197
197
def make_tree_1(self):
198
198
mtree = MockTree()
199
mtree.add_dir("a", "grandparent")
200
mtree.add_dir("b", "grandparent/parent")
201
mtree.add_file("c", "grandparent/parent/file", "Hello\n")
202
mtree.add_dir("d", "grandparent/alt_parent")
199
mtree.add_dir(b"a", "grandparent")
200
mtree.add_dir(b"b", "grandparent/parent")
201
mtree.add_file(b"c", "grandparent/parent/file", "Hello\n")
202
mtree.add_dir(b"d", "grandparent/alt_parent")
203
203
return BundleTree(mtree, ''), mtree
205
205
def test_renames(self):
211
211
self.assertEqual(btree.old_path("grandparent/parent/file"),
212
212
"grandparent/parent/file")
214
self.assertEqual(btree.id2path("a"), "grandparent")
215
self.assertEqual(btree.id2path("b"), "grandparent/parent")
216
self.assertEqual(btree.id2path("c"), "grandparent/parent/file")
214
self.assertEqual(btree.id2path(b"a"), "grandparent")
215
self.assertEqual(btree.id2path(b"b"), "grandparent/parent")
216
self.assertEqual(btree.id2path(b"c"), "grandparent/parent/file")
218
self.assertEqual(btree.path2id("grandparent"), "a")
219
self.assertEqual(btree.path2id("grandparent/parent"), "b")
220
self.assertEqual(btree.path2id("grandparent/parent/file"), "c")
218
self.assertEqual(btree.path2id("grandparent"), b"a")
219
self.assertEqual(btree.path2id("grandparent/parent"), b"b")
220
self.assertEqual(btree.path2id("grandparent/parent/file"), b"c")
222
222
self.assertIs(btree.path2id("grandparent2"), None)
223
223
self.assertIs(btree.path2id("grandparent2/parent"), None)
228
228
self.assertIs(btree.old_path("grandparent/parent"), None)
229
229
self.assertIs(btree.old_path("grandparent/parent/file"), None)
231
self.assertEqual(btree.id2path("a"), "grandparent2")
232
self.assertEqual(btree.id2path("b"), "grandparent2/parent")
233
self.assertEqual(btree.id2path("c"), "grandparent2/parent/file")
231
self.assertEqual(btree.id2path(b"a"), "grandparent2")
232
self.assertEqual(btree.id2path(b"b"), "grandparent2/parent")
233
self.assertEqual(btree.id2path(b"c"), "grandparent2/parent/file")
235
self.assertEqual(btree.path2id("grandparent2"), "a")
236
self.assertEqual(btree.path2id("grandparent2/parent"), "b")
237
self.assertEqual(btree.path2id("grandparent2/parent/file"), "c")
235
self.assertEqual(btree.path2id("grandparent2"), b"a")
236
self.assertEqual(btree.path2id("grandparent2/parent"), b"b")
237
self.assertEqual(btree.path2id("grandparent2/parent/file"), b"c")
239
239
self.assertTrue(btree.path2id("grandparent") is None)
240
240
self.assertTrue(btree.path2id("grandparent/parent") is None)
241
241
self.assertTrue(btree.path2id("grandparent/parent/file") is None)
243
243
btree.note_rename("grandparent/parent", "grandparent2/parent2")
244
self.assertEqual(btree.id2path("a"), "grandparent2")
245
self.assertEqual(btree.id2path("b"), "grandparent2/parent2")
246
self.assertEqual(btree.id2path("c"), "grandparent2/parent2/file")
244
self.assertEqual(btree.id2path(b"a"), "grandparent2")
245
self.assertEqual(btree.id2path(b"b"), "grandparent2/parent2")
246
self.assertEqual(btree.id2path(b"c"), "grandparent2/parent2/file")
248
self.assertEqual(btree.path2id("grandparent2"), "a")
249
self.assertEqual(btree.path2id("grandparent2/parent2"), "b")
250
self.assertEqual(btree.path2id("grandparent2/parent2/file"), "c")
248
self.assertEqual(btree.path2id("grandparent2"), b"a")
249
self.assertEqual(btree.path2id("grandparent2/parent2"), b"b")
250
self.assertEqual(btree.path2id("grandparent2/parent2/file"), b"c")
252
252
self.assertTrue(btree.path2id("grandparent2/parent") is None)
253
253
self.assertTrue(btree.path2id("grandparent2/parent/file") is None)
255
255
btree.note_rename("grandparent/parent/file",
256
256
"grandparent2/parent2/file2")
257
self.assertEqual(btree.id2path("a"), "grandparent2")
258
self.assertEqual(btree.id2path("b"), "grandparent2/parent2")
259
self.assertEqual(btree.id2path("c"), "grandparent2/parent2/file2")
257
self.assertEqual(btree.id2path(b"a"), "grandparent2")
258
self.assertEqual(btree.id2path(b"b"), "grandparent2/parent2")
259
self.assertEqual(btree.id2path(b"c"), "grandparent2/parent2/file2")
261
self.assertEqual(btree.path2id("grandparent2"), "a")
262
self.assertEqual(btree.path2id("grandparent2/parent2"), "b")
263
self.assertEqual(btree.path2id("grandparent2/parent2/file2"), "c")
261
self.assertEqual(btree.path2id("grandparent2"), b"a")
262
self.assertEqual(btree.path2id("grandparent2/parent2"), b"b")
263
self.assertEqual(btree.path2id("grandparent2/parent2/file2"), b"c")
265
265
self.assertTrue(btree.path2id("grandparent2/parent2/file") is None)
269
269
btree = self.make_tree_1()[0]
270
270
btree.note_rename("grandparent/parent/file",
271
271
"grandparent/alt_parent/file")
272
self.assertEqual(btree.id2path("c"), "grandparent/alt_parent/file")
273
self.assertEqual(btree.path2id("grandparent/alt_parent/file"), "c")
272
self.assertEqual(btree.id2path(b"c"), "grandparent/alt_parent/file")
273
self.assertEqual(btree.path2id("grandparent/alt_parent/file"), b"c")
274
274
self.assertTrue(btree.path2id("grandparent/parent/file") is None)
276
276
def unified_diff(self, old, new):
293
293
btree = self.make_tree_2()
294
294
add_patch = self.unified_diff([], ["Extra cheese\n"])
295
295
btree.note_patch("grandparent/parent/file", add_patch)
296
btree.note_id('f', 'grandparent/parent/symlink', kind='symlink')
296
btree.note_id(b'f', 'grandparent/parent/symlink', kind='symlink')
297
297
btree.note_target('grandparent/parent/symlink', 'venus')
298
298
self.adds_test(btree)
300
300
def adds_test(self, btree):
301
self.assertEqual(btree.id2path("e"), "grandparent/parent/file")
302
self.assertEqual(btree.path2id("grandparent/parent/file"), "e")
301
self.assertEqual(btree.id2path(b"e"), "grandparent/parent/file")
302
self.assertEqual(btree.path2id("grandparent/parent/file"), b"e")
303
303
self.assertEqual(btree.get_file("grandparent/parent/file").read(),
304
304
"Extra cheese\n")
305
305
self.assertEqual(
393
393
format = bzrdir.BzrDirMetaFormat1()
394
394
format.repository_format = knitrepo.RepositoryFormatKnit3()
395
395
source = self.make_branch_and_tree('source', format=format)
396
source.commit('one', rev_id='one-id')
397
source.commit('two', rev_id='two-id')
396
source.commit('one', rev_id=b'one-id')
397
source.commit('two', rev_id=b'two-id')
399
399
write_bundle(source.branch.repository, 'two-id', 'null:', text,
612
612
self.b1 = self.tree1.branch
614
614
self.build_tree_contents([('b1/one', b'one\n')])
615
self.tree1.add('one', 'one-id')
616
self.tree1.set_root_id('root-id')
617
self.tree1.commit('add one', rev_id='a@cset-0-1')
615
self.tree1.add('one', b'one-id')
616
self.tree1.set_root_id(b'root-id')
617
self.tree1.commit('add one', rev_id=b'a@cset-0-1')
619
bundle = self.get_valid_bundle('null:', 'a@cset-0-1')
619
bundle = self.get_valid_bundle('null:', b'a@cset-0-1')
621
621
# Make sure we can handle files with spaces, tabs, other
622
622
# bogus characters
691
691
with open('b1/sub/dir/nolastnewline.txt', 'ab') as f: f.write('\n')
692
692
self.tree1.rename_one('sub/dir/ pre space',
693
693
'sub/ start space')
694
self.tree1.commit('Modified files', rev_id='a@cset-0-5')
694
self.tree1.commit('Modified files', rev_id=b'a@cset-0-5')
695
695
bundle = self.get_valid_bundle('a@cset-0-4', 'a@cset-0-5')
697
697
self.tree1.rename_one('sub/dir/WithCaps.txt', 'temp')
698
698
self.tree1.rename_one('with space.txt', 'WithCaps.txt')
699
699
self.tree1.rename_one('temp', 'with space.txt')
700
self.tree1.commit(u'swap filenames', rev_id='a@cset-0-6',
700
self.tree1.commit(u'swap filenames', rev_id=b'a@cset-0-6',
702
702
bundle = self.get_valid_bundle('a@cset-0-5', 'a@cset-0-6')
703
703
other = self.get_checkout('a@cset-0-5')
708
708
self.assertEqualDiff(tree1_inv, tree2_inv)
709
709
other.rename_one('sub/dir/nolastnewline.txt', 'sub/nolastnewline.txt')
710
other.commit('rename file', rev_id='a@cset-0-6b')
710
other.commit('rename file', rev_id=b'a@cset-0-6b')
711
711
self.tree1.merge_from_branch(other.branch)
712
self.tree1.commit(u'Merge', rev_id='a@cset-0-7',
712
self.tree1.commit(u'Merge', rev_id=b'a@cset-0-7',
714
714
bundle = self.get_valid_bundle('a@cset-0-6', 'a@cset-0-7')
723
723
tt = TreeTransform(self.tree1)
724
724
tt.new_symlink(link_name, tt.root, link_target, link_id)
726
self.tree1.commit('add symlink', rev_id='l@cset-0-1')
726
self.tree1.commit('add symlink', rev_id=b'l@cset-0-1')
727
727
bundle = self.get_valid_bundle('null:', 'l@cset-0-1')
728
728
if getattr(bundle, 'revision_tree', None) is not None:
729
729
# Not all bundle formats supports revision_tree
749
749
tt.delete_contents(trans_id)
750
750
tt.create_symlink('jupiter', trans_id)
752
self.tree1.commit('just change symlink target', rev_id='l@cset-0-3')
752
self.tree1.commit('just change symlink target', rev_id=b'l@cset-0-3')
753
753
bundle = self.get_valid_bundle('l@cset-0-2', 'l@cset-0-3')
755
755
tt = TreeTransform(self.tree1)
756
756
trans_id = tt.trans_id_tree_path('link2')
757
757
tt.delete_contents(trans_id)
759
self.tree1.commit('Delete symlink', rev_id='l@cset-0-4')
759
self.tree1.commit('Delete symlink', rev_id=b'l@cset-0-4')
760
760
bundle = self.get_valid_bundle('l@cset-0-3', 'l@cset-0-4')
762
762
def test_symlink_bundle(self):
817
817
tt = TreeTransform(self.tree1)
818
818
tt.new_file('file', tt.root, 'file', 'file')
820
self.tree1.commit('create file', rev_id='a@lmod-0-1')
820
self.tree1.commit('create file', rev_id=b'a@lmod-0-1')
822
822
tt = TreeTransform(self.tree1)
823
823
trans_id = tt.trans_id_tree_path('file')
824
824
tt.delete_contents(trans_id)
825
825
tt.create_file('file2', trans_id)
827
self.tree1.commit('modify text', rev_id='a@lmod-0-2a')
827
self.tree1.commit('modify text', rev_id=b'a@lmod-0-2a')
829
829
other = self.get_checkout('a@lmod-0-1')
830
830
tt = TreeTransform(other)
832
832
tt.delete_contents(trans_id)
833
833
tt.create_file('file2', trans_id)
835
other.commit('modify text in another tree', rev_id='a@lmod-0-2b')
835
other.commit('modify text in another tree', rev_id=b'a@lmod-0-2b')
836
836
self.tree1.merge_from_branch(other.branch)
837
self.tree1.commit(u'Merge', rev_id='a@lmod-0-3',
837
self.tree1.commit(u'Merge', rev_id=b'a@lmod-0-3',
839
self.tree1.commit(u'Merge', rev_id='a@lmod-0-4')
839
self.tree1.commit(u'Merge', rev_id=b'a@lmod-0-4')
840
840
bundle = self.get_valid_bundle('a@lmod-0-2a', 'a@lmod-0-4')
842
842
def test_hide_history(self):
843
843
self.tree1 = self.make_branch_and_tree('b1')
844
844
self.b1 = self.tree1.branch
846
with open('b1/one', 'wb') as f: f.write('one\n')
846
with open('b1/one', 'wb') as f: f.write(b'one\n')
847
847
self.tree1.add('one')
848
self.tree1.commit('add file', rev_id='a@cset-0-1')
849
with open('b1/one', 'wb') as f: f.write('two\n')
850
self.tree1.commit('modify', rev_id='a@cset-0-2')
851
with open('b1/one', 'wb') as f: f.write('three\n')
852
self.tree1.commit('modify', rev_id='a@cset-0-3')
848
self.tree1.commit('add file', rev_id=b'a@cset-0-1')
849
with open('b1/one', 'wb') as f: f.write(b'two\n')
850
self.tree1.commit('modify', rev_id=b'a@cset-0-2')
851
with open('b1/one', 'wb') as f: f.write(b'three\n')
852
self.tree1.commit('modify', rev_id=b'a@cset-0-3')
853
853
bundle_file = BytesIO()
854
854
rev_ids = write_bundle(self.tree1.branch.repository, 'a@cset-0-3',
855
855
'a@cset-0-1', bundle_file, format=self.format)
894
894
f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
895
895
f.write(u'Modified \xb5\n'.encode('utf8'))
897
self.tree1.commit(u'modified', rev_id='i18n-2')
897
self.tree1.commit(u'modified', rev_id=b'i18n-2')
899
899
bundle = self.get_valid_bundle('i18n-1', 'i18n-2')
902
902
self.tree1.rename_one(u'with Dod\N{Euro Sign}', u'B\N{Euro Sign}gfors')
903
self.tree1.commit(u'renamed, the new i18n man', rev_id='i18n-3',
903
self.tree1.commit(u'renamed, the new i18n man', rev_id=b'i18n-3',
904
904
committer=u'Erik B\xe5gfors')
906
906
bundle = self.get_valid_bundle('i18n-2', 'i18n-3')
909
909
self.tree1.remove([u'B\N{Euro Sign}gfors'])
910
self.tree1.commit(u'removed', rev_id='i18n-4')
910
self.tree1.commit(u'removed', rev_id=b'i18n-4')
912
912
bundle = self.get_valid_bundle('i18n-3', 'i18n-4')
928
928
# once we actually support them
931
self.tree1.commit('funky whitespace', rev_id='white-1')
931
self.tree1.commit('funky whitespace', rev_id=b'white-1')
933
933
bundle = self.get_valid_bundle('null:', 'white-1')
936
936
with open('b1/trailing space ', 'ab') as f: f.write('add some text\n')
937
self.tree1.commit('add text', rev_id='white-2')
937
self.tree1.commit('add text', rev_id=b'white-2')
939
939
bundle = self.get_valid_bundle('white-1', 'white-2')
942
942
self.tree1.rename_one('trailing space ', ' start and end space ')
943
self.tree1.commit('rename', rev_id='white-3')
943
self.tree1.commit('rename', rev_id=b'white-3')
945
945
bundle = self.get_valid_bundle('white-2', 'white-3')
948
948
self.tree1.remove([' start and end space '])
949
self.tree1.commit('removed', rev_id='white-4')
949
self.tree1.commit('removed', rev_id=b'white-4')
951
951
bundle = self.get_valid_bundle('white-3', 'white-4')
978
978
def test_bundle_root_id(self):
979
979
self.tree1 = self.make_branch_and_tree('b1')
980
980
self.b1 = self.tree1.branch
981
self.tree1.commit('message', rev_id='revid1')
981
self.tree1.commit('message', rev_id=b'revid1')
982
982
bundle = self.get_valid_bundle('null:', 'revid1')
983
983
tree = self.get_bundle_tree(bundle, 'revid1')
984
984
root_revision = tree.get_file_revision(u'', tree.get_root_id())
1018
1018
self.addCleanup(tree.unlock)
1020
1020
tree.add([''], ['TREE_ROOT'])
1021
tree.commit('One', rev_id='rev1',
1021
tree.commit('One', rev_id=b'rev1',
1022
1022
revprops={'a':'4', 'b':'3', 'c':'2', 'd':'1'})
1023
1023
self.b1 = tree.branch
1024
1024
bundle_sio, revision_ids = self.create_bundle_text('null:', 'rev1')
1073
1073
def test_across_serializers(self):
1074
1074
tree = self.make_simple_tree('knit')
1075
tree.commit('hello', rev_id='rev1')
1076
tree.commit('hello', rev_id='rev2')
1075
tree.commit('hello', rev_id=b'rev1')
1076
tree.commit('hello', rev_id=b'rev2')
1077
1077
bundle = read_bundle(self.create_bundle_text('null:', 'rev2')[0])
1078
1078
repo = self.make_repository('repo', format='dirstate-with-subtree')
1079
1079
bundle.install_revisions(repo)
1084
1084
def make_repo_with_installed_revisions(self):
1085
1085
tree = self.make_simple_tree('knit')
1086
tree.commit('hello', rev_id='rev1')
1087
tree.commit('hello', rev_id='rev2')
1086
tree.commit('hello', rev_id=b'rev1')
1087
tree.commit('hello', rev_id=b'rev2')
1088
1088
bundle = read_bundle(self.create_bundle_text('null:', 'rev2')[0])
1089
1089
repo = self.make_repository('repo', format='dirstate-with-subtree')
1090
1090
bundle.install_revisions(repo)
1110
1110
def test_across_models_incompatible(self):
1111
1111
tree = self.make_simple_tree('dirstate-with-subtree')
1112
tree.commit('hello', rev_id='rev1')
1113
tree.commit('hello', rev_id='rev2')
1112
tree.commit('hello', rev_id=b'rev1')
1113
tree.commit('hello', rev_id=b'rev2')
1115
1115
bundle = read_bundle(self.create_bundle_text('null:', 'rev1')[0])
1116
1116
except errors.IncompatibleBundleFormat:
1125
1125
def test_get_merge_request(self):
1126
1126
tree = self.make_simple_tree()
1127
tree.commit('hello', rev_id='rev1')
1128
tree.commit('hello', rev_id='rev2')
1127
tree.commit('hello', rev_id=b'rev1')
1128
tree.commit('hello', rev_id=b'rev2')
1129
1129
bundle = read_bundle(self.create_bundle_text('null:', 'rev1')[0])
1130
1130
result = bundle.get_merge_request(tree.branch.repository)
1131
1131
self.assertEqual((None, 'rev1', 'inapplicable'), result)
1165
1165
self.tree1 = self.make_branch_and_tree('tree')
1166
1166
self.b1 = self.tree1.branch
1167
1167
# rev1 is not present in bundle, done by fetch
1168
self.build_tree_contents([('tree/file2', 'contents1')])
1169
self.tree1.add('file2', 'file2-id')
1170
self.tree1.commit('rev1', rev_id='reva')
1171
self.build_tree_contents([('tree/file3', 'contents2')])
1168
self.build_tree_contents([('tree/file2', b'contents1')])
1169
self.tree1.add('file2', b'file2-id')
1170
self.tree1.commit('rev1', rev_id=b'reva')
1171
self.build_tree_contents([('tree/file3', b'contents2')])
1172
1172
# rev2 is present in bundle, and done by fetch
1173
1173
# having file1 in the bunle causes file1's versionedfile to be opened.
1174
self.tree1.add('file3', 'file3-id')
1174
self.tree1.add('file3', b'file3-id')
1175
1175
self.tree1.commit('rev2')
1176
1176
# Updating file2 should not cause an attempt to add to file1's vf
1177
1177
target = self.tree1.controldir.sprout('target').open_workingtree()
1178
self.build_tree_contents([('tree/file2', 'contents3')])
1179
self.tree1.commit('rev3', rev_id='rev3')
1178
self.build_tree_contents([('tree/file2', b'contents3')])
1179
self.tree1.commit('rev3', rev_id=b'rev3')
1180
1180
bundle = self.get_valid_bundle('reva', 'rev3')
1181
1181
if getattr(bundle, 'get_bundle_reader', None) is None:
1182
1182
raise tests.TestSkipped('Bundle format cannot provide reader')
1183
1183
# be sure that file1 comes before file2
1184
1184
for b, m, k, r, f in bundle.get_bundle_reader().iter_records():
1185
if f == b'file3-id':
1187
self.assertNotEqual(f, 'file2-id')
1187
self.assertNotEqual(f, b'file2-id')
1188
1188
bundle.install_revisions(target.branch.repository)
1198
1198
tree.lock_write()
1199
1199
self.addCleanup(tree.unlock)
1200
1200
tree.add([''], ['TREE_ROOT'])
1201
tree.commit('One', revprops={'one':'two', 'empty':''}, rev_id='rev1')
1201
tree.commit('One', revprops={'one':'two', 'empty':''}, rev_id=b'rev1')
1202
1202
self.b1 = tree.branch
1203
1203
bundle_sio, revision_ids = self.create_bundle_text('null:', 'rev1')
1204
1204
self.assertContainsRe(bundle_sio.getvalue(),
1258
1258
self.addCleanup(tree.unlock)
1260
1260
tree.add([''], ['TREE_ROOT'])
1261
tree.commit('One', rev_id='rev1',
1261
tree.commit('One', rev_id=b'rev1',
1262
1262
revprops={'a':'4', 'b':'3', 'c':'2', 'd':'1'})
1263
1263
self.b1 = tree.branch
1264
1264
bundle_sio, revision_ids = self.create_bundle_text('null:', 'rev1')
1404
1404
def test_creation(self):
1405
1405
tree = self.make_branch_and_tree('tree')
1406
self.build_tree_contents([('tree/file', 'contents1\nstatic\n')])
1406
self.build_tree_contents([('tree/file', b'contents1\nstatic\n')])
1407
1407
tree.add('file', 'fileid-2')
1408
tree.commit('added file', rev_id='rev1')
1409
self.build_tree_contents([('tree/file', 'contents2\nstatic\n')])
1410
tree.commit('changed file', rev_id='rev2')
1408
tree.commit('added file', rev_id=b'rev1')
1409
self.build_tree_contents([('tree/file', b'contents2\nstatic\n')])
1410
tree.commit('changed file', rev_id=b'rev2')
1412
1412
serializer = BundleSerializerV4('1.0')
1413
1413
serializer.write(tree.branch.repository, ['rev1', 'rev2'], {}, s)