func (r *Remote) getWantedReferences(spec []config.RefSpec) ([]*plumbing.Reference, error) { var refs []*plumbing.Reference iter, err := r.Refs() if err != nil { return refs, err } wantTags := true for _, s := range spec { if !s.IsWildcard() { wantTags = false break } } return refs, iter.ForEach(func(ref *plumbing.Reference) error { if ref.Type() != plumbing.HashReference { return nil } if !config.MatchAny(spec, ref.Name()) { if !ref.IsTag() || !wantTags { return nil } } _, err := r.s.Object(plumbing.CommitObject, ref.Hash()) if err == plumbing.ErrObjectNotFound { refs = append(refs, ref) return nil } return err }) }
func getWants(spec []config.RefSpec, localStorer Storer, remoteRefs storer.ReferenceStorer) ([]plumbing.Hash, error) { wantTags := true for _, s := range spec { if !s.IsWildcard() { wantTags = false break } } iter, err := remoteRefs.IterReferences() if err != nil { return nil, err } wants := map[plumbing.Hash]bool{} err = iter.ForEach(func(ref *plumbing.Reference) error { if !config.MatchAny(spec, ref.Name()) { if !ref.IsTag() || !wantTags { return nil } } if ref.Type() == plumbing.SymbolicReference { ref, err = storer.ResolveReference(remoteRefs, ref.Name()) if err != nil { return err } } if ref.Type() != plumbing.HashReference { return nil } hash := ref.Hash() exists, err := commitExists(localStorer, hash) if err != nil { return err } if !exists { wants[hash] = true } return nil }) if err != nil { return nil, err } var result []plumbing.Hash for h := range wants { result = append(result, h) } return result, nil }