/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
1
# (C) 2005 Canonical Ltd
2
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.
7
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.
12
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
16
1263 by Martin Pool
- clean up imports
17
18
import os
19
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
20
from bzrlib.selftest import TestCaseInTempDir
1263 by Martin Pool
- clean up imports
21
from bzrlib.branch import Branch
22
from bzrlib.commit import commit
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
23
from bzrlib.fetch import fetch
1390 by Robert Collins
pair programming worx... merge integration and weave
24
from bzrlib.revision import (find_present_ancestors, combined_graph,
25
                             is_ancestor, MultipleRevisionSources)
1270 by Martin Pool
- fix recording of merged ancestry lines
26
from bzrlib.trace import mutter
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
27
from bzrlib.errors import NoSuchRevision
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
28
29
def make_branches():
30
    os.mkdir("branch1")
1185.2.9 by Lalo Martins
getting rid of everything that calls the Branch constructor directly
31
    br1 = Branch.initialize("branch1")
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
32
    
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")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
36
37
    os.mkdir("branch2")
1185.2.9 by Lalo Martins
getting rid of everything that calls the Branch constructor directly
38
    br2 = Branch.initialize("branch2")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
39
    br2.update_revisions(br1)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
40
    commit(br2, "Commit four", rev_id="b@u-0-3")
41
    commit(br2, "Commit five", rev_id="b@u-0-4")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
42
    revisions_2 = br2.revision_history()
1263 by Martin Pool
- clean up imports
43
    
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
44
    fetch(from_branch=br2, to_branch=br1)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
45
    br1.add_pending_merge(revisions_2[4])
1270 by Martin Pool
- fix recording of merged ancestry lines
46
    assert revisions_2[4] == 'b@u-0-4'
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
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")
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
50
    
51
    fetch(from_branch=br2, to_branch=br1)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
52
    br1.add_pending_merge(br2.revision_history()[5])
53
    commit(br1, "Commit nine", rev_id="a@u-0-5")
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
54
55
    fetch(from_branch=br1, to_branch=br2)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
56
    br2.add_pending_merge(br1.revision_history()[4])
57
    commit(br2, "Commit ten", rev_id="b@u-0-6")
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
58
59
    fetch(from_branch=br2, to_branch=br1)
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
60
    
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
61
    return br1, br2
62
63
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
64
class TestIsAncestor(TestCaseInTempDir):
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
65
    def test_recorded_ancestry(self):
66
        """Test that commit records all ancestors"""
67
        br1, br2 = make_branches()
68
        d = [('a@u-0-0', ['a@u-0-0']),
69
             ('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
70
             ('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
71
             ('b@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3']),
1270 by Martin Pool
- fix recording of merged ancestry lines
72
             ('b@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3',
73
                          'b@u-0-4']),
74
             ('a@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
75
                          'a@u-0-3']),
1271 by Martin Pool
- more commit ancestry tests
76
             ('a@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
77
                          'a@u-0-3', 'a@u-0-4']),
78
             ('b@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
79
                          'b@u-0-5']),
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',
81
                          'b@u-0-3', 'b@u-0-4',
82
                          'b@u-0-5', 'a@u-0-5']),
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',
84
                          'b@u-0-3', 'b@u-0-4',
85
                          'b@u-0-5', 'b@u-0-6']),
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
86
             ]
87
        for branch in br1, br2:
88
            for rev_id, anc in d:
1270 by Martin Pool
- fix recording of merged ancestry lines
89
                mutter('ancestry of {%s}: %r',
90
                       rev_id, branch.get_ancestry(rev_id))
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
91
                self.assertEquals(sorted(branch.get_ancestry(rev_id)),
1390 by Robert Collins
pair programming worx... merge integration and weave
92
                                  [None] + sorted(anc))
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
93
    
94
    
1272 by Martin Pool
- enable and disable more ancestry tests
95
    def test_is_ancestor(self):
1102 by Martin Pool
- merge test refactoring from robertc
96
        """Test checking whether a revision is an ancestor of another revision"""
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
97
        br1, br2 = make_branches()
98
        revisions = br1.revision_history()
99
        revisions_2 = br2.revision_history()
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
100
        sources = br1
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
101
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
102
        assert is_ancestor(revisions[0], revisions[0], br1)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
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)
1390 by Robert Collins
pair programming worx... merge integration and weave
106
        # disabled mbp 20050914, doesn't seem to happen anymore
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
107
        ## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
108
        ##                  revisions[0], br1)        
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
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)
1272 by Martin Pool
- enable and disable more ancestry tests
112
        ## assert not is_ancestor(revisions[3], revisions_2[3], br1)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
113
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
114
115
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
116
class TestIntermediateRevisions(TestCaseInTempDir):
1092.1.42 by Robert Collins
merge from abentley
117
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
118
    def setUp(self):
119
        from bzrlib.commit import commit
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
120
        TestCaseInTempDir.setUp(self)
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
121
        self.br1, self.br2 = make_branches()
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
122
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")
126
1390 by Robert Collins
pair programming worx... merge integration and weave
127
        fetch(from_branch=self.br2, to_branch=self.br1)
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
128
        self.br1.add_pending_merge(self.br2.revision_history()[6])
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
129
        self.br1.commit("Commit fourtten", rev_id="a@u-0-6")
130
1390 by Robert Collins
pair programming worx... merge integration and weave
131
        fetch(from_branch=self.br1, to_branch=self.br2)
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
132
        self.br2.add_pending_merge(self.br1.revision_history()[6])
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
133
        self.br2.commit("Commit fifteen", rev_id="b@u-0-10")
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
134
135
        from bzrlib.revision import MultipleRevisionSources
136
        self.sources = MultipleRevisionSources(self.br1, self.br2)
137
138
    def intervene(self, ancestor, revision, revision_history=None):
139
        from bzrlib.revision import get_intervening_revisions
140
        return get_intervening_revisions(ancestor,revision, self.sources, 
141
                                         revision_history)
142
1092.1.42 by Robert Collins
merge from abentley
143
    def test_intervene(self):
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
144
        """Find intermediate revisions, without requiring history"""
145
        from bzrlib.errors import NotAncestor, NoSuchRevision
146
        assert len(self.intervene('a@u-0-0', 'a@u-0-0')) == 0
147
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-1'), ['a@u-0-1'])
148
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-2'), 
149
                         ['a@u-0-1', 'a@u-0-2'])
150
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-3'), 
151
                         ['a@u-0-1', 'a@u-0-2', 'b@u-0-3'])
152
        self.assertEqual(self.intervene('b@u-0-3', 'a@u-0-3'), 
153
                         ['b@u-0-4', 'a@u-0-3'])
154
        self.assertEqual(self.intervene('a@u-0-2', 'a@u-0-3', 
155
                                        self.br1.revision_history()), 
156
                         ['a@u-0-3'])
157
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-5', 
158
                                        self.br1.revision_history()), 
159
                         ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4', 
160
                          'a@u-0-5'])
161
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6', 
162
                         self.br1.revision_history()), 
163
                         ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4', 
164
                          'b@u-0-6'])
165
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'), 
166
                         ['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4', 
167
                          'b@u-0-5'])
168
        self.assertEqual(self.intervene('b@u-0-3', 'b@u-0-6', 
169
                         self.br2.revision_history()), 
170
                         ['b@u-0-4', 'b@u-0-5', 'b@u-0-6'])
171
        self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10'), 
172
                         ['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
173
        self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10', 
174
                                        self.br2.revision_history()), 
175
                         ['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
176
        self.assertRaises(NotAncestor, self.intervene, 'b@u-0-10', 'b@u-0-6', 
177
                          self.br2.revision_history())
178
        self.assertRaises(NoSuchRevision, self.intervene, 'c@u-0-10', 
179
                          'b@u-0-6', self.br2.revision_history())
180
        self.assertRaises(NoSuchRevision, self.intervene, 'b@u-0-10', 
181
                          'c@u-0-6', self.br2.revision_history())
182
183
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
184
class TestCommonAncestor(TestCaseInTempDir):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
185
    """Test checking whether a revision is an ancestor of another revision"""
1092.1.39 by Robert Collins
merge from mpool
186
974.1.65 by Aaron Bentley
Cleanup and test-fixing
187
    def test_old_common_ancestor(self):
974.1.66 by Aaron Bentley
more cleanups, docs, sorting stuff
188
        """Pick a resonable merge base using the old functionality"""
974.1.65 by Aaron Bentley
Cleanup and test-fixing
189
        from bzrlib.revision import old_common_ancestor as common_ancestor
190
        br1, br2 = make_branches()
191
        revisions = br1.revision_history()
192
        revisions_2 = br2.revision_history()
1390 by Robert Collins
pair programming worx... merge integration and weave
193
        sources = br1
974.1.65 by Aaron Bentley
Cleanup and test-fixing
194
195
        expected_ancestors_list = {revisions[3]:(0, 0), 
196
                                   revisions[2]:(1, 1),
197
                                   revisions_2[4]:(2, 1), 
198
                                   revisions[1]:(3, 2),
199
                                   revisions_2[3]:(4, 2),
200
                                   revisions[0]:(5, 3) }
201
        ancestors_list = find_present_ancestors(revisions[3], sources)
202
        assert len(expected_ancestors_list) == len(ancestors_list)
203
        for key, value in expected_ancestors_list.iteritems():
204
            self.assertEqual(ancestors_list[key], value, 
205
                              "key %r, %r != %r" % (key, ancestors_list[key],
206
                                                    value))
207
208
        self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
209
                          revisions[0])
210
        self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
211
                          revisions[1])
212
        self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
213
                          revisions[1])
214
        self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
215
                          revisions[2])
216
        self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
217
                          revisions_2[4])
218
        self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
219
                          revisions_2[4])
220
        self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
221
                          revisions[4])
222
        self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
223
                          revisions_2[5])
224
1092.1.39 by Robert Collins
merge from mpool
225
    def test_common_ancestor(self):
974.1.65 by Aaron Bentley
Cleanup and test-fixing
226
        """Pick a reasonable merge base"""
227
        from bzrlib.revision import common_ancestor
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
228
        br1, br2 = make_branches()
229
        revisions = br1.revision_history()
230
        revisions_2 = br2.revision_history()
231
        sources = MultipleRevisionSources(br1, br2)
232
233
        expected_ancestors_list = {revisions[3]:(0, 0), 
234
                                   revisions[2]:(1, 1),
235
                                   revisions_2[4]:(2, 1), 
236
                                   revisions[1]:(3, 2),
237
                                   revisions_2[3]:(4, 2),
238
                                   revisions[0]:(5, 3) }
239
        ancestors_list = find_present_ancestors(revisions[3], sources)
240
        assert len(expected_ancestors_list) == len(ancestors_list)
241
        for key, value in expected_ancestors_list.iteritems():
242
            self.assertEqual(ancestors_list[key], value, 
243
                              "key %r, %r != %r" % (key, ancestors_list[key],
244
                                                    value))
245
246
        self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
247
                          revisions[0])
248
        self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
249
                          revisions[1])
250
        self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
251
                          revisions[1])
252
        self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
253
                          revisions[2])
254
        self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
255
                          revisions_2[4])
256
        self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
257
                          revisions_2[4])
258
        self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
259
                          revisions[4])
260
        self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
974.1.65 by Aaron Bentley
Cleanup and test-fixing
261
                          revisions[4])
262
1185.8.1 by Aaron Bentley
Ensured combined_graph is order-insensitive
263
    def test_combined(self):
264
        """combined_graph
265
        Ensure it's not order-sensitive
266
        """
267
        br1, br2 = make_branches()
268
        source = MultipleRevisionSources(br1, br2)
1390 by Robert Collins
pair programming worx... merge integration and weave
269
        combined_1 = combined_graph(br1.last_revision(), 
270
                                    br2.last_revision(), source)
271
        combined_2 = combined_graph(br2.last_revision(),
272
                                    br1.last_revision(), source)
1185.8.1 by Aaron Bentley
Ensured combined_graph is order-insensitive
273
        assert combined_1[1] == combined_2[1]
274
        assert combined_1[2] == combined_2[2]
275
        assert combined_1[3] == combined_2[3]
276
        assert combined_1 == combined_2