From 7172e04fe7e000d8826f0402dd7f70d8b3d55072 Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 2 Oct 2017 14:42:08 +0530 Subject: [PATCH 1/3] remote: add support for ls-remote --- remote.go | 33 +++++++++++++++++++++++++++++++++ remote_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/remote.go b/remote.go index 3e2476393..c297e8e3c 100644 --- a/remote.go +++ b/remote.go @@ -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 10f670837..4bb2037ce 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) +} From 4d0c2cccb890be585b74fea3805db6e555f42cfc Mon Sep 17 00:00:00 2001 From: Sunny Date: Wed, 4 Oct 2017 01:59:13 +0530 Subject: [PATCH 2/3] Create ListOptions and rename LSRemote to List. --- options.go | 6 ++++++ remote.go | 6 +++--- remote_test.go | 8 +++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/options.go b/options.go index 9f10aae8c..7036bc1f4 100644 --- a/options.go +++ b/options.go @@ -348,3 +348,9 @@ func (o *CommitOptions) Validate(r *Repository) error { return nil } + +// ListOptions describes how a remote list should be performed. +type ListOptions struct { + // Auth credentials, if required, to use with the remote repository. + Auth transport.AuthMethod +} diff --git a/remote.go b/remote.go index c297e8e3c..1b8b50244 100644 --- a/remote.go +++ b/remote.go @@ -728,9 +728,9 @@ 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) +// List the references on the remote repository. +func (r *Remote) List(o *ListOptions) ([]*plumbing.Reference, error) { + s, err := newUploadPackSession(r.c.URLs[0], o.Auth) if err != nil { return nil, err } diff --git a/remote_test.go b/remote_test.go index 4bb2037ce..f5f68176e 100644 --- a/remote_test.go +++ b/remote_test.go @@ -11,7 +11,6 @@ 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" @@ -644,7 +643,7 @@ func (s *RemoteSuite) TestGetHaves(c *C) { c.Assert(l, HasLen, 2) } -func (s *RemoteSuite) TestLSRemote(c *C) { +func (s *RemoteSuite) TestList(c *C) { url := c.MkDir() server, err := PlainInit(url, true) c.Assert(err, IsNil) @@ -664,9 +663,8 @@ func (s *RemoteSuite) TestLSRemote(c *C) { }) c.Assert(err, IsNil) - // Perform ls-remote. - var authMethod transport.AuthMethod - refs, err := remote.LSRemote(authMethod) + listOptions := ListOptions{} + refs, err := remote.List(&listOptions) c.Assert(err, IsNil) // Create a map of remote name and their hash. From b8eac90c420e14ebbabbb15523d024a4064e12ef Mon Sep 17 00:00:00 2001 From: Sunny Date: Wed, 4 Oct 2017 18:52:21 +0530 Subject: [PATCH 3/3] TestList: explicitly check the refs in fixture --- remote_test.go | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/remote_test.go b/remote_test.go index f5f68176e..30dab402a 100644 --- a/remote_test.go +++ b/remote_test.go @@ -644,38 +644,32 @@ func (s *RemoteSuite) TestGetHaves(c *C) { } func (s *RemoteSuite) TestList(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{ + repo := fixtures.Basic().One() + remote := newRemote(memory.NewStorage(), &config.RemoteConfig{ Name: DefaultRemoteName, - URLs: []string{url}, + URLs: []string{repo.URL}, }) - rs := config.RefSpec("refs/heads/*:refs/heads/*") - err = remote.Push(&PushOptions{ - RefSpecs: []config.RefSpec{rs}, - }) + refs, err := remote.List(&ListOptions{}) c.Assert(err, IsNil) - listOptions := ListOptions{} - refs, err := remote.List(&listOptions) - 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 + expected := []*plumbing.Reference{ + plumbing.NewSymbolicReference("HEAD", "refs/heads/master"), + plumbing.NewReferenceFromStrings("refs/heads/master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"), + plumbing.NewReferenceFromStrings("refs/heads/branch", "e8d3ffab552895c19b9fcf7aa264d277cde33881"), + plumbing.NewReferenceFromStrings("refs/pull/1/head", "b8e471f58bcbca63b07bda20e428190409c2db47"), + plumbing.NewReferenceFromStrings("refs/pull/2/head", "9632f02833b2f9613afb5e75682132b0b22e4a31"), + plumbing.NewReferenceFromStrings("refs/pull/2/merge", "c37f58a130ca555e42ff96a071cb9ccb3f437504"), + } + c.Assert(len(refs), Equals, len(expected)) + for _, e := range expected { + found := false + for _, r := range refs { + if r.Name() == e.Name() { + found = true + c.Assert(r, DeepEquals, e) + } } - refsMap[string(rf.Name())] = rf.Hash().String() + c.Assert(found, Equals, true) } - - AssertReferences(c, server, refsMap) }