/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.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
20
from bzrlib.graph import Graph, DictParentsProvider
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.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
107
                    b.repository.get_graph(), 
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
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.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
130
                    b.repository.get_graph(),
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
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 = {
0.436.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
197
                "A": (),
198
                "B": ("A",),
199
                "C": ("B",),
200
                "D": ("A",),
201
                "E": ("D", "B")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
202
        }
0.436.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
203
        graph = Graph(DictParentsProvider(parents_map))
204
        self.assertEquals({"D": ("D'", ["C"]), "E": ("E'", ("D'",))}, 
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
205
                generate_simple_plan(["A", "D", "E"], 
0.438.3 by Jelmer Vernooij
Add stop_revid argumen to generate_simple_plan.
206
                                     "D", None, "C", ["A", "B", "C"], 
0.436.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
207
                    graph, lambda y: y+"'"))
0.436.55 by Jelmer Vernooij
Add functinality for skipping duplicate merges.
208
209
    def test_plan_with_already_merged_skip_merges(self):
210
        """We need to use a merge base that makes sense. 
211
        
212
        A
213
        | \
214
        B  D
215
        | \|
216
        C  E
217
218
        Rebasing E on C should result in:
219
220
        A -> B -> C -> D'
221
222
        with a plan of:
223
224
        D -> (D', [C])
225
        """
226
        parents_map = {
0.436.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
227
                "A": (),
228
                "B": ("A",),
229
                "C": ("B",),
230
                "D": ("A",),
231
                "E": ("D", "B")
0.436.55 by Jelmer Vernooij
Add functinality for skipping duplicate merges.
232
        }
0.436.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
233
        graph = Graph(DictParentsProvider(parents_map))
0.436.55 by Jelmer Vernooij
Add functinality for skipping duplicate merges.
234
        self.assertEquals({"D": ("D'", ["C"])}, 
235
                generate_simple_plan(["A", "D", "E"], 
236
                                     "D", None, "C", ["A", "B", "C"], 
0.436.86 by Jelmer Vernooij
Fix some uses of get_revision_graph().
237
                    graph, lambda y: y+"'", True))
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
238
 
239
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
240
class PlanFileTests(TestCaseWithTransport):
241
   def test_rebase_plan_exists_false(self):
242
        wt = self.make_branch_and_tree('.')
243
        self.assertFalse(rebase_plan_exists(wt))
244
245
   def test_rebase_plan_exists_empty(self):
246
        wt = self.make_branch_and_tree('.')
247
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "")
248
        self.assertFalse(rebase_plan_exists(wt))
249
250
   def test_rebase_plan_exists(self):
251
        wt = self.make_branch_and_tree('.')
252
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "foo")
253
        self.assertTrue(rebase_plan_exists(wt))
254
255
   def test_remove_rebase_plan(self):
256
        wt = self.make_branch_and_tree('.')
257
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "foo")
258
        remove_rebase_plan(wt)
259
        self.assertFalse(rebase_plan_exists(wt))
260
261
   def test_remove_rebase_plan_twice(self):
262
        wt = self.make_branch_and_tree('.')
263
        remove_rebase_plan(wt)
264
        self.assertFalse(rebase_plan_exists(wt))
265
266
   def test_write_rebase_plan(self):
267
        wt = self.make_branch_and_tree('.')
268
        file('hello', 'w').write('hello world')
269
        wt.add('hello')
270
        wt.commit(message='add hello', rev_id="bla")
271
        write_rebase_plan(wt, 
272
                {"oldrev": ("newrev", ["newparent1", "newparent2"])})
273
        self.assertEqualDiff("""# Bazaar rebase plan 1
274
1 bla
275
oldrev newrev newparent1 newparent2
276
""", wt._control_files.get(REBASE_PLAN_FILENAME).read())
277
278
   def test_read_rebase_plan_nonexistant(self):
279
        wt = self.make_branch_and_tree('.')
280
        self.assertRaises(NoSuchFile, read_rebase_plan, wt)
281
282
   def test_read_rebase_plan_empty(self):
283
        wt = self.make_branch_and_tree('.')
284
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "")
285
        self.assertRaises(NoSuchFile, read_rebase_plan, wt)
286
        
287
   def test_read_rebase_plan(self):
288
        wt = self.make_branch_and_tree('.')
289
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, """# Bazaar rebase plan 1
290
1 bla
291
oldrev newrev newparent1 newparent2
292
""")
0.436.36 by Jelmer Vernooij
Fix compatibility with bzr 0.19.
293
        self.assertEquals(((1, "bla"), 
294
            {"oldrev": ("newrev", ["newparent1", "newparent2"])}),
295
            read_rebase_plan(wt))
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
296
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
297
0.436.9 by Jelmer Vernooij
Add rebase-todo command, fix rebase-continue.
298
class CurrentRevidFileTests(TestCaseWithTransport):
299
    def test_read_nonexistant(self):
300
        wt = self.make_branch_and_tree('.')
301
        self.assertIs(None, read_active_rebase_revid(wt))
302
303
    def test_read_null(self):
304
        wt = self.make_branch_and_tree('.')
305
        wt._control_files.put_utf8(REBASE_CURRENT_REVID_FILENAME, NULL_REVISION)
306
        self.assertIs(None, read_active_rebase_revid(wt))
307
308
    def test_read(self):
309
        wt = self.make_branch_and_tree('.')
310
        wt._control_files.put_utf8(REBASE_CURRENT_REVID_FILENAME, "bla")
311
        self.assertEquals("bla", read_active_rebase_revid(wt))
312
313
    def test_write(self):
314
        wt = self.make_branch_and_tree('.')
315
        write_active_rebase_revid(wt, "bloe")
316
        self.assertEquals("bloe", read_active_rebase_revid(wt))
317
318
    def test_write_null(self):
319
        wt = self.make_branch_and_tree('.')
320
        write_active_rebase_revid(wt, None)
321
        self.assertIs(None, read_active_rebase_revid(wt))
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
322
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
323
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
324
class RebaseTodoTests(TestCase):
325
    def test_done(self):
326
        class Repository:
327
            def has_revision(self, revid):
328
                return revid == "bloe"
329
        self.assertEquals([], 
330
                list(rebase_todo(Repository(), { "bla": ("bloe", [])})))
331
332
    def test_notstarted(self):
333
        class Repository:
334
            def has_revision(self, revid):
335
                return False
336
        self.assertEquals(["bla"], 
337
                list(rebase_todo(Repository(), { "bla": ("bloe", [])})))
338
339
    def test_halfway(self):
340
        class Repository:
341
            def has_revision(self, revid):
342
                return revid == "bloe"
343
        self.assertEquals(["ha"], 
344
                list(rebase_todo(Repository(), { "bla": ("bloe", []), 
345
                                                 "ha": ("hee", [])})))
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
346
347
class ReplaySnapshotTests(TestCaseWithTransport):
348
    def test_single_revision(self):
349
        wt = self.make_branch_and_tree(".")
350
        self.build_tree(['afile'])
351
        wt.add(["afile"])
352
        wt.commit("bla", rev_id="oldcommit")
0.436.49 by Jelmer Vernooij
Fix locking.
353
        wt.branch.repository.lock_write()
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
354
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", [],
355
                        {})
0.436.49 by Jelmer Vernooij
Fix locking.
356
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
357
        oldrev = wt.branch.repository.get_revision("oldcommit")
358
        newrev = wt.branch.repository.get_revision("newcommit")
359
        self.assertEquals([], newrev.parent_ids)
360
        self.assertEquals("newcommit", newrev.revision_id)
361
        self.assertEquals(oldrev.committer, newrev.committer)
362
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
363
        self.assertEquals(oldrev.timezone, newrev.timezone)
364
        inv = wt.branch.repository.get_inventory("newcommit")
365
        self.assertEquals("newcommit", inv[inv.path2id("afile")].revision)
366
367
    def test_parents_different(self):
368
        """replay_snapshot() relies on the fact that the contents of 
369
        the old and new parents is equal (at least concerning tree shape). If 
370
        it turns out it isn't, an exception should be raised."""
371
        wt = self.make_branch_and_tree(".")
372
        wt.commit("bloe", rev_id="base")
373
        self.build_tree(['afile', 'notherfile'])
374
        wt.add(["afile"])
375
        wt.commit("bla", rev_id="oldparent")
376
        wt.add(["notherfile"])
377
        wt.commit("bla", rev_id="oldcommit")
0.436.34 by Jelmer Vernooij
Some more tests.
378
        # this should raise an exception since oldcommit is being rewritten 
379
        # but 'afile' is present in the old parents but not in the new ones.
0.436.49 by Jelmer Vernooij
Fix locking.
380
        wt.branch.repository.lock_write()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
381
        self.assertRaises(
0.436.34 by Jelmer Vernooij
Some more tests.
382
                ReplayParentsInconsistent, replay_snapshot, 
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
383
                wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
384
                ["base"], {"oldparent": "base"})
0.436.49 by Jelmer Vernooij
Fix locking.
385
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
386
0.436.34 by Jelmer Vernooij
Some more tests.
387
    def test_two_revisions(self):
388
        wt = self.make_branch_and_tree("old")
389
        self.build_tree(['old/afile', 'old/notherfile'])
390
        wt.add(["afile"], ["somefileid"])
391
        wt.commit("bla", rev_id="oldparent")
392
        wt.add(["notherfile"])
393
        wt.commit("bla", rev_id="oldcommit")
394
        oldrepos = wt.branch.repository
395
        wt = self.make_branch_and_tree("new")
396
        self.build_tree(['new/afile', 'new/notherfile'])
397
        wt.add(["afile"], ["afileid"])
398
        wt.commit("bla", rev_id="newparent")
399
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
400
        wt.branch.repository.lock_write()
0.436.34 by Jelmer Vernooij
Some more tests.
401
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
402
                ["newparent"], {"oldparent": "newparent"})
0.436.49 by Jelmer Vernooij
Fix locking.
403
        wt.branch.repository.unlock()
0.436.34 by Jelmer Vernooij
Some more tests.
404
        oldrev = wt.branch.repository.get_revision("oldcommit")
405
        newrev = wt.branch.repository.get_revision("newcommit")
406
        self.assertEquals(["newparent"], newrev.parent_ids)
407
        self.assertEquals("newcommit", newrev.revision_id)
408
        self.assertEquals(oldrev.committer, newrev.committer)
409
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
410
        self.assertEquals(oldrev.timezone, newrev.timezone)
411
        inv = wt.branch.repository.get_inventory("newcommit")
412
        self.assertEquals("afileid", inv.path2id("afile"))
413
        self.assertEquals("newcommit", inv[inv.path2id("notherfile")].revision)
414
415
    def test_two_revisions_no_renames(self):
416
        wt = self.make_branch_and_tree("old")
417
        self.build_tree(['old/afile', 'old/notherfile'])
418
        wt.add(["afile"], ["somefileid"])
419
        wt.commit("bla", rev_id="oldparent")
420
        wt.add(["notherfile"])
421
        wt.commit("bla", rev_id="oldcommit")
422
        oldrepos = wt.branch.repository
423
        wt = self.make_branch_and_tree("new")
424
        self.build_tree(['new/afile', 'new/notherfile'])
425
        wt.add(["afile"], ["afileid"])
426
        wt.commit("bla", rev_id="newparent")
427
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
428
        wt.branch.repository.lock_write()
0.436.34 by Jelmer Vernooij
Some more tests.
429
        self.assertRaises(ReplayParentsInconsistent, 
430
                          replay_snapshot, wt.branch.repository, 
431
                          "oldcommit", "newcommit", 
432
                        ["newparent"], revid_renames={})
0.436.49 by Jelmer Vernooij
Fix locking.
433
        wt.branch.repository.unlock()
0.436.34 by Jelmer Vernooij
Some more tests.
434
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
435
    def test_multi_revisions(self):
436
        wt = self.make_branch_and_tree("old")
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
437
        self.build_tree(['old/afile', 'old/sfile', 'old/notherfile'])
438
        wt.add(['sfile'])
0.436.34 by Jelmer Vernooij
Some more tests.
439
        wt.add(["afile"], ["somefileid"])
440
        wt.commit("bla", rev_id="oldgrandparent")
441
        open("old/afile", "w").write("data")
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
442
        wt.commit("bla", rev_id="oldparent")
443
        wt.add(["notherfile"])
444
        wt.commit("bla", rev_id="oldcommit")
445
        oldrepos = wt.branch.repository
446
        wt = self.make_branch_and_tree("new")
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
447
        self.build_tree(['new/afile', 'new/sfile', 'new/notherfile'])
448
        wt.add(['sfile'])
0.436.34 by Jelmer Vernooij
Some more tests.
449
        wt.add(["afile"], ["afileid"])
450
        wt.commit("bla", rev_id="newgrandparent")
451
        open("new/afile", "w").write("data")
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
452
        wt.commit("bla", rev_id="newparent")
453
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
454
        wt.branch.repository.lock_write()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
455
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
456
                ["newparent"], {"oldgrandparent": "newgrandparent", 
457
                                "oldparent": "newparent"})
0.436.49 by Jelmer Vernooij
Fix locking.
458
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
459
        oldrev = wt.branch.repository.get_revision("oldcommit")
460
        newrev = wt.branch.repository.get_revision("newcommit")
0.436.34 by Jelmer Vernooij
Some more tests.
461
        self.assertEquals(["newparent"], newrev.parent_ids)
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
462
        self.assertEquals("newcommit", newrev.revision_id)
463
        self.assertEquals(oldrev.committer, newrev.committer)
464
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
465
        self.assertEquals(oldrev.timezone, newrev.timezone)
466
        inv = wt.branch.repository.get_inventory("newcommit")
0.436.34 by Jelmer Vernooij
Some more tests.
467
        self.assertEquals("afileid", inv.path2id("afile"))
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
468
        self.assertEquals("newcommit", inv[inv.path2id("notherfile")].revision)
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
469
        self.assertEquals("newgrandparent", inv[inv.path2id("sfile")].revision)
0.436.34 by Jelmer Vernooij
Some more tests.
470
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
471
    def test_maps_ids(self):
472
        wt = self.make_branch_and_tree("old")
473
        wt.commit("base", rev_id="base")
474
        self.build_tree(['old/afile'])
475
        wt.add(["afile"], ids=["originalid"])
476
        wt.commit("bla", rev_id="oldparent")
477
        file("old/afile", "w").write("bloe")
478
        wt.commit("bla", rev_id="oldcommit")
479
        oldrepos = wt.branch.repository
480
        wt = self.make_branch_and_tree("new")
481
        self.build_tree(['new/afile'])
482
        wt.add(["afile"], ids=["newid"])
483
        wt.commit("bla", rev_id="newparent")
484
        wt.branch.repository.fetch(oldrepos)
0.436.49 by Jelmer Vernooij
Fix locking.
485
        wt.branch.repository.lock_write()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
486
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
0.436.35 by Jelmer Vernooij
Make revid_renames argument mandatory.
487
                ["newparent"], {"oldparent": "newparent"})
0.436.49 by Jelmer Vernooij
Fix locking.
488
        wt.branch.repository.unlock()
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
489
        oldrev = wt.branch.repository.get_revision("oldcommit")
490
        newrev = wt.branch.repository.get_revision("newcommit")
491
        self.assertEquals(["newparent"], newrev.parent_ids)
492
        self.assertEquals("newcommit", newrev.revision_id)
493
        self.assertEquals(oldrev.committer, newrev.committer)
494
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
495
        self.assertEquals(oldrev.timezone, newrev.timezone)
496
        inv = wt.branch.repository.get_inventory("newcommit")
497
        self.assertEquals("newid", inv.path2id("afile"))
498
        self.assertEquals("newcommit", inv[inv.path2id("afile")].revision)
499
0.436.37 by Jelmer Vernooij
Store parents correctly.
500
501
class TestReplayWorkingtree(TestCaseWithTransport):
502
    def test_conflicts(self):
503
        wt = self.make_branch_and_tree("old")
504
        wt.commit("base", rev_id="base")
505
        self.build_tree(['old/afile'])
506
        wt.add(["afile"], ids=["originalid"])
507
        wt.commit("bla", rev_id="oldparent")
508
        file("old/afile", "w").write("bloe")
509
        wt.commit("bla", rev_id="oldcommit")
510
        oldrepos = wt.branch.repository
511
        wt = self.make_branch_and_tree("new")
512
        self.build_tree(['new/afile'])
513
        wt.add(["afile"], ids=["newid"])
514
        wt.commit("bla", rev_id="newparent")
515
        wt.branch.repository.fetch(oldrepos)
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
516
        wt.lock_write()
0.436.37 by Jelmer Vernooij
Store parents correctly.
517
        self.assertRaises(ConflictsInTree, 
518
            replay_delta_workingtree, wt, "oldcommit", "newcommit", 
519
            ["newparent"])
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
520
        wt.unlock()
0.436.37 by Jelmer Vernooij
Store parents correctly.
521
522
    def test_simple(self):
523
        wt = self.make_branch_and_tree("old")
524
        wt.commit("base", rev_id="base")
525
        self.build_tree(['old/afile'])
526
        wt.add(["afile"], ids=["originalid"])
527
        wt.commit("bla", rev_id="oldparent")
528
        file("old/afile", "w").write("bloe")
0.436.79 by Jelmer Vernooij
Fix tests when using the latest version of bzr.
529
        wt.commit("bla", rev_id="oldcommit")
0.436.37 by Jelmer Vernooij
Store parents correctly.
530
        wt = wt.bzrdir.sprout("new").open_workingtree()
531
        self.build_tree(['new/bfile'])
532
        wt.add(["bfile"], ids=["newid"])
533
        wt.commit("bla", rev_id="newparent")
534
        replay_delta_workingtree(wt, "oldcommit", "newcommit", 
535
            ["newparent"])
536
        oldrev = wt.branch.repository.get_revision("oldcommit")
537
        newrev = wt.branch.repository.get_revision("newcommit")
538
        self.assertEquals(["newparent"], newrev.parent_ids)
539
        self.assertEquals("newcommit", newrev.revision_id)
540
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
541
        self.assertEquals(oldrev.timezone, newrev.timezone)
542
543
    def test_multiple(self):
544
        wt = self.make_branch_and_tree("old")
545
        wt.commit("base", rev_id="base")
546
        self.build_tree(['old/afile'])
547
        wt.add(["afile"], ids=["originalid"])
548
        wt.commit("bla", rev_id="oldparent")
549
        file("old/afile", "w").write("bloe")
550
        wt.add_pending_merge("ghost")
551
        wt.commit("bla", rev_id="oldcommit")
552
        wt = wt.bzrdir.sprout("new").open_workingtree()
553
        self.build_tree(['new/bfile'])
554
        wt.add(["bfile"], ids=["newid"])
555
        wt.commit("bla", rev_id="newparent")
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
556
        wt.lock_write()
0.436.37 by Jelmer Vernooij
Store parents correctly.
557
        replay_delta_workingtree(wt, "oldcommit", "newcommit", 
558
            ["newparent", "ghost"])
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
559
        wt.unlock()
0.436.37 by Jelmer Vernooij
Store parents correctly.
560
        oldrev = wt.branch.repository.get_revision("oldcommit")
561
        newrev = wt.branch.repository.get_revision("newcommit")
562
        self.assertEquals(["newparent", "ghost"], newrev.parent_ids)
563
        self.assertEquals("newcommit", newrev.revision_id)
564
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
565
        self.assertEquals(oldrev.timezone, newrev.timezone)
566
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
567
    def test_already_merged(self):
568
        """We need to use a merge base that makes sense. 
569
        
570
        A
571
        | \
572
        B  D
573
        | \|
574
        C  E
575
576
        Rebasing E on C should result in:
577
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
578
        A -> B -> C -> D' -> E'
579
580
        Ancestry:
581
        A: 
582
        B: A
583
        C: A, B
584
        D: A
585
        E: A, B, D
586
        D': A, B, C
587
        E': A, B, C, D'
588
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
589
        """
590
        oldwt = self.make_branch_and_tree("old")
591
        self.build_tree(['old/afile'])
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
592
        file("old/afile", "w").write("A\n" * 10)
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
593
        oldwt.add(["afile"])
594
        oldwt.commit("base", rev_id="A")
595
        newwt = oldwt.bzrdir.sprout("new").open_workingtree()
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
596
        file("old/afile", "w").write("A\n"*10 + "B\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
597
        oldwt.commit("bla", rev_id="B")
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
598
        file("old/afile", "w").write("A\n" * 10 + "C\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
599
        oldwt.commit("bla", rev_id="C")
600
        self.build_tree(['new/bfile'])
601
        newwt.add(["bfile"])
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
602
        file("new/bfile", "w").write("D\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
603
        newwt.commit("bla", rev_id="D")
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
604
        file("new/afile", "w").write("E\n" + "A\n"*10 + "B\n")
605
        file("new/bfile", "w").write("D\nE\n")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
606
        newwt.add_pending_merge("B")
607
        newwt.commit("bla", rev_id="E")
608
        newwt.branch.repository.fetch(oldwt.branch.repository)
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
609
        newwt.lock_write()
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
610
        replay_delta_workingtree(newwt, "D", "D'", ["C"])
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
611
        newwt.unlock()
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
612
        oldrev = newwt.branch.repository.get_revision("D")
613
        newrev = newwt.branch.repository.get_revision("D'")
614
        self.assertEquals(["C"], newrev.parent_ids)
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
615
        newwt.lock_write()
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
616
        self.assertRaises(ConflictsInTree, 
617
            lambda: replay_delta_workingtree(newwt, "E", "E'", ["D'"]))
0.436.62 by Jelmer Vernooij
Fix compatibility with packs.
618
        newwt.unlock()
0.438.2 by Jelmer Vernooij
More work using proper merge bases.
619
        self.assertEquals("E\n" + "A\n" * 10 + "C\n",
620
                open("new/afile", 'r').read())
0.436.56 by Jelmer Vernooij
Fix test.
621
        newwt.set_conflicts(ConflictList())
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
622
        oldrev = newwt.branch.repository.get_revision("E")
0.436.56 by Jelmer Vernooij
Fix test.
623
        commit_rebase(newwt, oldrev, "E'")
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
624
        newrev = newwt.branch.repository.get_revision("E'")
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
625
        self.assertEquals(["D'"], newrev.parent_ids)
0.436.39 by Jelmer Vernooij
Some more refactoring, add test that demonstrates #126743.
626
        self.assertEquals(["A", "B", "C", "D'", "E'"], 
627
                          newwt.branch.revision_history())
628
0.436.37 by Jelmer Vernooij
Store parents correctly.
629
0.436.34 by Jelmer Vernooij
Some more tests.
630
class TestReplaySnapshotError(TestCase):
631
    def test_create(self):
632
        ReplaySnapshotError("message")
633
634
635
class TestReplayParentsInconsistent(TestCase):
636
    def test_create(self):
637
        ReplayParentsInconsistent("afileid", "arevid")
0.438.1 by Jelmer Vernooij
Split out function for determining rebase base.
638
0.436.54 by Jelmer Vernooij
Move determination of merge base to separate function.
639
640
class ReplayDetermineBaseTests(TestCase):
641
    def setUp(self):
642
        self.graph = Graph(self)
643
0.436.73 by Jelmer Vernooij
Fix tests.
644
    def get_parent_map(self, keys):
645
        return dict((revid, self._parent_dict[revid]) for k in self._parent_dict if k in keys)
646
0.436.54 by Jelmer Vernooij
Move determination of merge base to separate function.
647
    def get_parents(self, revid):
648
        return self._parent_dict[revid]
649
650
    def test_null(self):
651
        self._parent_dict = {"myrev": []}
652
        self.assertEquals(NULL_REVISION, 
653
          replay_determine_base(self.graph, "myrev", [], "mynewrev", ["bar"]))
654
655
    def test_simple(self):
656
        self._parent_dict = {"myinitrev": [], "myrev": ["myinitrev"]}
657
        self.assertEquals("myinitrev", 
658
          replay_determine_base(self.graph, "myrev", ["myinitrev"], 
659
                                "mynewrev", ["mynewparents"]))
660