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

Commit 998511e

Browse files
committed
Repository and Remote API changes
1 parent 72e5f00 commit 998511e

18 files changed

+211
-202
lines changed

blame_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var _ = Suite(&BlameCommon{})
2121
func (s *BlameCommon) SetUpSuite(c *C) {
2222
s.repos = make(map[string]*Repository, 0)
2323
for _, fixRepo := range fixtureRepos {
24-
r := NewPlainRepository()
24+
r, _ := NewMemoryRepository()
2525

2626
f, err := os.Open(fixRepo.packfile)
2727
c.Assert(err, IsNil)
@@ -32,7 +32,7 @@ func (s *BlameCommon) SetUpSuite(c *C) {
3232
stream := packfile.NewStream(bytes.NewReader(data))
3333

3434
d := packfile.NewDecoder(stream)
35-
err = d.Decode(r.Storage)
35+
err = d.Decode(r.os)
3636
c.Assert(err, IsNil)
3737

3838
c.Assert(f.Close(), IsNil)

clients/common/common.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"gopkg.in/src-d/go-git.v4/core"
1212
"gopkg.in/src-d/go-git.v4/formats/pktline"
13+
"gopkg.in/src-d/go-git.v4/storage/memory"
1314

1415
"gopkg.in/sourcegraph/go-vcsurl.v1"
1516
)
@@ -180,7 +181,7 @@ func (c *Capabilities) String() string {
180181

181182
type GitUploadPackInfo struct {
182183
Capabilities *Capabilities
183-
Refs map[core.ReferenceName]*core.Reference
184+
Refs memory.ReferenceStorage
184185
}
185186

186187
func NewGitUploadPackInfo() *GitUploadPackInfo {
@@ -206,7 +207,7 @@ func (r *GitUploadPackInfo) read(d *pktline.Decoder) error {
206207
}
207208

208209
isEmpty := true
209-
r.Refs = map[core.ReferenceName]*core.Reference{}
210+
r.Refs = make(memory.ReferenceStorage, 0)
210211
for _, line := range lines {
211212
if !r.isValidLine(line) {
212213
continue
@@ -237,7 +238,7 @@ func (r *GitUploadPackInfo) decodeHeaderLine(line string) {
237238
}
238239

239240
refName := core.ReferenceName(name)
240-
r.Refs[core.HEAD] = core.NewSymbolicReference(core.HEAD, refName)
241+
r.Refs.Set(core.NewSymbolicReference(core.HEAD, refName))
241242
}
242243

243244
func (r *GitUploadPackInfo) isValidLine(line string) bool {
@@ -250,21 +251,11 @@ func (r *GitUploadPackInfo) readLine(line string) {
250251
return
251252
}
252253

253-
ref := core.NewReferenceFromStrings(parts[1], parts[0])
254-
r.Refs[ref.Name()] = ref
254+
r.Refs.Set(core.NewReferenceFromStrings(parts[1], parts[0]))
255255
}
256256

257257
func (r *GitUploadPackInfo) Head() *core.Reference {
258-
h, ok := r.Refs[core.HEAD]
259-
if !ok {
260-
return nil
261-
}
262-
263-
ref, ok := r.Refs[h.Target()]
264-
if !ok {
265-
return nil
266-
}
267-
258+
ref, _ := core.ResolveReference(r.Refs, core.HEAD)
268259
return ref
269260
}
270261

clients/common_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type SuiteCommon struct {
2020

2121
var _ = Suite(&SuiteCommon{})
2222

23-
const fixtureTGZ = "../storage/filesystem/internal/gitdir/fixtures/spinnaker-gc.tgz"
23+
const fixtureTGZ = "../storage/filesystem/internal/dotgit/fixtures/spinnaker-gc.tgz"
2424

2525
func (s *SuiteCommon) SetUpSuite(c *C) {
2626
var err error

clients/http/git_upload_pack.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func NewGitUploadPackService() *GitUploadPackService {
2626

2727
func (s *GitUploadPackService) Connect(url common.Endpoint) error {
2828
s.endpoint = url
29-
3029
return nil
3130
}
3231

commit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func (c *Commit) Tree() *Tree {
3737

3838
// Parents return a CommitIter to the parent Commits
3939
func (c *Commit) Parents() *CommitIter {
40-
return NewCommitIter(c.r, core.NewObjectLookupIter(c.r.Storage, c.parents))
40+
return NewCommitIter(c.r, core.NewObjectLookupIter(c.r.os, c.parents))
4141
}
4242

4343
// NumParents returns the number of parents in a commit.

commit_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ var commitIterTests = []struct {
4242
func (s *SuiteCommit) TestIterSlice(c *C) {
4343
for i, t := range commitIterTests {
4444
r := s.repos[t.repo]
45-
iter := NewCommitIter(r, core.NewObjectSliceIter(makeObjectSlice(t.commits, r.Storage)))
45+
iter := NewCommitIter(r, core.NewObjectSliceIter(makeObjectSlice(t.commits, r.os)))
4646
s.checkIter(c, r, i, iter, t.commits)
4747
}
4848
}
4949

5050
func (s *SuiteCommit) TestIterLookup(c *C) {
5151
for i, t := range commitIterTests {
5252
r := s.repos[t.repo]
53-
iter := NewCommitIter(r, core.NewObjectLookupIter(r.Storage, makeHashSlice(t.commits)))
53+
iter := NewCommitIter(r, core.NewObjectLookupIter(r.os, makeHashSlice(t.commits)))
5454
s.checkIter(c, r, i, iter, t.commits)
5555
}
5656
}
@@ -68,15 +68,15 @@ func (s *SuiteCommit) checkIter(c *C, r *Repository, subtest int, iter *CommitIt
6868
func (s *SuiteCommit) TestIterSliceClose(c *C) {
6969
for i, t := range commitIterTests {
7070
r := s.repos[t.repo]
71-
iter := NewCommitIter(r, core.NewObjectSliceIter(makeObjectSlice(t.commits, r.Storage)))
71+
iter := NewCommitIter(r, core.NewObjectSliceIter(makeObjectSlice(t.commits, r.os)))
7272
s.checkIterClose(c, i, iter)
7373
}
7474
}
7575

7676
func (s *SuiteCommit) TestIterLookupClose(c *C) {
7777
for i, t := range commitIterTests {
7878
r := s.repos[t.repo]
79-
iter := NewCommitIter(r, core.NewObjectLookupIter(r.Storage, makeHashSlice(t.commits)))
79+
iter := NewCommitIter(r, core.NewObjectLookupIter(r.os, makeHashSlice(t.commits)))
8080
s.checkIterClose(c, i, iter)
8181
}
8282
}

common_test.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"os"
88
"testing"
99

10+
"gopkg.in/src-d/go-git.v4/clients"
1011
"gopkg.in/src-d/go-git.v4/clients/common"
1112
"gopkg.in/src-d/go-git.v4/core"
1213
"gopkg.in/src-d/go-git.v4/formats/packfile"
@@ -16,21 +17,33 @@ import (
1617

1718
func Test(t *testing.T) { TestingT(t) }
1819

20+
type BaseSuite struct{}
21+
22+
func (s *BaseSuite) SetUpTest(c *C) {
23+
clients.InstallProtocol("mock", &MockGitUploadPackService{})
24+
}
25+
26+
const RepositoryFixture = "mock://formats/packfile/fixtures/git-fixture.ref-delta"
27+
1928
type MockGitUploadPackService struct {
20-
Auth common.AuthMethod
21-
RC io.ReadCloser
29+
conected common.Endpoint
30+
auth common.AuthMethod
2231
}
2332

24-
func (s *MockGitUploadPackService) Connect(url common.Endpoint) error {
33+
func (p *MockGitUploadPackService) Connect(url common.Endpoint) error {
34+
p.conected = url
2535
return nil
2636
}
2737

28-
func (s *MockGitUploadPackService) ConnectWithAuth(url common.Endpoint, auth common.AuthMethod) error {
29-
s.Auth = auth
38+
func (p *MockGitUploadPackService) ConnectWithAuth(
39+
url common.Endpoint, auth common.AuthMethod,
40+
) error {
41+
p.conected = url
42+
p.auth = auth
3043
return nil
3144
}
3245

33-
func (s *MockGitUploadPackService) Info() (*common.GitUploadPackInfo, error) {
46+
func (p *MockGitUploadPackService) Info() (*common.GitUploadPackInfo, error) {
3447
h := core.NewHash("6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
3548

3649
c := common.NewCapabilities()
@@ -46,11 +59,8 @@ func (s *MockGitUploadPackService) Info() (*common.GitUploadPackInfo, error) {
4659
}, nil
4760
}
4861

49-
func (s *MockGitUploadPackService) Fetch(*common.GitUploadPackRequest) (io.ReadCloser, error) {
50-
var err error
51-
s.RC, err = os.Open("formats/packfile/fixtures/git-fixture.ref-delta")
52-
53-
return s.RC, err
62+
func (p *MockGitUploadPackService) Fetch(*common.GitUploadPackRequest) (io.ReadCloser, error) {
63+
return os.Open("formats/packfile/fixtures/git-fixture.ref-delta")
5464
}
5565

5666
type packedFixture struct {
@@ -74,7 +84,7 @@ func unpackFixtures(c *C, fixtures ...[]packedFixture) map[string]*Repository {
7484

7585
comment := Commentf("fixture packfile: %q", fixture.packfile)
7686

77-
repos[fixture.url] = NewPlainRepository()
87+
repos[fixture.url], _ = NewMemoryRepository()
7888

7989
f, err := os.Open(fixture.packfile)
8090
c.Assert(err, IsNil, comment)
@@ -86,7 +96,7 @@ func unpackFixtures(c *C, fixtures ...[]packedFixture) map[string]*Repository {
8696
r := packfile.NewStream(memStream)
8797

8898
d := packfile.NewDecoder(r)
89-
err = d.Decode(repos[fixture.url].Storage)
99+
err = d.Decode(repos[fixture.url].os)
90100
c.Assert(err, IsNil, comment)
91101

92102
c.Assert(f.Close(), IsNil, comment)

core/reference.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ const (
1313
refRemotePrefix = refPrefix + "remotes/"
1414
refNotePrefix = refPrefix + "notes/"
1515
symrefPrefix = "ref: "
16+
17+
maxResolveRecursion = 1024
1618
)
1719

1820
var (
19-
ErrReferenceNotFound = errors.New("reference not found")
21+
ErrMaxResolveRecursion = errors.New("max. recursion level reached")
22+
ErrReferenceNotFound = errors.New("reference not found")
2023
)
2124

2225
// ReferenceType reference type's
@@ -150,3 +153,29 @@ func (iter *ReferenceSliceIter) Next() (*Reference, error) {
150153
func (iter *ReferenceSliceIter) Close() {
151154
iter.pos = len(iter.series)
152155
}
156+
157+
func ResolveReference(s ReferenceStorage, n ReferenceName) (*Reference, error) {
158+
r, err := s.Get(n)
159+
if err != nil || r == nil {
160+
return r, err
161+
}
162+
return resolveReference(s, r, 0)
163+
}
164+
165+
func resolveReference(s ReferenceStorage, r *Reference, recursion int) (*Reference, error) {
166+
if r.Type() != SymbolicReference {
167+
return r, nil
168+
}
169+
170+
if recursion > maxResolveRecursion {
171+
return nil, ErrMaxResolveRecursion
172+
}
173+
174+
t, err := s.Get(r.Target())
175+
if err != nil {
176+
return nil, err
177+
}
178+
179+
recursion++
180+
return resolveReference(s, t, recursion)
181+
}

objects_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type ObjectsSuite struct {
1515

1616
var _ = Suite(&ObjectsSuite{})
1717

18+
/*
1819
func (s *ObjectsSuite) SetUpTest(c *C) {
1920
var err error
2021
s.r, err = NewRepository(RepositoryFixture, nil)
@@ -25,6 +26,7 @@ func (s *ObjectsSuite) SetUpTest(c *C) {
2526
err = s.r.Pull("origin", "refs/heads/master")
2627
c.Assert(err, IsNil)
2728
}
29+
*/
2830

2931
func (s *ObjectsSuite) TestNewCommit(c *C) {
3032
hash := core.NewHash("a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69")

options.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package git
2+
3+
import (
4+
"gopkg.in/src-d/go-git.v3/clients/common"
5+
"gopkg.in/src-d/go-git.v4/core"
6+
)
7+
8+
// CloneOptions describe how a clone should be perform
9+
type CloneOptions struct {
10+
// The (possibly remote) repository URL to clone from
11+
URL string
12+
// Auth credentials, if required, to uses with the remote repository
13+
Auth common.AuthMethod
14+
}
15+
16+
// FetchOptions describe how a fetch should be perform
17+
type FetchOptions struct {
18+
// Remote branch to fetch
19+
ReferenceName core.ReferenceName
20+
}

references.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
// therefore can appear repeated in the list.
2020
// (see git path-id for hints on how to fix this).
2121
func (c *Commit) References(path string) ([]*Commit, error) {
22-
result := make([]*Commit, 0)
22+
var result []*Commit
2323
seen := make(map[core.Hash]struct{}, 0)
2424
if err := walkGraph(&result, &seen, c.r, c, path); err != nil {
2525
return nil, err

references_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ var _ = Suite(&ReferencesSuite{})
2121
func (s *ReferencesSuite) SetUpSuite(c *C) {
2222
s.repos = make(map[string]*Repository, 0)
2323
for _, fix := range fixtureRepos {
24-
s.repos[fix.url] = NewPlainRepository()
24+
s.repos[fix.url], _ = NewMemoryRepository()
2525

2626
f, err := os.Open(fix.packfile)
2727
defer f.Close()
2828
c.Assert(err, IsNil)
2929
r := packfile.NewSeekable(f)
3030
d := packfile.NewDecoder(r)
31-
err = d.Decode(s.repos[fix.url].Storage)
31+
err = d.Decode(s.repos[fix.url].os)
3232
c.Assert(err, IsNil)
3333
}
3434
}

remote.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package git
22

33
import (
4-
"fmt"
5-
"io"
6-
74
"gopkg.in/src-d/go-git.v4/clients"
85
"gopkg.in/src-d/go-git.v4/clients/common"
96
"gopkg.in/src-d/go-git.v4/core"
7+
"gopkg.in/src-d/go-git.v4/formats/packfile"
108
)
119

1210
// Remote represents a connection to a remote repository
@@ -78,8 +76,26 @@ func (r *Remote) Capabilities() *common.Capabilities {
7876
}
7977

8078
// Fetch returns a reader using the request
81-
func (r *Remote) Fetch(req *common.GitUploadPackRequest) (io.ReadCloser, error) {
82-
return r.upSrv.Fetch(req)
79+
func (r *Remote) Fetch(s core.ObjectStorage, o *FetchOptions) (h core.Hash, err error) {
80+
ref, err := r.Ref(o.ReferenceName, true)
81+
if err != nil {
82+
return core.ZeroHash, err
83+
}
84+
85+
h = ref.Hash()
86+
req := &common.GitUploadPackRequest{}
87+
req.Want(h)
88+
89+
reader, err := r.upSrv.Fetch(req)
90+
if err != nil {
91+
return core.ZeroHash, err
92+
}
93+
94+
defer checkClose(reader, &err)
95+
stream := packfile.NewStream(reader)
96+
97+
d := packfile.NewDecoder(stream)
98+
return h, d.Decode(s)
8399
}
84100

85101
// Head returns the Reference of the HEAD
@@ -88,16 +104,16 @@ func (r *Remote) Head() *core.Reference {
88104
}
89105

90106
// Ref returns the Hash pointing the given refName
91-
func (r *Remote) Ref(name core.ReferenceName) (*core.Reference, error) {
92-
ref, ok := r.upInfo.Refs[name]
93-
if !ok {
94-
return nil, fmt.Errorf("unable to find ref %q", name)
107+
func (r *Remote) Ref(name core.ReferenceName, resolved bool) (*core.Reference, error) {
108+
if resolved {
109+
return core.ResolveReference(r.upInfo.Refs, name)
95110
}
96111

97-
return ref, nil
112+
return r.upInfo.Refs.Get(name)
98113
}
99114

100115
// Refs returns a map with all the References
101-
func (r *Remote) Refs() map[core.ReferenceName]*core.Reference {
102-
return r.upInfo.Refs
116+
func (r *Remote) Refs() core.ReferenceIter {
117+
i, _ := r.upInfo.Refs.Iter()
118+
return i
103119
}

0 commit comments

Comments
 (0)