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