/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.7 by Jelmer Vernooij
Add more test, make basic rebase work.
18
from bzrlib.errors import UnknownFormatError, NoSuchFile
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,
29
                    ReplaySnapshotFailed)
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
30
0.436.4 by Jelmer Vernooij
Add some tests.
31
0.436.3 by Jelmer Vernooij
Fill in commands.
32
class RebasePlanReadWriterTests(TestCase):
0.436.4 by Jelmer Vernooij
Add some tests.
33
    def test_simple_marshall_rebase_plan(self):
34
        self.assertEqualDiff(
35
"""# Bazaar rebase plan 1
36
1 bla
37
oldrev newrev newparent1 newparent2
38
""", marshall_rebase_plan((1, "bla"), 
39
                          {"oldrev": ("newrev", ["newparent1", "newparent2"])}))
40
41
    def test_simple_unmarshall_rebase_plan(self):
42
        self.assertEquals(((1, "bla"), 
43
                          {"oldrev": ("newrev", ["newparent1", "newparent2"])}),
44
                         unmarshall_rebase_plan("""# Bazaar rebase plan 1
45
1 bla
46
oldrev newrev newparent1 newparent2
47
"""))
48
49
    def test_unmarshall_rebase_plan_formatunknown(self):
50
        self.assertRaises(UnknownFormatError,
51
                         unmarshall_rebase_plan, """# Bazaar rebase plan x
52
1 bla
53
oldrev newrev newparent1 newparent2
54
""")
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
55
56
57
class ConversionTests(TestCaseWithTransport):
58
    def test_simple(self):
59
        wt = self.make_branch_and_tree('.')
60
        b = wt.branch
61
        file('hello', 'w').write('hello world')
62
        wt.add('hello')
63
        wt.commit(message='add hello', rev_id="bla")
64
        file('hello', 'w').write('world')
65
        wt.commit(message='change hello', rev_id="bloe")
66
        wt.set_last_revision("bla")
67
        b.set_revision_history(["bla"])
68
        file('hello', 'w').write('world')
69
        wt.commit(message='change hello', rev_id="bla2")
70
        
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
71
        newrev = replay_snapshot(wt.branch.repository, "bla2", "bla4", 
0.436.5 by Jelmer Vernooij
Import change_revision_parent from bzr-svn.
72
                                        ["bloe"])
73
        self.assertEqual("bla4", newrev)
74
        self.assertTrue(wt.branch.repository.has_revision(newrev))
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
75
        self.assertEqual(["bloe"], 
76
                wt.branch.repository.revision_parents(newrev))
77
        self.assertEqual("bla2", 
78
            wt.branch.repository.get_revision(newrev).properties["rebase-of"])
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
79
80
81
class PlanCreatorTests(TestCaseWithTransport):
82
    def test_simple_plan_creator(self):
83
        wt = self.make_branch_and_tree('.')
84
        b = wt.branch
85
        file('hello', 'w').write('hello world')
86
        wt.add('hello')
87
        wt.commit(message='add hello', rev_id="bla")
88
        file('hello', 'w').write('world')
89
        wt.commit(message='change hello', rev_id="bloe")
90
        wt.set_last_revision("bla")
91
        b.set_revision_history(["bla"])
92
        file('hello', 'w').write('world')
93
        wt.commit(message='change hello', rev_id="bla2")
94
95
        self.assertEquals({'bla2': ('newbla2', ["bloe"])}, 
96
                generate_simple_plan(b.repository, b.revision_history(), "bla2", "bloe", 
97
                    lambda y: "new"+y.revision_id))
98
     
99
    def test_simple_plan_creator_extra_history(self):
100
        wt = self.make_branch_and_tree('.')
101
        b = wt.branch
102
        file('hello', 'w').write('hello world')
103
        wt.add('hello')
104
        wt.commit(message='add hello', rev_id="bla")
105
        file('hello', 'w').write('world')
106
        wt.commit(message='change hello', rev_id="bloe")
107
        wt.set_last_revision("bla")
108
        b.set_revision_history(["bla"])
109
        file('hello', 'w').write('world')
110
        wt.commit(message='change hello', rev_id="bla2")
111
        file('hello', 'w').write('universe')
112
        wt.commit(message='change hello again', rev_id="bla3")
113
114
        self.assertEquals({'bla2': ('newbla2', ["bloe"]), 'bla3': ('newbla3', ['newbla2'])}, 
115
                generate_simple_plan(b.repository, b.revision_history(), "bla2", "bloe", 
116
                    lambda y: "new"+y.revision_id))
117
 
118
119
    def test_generate_transpose_plan(self):
120
        wt = self.make_branch_and_tree('.')
121
        b = wt.branch
122
        file('hello', 'w').write('hello world')
123
        wt.add('hello')
124
        wt.commit(message='add hello', rev_id="bla")
125
        file('hello', 'w').write('world')
126
        wt.commit(message='change hello', rev_id="bloe")
127
        wt.set_last_revision("bla")
128
        b.set_revision_history(["bla"])
129
        file('hello', 'w').write('world')
130
        wt.commit(message='change hello', rev_id="bla2")
131
        file('hello', 'w').write('universe')
132
        wt.commit(message='change hello again', rev_id="bla3")
133
        wt.set_last_revision("bla")
134
        b.set_revision_history(["bla"])
135
        file('hello', 'w').write('somebar')
136
        wt.commit(message='change hello yet again', rev_id="blie")
137
        wt.set_last_revision(NULL_REVISION)
138
        b.set_revision_history([])
139
        wt.add('hello')
140
        wt.commit(message='add hello', rev_id="lala")
141
142
        self.assertEquals({
0.436.31 by Jelmer Vernooij
Refactor generate_transpose_plan() to not take a repository object but
143
                'blie': ('newblie', ['lala']), },
144
                generate_transpose_plan(b.repository.get_revision_graph("blie"), 
145
                {"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.
146
        self.assertEquals({
147
                'bla2': ('newbla2', ['lala']),
148
                'bla3': ('newbla3', ['newbla2']),
149
                'blie': ('newblie', ['lala']),
150
                'bloe': ('newbloe', ['lala'])},
0.436.31 by Jelmer Vernooij
Refactor generate_transpose_plan() to not take a repository object but
151
                generate_transpose_plan(b.repository.get_revision_graph(), 
152
                {"bla": "lala"}, b.repository.revision_parents, lambda y: "new"+y))
0.436.6 by Jelmer Vernooij
Add somewhat more complex plan generation function, rebase implementation.
153
0.436.31 by Jelmer Vernooij
Refactor generate_transpose_plan() to not take a repository object but
154
    def test_generate_transpose_plan_one(self):
155
        self.assertEquals({"bla": ("newbla", ["lala"])},
156
                generate_transpose_plan({"bla": ["bloe"], "bloe": []},
157
                    {"bloe": "lala"}, {}.get, lambda y: "new"+y))
0.436.7 by Jelmer Vernooij
Add more test, make basic rebase work.
158
159
class PlanFileTests(TestCaseWithTransport):
160
   def test_rebase_plan_exists_false(self):
161
        wt = self.make_branch_and_tree('.')
162
        self.assertFalse(rebase_plan_exists(wt))
163
164
   def test_rebase_plan_exists_empty(self):
165
        wt = self.make_branch_and_tree('.')
166
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "")
167
        self.assertFalse(rebase_plan_exists(wt))
168
169
   def test_rebase_plan_exists(self):
170
        wt = self.make_branch_and_tree('.')
171
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "foo")
172
        self.assertTrue(rebase_plan_exists(wt))
173
174
   def test_remove_rebase_plan(self):
175
        wt = self.make_branch_and_tree('.')
176
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "foo")
177
        remove_rebase_plan(wt)
178
        self.assertFalse(rebase_plan_exists(wt))
179
180
   def test_remove_rebase_plan_twice(self):
181
        wt = self.make_branch_and_tree('.')
182
        remove_rebase_plan(wt)
183
        self.assertFalse(rebase_plan_exists(wt))
184
185
   def test_write_rebase_plan(self):
186
        wt = self.make_branch_and_tree('.')
187
        file('hello', 'w').write('hello world')
188
        wt.add('hello')
189
        wt.commit(message='add hello', rev_id="bla")
190
        write_rebase_plan(wt, 
191
                {"oldrev": ("newrev", ["newparent1", "newparent2"])})
192
        self.assertEqualDiff("""# Bazaar rebase plan 1
193
1 bla
194
oldrev newrev newparent1 newparent2
195
""", wt._control_files.get(REBASE_PLAN_FILENAME).read())
196
197
   def test_read_rebase_plan_nonexistant(self):
198
        wt = self.make_branch_and_tree('.')
199
        self.assertRaises(NoSuchFile, read_rebase_plan, wt)
200
201
   def test_read_rebase_plan_empty(self):
202
        wt = self.make_branch_and_tree('.')
203
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, "")
204
        self.assertRaises(NoSuchFile, read_rebase_plan, wt)
205
        
206
   def test_read_rebase_plan(self):
207
        wt = self.make_branch_and_tree('.')
208
        wt._control_files.put_utf8(REBASE_PLAN_FILENAME, """# Bazaar rebase plan 1
209
1 bla
210
oldrev newrev newparent1 newparent2
211
""")
212
        self.assertEquals(((1, "bla"), {"oldrev": ("newrev", ["newparent1", "newparent2"])}),
213
                read_rebase_plan(wt))
214
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
215
0.436.9 by Jelmer Vernooij
Add rebase-todo command, fix rebase-continue.
216
class CurrentRevidFileTests(TestCaseWithTransport):
217
    def test_read_nonexistant(self):
218
        wt = self.make_branch_and_tree('.')
219
        self.assertIs(None, read_active_rebase_revid(wt))
220
221
    def test_read_null(self):
222
        wt = self.make_branch_and_tree('.')
223
        wt._control_files.put_utf8(REBASE_CURRENT_REVID_FILENAME, NULL_REVISION)
224
        self.assertIs(None, read_active_rebase_revid(wt))
225
226
    def test_read(self):
227
        wt = self.make_branch_and_tree('.')
228
        wt._control_files.put_utf8(REBASE_CURRENT_REVID_FILENAME, "bla")
229
        self.assertEquals("bla", read_active_rebase_revid(wt))
230
231
    def test_write(self):
232
        wt = self.make_branch_and_tree('.')
233
        write_active_rebase_revid(wt, "bloe")
234
        self.assertEquals("bloe", read_active_rebase_revid(wt))
235
236
    def test_write_null(self):
237
        wt = self.make_branch_and_tree('.')
238
        write_active_rebase_revid(wt, None)
239
        self.assertIs(None, read_active_rebase_revid(wt))
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
240
0.436.20 by Jelmer Vernooij
Some more blackbox tests.
241
0.436.18 by Jelmer Vernooij
More tests, extend MapTree a bit.
242
class RebaseTodoTests(TestCase):
243
    def test_done(self):
244
        class Repository:
245
            def has_revision(self, revid):
246
                return revid == "bloe"
247
        self.assertEquals([], 
248
                list(rebase_todo(Repository(), { "bla": ("bloe", [])})))
249
250
    def test_notstarted(self):
251
        class Repository:
252
            def has_revision(self, revid):
253
                return False
254
        self.assertEquals(["bla"], 
255
                list(rebase_todo(Repository(), { "bla": ("bloe", [])})))
256
257
    def test_halfway(self):
258
        class Repository:
259
            def has_revision(self, revid):
260
                return revid == "bloe"
261
        self.assertEquals(["ha"], 
262
                list(rebase_todo(Repository(), { "bla": ("bloe", []), 
263
                                                 "ha": ("hee", [])})))
0.436.32 by Jelmer Vernooij
Properly detect invalid snapshot replays.
264
265
class ReplaySnapshotTests(TestCaseWithTransport):
266
    def test_single_revision(self):
267
        wt = self.make_branch_and_tree(".")
268
        self.build_tree(['afile'])
269
        wt.add(["afile"])
270
        wt.commit("bla", rev_id="oldcommit")
271
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", [])
272
        oldrev = wt.branch.repository.get_revision("oldcommit")
273
        newrev = wt.branch.repository.get_revision("newcommit")
274
        self.assertEquals([], newrev.parent_ids)
275
        self.assertEquals("newcommit", newrev.revision_id)
276
        self.assertEquals(oldrev.committer, newrev.committer)
277
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
278
        self.assertEquals(oldrev.timezone, newrev.timezone)
279
        inv = wt.branch.repository.get_inventory("newcommit")
280
        self.assertEquals("newcommit", inv[inv.path2id("afile")].revision)
281
282
    def test_parents_different(self):
283
        """replay_snapshot() relies on the fact that the contents of 
284
        the old and new parents is equal (at least concerning tree shape). If 
285
        it turns out it isn't, an exception should be raised."""
286
        wt = self.make_branch_and_tree(".")
287
        wt.commit("bloe", rev_id="base")
288
        self.build_tree(['afile', 'notherfile'])
289
        wt.add(["afile"])
290
        wt.commit("bla", rev_id="oldparent")
291
        wt.add(["notherfile"])
292
        wt.commit("bla", rev_id="oldcommit")
293
        self.assertRaises(
294
                ReplaySnapshotFailed, replay_snapshot, 
295
                wt.branch.repository, "oldcommit", "newcommit", 
296
                        ["base"])
297
298
    def test_multi_revisions(self):
299
        wt = self.make_branch_and_tree("old")
300
        self.build_tree(['old/afile', 'old/notherfile'])
301
        wt.add(["afile"])
302
        wt.commit("bla", rev_id="oldparent")
303
        wt.add(["notherfile"])
304
        wt.commit("bla", rev_id="oldcommit")
305
        oldrepos = wt.branch.repository
306
        wt = self.make_branch_and_tree("new")
307
        self.build_tree(['new/afile', 'new/notherfile'])
308
        wt.add(["afile"])
309
        wt.commit("bla", rev_id="newparent")
310
        wt.branch.repository.fetch(oldrepos)
311
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
312
                        ["newparent"])
313
        oldrev = wt.branch.repository.get_revision("oldcommit")
314
        newrev = wt.branch.repository.get_revision("newcommit")
315
        self.assertEquals(["base"], newrev.parent_ids)
316
        self.assertEquals("newcommit", newrev.revision_id)
317
        self.assertEquals(oldrev.committer, newrev.committer)
318
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
319
        self.assertEquals(oldrev.timezone, newrev.timezone)
320
        inv = wt.branch.repository.get_inventory("newcommit")
321
        self.assertIs(None, inv.path2id("afile"))
322
        self.assertEquals("newcommit", inv[inv.path2id("notherfile")].revision)
323
324
    def test_maps_ids(self):
325
        wt = self.make_branch_and_tree("old")
326
        wt.commit("base", rev_id="base")
327
        self.build_tree(['old/afile'])
328
        wt.add(["afile"], ids=["originalid"])
329
        wt.commit("bla", rev_id="oldparent")
330
        file("old/afile", "w").write("bloe")
331
        wt.commit("bla", rev_id="oldcommit")
332
        oldrepos = wt.branch.repository
333
        wt = self.make_branch_and_tree("new")
334
        self.build_tree(['new/afile'])
335
        wt.add(["afile"], ids=["newid"])
336
        wt.commit("bla", rev_id="newparent")
337
        wt.branch.repository.fetch(oldrepos)
338
        replay_snapshot(wt.branch.repository, "oldcommit", "newcommit", 
339
                        ["newparent"])
340
        oldrev = wt.branch.repository.get_revision("oldcommit")
341
        newrev = wt.branch.repository.get_revision("newcommit")
342
        self.assertEquals(["newparent"], newrev.parent_ids)
343
        self.assertEquals("newcommit", newrev.revision_id)
344
        self.assertEquals(oldrev.committer, newrev.committer)
345
        self.assertEquals(oldrev.timestamp, newrev.timestamp)
346
        self.assertEquals(oldrev.timezone, newrev.timezone)
347
        inv = wt.branch.repository.get_inventory("newcommit")
348
        self.assertEquals("newid", inv.path2id("afile"))
349
        self.assertEquals("newcommit", inv[inv.path2id("afile")].revision)
350
351
class TestReplaySnapshotFailed(TestCase):
352
    def test_create(self):
353
        ReplaySnapshotFailed("message")