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

Commit a99c129

Browse files
authored
Merge pull request #609 from darkowlzz/ls-remote
remote: add support for ls-remote
2 parents 30a99a2 + b8eac90 commit a99c129

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

options.go

+6
Original file line numberDiff line numberDiff line change
@@ -348,3 +348,9 @@ func (o *CommitOptions) Validate(r *Repository) error {
348348

349349
return nil
350350
}
351+
352+
// ListOptions describes how a remote list should be performed.
353+
type ListOptions struct {
354+
// Auth credentials, if required, to use with the remote repository.
355+
Auth transport.AuthMethod
356+
}

remote.go

+33
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,39 @@ func (r *Remote) buildFetchedTags(refs memory.ReferenceStorage) (updated bool, e
759759
return
760760
}
761761

762+
// List the references on the remote repository.
763+
func (r *Remote) List(o *ListOptions) ([]*plumbing.Reference, error) {
764+
s, err := newUploadPackSession(r.c.URLs[0], o.Auth)
765+
if err != nil {
766+
return nil, err
767+
}
768+
769+
defer ioutil.CheckClose(s, &err)
770+
771+
ar, err := s.AdvertisedReferences()
772+
if err != nil {
773+
return nil, err
774+
}
775+
776+
allRefs, err := ar.AllReferences()
777+
if err != nil {
778+
return nil, err
779+
}
780+
781+
refs, err := allRefs.IterReferences()
782+
if err != nil {
783+
return nil, err
784+
}
785+
786+
var resultRefs []*plumbing.Reference
787+
refs.ForEach(func(ref *plumbing.Reference) error {
788+
resultRefs = append(resultRefs, ref)
789+
return nil
790+
})
791+
792+
return resultRefs, nil
793+
}
794+
762795
func objectsToPush(commands []*packp.Command) ([]plumbing.Hash, error) {
763796
var objects []plumbing.Hash
764797
for _, cmd := range commands {

remote_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -644,3 +644,34 @@ func (s *RemoteSuite) TestGetHaves(c *C) {
644644
c.Assert(err, IsNil)
645645
c.Assert(l, HasLen, 2)
646646
}
647+
648+
func (s *RemoteSuite) TestList(c *C) {
649+
repo := fixtures.Basic().One()
650+
remote := newRemote(memory.NewStorage(), &config.RemoteConfig{
651+
Name: DefaultRemoteName,
652+
URLs: []string{repo.URL},
653+
})
654+
655+
refs, err := remote.List(&ListOptions{})
656+
c.Assert(err, IsNil)
657+
658+
expected := []*plumbing.Reference{
659+
plumbing.NewSymbolicReference("HEAD", "refs/heads/master"),
660+
plumbing.NewReferenceFromStrings("refs/heads/master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
661+
plumbing.NewReferenceFromStrings("refs/heads/branch", "e8d3ffab552895c19b9fcf7aa264d277cde33881"),
662+
plumbing.NewReferenceFromStrings("refs/pull/1/head", "b8e471f58bcbca63b07bda20e428190409c2db47"),
663+
plumbing.NewReferenceFromStrings("refs/pull/2/head", "9632f02833b2f9613afb5e75682132b0b22e4a31"),
664+
plumbing.NewReferenceFromStrings("refs/pull/2/merge", "c37f58a130ca555e42ff96a071cb9ccb3f437504"),
665+
}
666+
c.Assert(len(refs), Equals, len(expected))
667+
for _, e := range expected {
668+
found := false
669+
for _, r := range refs {
670+
if r.Name() == e.Name() {
671+
found = true
672+
c.Assert(r, DeepEquals, e)
673+
}
674+
}
675+
c.Assert(found, Equals, true)
676+
}
677+
}

0 commit comments

Comments
 (0)