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