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