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

Commit ef3c257

Browse files
committed
Move MergeBase and IsAncestor into plumbing/object.Commit
Signed-off-by: David Pordomingo <[email protected]>
1 parent 8214550 commit ef3c257

File tree

2 files changed

+65
-49
lines changed

2 files changed

+65
-49
lines changed

plumbing/object/merge_base.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,12 @@ import (
1111
// errIsReachable is thrown when first commit is an ancestor of the second
1212
var errIsReachable = fmt.Errorf("first is reachable from second")
1313

14-
// MergeBase mimics the behavior of `git merge-base first second`, returning the
15-
// best common ancestor of the two passed commits
16-
// The best common ancestors can not be reached from other common ancestors
17-
func MergeBase(
18-
first *Commit,
19-
second *Commit,
20-
) ([]*Commit, error) {
21-
14+
// MergeBase mimics the behavior of `git merge-base actual other`, returning the
15+
// best common ancestor between the actual and the passed one.
16+
// The best common ancestors can not be reached from other common ancestors.
17+
func (c *Commit) MergeBase(other *Commit) ([]*Commit, error) {
2218
// use sortedByCommitDateDesc strategy
23-
sorted := sortByCommitDateDesc(first, second)
19+
sorted := sortByCommitDateDesc(c, other)
2420
newer := sorted[0]
2521
older := sorted[1]
2622

@@ -44,17 +40,14 @@ func MergeBase(
4440
return Independents(res)
4541
}
4642

47-
// IsAncestor returns true if the candidate commit is ancestor of the target one
43+
// IsAncestor returns true if the actual commit is ancestor of the passed one.
4844
// It returns an error if the history is not transversable
49-
// It mimics the behavior of `git merge --is-ancestor candidate target`
50-
func IsAncestor(
51-
candidate *Commit,
52-
target *Commit,
53-
) (bool, error) {
45+
// It mimics the behavior of `git merge --is-ancestor actual other`
46+
func (c *Commit) IsAncestor(other *Commit) (bool, error) {
5447
found := false
55-
iter := NewCommitPreorderIter(target, nil, nil)
56-
err := iter.ForEach(func(c *Commit) error {
57-
if c.Hash != candidate.Hash {
48+
iter := NewCommitPreorderIter(other, nil, nil)
49+
err := iter.ForEach(func(comm *Commit) error {
50+
if comm.Hash != c.Hash {
5851
return nil
5952
}
6053

plumbing/object/merge_base_test.go

Lines changed: 54 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,17 @@
11
package object
22

33
import (
4+
"fmt"
45
"sort"
56

67
"gopkg.in/src-d/go-git.v4/plumbing"
8+
"gopkg.in/src-d/go-git.v4/plumbing/cache"
9+
"gopkg.in/src-d/go-git.v4/storage/filesystem"
710

811
. "gopkg.in/check.v1"
9-
"gopkg.in/src-d/go-git-fixtures.v3"
12+
fixtures "gopkg.in/src-d/go-git-fixtures.v3"
1013
)
1114

12-
func commitsFromRevs(repo *Repository, revs []string) ([]*Commit, error) {
13-
var commits []*Commit
14-
for _, rev := range revs {
15-
hash, err := repo.ResolveRevision(plumbing.Revision(rev))
16-
if err != nil {
17-
return nil, err
18-
}
19-
20-
commit, err := repo.CommitObject(*hash)
21-
if err != nil {
22-
return nil, err
23-
}
24-
25-
commits = append(commits, commit)
26-
}
27-
28-
return commits, nil
29-
}
30-
3115
func alphabeticSortCommits(commits []*Commit) {
3216
sort.Slice(commits, func(i, j int) bool {
3317
return commits[i].Hash.String() > commits[j].Hash.String()
@@ -79,27 +63,66 @@ passed result
7963
var _ = Suite(&orphansSuite{})
8064

8165
type orphansSuite struct {
82-
BaseSuite
66+
BaseObjectsSuite
8367
}
8468

8569
func (s *orphansSuite) SetUpSuite(c *C) {
8670
s.Suite.SetUpSuite(c)
87-
f := fixtures.ByTag("merge-base").One()
88-
s.Repository = s.NewRepository(f)
71+
s.Fixture = fixtures.ByTag("merge-base").One()
72+
s.Storer = filesystem.NewStorage(s.Fixture.DotGit(), cache.NewObjectLRUDefault())
73+
}
74+
75+
var revisionIndex = map[string]plumbing.Hash{
76+
"master": plumbing.NewHash("dce0e0c20d701c3d260146e443d6b3b079505191"),
77+
"feature": plumbing.NewHash("d1b0093698e398d596ef94d646c4db37e8d1e970"),
78+
"dev": plumbing.NewHash("25ca6c810c08482d61113fbcaaada38bb59093a8"),
79+
"M": plumbing.NewHash("bb355b64e18386dbc3af63dfd09c015c44cbd9b6"),
80+
"N": plumbing.NewHash("d64b894762ab5f09e2b155221b90c18bd0637236"),
81+
"A": plumbing.NewHash("29740cfaf0c2ee4bb532dba9e80040ca738f367c"),
82+
"B": plumbing.NewHash("2c84807970299ba98951c65fe81ebbaac01030f0"),
83+
"AB": plumbing.NewHash("31a7e081a28f149ee98ffd13ba1a6d841a5f46fd"),
84+
"P": plumbing.NewHash("ff84393134864cf9d3a9853a81bde81778bd5805"),
85+
"C": plumbing.NewHash("8b72fabdc4222c3ff965bc310ded788c601c50ed"),
86+
"D": plumbing.NewHash("14777cf3e209334592fbfd0b878f6868394db836"),
87+
"CD1": plumbing.NewHash("4709e13a3cbb300c2b8a917effda776e1b8955c7"),
88+
"CD2": plumbing.NewHash("38468e274e91e50ffb637b88a1954ab6193fe974"),
89+
"S": plumbing.NewHash("628f1a42b70380ed05734bf01b468b46206ef1ea"),
90+
"G": plumbing.NewHash("d1b0093698e398d596ef94d646c4db37e8d1e970"),
91+
"Q": plumbing.NewHash("dce0e0c20d701c3d260146e443d6b3b079505191"),
92+
"GQ1": plumbing.NewHash("ccaaa99c21dad7e9f392c36ae8cb72dc63bed458"),
93+
"GQ2": plumbing.NewHash("806824d4778e94fe7c3244e92a9cd07090c9ab54"),
94+
"A^": plumbing.NewHash("31a7e081a28f149ee98ffd13ba1a6d841a5f46fd"),
95+
"A^^": plumbing.NewHash("bb355b64e18386dbc3af63dfd09c015c44cbd9b6"),
96+
"A^^^": plumbing.NewHash("8d08dd1388b82dd354cb43918d83da86c76b0978"),
97+
"N^": plumbing.NewHash("b6e1fc8dad4f1068fb42774ec5fc65c065b2c312"),
98+
}
99+
100+
func (s *orphansSuite) commitsFromRevs(c *C, revs []string) ([]*Commit, error) {
101+
var commits []*Commit
102+
for _, rev := range revs {
103+
hash, ok := revisionIndex[rev]
104+
if !ok {
105+
return nil, fmt.Errorf("Revision not found '%s'", rev)
106+
}
107+
108+
commits = append(commits, s.commit(c, hash))
109+
}
110+
111+
return commits, nil
89112
}
90113

91114
// AssertMergeBase validates that the merge-base of the passed revs,
92115
// matches the expected result
93116
func (s *orphansSuite) AssertMergeBase(c *C, revs, expectedRevs []string) {
94117
c.Assert(revs, HasLen, 2)
95118

96-
commits, err := commitsFromRevs(s.Repository, revs)
119+
commits, err := s.commitsFromRevs(c, revs)
97120
c.Assert(err, IsNil)
98121

99-
results, err := MergeBase(commits[0], commits[1])
122+
results, err := commits[0].MergeBase(commits[1])
100123
c.Assert(err, IsNil)
101124

102-
expected, err := commitsFromRevs(s.Repository, expectedRevs)
125+
expected, err := s.commitsFromRevs(c, expectedRevs)
103126
c.Assert(err, IsNil)
104127

105128
c.Assert(results, HasLen, len(expected))
@@ -113,13 +136,13 @@ func (s *orphansSuite) AssertMergeBase(c *C, revs, expectedRevs []string) {
113136

114137
// AssertIndependents validates the independent commits of the passed list
115138
func (s *orphansSuite) AssertIndependents(c *C, revs, expectedRevs []string) {
116-
commits, err := commitsFromRevs(s.Repository, revs)
139+
commits, err := s.commitsFromRevs(c, revs)
117140
c.Assert(err, IsNil)
118141

119142
results, err := Independents(commits)
120143
c.Assert(err, IsNil)
121144

122-
expected, err := commitsFromRevs(s.Repository, expectedRevs)
145+
expected, err := s.commitsFromRevs(c, expectedRevs)
123146
c.Assert(err, IsNil)
124147

125148
c.Assert(results, HasLen, len(expected))
@@ -131,14 +154,14 @@ func (s *orphansSuite) AssertIndependents(c *C, revs, expectedRevs []string) {
131154
}
132155
}
133156

134-
// AssertAncestor validates the independent commits of the passed list
157+
// AssertAncestor validates if the first rev is ancestor of the second one
135158
func (s *orphansSuite) AssertAncestor(c *C, revs []string, shouldBeAncestor bool) {
136159
c.Assert(revs, HasLen, 2)
137160

138-
commits, err := commitsFromRevs(s.Repository, revs)
161+
commits, err := s.commitsFromRevs(c, revs)
139162
c.Assert(err, IsNil)
140163

141-
isAncestor, err := IsAncestor(commits[0], commits[1])
164+
isAncestor, err := commits[0].IsAncestor(commits[1])
142165
c.Assert(err, IsNil)
143166
c.Assert(isAncestor, Equals, shouldBeAncestor)
144167
}

0 commit comments

Comments
 (0)