/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.436.2 by Jelmer Vernooij
Add stubs for testsuite, rebase-continue and rebase-abort commands.
1
# Copyright (C) 2006-2007 by Jelmer Vernooij
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
0.436.81 by Jelmer Vernooij
Change license to GPLv3+
5
# the Free Software Foundation; either version 3 of the License, or
0.436.2 by Jelmer Vernooij
Add stubs for testsuite, rebase-continue and rebase-abort commands.
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
0.436.16 by Jelmer Vernooij
Some more work on maptree.
16
"""Tests for the rebase code."""
0.436.2 by Jelmer Vernooij
Add stubs for testsuite, rebase-continue and rebase-abort commands.
17
0.436.56 by Jelmer Vernooij
Fix test.
18
from bzrlib.conflicts import ConflictList
0.436.37 by Jelmer Vernooij
Store parents correctly.
19
from bzrlib.errors import UnknownFormatError, NoSuchFile, ConflictsInTree
0.436.54 by Jelmer Vernooij
Move determination of merge base to separate function.
20
from bzrlib.graph import Graph
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
21
from bzrlib.revision import NULL_REVISION
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
22
from bzrlib.tests import TestCase, TestCaseWithTransport
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
23
from bzrlib.trace import mutter
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
24
25
from rebase import (marshall_rebase_plan, unmarshall_rebase_plan, 
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
26
                    replay_snapshot, generate_simple_plan,
27
                    generate_transpose_plan, rebase_plan_exists,
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
28
                    rebase_todo, REBASE_PLAN_FILENAME, 
29
                    REBASE_CURRENT_REVID_FILENAME, read_rebase_plan, 
30
                    remove_rebase_plan, read_active_rebase_revid, 
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
31
                    write_active_rebase_revid, write_rebase_plan, MapTree,
0.436.37 by Jelmer Vernooij
Store parents correctly.
32
                    ReplaySnapshotError, ReplayParentsInconsistent, 
0.436.56 by Jelmer Vernooij
Fix test.
33
                    replay_delta_workingtree, replay_determine_base, 
34
                    commit_rebase)
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
35
0.436.4 by Jelmer Vernooij
Add some tests.
36
0.436.3 by Jelmer Vernooij
Fill in commands.
37
class RebasePlanReadWriterTests(TestCase):
0.436.4 by Jelmer Vernooij
Add some tests.
38
    def test_simple_marshall_rebase_plan(self):
39
        self.assertEqualDiff(
40
"""# Bazaar rebase plan 1
41
1 bla
42
oldrev newrev newparent1 newparent2
43
""", marshall_rebase_plan((1, "bla"), 
44
                          {"oldrev": ("newrev", ["newparent1", "newparent2"])}))
45
46
    def test_simple_unmarshall_rebase_plan(self):
47
        self.assertEquals(((1, "bla"), 
48
                          {"oldrev": ("newrev", ["newparent1", "newparent2"])}),
49
                         unmarshall_rebase_plan("""# Bazaar rebase plan 1
50
1 bla
51
oldrev newrev newparent1 newparent2
52
"""))
53
54
    def test_unmarshall_rebase_plan_formatunknown(self):
55
        self.assertRaises(UnknownFormatError,
56
                         unmarshall_rebase_plan, """# Bazaar rebase plan x
57
1 bla
58
oldrev newrev newparent1 newparent2
59
""")
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
60
61
62
class ConversionTests(TestCaseWithTransport):
63
    def test_simple(self):
64
        wt = self.make_branch_and_tree('.')
65
        b = wt.branch
66
        file('hello', 'w').write('hello world')
67
        wt.add('hello')
68
        wt.commit(message='add hello', rev_id="bla")
69
        file('hello', 'w').write('world')
70
        wt.commit(message='change hello', rev_id="bloe")
71
        wt.set_last_revision("bla")
72
        b.set_revision_history(["bla"])
73
        file('hello', 'w').write('world')
74
        wt.commit(message='change hello', rev_id="bla2")
0.436.49 by Jelmer Vernooij
Fix locking.
75
76
        wt.branch.repository.lock_write()
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
77
        newrev = replay_snapshot(wt.branch.repository, "bla2", "bla4", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
78
                ["bloe"], {"bla": "bloe"})
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
79
        self.assertEqual("bla4", newrev)
80
        self.assertTrue(wt.branch.repository.has_revision(newrev))
0.436.80 by Jelmer Vernooij
Avoid using deprecated revision_parents() function.
81
        self.assertEqual(("bloe",), 
82
                wt.branch.repository.get_parent_map([newrev])[newrev])
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
83
        self.assertEqual("bla2", 
84
            wt.branch.repository.get_revision(newrev).properties["rebase-of"])
0.436.49 by Jelmer Vernooij
Fix locking.
85
        wt.branch.repository.unlock()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
86
87
88
class PlanCreatorTests(TestCaseWithTransport):
89
    def test_simple_plan_creator(self):
90
        wt = self.make_branch_and_tree('.')
91
        b = wt.branch
92
        file('hello', 'w').write('hello world')
93
        wt.add('hello')
94
        wt.commit(message='add hello', rev_id="bla")
95
        file('hello', 'w').write('world')
96
        wt.commit(message='change hello', rev_id="bloe")
97
        wt.set_last_revision("bla")
98
        b.set_revision_history(["bla"])
99
        file('hello', 'w').write('world')
100
        wt.commit(message='change hello', rev_id="bla2")
101
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
102
        b.repository.lock_read()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
103
        self.assertEquals({'bla2': ('newbla2', ["bloe"])}, 
0.438.3 by Jelmer Vernooij
Add stop_revid argumen to generate_simple_plan.
104
                generate_simple_plan(b.revision_history(), "bla2", None, 
105
                    "bloe", 
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
106
                    ["bloe", "bla"],
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
107
                    b.repository.revision_parents, 
108
                    lambda y: "new"+y))
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
109
        b.repository.unlock()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
110
     
111
    def test_simple_plan_creator_extra_history(self):
112
        wt = self.make_branch_and_tree('.')
113
        b = wt.branch
114
        file('hello', 'w').write('hello world')
115
        wt.add('hello')
116
        wt.commit(message='add hello', rev_id="bla")
117
        file('hello', 'w').write('world')
118
        wt.commit(message='change hello', rev_id="bloe")
119
        wt.set_last_revision("bla")
120
        b.set_revision_history(["bla"])
121
        file('hello', 'w').write('world')
122
        wt.commit(message='change hello', rev_id="bla2")
123
        file('hello', 'w').write('universe')
124
        wt.commit(message='change hello again', rev_id="bla3")
125
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
126
        b.repository.lock_read()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
127
        self.assertEquals({'bla2': ('newbla2', ["bloe"]), 'bla3': ('newbla3', ['newbla2'])}, 
0.438.3 by Jelmer Vernooij
Add stop_revid argumen to generate_simple_plan.
128
                generate_simple_plan(b.revision_history(), "bla2", None, "bloe", 
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
129
                    ["bloe", "bla"],
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
130
                    b.repository.revision_parents,
131
                    lambda y: "new"+y))
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
132
        b.repository.unlock()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
133
 
134
135
    def test_generate_transpose_plan(self):
136
        wt = self.make_branch_and_tree('.')
137
        b = wt.branch
138
        file('hello', 'w').write('hello world')
139
        wt.add('hello')
140
        wt.commit(message='add hello', rev_id="bla")
141
        file('hello', 'w').write('world')
142
        wt.commit(message='change hello', rev_id="bloe")
143
        wt.set_last_revision("bla")
144
        b.set_revision_history(["bla"])
145
        file('hello', 'w').write('world')
146
        wt.commit(message='change hello', rev_id="bla2")
147
        file('hello', 'w').write('universe')
148
        wt.commit(message='change hello again', rev_id="bla3")
149
        wt.set_last_revision("bla")
150
        b.set_revision_history(["bla"])
151
        file('hello', 'w').write('somebar')
152
        wt.commit(message='change hello yet again', rev_id="blie")
153
        wt.set_last_revision(NULL_REVISION)
154
        b.set_revision_history([])
155
        wt.add('hello')
156
        wt.commit(message='add hello', rev_id="lala")
157
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
158
        b.repository.lock_read()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
159
        self.assertEquals({
0.436.36 by Jelmer Vernooij
Fix compatibility with bzr 0.19.
160
            'blie': ('newblie', ['lala'])},
161
            generate_transpose_plan(b.repository.get_revision_graph("blie"), 
162
            {"bla": "lala"}, b.repository.revision_parents, lambda y: "new"+y))
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
163
        self.assertEquals({
0.436.36 by Jelmer Vernooij
Fix compatibility with bzr 0.19.
164
            'bla2': ('newbla2', ['lala']),
165
            'bla3': ('newbla3', ['newbla2']),
166
            'blie': ('newblie', ['lala']),
167
            'bloe': ('newbloe', ['lala'])},
168
            generate_transpose_plan(b.repository.get_revision_graph(), 
169
            {"bla": "lala"}, 
170
            b.repository.revision_parents, lambda y: "new"+y))
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
171
        b.repository.unlock()
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
172
0.436.31 by Jelmer Vernooij
Refactor generate_transpose_plan() to not take a repository object but
173
    def test_generate_transpose_plan_one(self):
174
        self.assertEquals({"bla": ("newbla", ["lala"])},
175
                generate_transpose_plan({"bla": ["bloe"], "bloe": []},
176
                    {"bloe": "lala"}, {}.get, lambda y: "new"+y))
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
177
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
178
    def test_plan_with_already_merged(self):
179
        """We need to use a merge base that makes sense. 
180
        
181
        A
182
        | \
183
        B  D
184
        | \|
185
        C  E
186
187
        Rebasing E on C should result in:
188
189
        A -> B -> C -> D -> E
190
191
        with a plan of:
192
193
        D -> (D', [C])
0.436.40 by Jelmer Vernooij
Adjust expectations.
194
        E -> (E', [D', C])
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
195
        """
196
        parents_map = {
197
                "A": [],
198
                "B": ["A"],
199
                "C": ["B"],
200
                "D": ["A"],
0.436.40 by Jelmer Vernooij
Adjust expectations.
201
                "E": ["D", "B"]
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
202
        }
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
203
        self.assertEquals({"D": ("D'", ["C"]), "E": ("E'", ["D'"])}, 
204
                generate_simple_plan(["A", "D", "E"], 
0.438.3 by Jelmer Vernooij
Add stop_revid argumen to generate_simple_plan.
205
                                     "D", None, "C", ["A", "B", "C"], 
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
206
                    parents_map.get, lambda y: y+"'"))
0.436.55 by Jelmer Vernooij
Add functinality for skipping duplicate merges.
207
208
    def test_plan_with_already_merged_skip_merges(self):
209
        """We need to use a merge base that makes sense. 
210
        
211
        A
212
        | \
213
        B  D
214
        | \|
215
        C  E
216
217
        Rebasing E on C should result in:
218
219
        A -> B -> C -> D'
220
221
        with a plan of:
222
223
        D -> (D', [C])
224
        """
225
        parents_map = {
226
                "A": [],
227
                "B": ["A"],
228
                "C": ["B"],
229
                "D": ["A"],
230
                "E": ["D", "B"]
231
        }
232
        self.assertEquals({"D": ("D'", ["C"])}, 
233
                generate_simple_plan(["A", "D", "E"], 
234
                                     "D", None, "C", ["A", "B", "C"], 
235
                    parents_map.get, lambda y: y+"'", True))
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
236
 
237
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
238
class PlanFileTests(TestCaseWithTransport):
239
   def test_rebase_plan_exists_false(self):
240
        wt = self.make_branch_and_tree('.')
241
        self.assertFalse(rebase_plan_exists(wt))
242
243
   def test_rebase_plan_exists_empty(self):
244
        wt = self.make_branch_and_tree('.')
245
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "")
246
        self.assertFalse(rebase_plan_exists(wt))
247
248
   def test_rebase_plan_exists(self):
249
        wt = self.make_branch_and_tree('.')
250
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "foo")
251
        self.assertTrue(rebase_plan_exists(wt))
252
253
   def test_remove_rebase_plan(self):
254
        wt = self.make_branch_and_tree('.')
255
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "foo")
256
        remove_rebase_plan(wt)
257
        self.assertFalse(rebase_plan_exists(wt))
258
259
   def test_remove_rebase_plan_twice(self):
260
        wt = self.make_branch_and_tree('.')
261
        remove_rebase_plan(wt)
262
        self.assertFalse(rebase_plan_exists(wt))
263
264
   def test_write_rebase_plan(self):
265
        wt = self.make_branch_and_tree('.')
266
        file('hello', 'w').write('hello world')
267
        wt.add('hello')
268
        wt.commit(message='add hello', rev_id="bla")
269
        write_rebase_plan(wt, 
270
                {"oldrev": ("newrev", ["newparent1", "newparent2"])})
271
        self.assertEqualDiff("""# Bazaar rebase plan 1
272
1 bla
273
oldrev newrev newparent1 newparent2
274
""", wt._control_files.get(REBASE_PLAN_FILENAME).read())
275
276
   def test_read_rebase_plan_nonexistant(self):
277
        wt = self.make_branch_and_tree('.')
278
        self.assertRaises(NoSuchFile, read_rebase_plan, wt)
279
280
   def test_read_rebase_plan_empty(self):
281
        wt = self.make_branch_and_tree('.')
282
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "")
283
        self.assertRaises(NoSuchFile, read_rebase_plan, wt)
284
        
285
   def test_read_rebase_plan(self):
286
        wt = self.make_branch_and_tree('.')
287
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, """# Bazaar rebase plan 1
288
1 bla
289
oldrev newrev newparent1 newparent2
290
""")
0.436.36 by Jelmer Vernooij
Fix compatibility with bzr 0.19.
291
        self.assertEquals(((1, "bla"), 
292
            {"oldrev": ("newrev", ["newparent1", "newparent2"])}),
293
            read_rebase_plan(wt))
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
294
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
295
0.436.9 by Jelmer Vernooij
Add rebase-todo command, fix rebase-continue.
296
class CurrentRevidFileTests(TestCaseWithTransport):
297
    def test_read_nonexistant(self):
298
        wt = self.make_branch_and_tree('.')
299
        self.assertIs(None, read_active_rebase_revid(wt))
300
301
    def test_read_null(self):
302
        wt = self.make_branch_and_tree('.')
303
        wt._control_files.put_utf8(REBASE_CURRENT_REVID_FILENAME, NULL_REVISION)
304
        self.assertIs(None, read_active_rebase_revid(wt))
305
306
    def test_read(self):
307
        wt = self.make_branch_and_tree('.')
308
        wt._control_files.put_utf8(REBASE_CURRENT_REVID_FILENAME, "bla")
309
        self.assertEquals("bla", read_active_rebase_revid(wt))
310
311
    def test_write(self):
312
        wt = self.make_branch_and_tree('.')
313
        write_active_rebase_revid(wt, "bloe")
314
        self.assertEquals("bloe", read_active_rebase_revid(wt))
315
316
    def test_write_null(self):
317
        wt = self.make_branch_and_tree('.')
318
        write_active_rebase_revid(wt, None)
319
        self.assertIs(None, read_active_rebase_revid(wt))
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
320
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
321
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
322
class RebaseTodoTests(TestCase):
323
    def test_done(self):
324
        class Repository:
325
            def has_revision(self, revid):
326
                return revid == "bloe"
327
        self.assertEquals([], 
328
                list(rebase_todo(Repository(), { "bla": ("bloe", [])})))
329
330
    def test_notstarted(self):
331
        class Repository:
332
            def has_revision(self, revid):
333
                return False
334
        self.assertEquals(["bla"], 
335
                list(rebase_todo(Repository(), { "bla": ("bloe", [])})))
336
337
    def test_halfway(self):
338
        class Repository:
339
            def has_revision(self, revid):
340
                return revid == "bloe"
341
        self.assertEquals(["ha"], 
342
                list(rebase_todo(Repository(), { "bla": ("bloe", []), 
343
                                                 "ha": ("hee", [])})))
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
344
345
class ReplaySnapshotTests(TestCaseWithTransport):
346
    def test_single_revision(self):
347
        wt = self.make_branch_and_tree(".")
348
        self.build_tree(['afile'])
349
        wt.add(["afile"])
350
        wt.commit("bla", rev_id="oldcommit")
0.436.49 by Jelmer Vernooij
Fix locking.
351
        wt.branch.repository.lock_write()
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
352
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", [],
353
                        {})
0.436.49 by Jelmer Vernooij
Fix locking.
354
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
355
        oldrev = wt.branch.repository.get_revision("oldcommit")
356
        newrev = wt.branch.repository.get_revision("newcommit")
357
        self.assertEquals([], newrev.parent_ids)
358
        self.assertEquals("newcommit", newrev.revision_id)
359
        self.assertEquals(oldrev.committer, newrev.committer)
360
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
361
        self.assertEquals(oldrev.timezone, newrev.timezone)
362
        inv = wt.branch.repository.get_inventory("newcommit")
363
        self.assertEquals("newcommit", inv[inv.path2id("afile")].revision)
364
365
    def test_parents_different(self):
366
        """replay_snapshot() relies on the fact that the contents of 
367
        the old and new parents is equal (at least concerning tree shape). If 
368
        it turns out it isn't, an exception should be raised."""
369
        wt = self.make_branch_and_tree(".")
370
        wt.commit("bloe", rev_id="base")
371
        self.build_tree(['afile', 'notherfile'])
372
        wt.add(["afile"])
373
        wt.commit("bla", rev_id="oldparent")
374
        wt.add(["notherfile"])
375
        wt.commit("bla", rev_id="oldcommit")
0.436.34 by Jelmer Vernooij
Some more tests.
376
        # this should raise an exception since oldcommit is being rewritten 
377
        # but 'afile' is present in the old parents but not in the new ones.
0.436.49 by Jelmer Vernooij
Fix locking.
378
        wt.branch.repository.lock_write()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
379
        self.assertRaises(
0.436.34 by Jelmer Vernooij
Some more tests.
380
                ReplayParentsInconsistent, replay_snapshot, 
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
381
                wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
382
                ["base"], {"oldparent": "base"})
0.436.49 by Jelmer Vernooij
Fix locking.
383
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
384
0.436.34 by Jelmer Vernooij
Some more tests.
385
    def test_two_revisions(self):
386
        wt = self.make_branch_and_tree("old")
387
        self.build_tree(['old/afile', 'old/notherfile'])
388
        wt.add(["afile"], ["somefileid"])
389
        wt.commit("bla", rev_id="oldparent")
390
        wt.add(["notherfile"])
391
        wt.commit("bla", rev_id="oldcommit")
392
        oldrepos = wt.branch.repository
393
        wt = self.make_branch_and_tree("new")
394
        self.build_tree(['new/afile', 'new/notherfile'])
395
        wt.add(["afile"], ["afileid"])
396
        wt.commit("bla", rev_id="newparent")
397
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
398
        wt.branch.repository.lock_write()
0.436.34 by Jelmer Vernooij
Some more tests.
399
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
400
                ["newparent"], {"oldparent": "newparent"})
0.436.49 by Jelmer Vernooij
Fix locking.
401
        wt.branch.repository.unlock()
0.436.34 by Jelmer Vernooij
Some more tests.
402
        oldrev = wt.branch.repository.get_revision("oldcommit")
403
        newrev = wt.branch.repository.get_revision("newcommit")
404
        self.assertEquals(["newparent"], newrev.parent_ids)
405
        self.assertEquals("newcommit", newrev.revision_id)
406
        self.assertEquals(oldrev.committer, newrev.committer)
407
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
408
        self.assertEquals(oldrev.timezone, newrev.timezone)
409
        inv = wt.branch.repository.get_inventory("newcommit")
410
        self.assertEquals("afileid", inv.path2id("afile"))
411
        self.assertEquals("newcommit", inv[inv.path2id("notherfile")].revision)
412
413
    def test_two_revisions_no_renames(self):
414
        wt = self.make_branch_and_tree("old")
415
        self.build_tree(['old/afile', 'old/notherfile'])
416
        wt.add(["afile"], ["somefileid"])
417
        wt.commit("bla", rev_id="oldparent")
418
        wt.add(["notherfile"])
419
        wt.commit("bla", rev_id="oldcommit")
420
        oldrepos = wt.branch.repository
421
        wt = self.make_branch_and_tree("new")
422
        self.build_tree(['new/afile', 'new/notherfile'])
423
        wt.add(["afile"], ["afileid"])
424
        wt.commit("bla", rev_id="newparent")
425
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
426
        wt.branch.repository.lock_write()
0.436.34 by Jelmer Vernooij
Some more tests.
427
        self.assertRaises(ReplayParentsInconsistent, 
428
                          replay_snapshot, wt.branch.repository, 
429
                          "oldcommit", "newcommit", 
430
                        ["newparent"], revid_renames={})
0.436.49 by Jelmer Vernooij
Fix locking.
431
        wt.branch.repository.unlock()
0.436.34 by Jelmer Vernooij
Some more tests.
432
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
433
    def test_multi_revisions(self):
434
        wt = self.make_branch_and_tree("old")
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
435
        self.build_tree(['old/afile', 'old/sfile', 'old/notherfile'])
436
        wt.add(['sfile'])
0.436.34 by Jelmer Vernooij
Some more tests.
437
        wt.add(["afile"], ["somefileid"])
438
        wt.commit("bla", rev_id="oldgrandparent")
439
        open("old/afile", "w").write("data")
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
440
        wt.commit("bla", rev_id="oldparent")
441
        wt.add(["notherfile"])
442
        wt.commit("bla", rev_id="oldcommit")
443
        oldrepos = wt.branch.repository
444
        wt = self.make_branch_and_tree("new")
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
445
        self.build_tree(['new/afile', 'new/sfile', 'new/notherfile'])
446
        wt.add(['sfile'])
0.436.34 by Jelmer Vernooij
Some more tests.
447
        wt.add(["afile"], ["afileid"])
448
        wt.commit("bla", rev_id="newgrandparent")
449
        open("new/afile", "w").write("data")
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
450
        wt.commit("bla", rev_id="newparent")
451
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
452
        wt.branch.repository.lock_write()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
453
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
454
                ["newparent"], {"oldgrandparent": "newgrandparent", 
455
                                "oldparent": "newparent"})
0.436.49 by Jelmer Vernooij
Fix locking.
456
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
457
        oldrev = wt.branch.repository.get_revision("oldcommit")
458
        newrev = wt.branch.repository.get_revision("newcommit")
0.436.34 by Jelmer Vernooij
Some more tests.
459
        self.assertEquals(["newparent"], newrev.parent_ids)
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
460
        self.assertEquals("newcommit", newrev.revision_id)
461
        self.assertEquals(oldrev.committer, newrev.committer)
462
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
463
        self.assertEquals(oldrev.timezone, newrev.timezone)
464
        inv = wt.branch.repository.get_inventory("newcommit")
0.436.34 by Jelmer Vernooij
Some more tests.
465
        self.assertEquals("afileid", inv.path2id("afile"))
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
466
        self.assertEquals("newcommit", inv[inv.path2id("notherfile")].revision)
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
467
        self.assertEquals("newgrandparent", inv[inv.path2id("sfile")].revision)
0.436.34 by Jelmer Vernooij
Some more tests.
468
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
469
    def test_maps_ids(self):
470
        wt = self.make_branch_and_tree("old")
471
        wt.commit("base", rev_id="base")
472
        self.build_tree(['old/afile'])
473
        wt.add(["afile"], ids=["originalid"])
474
        wt.commit("bla", rev_id="oldparent")
475
        file("old/afile", "w").write("bloe")
476
        wt.commit("bla", rev_id="oldcommit")
477
        oldrepos = wt.branch.repository
478
        wt = self.make_branch_and_tree("new")
479
        self.build_tree(['new/afile'])
480
        wt.add(["afile"], ids=["newid"])
481
        wt.commit("bla", rev_id="newparent")
482
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
483
        wt.branch.repository.lock_write()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
484
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
485
                ["newparent"], {"oldparent": "newparent"})
0.436.49 by Jelmer Vernooij
Fix locking.
486
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
487
        oldrev = wt.branch.repository.get_revision("oldcommit")
488
        newrev = wt.branch.repository.get_revision("newcommit")
489
        self.assertEquals(["newparent"], newrev.parent_ids)
490
        self.assertEquals("newcommit", newrev.revision_id)
491
        self.assertEquals(oldrev.committer, newrev.committer)
492
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
493
        self.assertEquals(oldrev.timezone, newrev.timezone)
494
        inv = wt.branch.repository.get_inventory("newcommit")
495
        self.assertEquals("newid", inv.path2id("afile"))
496
        self.assertEquals("newcommit", inv[inv.path2id("afile")].revision)
497
0.436.37 by Jelmer Vernooij
Store parents correctly.
498
499
class TestReplayWorkingtree(TestCaseWithTransport):
500
    def test_conflicts(self):
501
        wt = self.make_branch_and_tree("old")
502
        wt.commit("base", rev_id="base")
503
        self.build_tree(['old/afile'])
504
        wt.add(["afile"], ids=["originalid"])
505
        wt.commit("bla", rev_id="oldparent")
506
        file("old/afile", "w").write("bloe")
507
        wt.commit("bla", rev_id="oldcommit")
508
        oldrepos = wt.branch.repository
509
        wt = self.make_branch_and_tree("new")
510
        self.build_tree(['new/afile'])
511
        wt.add(["afile"], ids=["newid"])
512
        wt.commit("bla", rev_id="newparent")
513
        wt.branch.repository.fetch(oldrepos)
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
514
        wt.lock_write()
0.436.37 by Jelmer Vernooij
Store parents correctly.
515
        self.assertRaises(ConflictsInTree, 
516
            replay_delta_workingtree, wt, "oldcommit", "newcommit", 
517
            ["newparent"])
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
518
        wt.unlock()
0.436.37 by Jelmer Vernooij
Store parents correctly.
519
520
    def test_simple(self):
521
        wt = self.make_branch_and_tree("old")
522
        wt.commit("base", rev_id="base")
523
        self.build_tree(['old/afile'])
524
        wt.add(["afile"], ids=["originalid"])
525
        wt.commit("bla", rev_id="oldparent")
526
        file("old/afile", "w").write("bloe")
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
527
        wt.commit("bla", rev_id="oldcommit")
0.436.37 by Jelmer Vernooij
Store parents correctly.
528
        wt = wt.bzrdir.sprout("new").open_workingtree()
529
        self.build_tree(['new/bfile'])
530
        wt.add(["bfile"], ids=["newid"])
531
        wt.commit("bla", rev_id="newparent")
532
        replay_delta_workingtree(wt, "oldcommit", "newcommit", 
533
            ["newparent"])
534
        oldrev = wt.branch.repository.get_revision("oldcommit")
535
        newrev = wt.branch.repository.get_revision("newcommit")
536
        self.assertEquals(["newparent"], newrev.parent_ids)
537
        self.assertEquals("newcommit", newrev.revision_id)
538
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
539
        self.assertEquals(oldrev.timezone, newrev.timezone)
540
541
    def test_multiple(self):
542
        wt = self.make_branch_and_tree("old")
543
        wt.commit("base", rev_id="base")
544
        self.build_tree(['old/afile'])
545
        wt.add(["afile"], ids=["originalid"])
546
        wt.commit("bla", rev_id="oldparent")
547
        file("old/afile", "w").write("bloe")
548
        wt.add_pending_merge("ghost")
549
        wt.commit("bla", rev_id="oldcommit")
550
        wt = wt.bzrdir.sprout("new").open_workingtree()
551
        self.build_tree(['new/bfile'])
552
        wt.add(["bfile"], ids=["newid"])
553
        wt.commit("bla", rev_id="newparent")
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
554
        wt.lock_write()
0.436.37 by Jelmer Vernooij
Store parents correctly.
555
        replay_delta_workingtree(wt, "oldcommit", "newcommit", 
556
            ["newparent", "ghost"])
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
557
        wt.unlock()
0.436.37 by Jelmer Vernooij
Store parents correctly.
558
        oldrev = wt.branch.repository.get_revision("oldcommit")
559
        newrev = wt.branch.repository.get_revision("newcommit")
560
        self.assertEquals(["newparent", "ghost"], newrev.parent_ids)
561
        self.assertEquals("newcommit", newrev.revision_id)
562
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
563
        self.assertEquals(oldrev.timezone, newrev.timezone)
564
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
565
    def test_already_merged(self):
566
        """We need to use a merge base that makes sense. 
567
        
568
        A
569
        | \
570
        B  D
571
        | \|
572
        C  E
573
574
        Rebasing E on C should result in:
575
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
576
        A -> B -> C -> D' -> E'
577
578
        Ancestry:
579
        A: 
580
        B: A
581
        C: A, B
582
        D: A
583
        E: A, B, D
584
        D': A, B, C
585
        E': A, B, C, D'
586
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
587
        """
588
        oldwt = self.make_branch_and_tree("old")
589
        self.build_tree(['old/afile'])
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
590
        file("old/afile", "w").write("A\n" * 10)
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
591
        oldwt.add(["afile"])
592
        oldwt.commit("base", rev_id="A")
593
        newwt = oldwt.bzrdir.sprout("new").open_workingtree()
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
594
        file("old/afile", "w").write("A\n"*10 + "B\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
595
        oldwt.commit("bla", rev_id="B")
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
596
        file("old/afile", "w").write("A\n" * 10 + "C\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
597
        oldwt.commit("bla", rev_id="C")
598
        self.build_tree(['new/bfile'])
599
        newwt.add(["bfile"])
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
600
        file("new/bfile", "w").write("D\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
601
        newwt.commit("bla", rev_id="D")
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
602
        file("new/afile", "w").write("E\n" + "A\n"*10 + "B\n")
603
        file("new/bfile", "w").write("D\nE\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
604
        newwt.add_pending_merge("B")
605
        newwt.commit("bla", rev_id="E")
606
        newwt.branch.repository.fetch(oldwt.branch.repository)
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
607
        newwt.lock_write()
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
608
        replay_delta_workingtree(newwt, "D", "D'", ["C"])
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
609
        newwt.unlock()
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
610
        oldrev = newwt.branch.repository.get_revision("D")
611
        newrev = newwt.branch.repository.get_revision("D'")
612
        self.assertEquals(["C"], newrev.parent_ids)
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
613
        newwt.lock_write()
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
614
        self.assertRaises(ConflictsInTree, 
615
            lambda: replay_delta_workingtree(newwt, "E", "E'", ["D'"]))
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
616
        newwt.unlock()
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
617
        self.assertEquals("E\n" + "A\n" * 10 + "C\n",
618
                open("new/afile", 'r').read())
0.436.56 by Jelmer Vernooij
Fix test.
619
        newwt.set_conflicts(ConflictList())
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
620
        oldrev = newwt.branch.repository.get_revision("E")
0.436.56 by Jelmer Vernooij
Fix test.
621
        commit_rebase(newwt, oldrev, "E'")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
622
        newrev = newwt.branch.repository.get_revision("E'")
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
623
        self.assertEquals(["D'"], newrev.parent_ids)
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
624
        self.assertEquals(["A", "B", "C", "D'", "E'"], 
625
                          newwt.branch.revision_history())
626
0.436.37 by Jelmer Vernooij
Store parents correctly.
627
0.436.34 by Jelmer Vernooij
Some more tests.
628
class TestReplaySnapshotError(TestCase):
629
    def test_create(self):
630
        ReplaySnapshotError("message")
631
632
633
class TestReplayParentsInconsistent(TestCase):
634
    def test_create(self):
635
        ReplayParentsInconsistent("afileid", "arevid")
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
636
0.436.54 by Jelmer Vernooij
Move determination of merge base to separate function.
637
638
class ReplayDetermineBaseTests(TestCase):
639
    def setUp(self):
640
        self.graph = Graph(self)
641
0.436.73 by Jelmer Vernooij
Fix tests.
642
    def get_parent_map(self, keys):
643
        return dict((revid, self._parent_dict[revid]) for k in self._parent_dict if k in keys)
644
0.436.54 by Jelmer Vernooij
Move determination of merge base to separate function.
645
    def get_parents(self, revid):
646
        return self._parent_dict[revid]
647
648
    def test_null(self):
649
        self._parent_dict = {"myrev": []}
650
        self.assertEquals(NULL_REVISION, 
651
          replay_determine_base(self.graph, "myrev", [], "mynewrev", ["bar"]))
652
653
    def test_simple(self):
654
        self._parent_dict = {"myinitrev": [], "myrev": ["myinitrev"]}
655
        self.assertEquals("myinitrev", 
656
          replay_determine_base(self.graph, "myrev", ["myinitrev"], 
657
                                "mynewrev", ["mynewparents"]))
658