1
# (C) 2005 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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
30
br1 = Branch("branch1", init=True)
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")
37
br2 = Branch("branch2", init=True)
38
br2.update_revisions(br1)
39
commit(br2, "Commit four", rev_id="b@u-0-3")
40
commit(br2, "Commit five", rev_id="b@u-0-4")
41
revisions_2 = br2.revision_history()
43
fetch(from_branch=br2, to_branch=br1)
44
br1.add_pending_merge(revisions_2[4])
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)
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"""
80
br1, br2 = make_branches()
81
revisions = br1.revision_history()
82
revisions_2 = br2.revision_history()
85
assert is_ancestor(revisions[0], revisions[0], br1)
86
assert is_ancestor(revisions[1], revisions[0], sources)
87
assert not is_ancestor(revisions[0], revisions[1], sources)
88
assert is_ancestor(revisions_2[3], revisions[0], sources)
89
# disabled mbp 20050914, doesn't seem to happen anymore
90
## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
92
assert is_ancestor(revisions[3], revisions_2[4], sources)
93
assert is_ancestor(revisions[3], revisions_2[4], br1)
94
assert is_ancestor(revisions[3], revisions_2[3], sources)
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__':