diff options
-rw-r--r-- | remote.go | 33 | ||||
-rw-r--r-- | remote_test.go | 39 |
2 files changed, 72 insertions, 0 deletions
@@ -728,6 +728,39 @@ func (r *Remote) buildFetchedTags(refs memory.ReferenceStorage) (updated bool, e return } +// LSRemote performs ls-remote on the remote. +func (r *Remote) LSRemote(auth transport.AuthMethod) ([]*plumbing.Reference, error) { + s, err := newUploadPackSession(r.c.URLs[0], auth) + if err != nil { + return nil, err + } + + defer ioutil.CheckClose(s, &err) + + ar, err := s.AdvertisedReferences() + if err != nil { + return nil, err + } + + allRefs, err := ar.AllReferences() + if err != nil { + return nil, err + } + + refs, err := allRefs.IterReferences() + if err != nil { + return nil, err + } + + var resultRefs []*plumbing.Reference + refs.ForEach(func(ref *plumbing.Reference) error { + resultRefs = append(resultRefs, ref) + return nil + }) + + return resultRefs, nil +} + func objectsToPush(commands []*packp.Command) ([]plumbing.Hash, error) { var objects []plumbing.Hash for _, cmd := range commands { diff --git a/remote_test.go b/remote_test.go index 10f6708..4bb2037 100644 --- a/remote_test.go +++ b/remote_test.go @@ -11,6 +11,7 @@ import ( "gopkg.in/src-d/go-git.v4/config" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/storer" + "gopkg.in/src-d/go-git.v4/plumbing/transport" "gopkg.in/src-d/go-git.v4/storage" "gopkg.in/src-d/go-git.v4/storage/filesystem" "gopkg.in/src-d/go-git.v4/storage/memory" @@ -642,3 +643,41 @@ func (s *RemoteSuite) TestGetHaves(c *C) { c.Assert(err, IsNil) c.Assert(l, HasLen, 2) } + +func (s *RemoteSuite) TestLSRemote(c *C) { + url := c.MkDir() + server, err := PlainInit(url, true) + c.Assert(err, IsNil) + + srcFs := fixtures.Basic().One().DotGit() + sto, err := filesystem.NewStorage(srcFs) + c.Assert(err, IsNil) + + remote := newRemote(sto, &config.RemoteConfig{ + Name: DefaultRemoteName, + URLs: []string{url}, + }) + + rs := config.RefSpec("refs/heads/*:refs/heads/*") + err = remote.Push(&PushOptions{ + RefSpecs: []config.RefSpec{rs}, + }) + c.Assert(err, IsNil) + + // Perform ls-remote. + var authMethod transport.AuthMethod + refs, err := remote.LSRemote(authMethod) + c.Assert(err, IsNil) + + // Create a map of remote name and their hash. + refsMap := map[string]string{} + for _, rf := range refs { + // Skip the symbolically linked HEAD. + if string(rf.Name()) == "HEAD" { + continue + } + refsMap[string(rf.Name())] = rf.Hash().String() + } + + AssertReferences(c, server, refsMap) +} |