20
from bzrlib.selftest import TestCaseInTempDir
20
21
from bzrlib.branch import Branch
21
from bzrlib.errors import NoSuchRevision
22
22
from bzrlib.commit import commit
23
23
from bzrlib.fetch import fetch
24
from bzrlib.revision import (find_present_ancestors, combined_graph,
25
is_ancestor, MultipleRevisionSources)
26
from bzrlib.tests import TestCaseWithTransport
24
from bzrlib.revision import (find_present_ancestors, common_ancestor,
27
26
from bzrlib.trace import mutter
28
from bzrlib.workingtree import WorkingTree
30
# XXX: Make this a method of a merge base case
31
def make_branches(self):
32
"""Create two branches
34
branch 1 has 6 commits, branch 2 has 3 commits
35
commit 10 was a psuedo merge from branch 1
36
but has been disabled until ghost support is
49
so A is missing b6 at the start
50
and B is missing a3, a4, a5
52
tree1 = self.make_branch_and_tree("branch1")
27
from bzrlib.errors import NoSuchRevision
31
br1 = Branch("branch1", init=True)
55
tree1.commit("Commit one", rev_id="a@u-0-0")
56
tree1.commit("Commit two", rev_id="a@u-0-1")
57
tree1.commit("Commit three", rev_id="a@u-0-2")
33
commit(br1, "Commit one", rev_id="a@u-0-0")
34
commit(br1, "Commit two", rev_id="a@u-0-1")
35
commit(br1, "Commit three", rev_id="a@u-0-2")
59
tree2 = self.make_branch_and_tree("branch2")
38
br2 = Branch("branch2", init=True)
61
39
br2.update_revisions(br1)
62
tree2.commit("Commit four", rev_id="b@u-0-3")
63
tree2.commit("Commit five", rev_id="b@u-0-4")
40
commit(br2, "Commit four", rev_id="b@u-0-3")
41
commit(br2, "Commit five", rev_id="b@u-0-4")
64
42
revisions_2 = br2.revision_history()
66
44
fetch(from_branch=br2, to_branch=br1)
67
tree1.add_pending_merge(revisions_2[4])
68
self.assertEquals(revisions_2[4], 'b@u-0-4')
69
tree1.commit("Commit six", rev_id="a@u-0-3")
70
tree1.commit("Commit seven", rev_id="a@u-0-4")
71
tree2.commit("Commit eight", rev_id="b@u-0-5")
45
br1.add_pending_merge(revisions_2[4])
46
assert revisions_2[4] == 'b@u-0-4'
47
commit(br1, "Commit six", rev_id="a@u-0-3")
48
commit(br1, "Commit seven", rev_id="a@u-0-4")
49
commit(br2, "Commit eight", rev_id="b@u-0-5")
73
51
fetch(from_branch=br2, to_branch=br1)
74
tree1.add_pending_merge(br2.revision_history()[5])
75
tree1.commit("Commit nine", rev_id="a@u-0-5")
76
# DO NOT FETCH HERE - we WANT a GHOST.
77
#fetch(from_branch=br1, to_branch=br2)
78
tree2.add_pending_merge(br1.revision_history()[4])
79
tree2.commit("Commit ten - ghost merge", rev_id="b@u-0-6")
52
br1.add_pending_merge(br2.revision_history()[5])
53
commit(br1, "Commit nine", rev_id="a@u-0-5")
55
fetch(from_branch=br1, to_branch=br2)
56
br2.add_pending_merge(br1.revision_history()[4])
57
commit(br2, "Commit ten", rev_id="b@u-0-6")
59
fetch(from_branch=br2, to_branch=br1)
84
class TestIsAncestor(TestCaseWithTransport):
64
class TestIsAncestor(TestCaseInTempDir):
86
65
def test_recorded_ancestry(self):
87
66
"""Test that commit records all ancestors"""
88
br1, br2 = make_branches(self)
67
br1, br2 = make_branches()
89
68
d = [('a@u-0-0', ['a@u-0-0']),
90
69
('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
91
70
('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
101
80
('a@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
102
81
'b@u-0-3', 'b@u-0-4',
103
82
'b@u-0-5', 'a@u-0-5']),
104
('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2',
83
('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
105
84
'b@u-0-3', 'b@u-0-4',
106
85
'b@u-0-5', 'b@u-0-6']),
108
br1_only = ('a@u-0-3', 'a@u-0-4', 'a@u-0-5')
109
br2_only = ('b@u-0-6',)
110
87
for branch in br1, br2:
111
88
for rev_id, anc in d:
112
if rev_id in br1_only and not branch is br1:
114
if rev_id in br2_only and not branch is br2:
116
89
mutter('ancestry of {%s}: %r',
117
rev_id, branch.repository.get_ancestry(rev_id))
118
result = sorted(branch.repository.get_ancestry(rev_id))
119
self.assertEquals(result, [None] + sorted(anc))
90
rev_id, branch.get_ancestry(rev_id))
91
self.assertEquals(sorted(branch.get_ancestry(rev_id)),
122
95
def test_is_ancestor(self):
123
96
"""Test checking whether a revision is an ancestor of another revision"""
124
br1, br2 = make_branches(self)
97
br1, br2 = make_branches()
125
98
revisions = br1.revision_history()
126
99
revisions_2 = br2.revision_history()
129
self.assert_(is_ancestor(revisions[0], revisions[0], br1))
130
self.assert_(is_ancestor(revisions[1], revisions[0], sources))
131
self.assert_(not is_ancestor(revisions[0], revisions[1], sources))
132
self.assert_(is_ancestor(revisions_2[3], revisions[0], sources))
133
# disabled mbp 20050914, doesn't seem to happen anymore
102
assert is_ancestor(revisions[0], revisions[0], br1)
103
assert is_ancestor(revisions[1], revisions[0], sources)
104
assert not is_ancestor(revisions[0], revisions[1], sources)
105
assert is_ancestor(revisions_2[3], revisions[0], sources)
106
# disabled mbp 20050914, doesn't seem to happen anymore
134
107
## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
135
108
## revisions[0], br1)
136
self.assert_(is_ancestor(revisions[3], revisions_2[4], sources))
137
self.assert_(is_ancestor(revisions[3], revisions_2[4], br1))
138
self.assert_(is_ancestor(revisions[3], revisions_2[3], sources))
139
## self.assert_(not is_ancestor(revisions[3], revisions_2[3], br1))
142
class TestIntermediateRevisions(TestCaseWithTransport):
109
assert is_ancestor(revisions[3], revisions_2[4], sources)
110
assert is_ancestor(revisions[3], revisions_2[4], br1)
111
assert is_ancestor(revisions[3], revisions_2[3], sources)
112
## assert not is_ancestor(revisions[3], revisions_2[3], br1)
116
class TestIntermediateRevisions(TestCaseInTempDir):
145
119
from bzrlib.commit import commit
146
TestCaseWithTransport.setUp(self)
147
self.br1, self.br2 = make_branches(self)
148
wt1 = self.br1.bzrdir.open_workingtree()
149
wt2 = self.br2.bzrdir.open_workingtree()
150
wt2.commit("Commit eleven", rev_id="b@u-0-7")
151
wt2.commit("Commit twelve", rev_id="b@u-0-8")
152
wt2.commit("Commit thirtteen", rev_id="b@u-0-9")
154
fetch(from_branch=self.br2, to_branch=self.br1)
155
wt1.add_pending_merge(self.br2.revision_history()[6])
156
wt1.commit("Commit fourtten", rev_id="a@u-0-6")
158
fetch(from_branch=self.br1, to_branch=self.br2)
159
wt2.add_pending_merge(self.br1.revision_history()[6])
160
wt2.commit("Commit fifteen", rev_id="b@u-0-10")
120
TestCaseInTempDir.setUp(self)
121
self.br1, self.br2 = make_branches()
123
self.br2.commit("Commit eleven", rev_id="b@u-0-7")
124
self.br2.commit("Commit twelve", rev_id="b@u-0-8")
125
self.br2.commit("Commit thirtteen", rev_id="b@u-0-9")
127
fetch(from_branch=self.br2, to_branch=self.br1)
128
self.br1.add_pending_merge(self.br2.revision_history()[6])
129
self.br1.commit("Commit fourtten", rev_id="a@u-0-6")
131
fetch(from_branch=self.br1, to_branch=self.br2)
132
self.br2.add_pending_merge(self.br1.revision_history()[6])
133
self.br2.commit("Commit fifteen", rev_id="b@u-0-10")
162
135
from bzrlib.revision import MultipleRevisionSources
163
self.sources = MultipleRevisionSources(self.br1.repository,
136
self.sources = MultipleRevisionSources(self.br1, self.br2)
166
138
def intervene(self, ancestor, revision, revision_history=None):
167
139
from bzrlib.revision import get_intervening_revisions
246
216
self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
248
fetch(from_branch=br2, to_branch=br1)
249
218
self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
250
revisions[4]) # revisions_2[5] is equally valid
251
220
self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
254
def test_common_ancestor(self):
255
"""Pick a reasonable merge base"""
256
from bzrlib.revision import common_ancestor
257
br1, br2 = make_branches(self)
258
revisions = br1.revision_history()
259
revisions_2 = br2.revision_history()
260
sources = MultipleRevisionSources(br1.repository, br2.repository)
261
expected_ancestors_list = {revisions[3]:(0, 0),
263
revisions_2[4]:(2, 1),
265
revisions_2[3]:(4, 2),
266
revisions[0]:(5, 3) }
267
ancestors_list = find_present_ancestors(revisions[3], sources)
268
self.assertEquals(len(expected_ancestors_list), len(ancestors_list))
269
for key, value in expected_ancestors_list.iteritems():
270
self.assertEqual(ancestors_list[key], value,
271
"key %r, %r != %r" % (key, ancestors_list[key],
273
self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
275
self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
277
self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
279
self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
281
self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
283
self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
285
self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
286
revisions[4]) # revisions_2[5] is equally valid
287
self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
288
revisions[4]) # revisions_2[5] is equally valid
290
def test_combined(self):
292
Ensure it's not order-sensitive
294
br1, br2 = make_branches(self)
295
source = MultipleRevisionSources(br1.repository, br2.repository)
296
combined_1 = combined_graph(br1.last_revision(),
297
br2.last_revision(), source)
298
combined_2 = combined_graph(br2.last_revision(),
299
br1.last_revision(), source)
300
self.assertEquals(combined_1[1], combined_2[1])
301
self.assertEquals(combined_1[2], combined_2[2])
302
self.assertEquals(combined_1[3], combined_2[3])
303
self.assertEquals(combined_1, combined_2)
305
def test_get_history(self):
306
# TODO: test ghosts on the left hand branch's impact
307
# TODO: test ghosts on all parents, we should get some
308
# indicator. i.e. NULL_REVISION
310
tree = self.make_branch_and_tree('.')
311
tree.commit('1', rev_id = '1', allow_pointless=True)
312
tree.commit('2', rev_id = '2', allow_pointless=True)
313
tree.commit('3', rev_id = '3', allow_pointless=True)
314
rev = tree.branch.repository.get_revision('1')
315
history = rev.get_history(tree.branch.repository)
316
self.assertEqual([None, '1'], history)
317
rev = tree.branch.repository.get_revision('2')
318
history = rev.get_history(tree.branch.repository)
319
self.assertEqual([None, '1', '2'], history)
320
rev = tree.branch.repository.get_revision('3')
321
history = rev.get_history(tree.branch.repository)
322
self.assertEqual([None, '1', '2' ,'3'], history)
224
if __name__ == '__main__':