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

Commit 7172e04

Browse files
committed
remote: add support for ls-remote
1 parent f9879dd commit 7172e04

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

remote.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,39 @@ func (r *Remote) buildFetchedTags(refs memory.ReferenceStorage) (updated bool, e
728728
return
729729
}
730730

731+
// LSRemote performs ls-remote on the remote.
732+
func (r *Remote) LSRemote(auth transport.AuthMethod) ([]*plumbing.Reference, error) {
733+
s, err := newUploadPackSession(r.c.URLs[0], auth)
734+
if err != nil {
735+
return nil, err
736+
}
737+
738+
defer ioutil.CheckClose(s, &err)
739+
740+
ar, err := s.AdvertisedReferences()
741+
if err != nil {
742+
return nil, err
743+
}
744+
745+
allRefs, err := ar.AllReferences()
746+
if err != nil {
747+
return nil, err
748+
}
749+
750+
refs, err := allRefs.IterReferences()
751+
if err != nil {
752+
return nil, err
753+
}
754+
755+
var resultRefs []*plumbing.Reference
756+
refs.ForEach(func(ref *plumbing.Reference) error {
757+
resultRefs = append(resultRefs, ref)
758+
return nil
759+
})
760+
761+
return resultRefs, nil
762+
}
763+
731764
func objectsToPush(commands []*packp.Command) ([]plumbing.Hash, error) {
732765
var objects []plumbing.Hash
733766
for _, cmd := range commands {

remote_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"gopkg.in/src-d/go-git.v4/config"
1212
"gopkg.in/src-d/go-git.v4/plumbing"
1313
"gopkg.in/src-d/go-git.v4/plumbing/storer"
14+
"gopkg.in/src-d/go-git.v4/plumbing/transport"
1415
"gopkg.in/src-d/go-git.v4/storage"
1516
"gopkg.in/src-d/go-git.v4/storage/filesystem"
1617
"gopkg.in/src-d/go-git.v4/storage/memory"
@@ -642,3 +643,41 @@ func (s *RemoteSuite) TestGetHaves(c *C) {
642643
c.Assert(err, IsNil)
643644
c.Assert(l, HasLen, 2)
644645
}
646+
647+
func (s *RemoteSuite) TestLSRemote(c *C) {
648+
url := c.MkDir()
649+
server, err := PlainInit(url, true)
650+
c.Assert(err, IsNil)
651+
652+
srcFs := fixtures.Basic().One().DotGit()
653+
sto, err := filesystem.NewStorage(srcFs)
654+
c.Assert(err, IsNil)
655+
656+
remote := newRemote(sto, &config.RemoteConfig{
657+
Name: DefaultRemoteName,
658+
URLs: []string{url},
659+
})
660+
661+
rs := config.RefSpec("refs/heads/*:refs/heads/*")
662+
err = remote.Push(&PushOptions{
663+
RefSpecs: []config.RefSpec{rs},
664+
})
665+
c.Assert(err, IsNil)
666+
667+
// Perform ls-remote.
668+
var authMethod transport.AuthMethod
669+
refs, err := remote.LSRemote(authMethod)
670+
c.Assert(err, IsNil)
671+
672+
// Create a map of remote name and their hash.
673+
refsMap := map[string]string{}
674+
for _, rf := range refs {
675+
// Skip the symbolically linked HEAD.
676+
if string(rf.Name()) == "HEAD" {
677+
continue
678+
}
679+
refsMap[string(rf.Name())] = rf.Hash().String()
680+
}
681+
682+
AssertReferences(c, server, refsMap)
683+
}

0 commit comments

Comments
 (0)