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