Skip to content

Commit d851b90

Browse files
committed
repository: allow push from shallow repositories
1 parent 95bfc7e commit d851b90

File tree

5 files changed

+83
-47
lines changed

5 files changed

+83
-47
lines changed

plumbing/object/commit_walker_test.go

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package object
22

3-
import . "gopkg.in/check.v1"
4-
import "gopkg.in/src-d/go-git.v4/plumbing"
3+
import (
4+
"gopkg.in/src-d/go-git.v4/plumbing"
5+
6+
. "gopkg.in/check.v1"
7+
)
58

69
type CommitWalkerSuite struct {
710
BaseObjectsSuite
@@ -57,27 +60,6 @@ func (s *CommitWalkerSuite) TestCommitPreIteratorWithIgnore(c *C) {
5760
}
5861
}
5962

60-
func (s *CommitWalkerSuite) TestCommitPreIteratorWithIgnoreFirst(c *C) {
61-
commit := s.commit(c, s.Fixture.Head)
62-
63-
var commits []*Commit
64-
NewCommitPreorderIter(commit, []plumbing.Hash{
65-
plumbing.NewHash("6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
66-
}).ForEach(func(c *Commit) error {
67-
commits = append(commits, c)
68-
return nil
69-
})
70-
71-
c.Assert(commits, HasLen, 2)
72-
73-
expected := []string{
74-
"6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
75-
}
76-
for i, commit := range commits {
77-
c.Assert(commit.Hash.String(), Equals, expected[i])
78-
}
79-
}
80-
8163
func (s *CommitWalkerSuite) TestCommitPostIterator(c *C) {
8264
commit := s.commit(c, s.Fixture.Head)
8365

plumbing/revlist/revlist.go

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ import (
1616
// the reachable objects from the given objects. Ignore param are object hashes
1717
// that we want to ignore on the result. All that objects must be accessible
1818
// from the object storer.
19-
func Objects(
20-
s storer.EncodedObjectStorer,
21-
objects []plumbing.Hash,
22-
ignore []plumbing.Hash) ([]plumbing.Hash, error) {
23-
19+
func Objects(s storer.EncodedObjectStorer, objects, ignore []plumbing.Hash) ([]plumbing.Hash, error) {
2420
seen := hashListToSet(ignore)
2521
result := make(map[plumbing.Hash]bool)
2622

@@ -32,7 +28,7 @@ func Objects(
3228
}
3329

3430
for _, h := range objects {
35-
if err := processObject(s, h, seen, walkerFunc); err != nil {
31+
if err := processObject(s, h, seen, ignore, walkerFunc); err != nil {
3632
return nil, err
3733
}
3834
}
@@ -45,6 +41,7 @@ func processObject(
4541
s storer.EncodedObjectStorer,
4642
h plumbing.Hash,
4743
seen map[plumbing.Hash]bool,
44+
ignore []plumbing.Hash,
4845
walkerFunc func(h plumbing.Hash),
4946
) error {
5047
o, err := s.EncodedObject(plumbing.AnyObject, h)
@@ -59,12 +56,12 @@ func processObject(
5956

6057
switch do := do.(type) {
6158
case *object.Commit:
62-
return reachableObjects(do, seen, walkerFunc)
59+
return reachableObjects(do, seen, ignore, walkerFunc)
6360
case *object.Tree:
6461
return iterateCommitTrees(seen, do, walkerFunc)
6562
case *object.Tag:
6663
walkerFunc(do.Hash)
67-
return processObject(s, do.Target, seen, walkerFunc)
64+
return processObject(s, do.Target, seen, ignore, walkerFunc)
6865
case *object.Blob:
6966
walkerFunc(do.Hash)
7067
default:
@@ -82,22 +79,24 @@ func processObject(
8279
func reachableObjects(
8380
commit *object.Commit,
8481
seen map[plumbing.Hash]bool,
82+
ignore []plumbing.Hash,
8583
cb func(h plumbing.Hash)) error {
86-
return object.NewCommitPreorderIter(commit).
87-
ForEach(func(commit *object.Commit) error {
88-
if seen[commit.Hash] {
89-
return nil
90-
}
9184

92-
cb(commit.Hash)
85+
i := object.NewCommitPreorderIter(commit, ignore)
86+
return i.ForEach(func(commit *object.Commit) error {
87+
if seen[commit.Hash] {
88+
return nil
89+
}
90+
91+
cb(commit.Hash)
9392

94-
tree, err := commit.Tree()
95-
if err != nil {
96-
return err
97-
}
93+
tree, err := commit.Tree()
94+
if err != nil {
95+
return err
96+
}
9897

99-
return iterateCommitTrees(seen, tree, cb)
100-
})
98+
return iterateCommitTrees(seen, tree, cb)
99+
})
101100
}
102101

103102
// iterateCommitTrees iterate all reachable trees from the given commit

remote.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ func (r *Remote) Push(o *PushOptions) (err error) {
104104

105105
req := packp.NewReferenceUpdateRequestFromCapabilities(ar.Capabilities)
106106
if err := r.addReferencesToUpdate(o.RefSpecs, remoteRefs, req); err != nil {
107+
107108
return err
108109
}
109110

@@ -121,6 +122,15 @@ func (r *Remote) Push(o *PushOptions) (err error) {
121122
return err
122123
}
123124

125+
stop, err := r.s.Shallow()
126+
if err != nil {
127+
return err
128+
}
129+
130+
// if we have shallow we should include this as part of the objects that
131+
// we are aware.
132+
haves = append(haves, stop...)
133+
124134
hashesToPush, err := revlist.Objects(r.s, objects, haves)
125135
if err != nil {
126136
return err
@@ -486,7 +496,7 @@ func isFastForward(s storer.EncodedObjectStorer, old, new plumbing.Hash) (bool,
486496
}
487497

488498
found := false
489-
iter := object.NewCommitPreorderIter(c)
499+
iter := object.NewCommitPreorderIter(c, nil)
490500
return found, iter.ForEach(func(c *object.Commit) error {
491501
if c.Hash != old {
492502
return nil

repository.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ func (r *Repository) Log(o *LogOptions) (object.CommitIter, error) {
689689
return nil, err
690690
}
691691

692-
return object.NewCommitPreorderIter(commit), nil
692+
return object.NewCommitPreorderIter(commit, nil), nil
693693
}
694694

695695
// Tags returns all the References from Tags. This method returns all the tag
@@ -918,7 +918,7 @@ func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, err
918918
commit = c
919919
}
920920
case revision.CaretReg:
921-
history := object.NewCommitPreorderIter(commit)
921+
history := object.NewCommitPreorderIter(commit, nil)
922922

923923
re := item.(revision.CaretReg).Regexp
924924
negate := item.(revision.CaretReg).Negate
@@ -948,7 +948,7 @@ func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, err
948948

949949
commit = c
950950
case revision.AtDate:
951-
history := object.NewCommitPreorderIter(commit)
951+
history := object.NewCommitPreorderIter(commit, nil)
952952

953953
date := item.(revision.AtDate).Date
954954

repository_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
. "gopkg.in/check.v1"
2121
"gopkg.in/src-d/go-billy.v3/memfs"
2222
"gopkg.in/src-d/go-billy.v3/osfs"
23+
"gopkg.in/src-d/go-billy.v3/util"
2324
)
2425

2526
type RepositorySuite struct {
@@ -767,6 +768,50 @@ func (s *RepositorySuite) TestPushToEmptyRepository(c *C) {
767768
c.Assert(err, IsNil)
768769
}
769770

771+
func (s *RepositorySuite) TestPushDepth(c *C) {
772+
dir, err := ioutil.TempDir("", "push-depth")
773+
defer os.RemoveAll(dir)
774+
775+
origin, err := PlainClone(c.MkDir(), true, &CloneOptions{
776+
URL: fixtures.Basic().One().DotGit().Root(),
777+
})
778+
779+
c.Assert(err, IsNil)
780+
fs := origin.Storer.(*filesystem.Storage).Filesystem()
781+
782+
r, err := Clone(memory.NewStorage(), memfs.New(), &CloneOptions{
783+
URL: fs.Root(),
784+
Depth: 1,
785+
})
786+
c.Assert(err, IsNil)
787+
788+
err = util.WriteFile(r.wt, "foo", nil, 0755)
789+
c.Assert(err, IsNil)
790+
791+
w, err := r.Worktree()
792+
c.Assert(err, IsNil)
793+
794+
_, err = w.Add("foo")
795+
c.Assert(err, IsNil)
796+
797+
hash, err := w.Commit("foo", &CommitOptions{
798+
Author: defaultSignature(),
799+
Committer: defaultSignature(),
800+
})
801+
c.Assert(err, IsNil)
802+
803+
err = r.Push(&PushOptions{})
804+
c.Assert(err, IsNil)
805+
806+
remote, err := origin.Head()
807+
c.Assert(err, IsNil)
808+
c.Assert(remote.Hash(), Equals, hash)
809+
810+
local, err := r.Head()
811+
c.Assert(err, IsNil)
812+
c.Assert(local.Hash(), Equals, remote.Hash())
813+
}
814+
770815
func (s *RepositorySuite) TestPushNonExistentRemote(c *C) {
771816
srcFs := fixtures.Basic().One().DotGit()
772817
sto, err := filesystem.NewStorage(srcFs)

0 commit comments

Comments
 (0)