1 # Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
2 # *-* coding: utf-8 *-*
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 """Subversion fetch tests."""
21 from bzrlib.branch import Branch
22 from bzrlib.bzrdir import BzrDir
23 from bzrlib.osutils import has_symlinks
24 from bzrlib.repository import Repository
25 from bzrlib.revision import NULL_REVISION
26 from bzrlib.tests import TestSkipped, KnownFailure
27 from bzrlib.trace import mutter
29 from bzrlib.plugins.svn import format, remote
30 from bzrlib.plugins.svn.convert import load_dumpfile
31 from bzrlib.plugins.svn.errors import InvalidFileName
32 from bzrlib.plugins.svn.mapping3 import set_branching_scheme
33 from bzrlib.plugins.svn.mapping3.scheme import TrunkBranchingScheme, NoBranchingScheme
34 from bzrlib.plugins.svn.tests import TestCaseWithSubversionRepository
35 from bzrlib.plugins.svn.transport import SvnRaTransport
39 class TestFetchWorks(TestCaseWithSubversionRepository):
40 def test_fetch_fileid_renames(self):
41 repos_url = self.make_repository('d')
43 dc = self.commit_editor(repos_url)
44 dc.add_file("test", "data")
45 dc.change_dir_prop("", "bzr:file-ids", "test\tbla\n")
46 dc.change_dir_prop("", "bzr:revision-info", "")
49 oldrepos = Repository.open(repos_url)
50 dir = BzrDir.create("f", format.get_rich_root_format())
51 newrepos = dir.create_repository()
52 oldrepos.copy_content_into(newrepos)
53 mapping = oldrepos.get_mapping()
54 self.assertEqual("bla", newrepos.get_inventory(
55 oldrepos.generate_revision_id(1, "", mapping)).path2id("test"))
57 def test_fetch_trunk1(self):
58 repos_url = self.make_repository('d')
60 dc = self.commit_editor(repos_url)
62 dc.add_dir("proj1/trunk")
63 dc.add_file("proj1/trunk/file", "data")
66 oldrepos = Repository.open(repos_url)
67 set_branching_scheme(oldrepos, TrunkBranchingScheme(1))
68 dir = BzrDir.create("f", format.get_rich_root_format())
69 newrepos = dir.create_repository()
70 oldrepos.copy_content_into(newrepos)
72 def test_replace_from_branch(self):
73 repos_url = self.make_repository('d')
75 dc = self.commit_editor(repos_url)
77 dc.add_dir("trunk/check")
78 dc.add_dir("trunk/check/debian")
79 dc.add_file("trunk/check/stamp-h.in", "foo")
83 dc = self.commit_editor(repos_url)
84 dc.add_file("trunk/check/debian/pl", "bar")
87 dc = self.commit_editor(repos_url)
88 dc.add_file("trunk/check/debian/voo", "bar")
91 dc = self.commit_editor(repos_url)
92 dc.add_file("trunk/check/debian/blie", "oeh")
95 dc = self.commit_editor(repos_url)
96 dc.add_file("trunk/check/debian/bar", "oeh")
97 dc.add_file("trunk/check/bar", "bla")
100 self.make_checkout(repos_url, "dc")
102 self.client_copy("dc/trunk", "dc/tags/R_0_9_2", revnum=2)
103 self.client_delete("dc/tags/R_0_9_2/check/debian")
104 shutil.rmtree("dc/tags/R_0_9_2/check/debian")
105 self.client_copy("dc/trunk/check/debian", "dc/tags/R_0_9_2/check",
107 self.client_delete("dc/tags/R_0_9_2/check/stamp-h.in")
108 self.client_copy("dc/trunk/check/stamp-h.in", "dc/tags/R_0_9_2/check",
110 self.build_tree({"dc/tags/R_0_9_2/check/debian/blie": "oehha"})
111 self.client_update("dc")
112 self.client_commit("dc", "strange revision")
113 oldrepos = Repository.open(repos_url)
114 set_branching_scheme(oldrepos, TrunkBranchingScheme(0))
115 dir = BzrDir.create("f", format.get_rich_root_format())
116 newrepos = dir.create_repository()
117 oldrepos.copy_content_into(newrepos)
119 def test_fetch_backslash(self):
120 if sys.platform == 'win32':
121 raise TestSkipped("Unable to create filenames with backslash on Windows")
122 repos_url = self.make_repository('d')
124 dc = self.commit_editor(repos_url)
126 dc.add_file("trunk/file\\part", "data")
129 oldrepos = Repository.open(repos_url)
130 set_branching_scheme(oldrepos, TrunkBranchingScheme())
131 dir = BzrDir.create("f", format.get_rich_root_format())
132 newrepos = dir.create_repository()
133 self.assertRaises(InvalidFileName, oldrepos.copy_content_into, newrepos)
135 def test_fetch_null(self):
136 repos_url = self.make_repository('d')
137 oldrepos = Repository.open(repos_url)
138 set_branching_scheme(oldrepos, TrunkBranchingScheme(1))
139 dir = BzrDir.create("f", format.get_rich_root_format())
140 newrepos = dir.create_repository()
141 oldrepos.copy_content_into(newrepos, NULL_REVISION)
143 def test_fetch_complex_ids_dirs(self):
144 repos_url = self.make_repository('d')
146 dc = self.commit_editor(repos_url)
148 dc.add_dir("dir/adir")
149 dc.change_dir_prop("", "bzr:revision-info", "")
150 dc.change_dir_prop("", "bzr:file-ids", "dir\tbloe\ndir/adir\tbla\n")
153 dc = self.commit_editor(repos_url)
154 dc.add_dir("bdir", "dir/adir")
155 dc.delete("dir/adir")
156 dc.change_dir_prop("", "bzr:revision-info", "properties: \n")
157 dc.change_dir_prop("", "bzr:file-ids", "bdir\tbla\n")
160 oldrepos = Repository.open(repos_url)
161 dir = BzrDir.create("f", format.get_rich_root_format())
162 newrepos = dir.create_repository()
163 oldrepos.copy_content_into(newrepos)
164 mapping = oldrepos.get_mapping()
165 tree = newrepos.revision_tree(oldrepos.generate_revision_id(2, "", mapping))
166 self.assertEquals("bloe", tree.path2id("dir"))
167 self.assertIs(None, tree.path2id("dir/adir"))
168 self.assertEquals("bla", tree.path2id("bdir"))
170 def test_fetch_complex_ids_files(self):
171 repos_url = self.make_client('d', 'dc')
172 self.build_tree({'dc/dir/adir': 'contents'})
173 self.client_add("dc/dir")
174 self.client_set_prop("dc", "bzr:revision-info", "")
175 self.client_set_prop("dc", "bzr:file-ids", "dir\tbloe\ndir/adir\tbla\n")
176 self.client_commit("dc", "My Message")
177 self.client_update("dc")
178 self.client_copy("dc/dir/adir", "dc/bdir")
179 self.client_delete("dc/dir/adir")
180 self.client_set_prop("dc", "bzr:revision-info", "properties: \n")
181 self.client_set_prop("dc", "bzr:file-ids", "bdir\tbla\n")
182 self.client_commit("dc", "My Message")
183 self.client_update("dc")
184 oldrepos = Repository.open(repos_url)
185 dir = BzrDir.create("f", format.get_rich_root_format())
186 newrepos = dir.create_repository()
187 oldrepos.copy_content_into(newrepos)
188 mapping = oldrepos.get_mapping()
189 tree = newrepos.revision_tree(oldrepos.generate_revision_id(2, "", mapping))
190 self.assertEquals("bloe", tree.path2id("dir"))
191 self.assertIs(None, tree.path2id("dir/adir"))
192 mutter('entries: %r' % tree.inventory.entries())
193 self.assertEquals("bla", tree.path2id("bdir"))
195 def test_fetch_copy_remove_old(self):
196 repos_url = self.make_client('d', 'dc')
197 self.build_tree({'dc/trunk/afile': 'foo', 'dc/tags': None,
198 'dc/branches': None})
199 self.client_add("dc/trunk")
200 self.client_add("dc/tags")
201 self.client_add("dc/branches")
202 self.client_commit("dc", "My Message")
203 self.client_update("dc")
204 self.client_copy("dc/trunk", "dc/branches/blal")
205 self.build_tree({'dc/branches/blal/afile': "bar"})
206 self.client_commit("dc", "Msg")
207 self.client_update("dc")
208 self.client_copy("dc/trunk", "dc/tags/bla")
209 self.client_delete("dc/tags/bla/afile")
210 self.client_copy("dc/branches/blal/afile", "dc/tags/bla/afile")
211 self.client_commit("dc", "My Message")
212 self.client_update("dc")
213 oldrepos = Repository.open(repos_url)
214 dir = BzrDir.create("f", format.get_rich_root_format())
215 newrepos = dir.create_repository()
216 oldrepos.copy_content_into(newrepos)
218 def test_fetch_special_char(self):
219 repos_url = self.make_repository('d')
221 dc = self.commit_editor(repos_url)
223 dc.add_file(u"trunk/f\x2cle".encode("utf-8"), "data")
226 oldrepos = Repository.open(repos_url)
227 set_branching_scheme(oldrepos, TrunkBranchingScheme(0))
228 dir = BzrDir.create("f", format.get_rich_root_format())
229 newrepos = dir.create_repository()
230 oldrepos.copy_content_into(newrepos)
232 def test_fetch_signature(self):
233 repos_url = self.make_repository('d')
234 dc = self.commit_editor(repos_url)
236 dc.add_file("trunk/bar", "data")
239 self.client_set_revprop(repos_url, 1, "bzr:gpg-signature", "SIGNATURE")
240 oldrepos = Repository.open(repos_url)
241 set_branching_scheme(oldrepos, TrunkBranchingScheme(0))
242 dir = BzrDir.create("f", format.get_rich_root_format())
243 newrepos = dir.create_repository()
244 oldrepos.copy_content_into(newrepos)
245 self.assertEquals("SIGNATURE", newrepos.get_signature_text(oldrepos.generate_revision_id(1, "trunk", oldrepos.get_mapping())))
247 def test_fetch_special_char_edit(self):
248 repos_url = self.make_repository('d')
250 dc = self.commit_editor(repos_url)
252 dc.add_dir(u'trunk/IöC'.encode("utf-8"))
255 dc = self.commit_editor(repos_url)
256 dc.add_file(u'trunk/IöC/bar'.encode("utf-8"), "more data")
259 oldrepos = Repository.open(repos_url)
260 set_branching_scheme(oldrepos, TrunkBranchingScheme(0))
261 dir = BzrDir.create("f", format.get_rich_root_format())
262 newrepos = dir.create_repository()
263 oldrepos.copy_content_into(newrepos)
265 def test_fetch_special_char_child(self):
266 repos_url = self.make_repository('d')
268 dc = self.commit_editor(repos_url)
270 dc.add_dir(u"trunk/é".encode("utf-8"))
271 dc.add_file(u'trunk/é/f\x2cle'.encode("utf-8"), "data")
273 oldrepos = Repository.open(repos_url)
274 set_branching_scheme(oldrepos, TrunkBranchingScheme(0))
275 dir = BzrDir.create("f", format.get_rich_root_format())
276 newrepos = dir.create_repository()
277 oldrepos.copy_content_into(newrepos)
279 def test_fetch_special_char_modify(self):
280 repos_url = self.make_repository('d')
282 dc = self.commit_editor(repos_url)
284 dc.add_file(u"trunk/€\x2c".encode("utf-8"), "data")
287 dc = self.commit_editor(repos_url)
288 dc.change_file(u"trunk/€\x2c".encode("utf-8"), "bar")
291 oldrepos = Repository.open(repos_url)
292 set_branching_scheme(oldrepos, TrunkBranchingScheme(0))
293 dir = BzrDir.create("f", format.get_rich_root_format())
294 newrepos = dir.create_repository()
295 oldrepos.copy_content_into(newrepos)
296 self.assertEquals(2, revno)
298 def test_fetch_delete(self):
299 repos_url = self.make_client('d', 'dc')
300 self.build_tree({'dc/foo/bla': "data"})
301 self.client_add("dc/foo")
302 self.client_commit("dc", "My Message")
303 oldrepos = Repository.open(repos_url)
304 dir = BzrDir.create("f", format.get_rich_root_format())
305 newrepos = dir.create_repository()
306 oldrepos.copy_content_into(newrepos)
307 self.client_delete("dc/foo/bla")
308 self.client_commit("dc", "Second Message")
309 newrepos = Repository.open("f")
310 oldrepos.copy_content_into(newrepos)
311 mapping = oldrepos.get_mapping()
312 self.assertTrue(oldrepos.has_revision(oldrepos.generate_revision_id(2, "", mapping)))
314 def test_fetch_delete_recursive(self):
315 repos_url = self.make_client('d', 'dc')
316 self.build_tree({'dc/foo/bla': "data"})
317 self.client_add("dc/foo")
318 self.client_commit("dc", "My Message")
319 self.client_delete("dc/foo")
320 self.client_commit("dc", "Second Message")
321 oldrepos = Repository.open(repos_url)
322 dir = BzrDir.create("f", format.get_rich_root_format())
323 newrepos = dir.create_repository()
324 oldrepos.copy_content_into(newrepos)
325 mapping = oldrepos.get_mapping()
326 tree = newrepos.revision_tree(oldrepos.generate_revision_id(1, "", mapping))
327 self.assertEquals(3, len(tree.inventory))
328 tree = newrepos.revision_tree(oldrepos.generate_revision_id(2, "", mapping))
329 self.assertEquals(1, len(tree.inventory))
331 def test_fetch_local(self):
332 repos_url = self.make_client('d', 'dc')
333 self.build_tree({'dc/foo/bla': "data"})
334 self.client_add("dc/foo")
335 self.client_commit("dc", "My Message")
336 self.build_tree({'dc/foo/blo': "data2", "dc/bar/foo": "data3", 'dc/foo/bla': "data"})
337 self.client_add("dc/foo/blo")
338 self.client_add("dc/bar")
339 self.client_commit("dc", "Second Message")
340 oldrepos = Repository.open(repos_url)
341 dir = BzrDir.create("f", format.get_rich_root_format())
342 newrepos = dir.create_repository()
343 oldrepos.copy_content_into(newrepos)
344 mapping = oldrepos.get_mapping()
345 self.assertTrue(newrepos.has_revision(
346 oldrepos.generate_revision_id(1, "", mapping)))
347 self.assertTrue(newrepos.has_revision(
348 oldrepos.generate_revision_id(2, "", mapping)))
351 tree = newrepos.revision_tree(
352 oldrepos.generate_revision_id(2, "", mapping))
353 self.assertTrue(tree.has_filename("foo/bla"))
354 self.assertTrue(tree.has_filename("foo"))
355 self.assertEqual("data", tree.get_file_by_path("foo/bla").read())
359 def test_fetch_replace(self):
360 repos_url = self.make_client('d', 'dc')
361 self.build_tree({'dc/bla': "data"})
362 self.client_add("dc/bla")
363 self.client_commit("dc", "My Message")
364 self.client_delete("dc/bla")
365 self.build_tree({'dc/bla': "data2"})
366 self.client_add("dc/bla")
367 self.client_commit("dc", "Second Message")
368 oldrepos = Repository.open("svn+"+repos_url)
369 dir = BzrDir.create("f", format.get_rich_root_format())
370 newrepos = dir.create_repository()
371 oldrepos.copy_content_into(newrepos)
372 mapping = oldrepos.get_mapping()
373 self.assertTrue(newrepos.has_revision(
374 oldrepos.generate_revision_id(1, "", mapping)))
375 self.assertTrue(newrepos.has_revision(
376 oldrepos.generate_revision_id(2, "", mapping)))
377 inv1 = newrepos.get_inventory(
378 oldrepos.generate_revision_id(1, "", mapping))
379 inv2 = newrepos.get_inventory(
380 oldrepos.generate_revision_id(2, "", mapping))
381 self.assertNotEqual(inv1.path2id("bla"), inv2.path2id("bla"))
383 def test_fetch_copy_subdir(self):
384 repos_url = self.make_client('d', 'dc')
385 self.build_tree({'dc/trunk/mydir/a': "data"})
386 self.client_add("dc/trunk")
387 self.client_commit("dc", "My Message")
388 self.build_tree({'dc/branches/tmp': None})
389 self.client_add("dc/branches")
390 self.client_commit("dc", "Second Message")
391 self.client_copy("dc/trunk/mydir", "dc/branches/tmp/abranch")
392 self.client_commit("dc", "Third Message")
393 oldrepos = Repository.open("svn+"+repos_url)
394 set_branching_scheme(oldrepos, TrunkBranchingScheme())
395 dir = BzrDir.create("f", format.get_rich_root_format())
396 newrepos = dir.create_repository()
397 oldrepos.copy_content_into(newrepos)
399 def test_fetch_replace_nordic(self):
400 filename = os.path.join(self.test_dir, "dumpfile")
401 open(filename, 'w').write("""SVN-fs-dump-format-version: 2
403 UUID: 606c7b1f-987c-4826-b37d-eb556ceb87e1
406 Prop-content-length: 56
412 2006-12-26T00:04:55.850520Z
416 Prop-content-length: 103
430 2006-12-26T00:05:15.504335Z
436 Prop-content-length: 10
445 Prop-content-length: 10
446 Text-content-length: 5
447 Text-content-md5: 49803c8f7913948eb3e30bae749ae6bd
455 Prop-content-length: 105
469 2006-12-26T00:05:43.584249Z
478 load_dumpfile("dumpfile", "old")
479 oldrepos = Repository.open("old")
480 dir = BzrDir.create("f", format.get_rich_root_format())
481 newrepos = dir.create_repository()
482 oldrepos.copy_content_into(newrepos)
483 mapping = oldrepos.get_mapping()
484 self.assertTrue(newrepos.has_revision(
485 oldrepos.generate_revision_id(1, "", mapping)))
486 inv1 = newrepos.get_inventory(
487 oldrepos.generate_revision_id(1, "", mapping))
488 self.assertTrue(inv1.has_filename(u"x\xe1"))
490 def test_fetch_replace_with_subreplace(self):
491 filename = os.path.join(self.test_dir, "dumpfile")
492 open(filename, 'w').write("""SVN-fs-dump-format-version: 2
494 UUID: 606c7b1f-987c-4826-b37d-eb456ceb87e1
497 Prop-content-length: 56
503 2006-12-26T00:04:55.850520Z
507 Prop-content-length: 103
521 2006-12-26T00:05:15.504335Z
527 Prop-content-length: 10
535 Prop-content-length: 10
543 Prop-content-length: 10
549 Prop-content-length: 105
563 2006-12-26T00:05:43.584249Z
572 Prop-content-length: 10
579 Prop-content-length: 108
594 2006-12-25T04:30:06.383777Z
604 Node-copyfrom-path: x
613 Node-copyfrom-path: u
619 load_dumpfile("dumpfile", "old")
620 oldrepos = Repository.open("old")
621 dir = BzrDir.create("f", format.get_rich_root_format())
622 newrepos = dir.create_repository()
623 oldrepos.copy_content_into(newrepos)
624 mapping = oldrepos.get_mapping()
625 self.assertTrue(newrepos.has_revision(
626 oldrepos.generate_revision_id(1, "", mapping)))
627 self.assertTrue(newrepos.has_revision(
628 oldrepos.generate_revision_id(3, "", mapping)))
629 inv1 = newrepos.get_inventory(
630 oldrepos.generate_revision_id(1, "", mapping))
631 inv2 = newrepos.get_inventory(
632 oldrepos.generate_revision_id(3, "", mapping))
634 def test_fetch_replace_self(self):
635 filename = os.path.join(self.test_dir, "dumpfile")
636 open(filename, 'w').write("""SVN-fs-dump-format-version: 2
638 UUID: 6dcc86fc-ac21-4df7-a3a3-87616123c853
641 Prop-content-length: 56
647 2006-12-25T04:27:54.633666Z
651 Prop-content-length: 108
666 2006-12-25T04:28:17.503039Z
672 Prop-content-length: 10
679 Prop-content-length: 117
694 2006-12-25T04:28:30.160663Z
700 Prop-content-length: 10
707 Prop-content-length: 105
722 2006-12-25T04:28:44.996894Z
729 Node-copyfrom-path: bla
733 Prop-content-length: 108
748 2006-12-25T04:30:06.383777Z
759 Node-copyfrom-path: bla
765 load_dumpfile("dumpfile", "old")
766 oldrepos = Repository.open("old")
767 dir = BzrDir.create("f", format.get_rich_root_format())
768 newrepos = dir.create_repository()
769 oldrepos.copy_content_into(newrepos)
770 mapping = oldrepos.get_mapping()
771 self.assertTrue(newrepos.has_revision(
772 oldrepos.generate_revision_id(1, "", mapping)))
773 self.assertTrue(newrepos.has_revision(
774 oldrepos.generate_revision_id(3, "", mapping)))
775 inv1 = newrepos.get_inventory(
776 oldrepos.generate_revision_id(1, "", mapping))
777 inv2 = newrepos.get_inventory(
778 oldrepos.generate_revision_id(3, "", mapping))
779 self.assertEqual(inv1.path2id("bla"), inv2.path2id("bla"))
781 def test_fetch_replace_backup(self):
782 filename = os.path.join(self.test_dir, "dumpfile")
783 open(filename, 'w').write("""SVN-fs-dump-format-version: 2
785 UUID: 6dcc86fc-ac21-4df7-a3a3-87616123c853
788 Prop-content-length: 56
794 2006-12-25T04:27:54.633666Z
798 Prop-content-length: 108
813 2006-12-25T04:28:17.503039Z
819 Prop-content-length: 10
826 Prop-content-length: 117
841 2006-12-25T04:28:30.160663Z
847 Prop-content-length: 10
854 Prop-content-length: 105
869 2006-12-25T04:28:44.996894Z
876 Node-copyfrom-path: bla
880 Prop-content-length: 112
895 2006-12-25T23:51:09.678679Z
901 Prop-content-length: 28
913 Prop-content-length: 108
928 2006-12-25T04:30:06.383777Z
939 Node-copyfrom-path: bla
945 load_dumpfile("dumpfile", "old")
946 oldrepos = Repository.open("old")
947 dir = BzrDir.create("f", format.get_rich_root_format())
948 newrepos = dir.create_repository()
949 oldrepos.copy_content_into(newrepos)
950 mapping = oldrepos.get_mapping()
951 self.assertTrue(newrepos.has_revision(
952 oldrepos.generate_revision_id(1, "", mapping)))
953 self.assertTrue(newrepos.has_revision(
954 oldrepos.generate_revision_id(3, "", mapping)))
955 inv1 = newrepos.get_inventory(
956 oldrepos.generate_revision_id(1, "", mapping))
957 inv2 = newrepos.get_inventory(
958 oldrepos.generate_revision_id(3, "", mapping))
959 self.assertEqual(inv1.path2id("bla"), inv2.path2id("bla"))
961 def test_fetch_replace_unrelated(self):
962 filename = os.path.join(self.test_dir, "dumpfile")
963 open(filename, 'w').write("""SVN-fs-dump-format-version: 2
965 UUID: 606c7b1f-987c-4826-b37d-eb456ceb87e1
968 Prop-content-length: 56
974 2006-12-26T00:04:55.850520Z
978 Prop-content-length: 103
992 2006-12-26T00:05:15.504335Z
998 Prop-content-length: 10
1005 Prop-content-length: 102
1019 2006-12-26T00:05:30.775369Z
1027 Prop-content-length: 105
1041 2006-12-26T00:05:43.584249Z
1047 Prop-content-length: 10
1054 Prop-content-length: 108
1069 2006-12-25T04:30:06.383777Z
1079 Node-copyfrom-rev: 1
1080 Node-copyfrom-path: x
1086 load_dumpfile("dumpfile", "old")
1087 oldrepos = Repository.open("old")
1088 dir = BzrDir.create("f", format.get_rich_root_format())
1089 newrepos = dir.create_repository()
1090 oldrepos.copy_content_into(newrepos)
1091 mapping = oldrepos.get_mapping()
1092 self.assertTrue(newrepos.has_revision(
1093 oldrepos.generate_revision_id(1, "", mapping)))
1094 self.assertTrue(newrepos.has_revision(
1095 oldrepos.generate_revision_id(4, "", mapping)))
1096 inv1 = newrepos.get_inventory(
1097 oldrepos.generate_revision_id(1, "", mapping))
1098 inv2 = newrepos.get_inventory(
1099 oldrepos.generate_revision_id(4, "", mapping))
1100 self.assertNotEqual(inv1.path2id("x"), inv2.path2id("x"))
1102 def test_fetch_replace_related(self):
1103 filename = os.path.join(self.test_dir, "dumpfile")
1104 open(filename, 'w').write("""SVN-fs-dump-format-version: 2
1106 UUID: 606c7b1f-987c-4826-b37d-eb456ceb87e1
1109 Prop-content-length: 56
1115 2006-12-26T00:04:55.850520Z
1119 Prop-content-length: 103
1133 2006-12-26T00:05:15.504335Z
1139 Prop-content-length: 10
1146 Prop-content-length: 102
1160 2006-12-26T00:05:30.775369Z
1168 Prop-content-length: 105
1182 2006-12-26T00:05:43.584249Z
1188 Node-copyfrom-rev: 1
1189 Node-copyfrom-path: x
1190 Prop-content-length: 10
1197 Prop-content-length: 108
1212 2006-12-25T04:30:06.383777Z
1220 Prop-content-length: 108
1235 2006-12-25T04:30:06.383777Z
1242 Node-copyfrom-rev: 1
1243 Node-copyfrom-path: x
1249 load_dumpfile("dumpfile", "old")
1250 oldrepos = Repository.open("old")
1251 dir = BzrDir.create("f", format.get_rich_root_format())
1252 newrepos = dir.create_repository()
1253 oldrepos.copy_content_into(newrepos)
1254 mapping = oldrepos.get_mapping()
1255 self.assertTrue(newrepos.has_revision(
1256 oldrepos.generate_revision_id(1, "", mapping)))
1257 self.assertTrue(newrepos.has_revision(
1258 oldrepos.generate_revision_id(5, "", mapping)))
1259 inv1 = newrepos.get_inventory(
1260 oldrepos.generate_revision_id(1, "", mapping))
1261 inv2 = newrepos.get_inventory(
1262 oldrepos.generate_revision_id(5, "", mapping))
1263 self.assertNotEqual(inv1.path2id("y"), inv2.path2id("y"))
1265 def test_fetch_dir_upgrade(self):
1266 repos_url = self.make_repository('d')
1268 dc = self.commit_editor(repos_url)
1270 dc.add_dir("trunk/lib")
1271 dc.add_file("trunk/lib/file", 'data')
1274 dc = self.commit_editor(repos_url)
1275 dc.add_dir("branches")
1276 dc.add_dir("branches/mybranch", "trunk/lib")
1279 oldrepos = Repository.open(repos_url)
1280 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1281 dir = BzrDir.create("f", format.get_rich_root_format())
1282 newrepos = dir.create_repository()
1283 oldrepos.copy_content_into(newrepos)
1285 branch = Branch.open("%s/branches/mybranch" % repos_url)
1286 mapping = oldrepos.get_mapping()
1287 self.assertEqual([oldrepos.generate_revision_id(2, "branches/mybranch", mapping)],
1288 branch.revision_history())
1290 def test_fetch_file_from_non_branch(self):
1291 repos_url = self.make_client('d', 'dc')
1293 self.build_tree({'dc/old-trunk/lib/file': 'data'})
1294 self.client_add("dc/old-trunk")
1295 self.client_commit("dc", "trunk data")
1297 self.build_tree({'dc/trunk/lib': None})
1298 self.client_add("dc/trunk")
1299 self.client_copy("dc/old-trunk/lib/file", "dc/trunk/lib/file")
1300 self.client_commit("dc", "revive old trunk")
1302 oldrepos = Repository.open(repos_url)
1303 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1304 dir = BzrDir.create("f", format.get_rich_root_format())
1305 newrepos = dir.create_repository()
1306 oldrepos.copy_content_into(newrepos)
1308 branch = Branch.open("%s/trunk" % repos_url)
1309 self.assertEqual([oldrepos.generate_revision_id(2, "trunk", oldrepos.get_mapping())],
1310 branch.revision_history())
1312 def test_fetch_dir_from_non_branch(self):
1313 repos_url = self.make_client('d', 'dc')
1315 self.build_tree({'dc/old-trunk/lib/file': 'data'})
1316 self.client_add("dc/old-trunk")
1317 self.client_commit("dc", "trunk data")
1319 self.client_copy("dc/old-trunk", "dc/trunk")
1320 self.client_commit("dc", "revive old trunk")
1322 oldrepos = Repository.open(repos_url)
1323 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1324 dir = BzrDir.create("f", format.get_rich_root_format())
1325 newrepos = dir.create_repository()
1326 oldrepos.copy_content_into(newrepos)
1328 branch = Branch.open("%s/trunk" % repos_url)
1329 self.assertEqual([oldrepos.generate_revision_id(2, "trunk", oldrepos.get_mapping())],
1330 branch.revision_history())
1332 def test_fetch_from_non_branch(self):
1333 repos_url = self.make_repository('d')
1335 dc = self.commit_editor(repos_url)
1336 dc.add_dir("old-trunk")
1337 dc.add_dir("old-trunk/lib")
1338 dc.add_file("old-trunk/lib/file", "data")
1341 dc = self.commit_editor(repos_url)
1342 dc.add_dir("trunk", "old-trunk")
1345 oldrepos = Repository.open(repos_url)
1346 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1347 dir = BzrDir.create("f", format.get_rich_root_format())
1348 newrepos = dir.create_repository()
1349 oldrepos.copy_content_into(newrepos)
1351 branch = Branch.open("%s/trunk" % repos_url)
1352 self.assertEqual([oldrepos.generate_revision_id(2, "trunk", oldrepos.get_mapping())],
1353 branch.revision_history())
1357 def test_fetch_branch_downgrade(self):
1358 repos_url = self.make_client('d', 'dc')
1360 self.build_tree({'dc/trunk/file': 'data'})
1361 self.client_add("dc/trunk")
1362 self.client_commit("dc", "trunk data")
1364 self.build_tree({'dc/branches/mybranch': None})
1365 self.client_add("dc/branches")
1366 self.client_copy("dc/trunk", "dc/branches/mybranch/lib")
1367 self.client_commit("dc", "split out lib")
1369 oldrepos = Repository.open(repos_url)
1370 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1371 dir = BzrDir.create("f", format.get_rich_root_format())
1372 newrepos = dir.create_repository()
1373 oldrepos.copy_content_into(newrepos)
1375 def test_fetch_all(self):
1376 repos_url = self.make_repository('d')
1378 dc = self.commit_editor(repos_url)
1380 dc.add_file("trunk/hosts", 'hej1')
1383 dc = self.commit_editor(repos_url)
1384 dc.change_file('trunk/hosts', 'hej2')
1387 dc = self.commit_editor(repos_url)
1388 dc.change_file('trunk/hosts', 'hej3')
1391 dc = self.commit_editor(repos_url)
1392 dc.add_dir("branches")
1393 dc.add_dir("branches/foobranch")
1394 dc.add_file("branches/foobranch/file", 'foohosts')
1397 oldrepos = Repository.open(repos_url)
1398 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1399 dir = BzrDir.create("f", format.get_rich_root_format())
1400 newrepos = dir.create_repository()
1401 oldrepos.copy_content_into(newrepos)
1403 mapping = oldrepos.get_mapping()
1405 self.assertTrue(newrepos.has_revision(
1406 oldrepos.generate_revision_id(1, "trunk", mapping)))
1407 self.assertTrue(newrepos.has_revision(
1408 oldrepos.generate_revision_id(2, "trunk", mapping)))
1409 self.assertTrue(newrepos.has_revision(
1410 oldrepos.generate_revision_id(3, "trunk", mapping)))
1411 self.assertTrue(newrepos.has_revision(
1412 oldrepos.generate_revision_id(4, "branches/foobranch", mapping)))
1413 self.assertFalse(newrepos.has_revision(
1414 oldrepos.generate_revision_id(4, "trunk", mapping)))
1415 self.assertFalse(newrepos.has_revision(
1416 oldrepos.generate_revision_id(2, "", mapping)))
1418 def test_fetch_copy_root_id_kept(self):
1419 repos_url = self.make_client('d', 'dc')
1421 self.build_tree({'dc/trunk': None,
1422 'dc/trunk/hosts': 'hej1'})
1423 self.client_add("dc/trunk")
1424 self.client_commit("dc", "created trunk and added hosts") #1
1426 self.build_tree({'dc/branches': None})
1427 self.client_add("dc/branches")
1428 self.client_commit("dc", "added branches") #2
1430 self.client_copy("dc/trunk", "dc/branches/foobranch")
1431 self.client_commit("dc", "added branch foobranch") #3
1433 repos = remote.SvnRemoteAccess(SvnRaTransport("svn+"+repos_url), format.SvnRemoteFormat()).find_repository()
1434 set_branching_scheme(repos, TrunkBranchingScheme())
1436 mapping = repos.get_mapping()
1438 tree = repos.revision_tree(
1439 repos.generate_revision_id(3, "branches/foobranch", mapping))
1441 self.assertEqual(mapping.generate_file_id(repos.uuid, 1, "trunk", u""), tree.inventory.root.file_id)
1443 def test_fetch_odd(self):
1444 repos_url = self.make_client('d', 'dc')
1446 self.build_tree({'dc/trunk': None,
1447 'dc/trunk/hosts': 'hej1'})
1448 self.client_add("dc/trunk")
1449 self.client_commit("dc", "created trunk and added hosts") #1
1450 self.client_update("dc")
1452 self.build_tree({'dc/trunk/hosts': 'hej2'})
1453 self.client_commit("dc", "rev 2") #2
1454 self.client_update("dc")
1456 self.build_tree({'dc/trunk/hosts': 'hej3'})
1457 self.client_commit("dc", "rev 3") #3
1458 self.client_update("dc")
1460 self.build_tree({'dc/branches': None})
1461 self.client_add("dc/branches")
1462 self.client_commit("dc", "added branches") #4
1463 self.client_update("dc")
1465 self.client_copy("dc/trunk", "dc/branches/foobranch")
1466 self.client_commit("dc", "added branch foobranch") #5
1467 self.client_update("dc")
1469 self.build_tree({'dc/branches/foobranch/hosts': 'foohosts'})
1470 self.client_commit("dc", "foohosts") #6
1472 repos = remote.SvnRemoteAccess(SvnRaTransport("svn+"+repos_url), format.SvnRemoteFormat()).find_repository()
1473 set_branching_scheme(repos, TrunkBranchingScheme())
1475 mapping = repos.get_mapping()
1477 tree = repos.revision_tree(
1478 repos.generate_revision_id(6, "branches/foobranch", mapping))
1480 def test_fetch_consistent(self):
1481 repos_url = self.make_repository('d')
1483 dc = self.commit_editor(repos_url)
1484 dc.add_file("bla", "data")
1485 dc.change_file_prop("bla", "svn:executable", "*")
1488 oldrepos = Repository.open("svn+"+repos_url)
1489 dir1 = BzrDir.create("f", format.get_rich_root_format())
1490 dir2 = BzrDir.create("g", format.get_rich_root_format())
1491 newrepos1 = dir1.create_repository()
1492 newrepos2 = dir2.create_repository()
1493 oldrepos.copy_content_into(newrepos1)
1494 oldrepos.copy_content_into(newrepos2)
1495 mapping = oldrepos.get_mapping()
1496 inv1 = newrepos1.get_inventory(
1497 oldrepos.generate_revision_id(1, "", mapping))
1498 inv2 = newrepos2.get_inventory(
1499 oldrepos.generate_revision_id(1, "", mapping))
1500 self.assertEqual(inv1, inv2)
1502 def test_fetch_executable(self):
1503 repos_url = self.make_client('d', 'dc')
1504 self.build_tree({'dc/bla': "data", 'dc/blie': "data2"})
1505 self.client_add("dc/bla")
1506 self.client_add("dc/blie")
1507 self.client_set_prop("dc/bla", "svn:executable", "*")
1508 self.client_set_prop("dc/blie", "svn:executable", "")
1509 self.client_commit("dc", "My Message")
1510 oldrepos = Repository.open("svn+"+repos_url)
1511 dir = BzrDir.create("f", format.get_rich_root_format())
1512 newrepos = dir.create_repository()
1513 oldrepos.copy_content_into(newrepos)
1514 mapping = oldrepos.get_mapping()
1515 self.assertTrue(newrepos.has_revision(
1516 oldrepos.generate_revision_id(1, "", mapping)))
1517 inv1 = newrepos.get_inventory(
1518 oldrepos.generate_revision_id(1, "", mapping))
1519 self.assertTrue(inv1[inv1.path2id("bla")].executable)
1520 self.assertTrue(inv1[inv1.path2id("blie")].executable)
1522 def test_fetch_symlink(self):
1523 if not has_symlinks():
1525 repos_url = self.make_client('d', 'dc')
1526 self.build_tree({'dc/bla': "data"})
1527 os.symlink('bla', 'dc/mylink')
1528 self.client_add("dc/bla")
1529 self.client_add("dc/mylink")
1530 self.client_commit("dc", "My Message")
1531 oldrepos = Repository.open("svn+"+repos_url)
1532 dir = BzrDir.create("f", format.get_rich_root_format())
1533 newrepos = dir.create_repository()
1534 oldrepos.copy_content_into(newrepos)
1535 mapping = oldrepos.get_mapping()
1536 self.assertTrue(newrepos.has_revision(
1537 oldrepos.generate_revision_id(1, "", mapping)))
1538 inv1 = newrepos.get_inventory(
1539 oldrepos.generate_revision_id(1, "", mapping))
1540 self.assertEqual('symlink', inv1[inv1.path2id("mylink")].kind)
1541 self.assertEqual('bla', inv1[inv1.path2id("mylink")].symlink_target)
1543 def test_fetch_symlink_kind_change(self):
1544 repos_url = self.make_client('d', 'dc')
1545 self.build_tree({'dc/bla': "data", "dc/mylink": "link bla"})
1546 self.client_add("dc/bla")
1547 self.client_add("dc/mylink")
1548 self.client_commit("dc", "My Message")
1549 ra = SvnRaTransport(repos_url)
1550 def done(info, pool):
1552 editor = ra.get_commit_editor({"svn:log": "msg"}, done, None, False)
1553 root_baton = editor.open_root(1)
1554 baton = root_baton.open_file("mylink", 1)
1555 baton.change_prop("svn:special", "*")
1559 oldrepos = Repository.open("svn+"+repos_url)
1560 dir = BzrDir.create("f", format.get_rich_root_format())
1561 newrepos = dir.create_repository()
1562 oldrepos.copy_content_into(newrepos)
1563 mapping = oldrepos.get_mapping()
1564 self.assertTrue(newrepos.has_revision(
1565 oldrepos.generate_revision_id(1, "", mapping)))
1566 inv1 = newrepos.get_inventory(
1567 oldrepos.generate_revision_id(1, "", mapping))
1568 inv2 = newrepos.get_inventory(
1569 oldrepos.generate_revision_id(2, "", mapping))
1570 self.assertEqual('file', inv1[inv1.path2id("mylink")].kind)
1571 self.assertEqual('symlink', inv2[inv2.path2id("mylink")].kind)
1572 self.assertEqual('bla', inv2[inv2.path2id("mylink")].symlink_target)
1574 def test_fetch_executable_separate(self):
1575 repos_url = self.make_client('d', 'dc')
1576 self.build_tree({'dc/bla': "data"})
1577 self.client_add("dc/bla")
1578 self.client_commit("dc", "My Message")
1579 self.client_set_prop("dc/bla", "svn:executable", "*")
1580 self.client_commit("dc", "Make executable")
1581 oldrepos = Repository.open("svn+"+repos_url)
1582 dir = BzrDir.create("f", format.get_rich_root_format())
1583 newrepos = dir.create_repository()
1584 oldrepos.copy_content_into(newrepos)
1585 mapping = oldrepos.get_mapping()
1586 self.assertTrue(newrepos.has_revision(
1587 oldrepos.generate_revision_id(1, "", mapping)))
1588 inv1 = newrepos.get_inventory(
1589 oldrepos.generate_revision_id(1, "", mapping))
1590 self.assertFalse(inv1[inv1.path2id("bla")].executable)
1591 inv2 = newrepos.get_inventory(
1592 oldrepos.generate_revision_id(2, "", mapping))
1593 self.assertTrue(inv2[inv2.path2id("bla")].executable)
1594 self.assertEqual(oldrepos.generate_revision_id(2, "", mapping),
1595 inv2[inv2.path2id("bla")].revision)
1597 def test_fetch_ghosts(self):
1598 repos_url = self.make_repository('d')
1600 dc = self.commit_editor(repos_url)
1601 dc.add_file("bla", "data")
1602 dc.change_dir_prop("", "bzr:ancestry:v3-none", "aghost\n")
1605 oldrepos = Repository.open("svn+"+repos_url)
1606 dir = BzrDir.create("f", format.get_rich_root_format())
1607 newrepos = dir.create_repository()
1608 oldrepos.copy_content_into(newrepos)
1609 mapping = oldrepos.get_mapping()
1611 rev = newrepos.get_revision(oldrepos.generate_revision_id(1, "", mapping))
1612 self.assertTrue("aghost" in rev.parent_ids)
1614 def test_fetch_svk_merge(self):
1615 repos_url = self.make_client('d', 'dc')
1616 self.build_tree({'dc/trunk/bla': "data", "dc/branches": None})
1617 self.client_add("dc/trunk")
1618 self.client_commit("dc", "My Message")
1620 self.client_add("dc/branches")
1621 self.client_copy("dc/trunk", "dc/branches/foo")
1622 self.build_tree({'dc/branches/foo/bla': "more data"})
1623 self.client_commit("dc", "Branch")
1625 oldrepos = Repository.open("svn+"+repos_url)
1626 self.client_set_prop("dc/trunk", "svk:merge",
1627 "%s:/branches/foo:2\n" % oldrepos.uuid)
1628 self.client_commit("dc", "Merge")
1630 dir = BzrDir.create("f", format.get_rich_root_format())
1631 newrepos = dir.create_repository()
1632 oldrepos.copy_content_into(newrepos)
1634 mapping = oldrepos.get_mapping()
1636 rev = newrepos.get_revision(oldrepos.generate_revision_id(3, "trunk", mapping))
1637 mutter('parent ids: %r' % rev.parent_ids)
1638 self.assertTrue(oldrepos.generate_revision_id(2, "branches/foo", mapping) in rev.parent_ids)
1640 def test_fetch_invalid_ghosts(self):
1641 repos_url = self.make_client('d', 'dc')
1642 self.build_tree({'dc/bla': "data"})
1643 self.client_add("dc/bla")
1644 self.client_set_prop("dc", "bzr:ancestry:v3-none", "a ghost\n")
1645 self.client_commit("dc", "My Message")
1646 oldrepos = Repository.open("svn+"+repos_url)
1647 dir = BzrDir.create("f", format.get_rich_root_format())
1648 newrepos = dir.create_repository()
1649 oldrepos.copy_content_into(newrepos)
1651 mapping = oldrepos.get_mapping()
1653 rev = newrepos.get_revision(oldrepos.generate_revision_id(1, "", mapping))
1654 self.assertEqual([oldrepos.generate_revision_id(0, "", mapping)], rev.parent_ids)
1656 def test_fetch_property_change_only(self):
1657 repos_url = self.make_repository('d')
1658 dc = self.commit_editor(repos_url)
1660 dc.add_file("trunk/bla", "data")
1663 dc = self.commit_editor(repos_url)
1664 dc.change_dir_prop("", "some:property", "some data\n")
1667 dc = self.commit_editor(repos_url)
1668 dc.change_dir_prop("", "some2:property", "some data\n")
1671 dc = self.commit_editor(repos_url)
1672 dc.change_dir_prop("", "some:property", "some data4\n")
1675 oldrepos = Repository.open("svn+"+repos_url)
1676 dir = BzrDir.create("f", format.get_rich_root_format())
1677 newrepos = dir.create_repository()
1678 oldrepos.copy_content_into(newrepos)
1679 mapping = oldrepos.get_mapping()
1681 oldrepos.generate_revision_id(0, "", mapping),
1682 oldrepos.generate_revision_id(1, "", mapping),
1683 oldrepos.generate_revision_id(2, "", mapping),
1684 oldrepos.generate_revision_id(3, "", mapping),
1685 oldrepos.generate_revision_id(4, "", mapping),
1686 ], newrepos.all_revision_ids())
1688 def test_fetch_property_change_only_trunk(self):
1689 repos_url = self.make_repository('d')
1690 dc = self.commit_editor(repos_url)
1692 dc.add_file("trunk/bla", "data")
1695 dc = self.commit_editor(repos_url)
1696 dc.change_dir_prop("trunk", "some:property", "some data\n")
1699 dc = self.commit_editor(repos_url)
1700 dc.change_dir_prop("trunk", "some2:property", "some data\n")
1703 dc = self.commit_editor(repos_url)
1704 dc.change_dir_prop("trunk", "some:property", "some data3\n")
1707 oldrepos = Repository.open("svn+"+repos_url)
1708 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1709 dir = BzrDir.create("f", format.get_rich_root_format())
1710 newrepos = dir.create_repository()
1711 oldrepos.copy_content_into(newrepos)
1712 mapping = oldrepos.get_mapping()
1714 oldrepos.generate_revision_id(1, "trunk", mapping),
1715 oldrepos.generate_revision_id(2, "trunk", mapping),
1716 oldrepos.generate_revision_id(3, "trunk", mapping),
1717 oldrepos.generate_revision_id(4, "trunk", mapping),
1718 ], newrepos.all_revision_ids())
1720 def test_fetch_crosscopy(self):
1721 repos_url = self.make_client('d', 'dc')
1722 self.build_tree({'dc/trunk/adir/afile': "data",
1723 'dc/trunk/adir/stationary': None,
1724 'dc/branches/abranch': None})
1725 self.client_add("dc/trunk")
1726 self.client_add("dc/branches")
1727 self.client_commit("dc", "Initial commit")
1730 self.client_copy("dc/trunk/adir", "dc/branches/abranch/bdir")
1731 self.client_commit("dc", "Cross copy commit")
1734 self.build_tree({"dc/branches/abranch/bdir/afile": "otherdata"})
1735 self.client_commit("dc", "Change data")
1738 self.build_tree({"dc/branches/abranch/bdir/bfile": "camel",
1739 "dc/branches/abranch/bdir/stationary/traveller": "data"})
1740 self.client_add("dc/branches/abranch/bdir/bfile")
1741 self.client_add("dc/branches/abranch/bdir/stationary/traveller")
1742 self.client_commit("dc", "Change dir")
1744 oldrepos = Repository.open("svn+"+repos_url)
1745 set_branching_scheme(oldrepos, TrunkBranchingScheme())
1746 dir = BzrDir.create("f", format.get_rich_root_format())
1747 newrepos = dir.create_repository()
1748 mapping = oldrepos.get_mapping()
1749 copyrev = oldrepos.generate_revision_id(2, "branches/abranch", mapping)
1750 prevrev = oldrepos.generate_revision_id(3, "branches/abranch", mapping)
1751 lastrev = oldrepos.generate_revision_id(4, "branches/abranch", mapping)
1752 oldrepos.copy_content_into(newrepos, lastrev)
1754 inventory = newrepos.get_inventory(lastrev)
1755 self.assertEqual(prevrev,
1756 inventory[inventory.path2id("bdir/afile")].revision)
1758 inventory = newrepos.get_inventory(prevrev)
1759 self.assertEqual(copyrev,
1760 inventory[inventory.path2id("bdir/stationary")].revision)