Skip to content

Commit 806a6af

Browse files
committed
repository: Resolve commit when cloning annotated tag, fixes src-d#557
1 parent 6f3b2d8 commit 806a6af

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

repository.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,25 @@ func (r *Repository) DeleteRemote(name string) error {
400400
return r.Storer.SetConfig(cfg)
401401
}
402402

403+
func (r *Repository) resolveToCommitHash(h plumbing.Hash) (plumbing.Hash, error) {
404+
obj, err := r.Storer.EncodedObject(plumbing.AnyObject, h)
405+
if err != nil {
406+
return plumbing.ZeroHash, err
407+
}
408+
switch obj.Type() {
409+
case plumbing.TagObject:
410+
t, err := object.DecodeTag(r.Storer, obj)
411+
if err != nil {
412+
return plumbing.ZeroHash, err
413+
}
414+
return r.resolveToCommitHash(t.Target)
415+
case plumbing.CommitObject:
416+
return h, nil
417+
default:
418+
return plumbing.ZeroHash, errors.New("Unable to resolve to commit")
419+
}
420+
}
421+
403422
// Clone clones a remote repository
404423
func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
405424
if err := o.Validate(); err != nil {
@@ -431,7 +450,11 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
431450
return err
432451
}
433452

434-
if err := w.Reset(&ResetOptions{Commit: head.Hash()}); err != nil {
453+
h, err := r.resolveToCommitHash(head.Hash())
454+
if err != nil {
455+
return err
456+
}
457+
if err := w.Reset(&ResetOptions{Commit: h}); err != nil {
435458
return err
436459
}
437460

repository_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,27 @@ func (s *RepositorySuite) TestCloneDetachedHEADAndShallow(c *C) {
651651
c.Assert(count, Equals, 15)
652652
}
653653

654+
func (s *RepositorySuite) TestCloneDetachedHEADAnnotatedTag(c *C) {
655+
r, _ := Init(memory.NewStorage(), nil)
656+
err := r.clone(context.Background(), &CloneOptions{
657+
URL: s.GetLocalRepositoryURL(fixtures.ByTag("tags").One()),
658+
ReferenceName: plumbing.ReferenceName("refs/tags/annotated-tag"),
659+
})
660+
c.Assert(err, IsNil)
661+
662+
head, err := r.Reference(plumbing.HEAD, false)
663+
c.Assert(err, IsNil)
664+
c.Assert(head, NotNil)
665+
c.Assert(head.Type(), Equals, plumbing.HashReference)
666+
c.Assert(head.Hash().String(), Equals, "f7b877701fbf855b44c0a9e86f3fdce2c298b07f")
667+
668+
count := 0
669+
objects, err := r.Objects()
670+
c.Assert(err, IsNil)
671+
objects.ForEach(func(object.Object) error { count++; return nil })
672+
c.Assert(count, Equals, 7)
673+
}
674+
654675
func (s *RepositorySuite) TestPush(c *C) {
655676
url := c.MkDir()
656677
server, err := PlainInit(url, true)

0 commit comments

Comments
 (0)