20
from bzrlib.selftest import TestCaseInTempDir
21
20
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
24
from bzrlib.revision import (find_present_ancestors, combined_graph,
25
25
is_ancestor, MultipleRevisionSources)
26
from bzrlib.tests import TestCaseWithTransport
26
27
from bzrlib.trace import mutter
27
from bzrlib.errors import NoSuchRevision
28
from bzrlib.workingtree import WorkingTree
30
# XXX: Make this a method of a merge base case
31
def make_branches(self):
30
32
"""Create two branches
32
34
branch 1 has 6 commits, branch 2 has 3 commits
47
49
so A is missing b6 at the start
48
50
and B is missing a3, a4, a5
51
br1 = Branch.initialize("branch1")
52
tree1 = self.make_branch_and_tree("branch1")
53
commit(br1, "Commit one", rev_id="a@u-0-0")
54
commit(br1, "Commit two", rev_id="a@u-0-1")
55
commit(br1, "Commit three", rev_id="a@u-0-2")
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")
58
br2 = Branch.initialize("branch2")
59
tree2 = self.make_branch_and_tree("branch2")
59
61
br2.update_revisions(br1)
60
commit(br2, "Commit four", rev_id="b@u-0-3")
61
commit(br2, "Commit five", rev_id="b@u-0-4")
62
tree2.commit("Commit four", rev_id="b@u-0-3")
63
tree2.commit("Commit five", rev_id="b@u-0-4")
62
64
revisions_2 = br2.revision_history()
64
66
fetch(from_branch=br2, to_branch=br1)
65
br1.add_pending_merge(revisions_2[4])
66
assert revisions_2[4] == 'b@u-0-4'
67
commit(br1, "Commit six", rev_id="a@u-0-3")
68
commit(br1, "Commit seven", rev_id="a@u-0-4")
69
commit(br2, "Commit eight", rev_id="b@u-0-5")
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")
71
73
fetch(from_branch=br2, to_branch=br1)
72
br1.add_pending_merge(br2.revision_history()[5])
73
commit(br1, "Commit nine", rev_id="a@u-0-5")
74
tree1.add_pending_merge(br2.revision_history()[5])
75
tree1.commit("Commit nine", rev_id="a@u-0-5")
74
76
# DO NOT FETCH HERE - we WANT a GHOST.
75
77
#fetch(from_branch=br1, to_branch=br2)
76
br2.add_pending_merge(br1.revision_history()[4])
77
commit(br2, "Commit ten - ghost merge", rev_id="b@u-0-6")
78
tree2.add_pending_merge(br1.revision_history()[4])
79
tree2.commit("Commit ten - ghost merge", rev_id="b@u-0-6")
82
class TestIsAncestor(TestCaseInTempDir):
84
class TestIsAncestor(TestCaseWithTransport):
83
86
def test_recorded_ancestry(self):
84
87
"""Test that commit records all ancestors"""
85
br1, br2 = make_branches()
88
br1, br2 = make_branches(self)
86
89
d = [('a@u-0-0', ['a@u-0-0']),
87
90
('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
88
91
('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
111
114
if rev_id in br2_only and not branch is br2:
113
116
mutter('ancestry of {%s}: %r',
114
rev_id, branch.get_ancestry(rev_id))
115
self.assertEquals(sorted(branch.get_ancestry(rev_id)),
116
[None] + sorted(anc))
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))
119
122
def test_is_ancestor(self):
120
123
"""Test checking whether a revision is an ancestor of another revision"""
121
br1, br2 = make_branches()
124
br1, br2 = make_branches(self)
122
125
revisions = br1.revision_history()
123
126
revisions_2 = br2.revision_history()
126
assert is_ancestor(revisions[0], revisions[0], br1)
127
assert is_ancestor(revisions[1], revisions[0], sources)
128
assert not is_ancestor(revisions[0], revisions[1], sources)
129
assert is_ancestor(revisions_2[3], revisions[0], sources)
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))
130
133
# disabled mbp 20050914, doesn't seem to happen anymore
131
134
## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
132
135
## revisions[0], br1)
133
assert is_ancestor(revisions[3], revisions_2[4], sources)
134
assert is_ancestor(revisions[3], revisions_2[4], br1)
135
assert is_ancestor(revisions[3], revisions_2[3], sources)
136
## assert not is_ancestor(revisions[3], revisions_2[3], br1)
139
class TestIntermediateRevisions(TestCaseInTempDir):
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):
142
145
from bzrlib.commit import commit
143
TestCaseInTempDir.setUp(self)
144
self.br1, self.br2 = make_branches()
146
self.br2.commit("Commit eleven", rev_id="b@u-0-7")
147
self.br2.commit("Commit twelve", rev_id="b@u-0-8")
148
self.br2.commit("Commit thirtteen", rev_id="b@u-0-9")
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")
150
154
fetch(from_branch=self.br2, to_branch=self.br1)
151
self.br1.add_pending_merge(self.br2.revision_history()[6])
152
self.br1.commit("Commit fourtten", rev_id="a@u-0-6")
155
wt1.add_pending_merge(self.br2.revision_history()[6])
156
wt1.commit("Commit fourtten", rev_id="a@u-0-6")
154
158
fetch(from_branch=self.br1, to_branch=self.br2)
155
self.br2.add_pending_merge(self.br1.revision_history()[6])
156
self.br2.commit("Commit fifteen", rev_id="b@u-0-10")
159
wt2.add_pending_merge(self.br1.revision_history()[6])
160
wt2.commit("Commit fifteen", rev_id="b@u-0-10")
158
162
from bzrlib.revision import MultipleRevisionSources
159
self.sources = MultipleRevisionSources(self.br1, self.br2)
163
self.sources = MultipleRevisionSources(self.br1.repository,
161
166
def intervene(self, ancestor, revision, revision_history=None):
162
167
from bzrlib.revision import get_intervening_revisions
181
186
self.br1.revision_history()),
182
187
['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
184
print ("testrevision.py 191 - intervene appears to return b..6 even"
185
"though it is not reachable!")
186
# self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6',
187
# self.br1.revision_history()),
188
# ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
190
# self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'),
191
# ['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
189
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6',
190
self.br1.revision_history()),
191
['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
193
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'),
194
['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
193
196
self.assertEqual(self.intervene('b@u-0-3', 'b@u-0-6',
194
197
self.br2.revision_history()),
195
198
['b@u-0-4', 'b@u-0-5', 'b@u-0-6'])
288
291
"""combined_graph
289
292
Ensure it's not order-sensitive
291
br1, br2 = make_branches()
292
source = MultipleRevisionSources(br1, br2)
294
br1, br2 = make_branches(self)
295
source = MultipleRevisionSources(br1.repository, br2.repository)
293
296
combined_1 = combined_graph(br1.last_revision(),
294
297
br2.last_revision(), source)
295
298
combined_2 = combined_graph(br2.last_revision(),
296
299
br1.last_revision(), source)
297
assert combined_1[1] == combined_2[1]
298
assert combined_1[2] == combined_2[2]
299
assert combined_1[3] == combined_2[3]
300
assert combined_1 == combined_2
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)