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

Commit a779a26

Browse files
authored
Merge pull request #1015 from fkorotkov/fedor/fix-tag-clonning
repository: Fix RefSpec for a single tag.
2 parents 91e601d + 3ab4ee5 commit a779a26

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

repository.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -710,16 +710,17 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
710710
}
711711

712712
c := &config.RemoteConfig{
713-
Name: o.RemoteName,
714-
URLs: []string{o.URL},
713+
Name: o.RemoteName,
714+
URLs: []string{o.URL},
715+
Fetch: r.cloneRefSpec(o),
715716
}
716717

717718
if _, err := r.CreateRemote(c); err != nil {
718719
return err
719720
}
720721

721722
ref, err := r.fetchAndUpdateReferences(ctx, &FetchOptions{
722-
RefSpecs: r.cloneRefSpec(o, c),
723+
RefSpecs: c.Fetch,
723724
Depth: o.Depth,
724725
Auth: o.Auth,
725726
Progress: o.Progress,
@@ -789,21 +790,26 @@ const (
789790
refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD"
790791
)
791792

792-
func (r *Repository) cloneRefSpec(o *CloneOptions, c *config.RemoteConfig) []config.RefSpec {
793-
var rs string
794-
793+
func (r *Repository) cloneRefSpec(o *CloneOptions) []config.RefSpec {
795794
switch {
796795
case o.ReferenceName.IsTag():
797-
rs = fmt.Sprintf(refspecTag, o.ReferenceName.Short())
796+
return []config.RefSpec{
797+
config.RefSpec(fmt.Sprintf(refspecTag, o.ReferenceName.Short())),
798+
}
798799
case o.SingleBranch && o.ReferenceName == plumbing.HEAD:
799-
rs = fmt.Sprintf(refspecSingleBranchHEAD, c.Name)
800+
return []config.RefSpec{
801+
config.RefSpec(fmt.Sprintf(refspecSingleBranchHEAD, o.RemoteName)),
802+
config.RefSpec(fmt.Sprintf(refspecSingleBranch, plumbing.Master.Short(), o.RemoteName)),
803+
}
800804
case o.SingleBranch:
801-
rs = fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), c.Name)
805+
return []config.RefSpec{
806+
config.RefSpec(fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), o.RemoteName)),
807+
}
802808
default:
803-
return c.Fetch
809+
return []config.RefSpec{
810+
config.RefSpec(fmt.Sprintf(config.DefaultFetchRefSpec, o.RemoteName)),
811+
}
804812
}
805-
806-
return []config.RefSpec{config.RefSpec(rs)}
807813
}
808814

809815
func (r *Repository) setIsBare(isBare bool) error {
@@ -821,9 +827,7 @@ func (r *Repository) updateRemoteConfigIfNeeded(o *CloneOptions, c *config.Remot
821827
return nil
822828
}
823829

824-
c.Fetch = []config.RefSpec{config.RefSpec(fmt.Sprintf(
825-
refspecSingleBranch, head.Name().Short(), c.Name,
826-
))}
830+
c.Fetch = r.cloneRefSpec(o)
827831

828832
cfg, err := r.Storer.Config()
829833
if err != nil {

repository_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,32 @@ func (s *RepositorySuite) TestCloneSingleBranch(c *C) {
919919
c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
920920
}
921921

922+
func (s *RepositorySuite) TestCloneSingleTag(c *C) {
923+
r, _ := Init(memory.NewStorage(), nil)
924+
925+
url := s.GetLocalRepositoryURL(
926+
fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
927+
)
928+
929+
err := r.clone(context.Background(), &CloneOptions{
930+
URL: url,
931+
SingleBranch: true,
932+
ReferenceName: plumbing.ReferenceName("refs/tags/commit-tag"),
933+
})
934+
c.Assert(err, IsNil)
935+
936+
branch, err := r.Reference("refs/tags/commit-tag", false)
937+
c.Assert(err, IsNil)
938+
c.Assert(branch, NotNil)
939+
940+
conf, err := r.Config()
941+
c.Assert(err, IsNil)
942+
originRemote := conf.Remotes["origin"]
943+
c.Assert(originRemote, NotNil)
944+
c.Assert(originRemote.Fetch, HasLen, 1)
945+
c.Assert(originRemote.Fetch[0].String(), Equals, "+refs/tags/commit-tag:refs/tags/commit-tag")
946+
}
947+
922948
func (s *RepositorySuite) TestCloneDetachedHEAD(c *C) {
923949
r, _ := Init(memory.NewStorage(), nil)
924950
err := r.clone(context.Background(), &CloneOptions{

0 commit comments

Comments
 (0)