14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
from bzrlib.selftest import InTempDir
20
from bzrlib.selftest import TestCaseInTempDir
21
from bzrlib.branch import Branch
22
from bzrlib.commit import commit
23
from bzrlib.fetch import fetch
24
from bzrlib.revision import (find_present_ancestors, common_ancestor,
26
from bzrlib.errors import NoSuchRevision
20
28
def make_branches():
21
from bzrlib.branch import Branch
22
from bzrlib.commit import commit
24
29
os.mkdir("branch1")
25
30
br1 = Branch("branch1", init=True)
26
commit(br1, "Commit one")
27
commit(br1, "Commit two")
28
commit(br1, "Commit three")
32
commit(br1, "Commit one", rev_id="a@u-0-0")
33
commit(br1, "Commit two", rev_id="a@u-0-1")
34
commit(br1, "Commit three", rev_id="a@u-0-2")
30
36
os.mkdir("branch2")
31
37
br2 = Branch("branch2", init=True)
32
38
br2.update_revisions(br1)
33
commit(br2, "Commit four")
34
commit(br2, "Commit five")
39
commit(br2, "Commit four", rev_id="b@u-0-3")
40
commit(br2, "Commit five", rev_id="b@u-0-4")
35
41
revisions_2 = br2.revision_history()
43
fetch(from_branch=br2, to_branch=br1)
36
44
br1.add_pending_merge(revisions_2[4])
37
commit(br1, "Commit six")
45
commit(br1, "Commit six", rev_id="a@u-0-3")
46
commit(br1, "Commit seven", rev_id="a@u-0-4")
47
commit(br2, "Commit eight", rev_id="b@u-0-5")
49
fetch(from_branch=br2, to_branch=br1)
50
br1.add_pending_merge(br2.revision_history()[5])
51
commit(br1, "Commit nine", rev_id="a@u-0-5")
53
fetch(from_branch=br1, to_branch=br2)
54
br2.add_pending_merge(br1.revision_history()[4])
55
commit(br2, "Commit ten", rev_id="b@u-0-6")
57
fetch(from_branch=br2, to_branch=br1)
41
class TestIsAncestor(InTempDir):
42
"""Test checking whether a revision is an ancestor of another revision"""
44
from bzrlib.revision import is_ancestor, MultipleRevisionSources
45
from bzrlib.errors import NoSuchRevision
62
class TestIsAncestor(TestCaseInTempDir):
63
def test_recorded_ancestry(self):
64
"""Test that commit records all ancestors"""
65
br1, br2 = make_branches()
66
d = [('a@u-0-0', ['a@u-0-0']),
67
('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
68
('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
69
('b@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3']),
70
('b@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-3', 'b@u-0-4']),
72
for branch in br1, br2:
74
self.assertEquals(sorted(branch.get_ancestry(rev_id)),
78
def test_is_ancestor(self):
79
"""Test checking whether a revision is an ancestor of another revision"""
46
80
br1, br2 = make_branches()
47
81
revisions = br1.revision_history()
48
82
revisions_2 = br2.revision_history()
49
sources = MultipleRevisionSources(br1, br2)
51
assert is_ancestor(revisions[0], revisions[0], sources)
85
assert is_ancestor(revisions[0], revisions[0], br1)
52
86
assert is_ancestor(revisions[1], revisions[0], sources)
53
87
assert not is_ancestor(revisions[0], revisions[1], sources)
54
88
assert is_ancestor(revisions_2[3], revisions[0], sources)
55
self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
89
# disabled mbp 20050914, doesn't seem to happen anymore
90
## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
57
92
assert is_ancestor(revisions[3], revisions_2[4], sources)
58
93
assert is_ancestor(revisions[3], revisions_2[4], br1)
59
94
assert is_ancestor(revisions[3], revisions_2[3], sources)
60
95
assert not is_ancestor(revisions[3], revisions_2[3], br1)
99
class TestIntermediateRevisions(TestCaseInTempDir):
102
from bzrlib.commit import commit
103
TestCaseInTempDir.setUp(self)
104
self.br1, self.br2 = make_branches()
106
self.br2.commit("Commit eleven", rev_id="b@u-0-7")
107
self.br2.commit("Commit twelve", rev_id="b@u-0-8")
108
self.br2.commit("Commit thirtteen", rev_id="b@u-0-9")
110
fetch(from_branch=self.br2, to_branch=self.br1)
111
self.br1.add_pending_merge(self.br2.revision_history()[6])
112
self.br1.commit("Commit fourtten", rev_id="a@u-0-6")
114
fetch(from_branch=self.br1, to_branch=self.br2)
115
self.br2.add_pending_merge(self.br1.revision_history()[6])
116
self.br2.commit("Commit fifteen", rev_id="b@u-0-10")
118
from bzrlib.revision import MultipleRevisionSources
119
self.sources = MultipleRevisionSources(self.br1, self.br2)
121
def intervene(self, ancestor, revision, revision_history=None):
122
from bzrlib.revision import get_intervening_revisions
123
return get_intervening_revisions(ancestor,revision, self.sources,
126
def test_intervene(self):
127
"""Find intermediate revisions, without requiring history"""
128
from bzrlib.errors import NotAncestor, NoSuchRevision
129
assert len(self.intervene('a@u-0-0', 'a@u-0-0')) == 0
130
self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-1'), ['a@u-0-1'])
131
self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-2'),
132
['a@u-0-1', 'a@u-0-2'])
133
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-3'),
134
['a@u-0-1', 'a@u-0-2', 'b@u-0-3'])
135
self.assertEqual(self.intervene('b@u-0-3', 'a@u-0-3'),
136
['b@u-0-4', 'a@u-0-3'])
137
self.assertEqual(self.intervene('a@u-0-2', 'a@u-0-3',
138
self.br1.revision_history()),
140
self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-5',
141
self.br1.revision_history()),
142
['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
144
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6',
145
self.br1.revision_history()),
146
['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
148
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'),
149
['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
151
self.assertEqual(self.intervene('b@u-0-3', 'b@u-0-6',
152
self.br2.revision_history()),
153
['b@u-0-4', 'b@u-0-5', 'b@u-0-6'])
154
self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10'),
155
['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
156
self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10',
157
self.br2.revision_history()),
158
['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
159
self.assertRaises(NotAncestor, self.intervene, 'b@u-0-10', 'b@u-0-6',
160
self.br2.revision_history())
161
self.assertRaises(NoSuchRevision, self.intervene, 'c@u-0-10',
162
'b@u-0-6', self.br2.revision_history())
163
self.assertRaises(NoSuchRevision, self.intervene, 'b@u-0-10',
164
'c@u-0-6', self.br2.revision_history())
167
class TestCommonAncestor(TestCaseInTempDir):
168
"""Test checking whether a revision is an ancestor of another revision"""
170
def test_common_ancestor(self):
171
br1, br2 = make_branches()
172
revisions = br1.revision_history()
173
revisions_2 = br2.revision_history()
176
expected_ancestors_list = {revisions[3]:(0, 0),
178
revisions_2[4]:(2, 1),
180
revisions_2[3]:(4, 2),
181
revisions[0]:(5, 3) }
182
ancestors_list = find_present_ancestors(revisions[3], sources)
183
assert len(expected_ancestors_list) == len(ancestors_list)
184
for key, value in expected_ancestors_list.iteritems():
185
self.assertEqual(ancestors_list[key], value,
186
"key %r, %r != %r" % (key, ancestors_list[key],
189
self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
191
self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
193
self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
195
self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
197
self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
199
self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
201
self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
203
self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
207
if __name__ == '__main__':