Skip to content

Commit

Permalink
repository: Fix RefSpec for a single tag. Fixes src-d#960
Browse files Browse the repository at this point in the history
Signed-off-by: Fedor Korotkov <[email protected]>
  • Loading branch information
fkorotkov committed Nov 7, 2018
1 parent 959dc01 commit 3ab4ee5
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 15 deletions.
34 changes: 19 additions & 15 deletions repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -710,16 +710,17 @@ func (r *Repository) clone(ctx context.Context, o *CloneOptions) error {
}

c := &config.RemoteConfig{
Name: o.RemoteName,
URLs: []string{o.URL},
Name: o.RemoteName,
URLs: []string{o.URL},
Fetch: r.cloneRefSpec(o),
}

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

ref, err := r.fetchAndUpdateReferences(ctx, &FetchOptions{
RefSpecs: r.cloneRefSpec(o, c),
RefSpecs: c.Fetch,
Depth: o.Depth,
Auth: o.Auth,
Progress: o.Progress,
Expand Down Expand Up @@ -789,21 +790,26 @@ const (
refspecSingleBranchHEAD = "+HEAD:refs/remotes/%s/HEAD"
)

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

func (r *Repository) cloneRefSpec(o *CloneOptions) []config.RefSpec {
switch {
case o.ReferenceName.IsTag():
rs = fmt.Sprintf(refspecTag, o.ReferenceName.Short())
return []config.RefSpec{
config.RefSpec(fmt.Sprintf(refspecTag, o.ReferenceName.Short())),
}
case o.SingleBranch && o.ReferenceName == plumbing.HEAD:
rs = fmt.Sprintf(refspecSingleBranchHEAD, c.Name)
return []config.RefSpec{
config.RefSpec(fmt.Sprintf(refspecSingleBranchHEAD, o.RemoteName)),
config.RefSpec(fmt.Sprintf(refspecSingleBranch, plumbing.Master.Short(), o.RemoteName)),
}
case o.SingleBranch:
rs = fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), c.Name)
return []config.RefSpec{
config.RefSpec(fmt.Sprintf(refspecSingleBranch, o.ReferenceName.Short(), o.RemoteName)),
}
default:
return c.Fetch
return []config.RefSpec{
config.RefSpec(fmt.Sprintf(config.DefaultFetchRefSpec, o.RemoteName)),
}
}

return []config.RefSpec{config.RefSpec(rs)}
}

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

c.Fetch = []config.RefSpec{config.RefSpec(fmt.Sprintf(
refspecSingleBranch, head.Name().Short(), c.Name,
))}
c.Fetch = r.cloneRefSpec(o)

cfg, err := r.Storer.Config()
if err != nil {
Expand Down
26 changes: 26 additions & 0 deletions repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -919,6 +919,32 @@ func (s *RepositorySuite) TestCloneSingleBranch(c *C) {
c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
}

func (s *RepositorySuite) TestCloneSingleTag(c *C) {
r, _ := Init(memory.NewStorage(), nil)

url := s.GetLocalRepositoryURL(
fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
)

err := r.clone(context.Background(), &CloneOptions{
URL: url,
SingleBranch: true,
ReferenceName: plumbing.ReferenceName("refs/tags/commit-tag"),
})
c.Assert(err, IsNil)

branch, err := r.Reference("refs/tags/commit-tag", false)
c.Assert(err, IsNil)
c.Assert(branch, NotNil)

conf, err := r.Config()
c.Assert(err, IsNil)
originRemote := conf.Remotes["origin"]
c.Assert(originRemote, NotNil)
c.Assert(originRemote.Fetch, HasLen, 1)
c.Assert(originRemote.Fetch[0].String(), Equals, "+refs/tags/commit-tag:refs/tags/commit-tag")
}

func (s *RepositorySuite) TestCloneDetachedHEAD(c *C) {
r, _ := Init(memory.NewStorage(), nil)
err := r.clone(context.Background(), &CloneOptions{
Expand Down

0 comments on commit 3ab4ee5

Please sign in to comment.