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