1
# Copyright (C) 2007-2009 Jelmer Vernooij <jelmer@samba.org>
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.
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.
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
17
"""Mapping upgrade tests."""
19
from bzrlib.bzrdir import (
22
from bzrlib.errors import (
25
from bzrlib.repository import (
28
from bzrlib.tests import (
33
from bzrlib.plugins.svn.layout.standard import (
36
from bzrlib.plugins.svn.mapping import (
39
from bzrlib.plugins.svn.mapping3.base import (
42
from bzrlib.plugins.svn.mapping3.scheme import (
45
from bzrlib.plugins.svn.tests import (
53
from bzrlib.plugins.rewrite import upgrade
55
from bzrlib.plugins.rebase import upgrade
56
except IncompatibleAPI, e:
57
raise TestSkipped(str(e))
58
except ImportError, e:
59
raise TestSkipped(str(e))
63
class UpgradeTests(SubversionTestCase):
65
def test_no_custom(self):
66
upgrade = import_upgrade()
67
repos_url = self.make_repository("a")
69
dc = self.get_commit_editor(repos_url)
70
dc.add_file("a").modify("b")
73
oldrepos = Repository.open(repos_url)
74
oldrepos.set_layout(RootLayout())
75
dir = BzrDir.create("f")
76
newrepos = dir.create_repository()
77
oldrepos.copy_content_into(newrepos)
79
wt = dir.create_workingtree()
80
file("f/a","w").write("b")
82
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
84
self.assertTrue(newrepos.has_revision("svn-v1:1@%s-" % oldrepos.uuid))
86
mapping = oldrepos.get_mapping()
87
upgrade.upgrade_repository(newrepos, oldrepos, new_mapping=mapping, allow_changes=True)
89
self.assertTrue(newrepos.has_revision(oldrepos.generate_revision_id(1, "", mapping)))
91
def test_single_custom(self):
92
upgrade = import_upgrade()
93
repos_url = self.make_repository("a")
95
dc = self.get_commit_editor(repos_url)
96
dc.add_file("a").modify("b")
99
oldrepos = Repository.open(repos_url)
100
oldrepos.set_layout(RootLayout())
101
dir = BzrDir.create("f")
102
newrepos = dir.create_repository()
103
oldrepos.copy_content_into(newrepos)
105
wt = dir.create_workingtree()
106
file("f/a", "w").write("b")
108
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
109
file("f/a", 'w').write("moredata")
110
wt.commit(message='fix moredata', rev_id="customrev")
112
mapping = oldrepos.get_mapping()
113
upgrade.upgrade_repository(newrepos, oldrepos, new_mapping=mapping, allow_changes=True)
115
self.assertTrue(newrepos.has_revision(oldrepos.generate_revision_id(1, "", mapping)))
116
self.assertTrue(newrepos.has_revision("customrev%s-upgrade" % mapping.upgrade_suffix))
118
self.assertTrue((oldrepos.generate_revision_id(1, "", mapping),),
119
tuple(newrepos.get_revision("customrev%s-upgrade" % mapping.upgrade_suffix).parent_ids))
122
def test_single_keep_parent_fileid(self):
123
upgrade = import_upgrade()
124
repos_url = self.make_repository("a")
126
dc = self.get_commit_editor(repos_url)
127
dc.add_file("a").modify("b")
130
oldrepos = Repository.open(repos_url)
131
oldrepos.set_layout(RootLayout())
132
dir = BzrDir.create("f")
133
newrepos = dir.create_repository()
134
oldrepos.copy_content_into(newrepos)
136
wt = dir.create_workingtree()
137
file("f/a", "w").write("b")
138
wt.add(["a"], ["someid"])
139
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
140
wt.rename_one("a", "b")
141
file("f/a", 'w').write("moredata")
142
wt.add(["a"], ["specificid"])
143
wt.commit(message='fix moredata', rev_id="customrev")
145
mapping = oldrepos.get_mapping()
146
upgrade.upgrade_repository(newrepos, oldrepos, new_mapping=mapping, allow_changes=True)
147
tree = newrepos.revision_tree("customrev%s-upgrade" % mapping.upgrade_suffix)
148
self.assertEqual("specificid", tree.inventory.path2id("a"))
149
self.assertEqual(mapping.generate_file_id((oldrepos.uuid, "", 1), u"a"),
150
tree.inventory.path2id("b"))
152
def test_single_custom_continue(self):
153
upgrade = import_upgrade()
154
repos_url = self.make_repository("a")
156
dc = self.get_commit_editor(repos_url)
157
dc.add_file("a").modify("b")
158
dc.add_file("b").modify("c")
161
oldrepos = Repository.open(repos_url)
162
oldrepos.set_layout(RootLayout())
163
dir = BzrDir.create("f")
164
newrepos = dir.create_repository()
165
oldrepos.copy_content_into(newrepos)
167
wt = dir.create_workingtree()
168
file("f/a", "w").write("b")
169
file("f/b", "w").write("c")
172
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
173
file("f/a", 'w').write("moredata")
174
file("f/b", 'w').write("moredata")
175
wt.commit(message='fix moredata', rev_id="customrev")
177
tree = newrepos.revision_tree("svn-v1:1@%s-" % oldrepos.uuid)
179
newrepos.lock_write()
180
newrepos.start_write_group()
182
mapping = oldrepos.get_mapping()
183
fileid = tree.inventory.path2id("a")
184
revid = "customrev%s-upgrade" % mapping.upgrade_suffix
185
newrepos.texts.add_lines((fileid, revid),
186
[(fileid, "svn-v1:1@%s-" % oldrepos.uuid)],
187
tree.get_file(fileid).readlines())
189
newrepos.commit_write_group()
192
upgrade.upgrade_repository(newrepos, oldrepos, new_mapping=mapping,
195
self.assertTrue(newrepos.has_revision(oldrepos.generate_revision_id(1, "", mapping)))
196
self.assertTrue(newrepos.has_revision("customrev%s-upgrade" % mapping.upgrade_suffix))
198
self.assertTrue((oldrepos.generate_revision_id(1, "", mapping),),
199
tuple(newrepos.get_revision("customrev%s-upgrade" % mapping.upgrade_suffix).parent_ids))
202
def test_more_custom(self):
203
upgrade = import_upgrade()
204
repos_url = self.make_repository("a")
206
dc = self.get_commit_editor(repos_url)
207
dc.add_file("a").modify("b")
210
oldrepos = Repository.open(repos_url)
211
oldrepos.set_layout(RootLayout())
212
dir = BzrDir.create("f")
213
newrepos = dir.create_repository()
215
wt = dir.create_workingtree()
216
file("f/a", "w").write("b")
218
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
219
file("f/a", 'w').write("moredata")
220
wt.commit(message='fix moredata', rev_id="customrev")
221
file("f/a", 'w').write("blackfield")
222
wt.commit(message='fix it again', rev_id="anotherrev")
224
mapping = oldrepos.get_mapping()
225
renames = upgrade.upgrade_repository(newrepos, oldrepos,
226
new_mapping=mapping, allow_changes=True)
228
'svn-v1:1@%s-' % oldrepos.uuid: mapping.revision_id_foreign_to_bzr((oldrepos.uuid, "", 1)),
229
"customrev": "customrev%s-upgrade" % mapping.upgrade_suffix,
230
"anotherrev": "anotherrev%s-upgrade" % mapping.upgrade_suffix},
233
self.assertTrue(newrepos.has_revision(oldrepos.generate_revision_id(1, "", mapping)))
234
self.assertTrue(newrepos.has_revision("customrev%s-upgrade" % mapping.upgrade_suffix))
235
self.assertTrue(newrepos.has_revision("anotherrev%s-upgrade" % mapping.upgrade_suffix))
237
self.assertTrue((oldrepos.generate_revision_id(1, "", mapping),),
238
tuple(newrepos.get_revision("customrev%s-upgrade" % mapping.upgrade_suffix).parent_ids))
239
self.assertTrue(("customrev-%s-upgrade" % mapping.upgrade_suffix,),
240
tuple(newrepos.get_revision("anotherrev%s-upgrade" % mapping.upgrade_suffix).parent_ids))
243
def test_more_custom_branch(self):
244
upgrade = import_upgrade()
245
repos_url = self.make_repository("a")
247
dc = self.get_commit_editor(repos_url)
248
dc.add_file("a").modify("b")
251
oldrepos = Repository.open(repos_url)
252
oldrepos.set_layout(RootLayout())
253
dir = BzrDir.create("f")
254
newrepos = dir.create_repository()
255
b = dir.create_branch()
256
wt = dir.create_workingtree()
257
file("f/a", "w").write("b")
259
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
260
file("f/a", 'w').write("moredata")
261
wt.commit(message='fix moredata', rev_id="customrev")
262
file("f/a", 'w').write("blackfield")
263
wt.commit(message='fix it again', rev_id="anotherrev")
265
upgrade.upgrade_branch(b, oldrepos, new_mapping=oldrepos.get_mapping(), allow_changes=True)
266
mapping = oldrepos.get_mapping()
267
self.assertEqual([oldrepos.generate_revision_id(0, "", mapping),
268
oldrepos.generate_revision_id(1, "", mapping),
269
"customrev%s-upgrade" % mapping.upgrade_suffix,
270
"anotherrev%s-upgrade" % mapping.upgrade_suffix
271
], b.revision_history())
273
def test_workingtree(self):
274
upgrade = import_upgrade()
275
repos_url = self.make_repository("a")
277
dc = self.get_commit_editor(repos_url)
278
dc.add_file("a").modify("b")
281
oldrepos = Repository.open(repos_url)
282
oldrepos.set_layout(RootLayout())
283
dir = BzrDir.create("f")
284
newrepos = dir.create_repository()
285
b = dir.create_branch()
286
wt = dir.create_workingtree()
287
file("f/a", "w").write("b")
289
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
290
file("f/a", 'w').write("moredata")
291
wt.commit(message='fix moredata', rev_id="customrev")
292
file("f/a", 'w').write("blackfield")
293
wt.commit(message='fix it again', rev_id="anotherrev")
295
mapping = oldrepos.get_mapping()
296
upgrade.upgrade_workingtree(wt, oldrepos, new_mapping=mapping,
298
self.assertEquals(wt.last_revision(), b.last_revision())
299
self.assertEqual([oldrepos.generate_revision_id(0, "", mapping),
300
oldrepos.generate_revision_id(1, "", mapping),
301
"customrev%s-upgrade" % mapping.upgrade_suffix,
302
"anotherrev%s-upgrade" % mapping.upgrade_suffix
303
], b.revision_history())
305
def test_branch_none(self):
306
upgrade = import_upgrade()
307
repos_url = self.make_repository("a")
309
dc = self.get_commit_editor(repos_url)
310
dc.add_file("a").modify("b")
313
oldrepos = Repository.open(repos_url)
314
dir = BzrDir.create("f")
315
dir.create_repository()
316
b = dir.create_branch()
317
wt = dir.create_workingtree()
318
file("f/a", "w").write("b")
320
wt.commit(message="data", rev_id="blarev")
321
file("f/a", 'w').write("moredata")
322
wt.commit(message='fix moredata', rev_id="customrev")
323
file("f/a", 'w').write("blackfield")
324
wt.commit(message='fix it again', rev_id="anotherrev")
326
upgrade.upgrade_branch(b, oldrepos, new_mapping=oldrepos.get_mapping())
327
self.assertEqual(["blarev", "customrev", "anotherrev"],
328
b.revision_history())
330
def test_raise_incompat(self):
331
upgrade = import_upgrade()
332
repos_url = self.make_repository("a")
334
dc = self.get_commit_editor(repos_url)
335
dc.add_file("d").modify("e")
338
oldrepos = Repository.open(repos_url)
339
oldrepos.set_layout(RootLayout())
340
dir = BzrDir.create("f")
341
dir.create_repository()
342
b = dir.create_branch()
343
wt = dir.create_workingtree()
344
file("f/a", "w").write("c")
346
wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
348
self.assertRaises(upgrade.UpgradeChangesContent, lambda: upgrade.upgrade_branch(b, oldrepos, new_mapping=oldrepos.get_mapping()))
351
class TestGenerateUpdateMapTests(TestCase):
353
def test_nothing(self):
354
upgrade = import_upgrade()
355
self.assertEquals({}, upgrade.generate_upgrade_map(["bla", "bloe"], foreign_vcs_svn, BzrSvnMappingv3(TrunkBranchingScheme()).revision_id_foreign_to_bzr))
357
def test_v2_to_v3(self):
358
upgrade = import_upgrade()
359
self.assertEquals({"svn-v2:12@65390229-12b7-0310-b90b-f21a5aa7ec8e-trunk": "svn-v3-trunk0:65390229-12b7-0310-b90b-f21a5aa7ec8e:trunk:12"}, upgrade.generate_upgrade_map(["svn-v2:12@65390229-12b7-0310-b90b-f21a5aa7ec8e-trunk", "bloe", "blaaa"], foreign_vcs_svn, BzrSvnMappingv3(TrunkBranchingScheme()).revision_id_foreign_to_bzr))