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