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 Fetcher
20
25
def make_branches():
21
from bzrlib.branch import Branch
22
from bzrlib.commit import commit
24
26
os.mkdir("branch1")
25
27
br1 = Branch("branch1", init=True)
26
commit(br1, "Commit one")
27
commit(br1, "Commit two")
28
commit(br1, "Commit three")
29
commit(br1, "Commit one", rev_id="a@u-0-0")
30
commit(br1, "Commit two", rev_id="a@u-0-1")
31
commit(br1, "Commit three", rev_id="a@u-0-2")
30
33
os.mkdir("branch2")
31
34
br2 = Branch("branch2", init=True)
32
35
br2.update_revisions(br1)
33
commit(br2, "Commit four")
34
commit(br2, "Commit five")
36
commit(br2, "Commit four", rev_id="b@u-0-3")
37
commit(br2, "Commit five", rev_id="b@u-0-4")
35
38
revisions_2 = br2.revision_history()
40
## Fetch(from_branch=br2, to_branch=br1)
36
41
br1.add_pending_merge(revisions_2[4])
37
commit(br1, "Commit six")
42
commit(br1, "Commit six", rev_id="a@u-0-3")
43
commit(br1, "Commit seven", rev_id="a@u-0-4")
44
commit(br2, "Commit eight", rev_id="b@u-0-5")
45
br1.add_pending_merge(br2.revision_history()[5])
46
commit(br1, "Commit nine", rev_id="a@u-0-5")
47
br2.add_pending_merge(br1.revision_history()[4])
48
commit(br2, "Commit ten", rev_id="b@u-0-6")
41
class TestIsAncestor(InTempDir):
42
"""Test checking whether a revision is an ancestor of another revision"""
52
class TestIsAncestor(TestCaseInTempDir):
53
def test_is_ancestor(self):
54
"""Test checking whether a revision is an ancestor of another revision"""
44
55
from bzrlib.revision import is_ancestor, MultipleRevisionSources
45
56
from bzrlib.errors import NoSuchRevision
46
57
br1, br2 = make_branches()
59
70
assert is_ancestor(revisions[3], revisions_2[3], sources)
60
71
assert not is_ancestor(revisions[3], revisions_2[3], br1)
73
class TestIntermediateRevisions(TestCaseInTempDir):
76
from bzrlib.commit import commit
77
TestCaseInTempDir.setUp(self)
78
self.br1, self.br2 = make_branches()
79
commit(self.br2, "Commit eleven", rev_id="b@u-0-7")
80
commit(self.br2, "Commit twelve", rev_id="b@u-0-8")
81
commit(self.br2, "Commit thirtteen", rev_id="b@u-0-9")
82
self.br1.add_pending_merge(self.br2.revision_history()[6])
83
commit(self.br1, "Commit fourtten", rev_id="a@u-0-6")
84
self.br2.add_pending_merge(self.br1.revision_history()[6])
85
commit(self.br2, "Commit fifteen", rev_id="b@u-0-10")
87
from bzrlib.revision import MultipleRevisionSources
88
self.sources = MultipleRevisionSources(self.br1, self.br2)
90
def intervene(self, ancestor, revision, revision_history=None):
91
from bzrlib.revision import get_intervening_revisions
92
return get_intervening_revisions(ancestor,revision, self.sources,
95
def test_intervene(self):
96
"""Find intermediate revisions, without requiring history"""
97
from bzrlib.errors import NotAncestor, NoSuchRevision
98
assert len(self.intervene('a@u-0-0', 'a@u-0-0')) == 0
99
self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-1'), ['a@u-0-1'])
100
self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-2'),
101
['a@u-0-1', 'a@u-0-2'])
102
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-3'),
103
['a@u-0-1', 'a@u-0-2', 'b@u-0-3'])
104
self.assertEqual(self.intervene('b@u-0-3', 'a@u-0-3'),
105
['b@u-0-4', 'a@u-0-3'])
106
self.assertEqual(self.intervene('a@u-0-2', 'a@u-0-3',
107
self.br1.revision_history()),
109
self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-5',
110
self.br1.revision_history()),
111
['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
113
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6',
114
self.br1.revision_history()),
115
['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
117
self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'),
118
['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
120
self.assertEqual(self.intervene('b@u-0-3', 'b@u-0-6',
121
self.br2.revision_history()),
122
['b@u-0-4', 'b@u-0-5', 'b@u-0-6'])
123
self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10'),
124
['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
125
self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10',
126
self.br2.revision_history()),
127
['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
128
self.assertRaises(NotAncestor, self.intervene, 'b@u-0-10', 'b@u-0-6',
129
self.br2.revision_history())
130
self.assertRaises(NoSuchRevision, self.intervene, 'c@u-0-10',
131
'b@u-0-6', self.br2.revision_history())
132
self.assertRaises(NoSuchRevision, self.intervene, 'b@u-0-10',
133
'c@u-0-6', self.br2.revision_history())
136
class TestCommonAncestor(TestCaseInTempDir):
137
"""Test checking whether a revision is an ancestor of another revision"""
139
def test_common_ancestor(self):
140
from bzrlib.revision import find_present_ancestors, common_ancestor
141
from bzrlib.revision import MultipleRevisionSources
142
br1, br2 = make_branches()
143
revisions = br1.revision_history()
144
revisions_2 = br2.revision_history()
145
sources = MultipleRevisionSources(br1, br2)
147
expected_ancestors_list = {revisions[3]:(0, 0),
149
revisions_2[4]:(2, 1),
151
revisions_2[3]:(4, 2),
152
revisions[0]:(5, 3) }
153
ancestors_list = find_present_ancestors(revisions[3], sources)
154
assert len(expected_ancestors_list) == len(ancestors_list)
155
for key, value in expected_ancestors_list.iteritems():
156
self.assertEqual(ancestors_list[key], value,
157
"key %r, %r != %r" % (key, ancestors_list[key],
160
self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
162
self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
164
self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
166
self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
168
self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
170
self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
172
self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
174
self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
178
if __name__ == '__main__':