Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit a0885c5

Browse files
authored
Merge pull request #532 from mcuadros/fix-shallo
Remote.Clone fix clone of tags in shallow mode
2 parents 902347a + 595de2b commit a0885c5

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

repository.go

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -448,20 +448,24 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
448448
return r.updateRemoteConfigIfNeeded(o, c, head)
449449
}
450450

451-
func (r *Repository) cloneRefSpec(o *CloneOptions,
452-
c *config.RemoteConfig) []config.RefSpec {
453-
454-
if !o.SingleBranch {
455-
return c.Fetch
456-
}
451+
const (
452+
refspecTagWithDepth = "+refs/tags/%s:refs/tags/%[1]s"
453+
refspecSingleBranch = "+refs/heads/%s:refs/remotes/%s/%[1]s"
454+
refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD"
455+
)
457456

457+
func (r *Repository) cloneRefSpec(o *CloneOptions, c *config.RemoteConfig) []config.RefSpec {
458458
var rs string
459459

460-
if o.ReferenceName == plumbing.HEAD {
460+
switch {
461+
case o.ReferenceName.IsTag() && o.Depth > 0:
462+
rs = fmt.Sprintf(refspecTagWithDepth, o.ReferenceName.Short())
463+
case o.SingleBranch && o.ReferenceName == plumbing.HEAD:
461464
rs = fmt.Sprintf(refspecSingleBranchHEAD, c.Name)
462-
} else {
463-
rs = fmt.Sprintf(refspecSingleBranch,
464-
o.ReferenceName.Short(), c.Name)
465+
case o.SingleBranch:
466+
rs = fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), c.Name)
467+
default:
468+
return c.Fetch
465469
}
466470

467471
return []config.RefSpec{config.RefSpec(rs)}
@@ -477,11 +481,6 @@ func (r *Repository) setIsBare(isBare bool) error {
477481
return r.Storer.SetConfig(cfg)
478482
}
479483

480-
const (
481-
refspecSingleBranch = "+refs/heads/%s:refs/remotes/%s/%[1]s"
482-
refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD"
483-
)
484-
485484
func (r *Repository) updateRemoteConfigIfNeeded(o *CloneOptions, c *config.RemoteConfig, head *plumbing.Reference) error {
486485
if !o.SingleBranch {
487486
return nil

repository_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,12 +613,42 @@ func (s *RepositorySuite) TestCloneDetachedHEAD(c *C) {
613613
URL: s.GetBasicLocalRepositoryURL(),
614614
ReferenceName: plumbing.ReferenceName("refs/tags/v1.0.0"),
615615
})
616+
c.Assert(err, IsNil)
617+
618+
head, err := r.Reference(plumbing.HEAD, false)
619+
c.Assert(err, IsNil)
620+
c.Assert(head, NotNil)
621+
c.Assert(head.Type(), Equals, plumbing.HashReference)
622+
c.Assert(head.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
623+
624+
count := 0
625+
objects, err := r.Objects()
626+
c.Assert(err, IsNil)
627+
objects.ForEach(func(object.Object) error { count++; return nil })
628+
c.Assert(count, Equals, 31)
629+
}
630+
631+
func (s *RepositorySuite) TestCloneDetachedHEADAndShallow(c *C) {
632+
r, _ := Init(memory.NewStorage(), memfs.New())
633+
err := r.clone(context.Background(), &CloneOptions{
634+
URL: s.GetBasicLocalRepositoryURL(),
635+
ReferenceName: plumbing.ReferenceName("refs/tags/v1.0.0"),
636+
Depth: 1,
637+
})
638+
639+
c.Assert(err, IsNil)
616640

617641
head, err := r.Reference(plumbing.HEAD, false)
618642
c.Assert(err, IsNil)
619643
c.Assert(head, NotNil)
620644
c.Assert(head.Type(), Equals, plumbing.HashReference)
621645
c.Assert(head.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
646+
647+
count := 0
648+
objects, err := r.Objects()
649+
c.Assert(err, IsNil)
650+
objects.ForEach(func(object.Object) error { count++; return nil })
651+
c.Assert(count, Equals, 15)
622652
}
623653

624654
func (s *RepositorySuite) TestPush(c *C) {

0 commit comments

Comments
 (0)