diff options
-rw-r--r-- | common_test.go | 1 | ||||
-rw-r--r-- | config/refspec.go | 7 | ||||
-rw-r--r-- | options.go | 4 | ||||
-rw-r--r-- | remote.go | 14 | ||||
-rw-r--r-- | repository_test.go | 19 | ||||
-rw-r--r-- | tag.go | 21 |
6 files changed, 44 insertions, 22 deletions
diff --git a/common_test.go b/common_test.go index 7a3310f..854db3a 100644 --- a/common_test.go +++ b/common_test.go @@ -97,6 +97,7 @@ func (p *MockGitUploadPackService) Info() (*common.GitUploadPackInfo, error) { ref := core.ReferenceName("refs/heads/master") branch := core.ReferenceName("refs/heads/branch") tag := core.ReferenceName("refs/tags/v1.0.0") + return &common.GitUploadPackInfo{ Capabilities: c, Refs: map[core.ReferenceName]*core.Reference{ diff --git a/config/refspec.go b/config/refspec.go index dae13be..9b5560d 100644 --- a/config/refspec.go +++ b/config/refspec.go @@ -59,14 +59,15 @@ func (s RefSpec) Src() string { // Match match the given core.ReferenceName against the source func (s RefSpec) Match(n core.ReferenceName) bool { - if !s.isGlob() { + if !s.IsWildcard() { return s.matchExact(n) } return s.matchGlob(n) } -func (s RefSpec) isGlob() bool { +// IsWildcard returns true if the RefSpec contains a wildcard +func (s RefSpec) IsWildcard() bool { return strings.Index(string(s), refSpecWildcard) != -1 } @@ -97,7 +98,7 @@ func (s RefSpec) Dst(n core.ReferenceName) core.ReferenceName { dst := spec[start:len(spec)] src := s.Src() - if !s.isGlob() { + if !s.IsWildcard() { return core.ReferenceName(dst) } @@ -79,7 +79,9 @@ func (o *PullOptions) Validate() error { // FetchOptions describe how a fetch should be perform type FetchOptions struct { RefSpecs []config.RefSpec - Depth int + // Depth limit fetching to the specified number of commits from the tip of + // each remote branch history. + Depth int } // Validate validate the fields and set the default values @@ -120,13 +120,23 @@ func (r *Remote) getWantedReferences(spec []config.RefSpec) ([]*core.Reference, return refs, err } + wantTags := true + for _, s := range spec { + if !s.IsWildcard() { + wantTags = false + break + } + } + return refs, iter.ForEach(func(ref *core.Reference) error { if ref.Type() != core.HashReference { return nil } if !config.MatchAny(spec, ref.Name()) { - return nil + if !ref.IsTag() || !wantTags { + return nil + } } _, err := r.s.ObjectStorage().Get(core.CommitObject, ref.Hash()) @@ -223,7 +233,7 @@ func (r *Remote) buildFetchedTags() error { return nil } - _, err := os.Get(core.CommitObject, ref.Hash()) + _, err := os.Get(core.AnyObject, ref.Hash()) if err == core.ErrObjectNotFound { return nil } diff --git a/repository_test.go b/repository_test.go index 07fa763..b67e31d 100644 --- a/repository_test.go +++ b/repository_test.go @@ -314,24 +314,27 @@ func (s *RepositorySuite) TestTag(c *C) { func (s *RepositorySuite) TestTags(c *C) { r := NewMemoryRepository() - err := r.Clone(&CloneOptions{URL: "https://github.com/spinnaker/spinnaker.git"}) + err := r.Clone(&CloneOptions{URL: "https://github.com/git-fixtures/tags.git"}) c.Assert(err, IsNil) count := 0 tags, err := r.Tags() c.Assert(err, IsNil) - for { - tag, err := tags.Next() - if err != nil { - break - } + tags.ForEach(func(tag *Tag) error { count++ c.Assert(tag.Hash.IsZero(), Equals, false) c.Assert(tag.Type(), Equals, core.TagObject) - } - c.Assert(count, Equals, 11) + return nil + }) + + refs, _ := r.Refs() + refs.ForEach(func(ref *core.Reference) error { + return nil + }) + + c.Assert(count, Equals, 4) } func (s *RepositorySuite) TestCommitIterClosePanic(c *C) { @@ -28,13 +28,6 @@ type Tag struct { r *Repository } -// Type returns the type of object. It always returns core.TreeObject. -/* -func (t *Tag) Type() core.ObjectType { - return core.TagObject -} -*/ - // ID returns the object ID of the tag, not the object that the tag references. // The returned value will always match the current value of Tag.Hash. // @@ -180,10 +173,11 @@ func (t *Tag) Object() (Object, error) { // string. func (t *Tag) String() string { obj, _ := t.Object() + return fmt.Sprintf( "%s %s\nTagger: %s\nDate: %s\n\n%s\n%s", core.TagObject, t.Name, t.Tagger.String(), t.Tagger.When.Format(DateFormat), - t.Message, obj, + t.Message, objectAsString(obj), ) } @@ -226,3 +220,14 @@ func (iter *TagIter) ForEach(cb func(*Tag) error) error { return cb(tag) }) } + +func objectAsString(obj Object) string { + switch o := obj.(type) { + case *Commit: + return o.String() + case *Tag: + return o.String() + } + + return "" +} |