867
867
class TestDiffFromTool(tests.TestCaseWithTransport):
869
869
def test_from_string(self):
870
diff_obj = diff.DiffFromTool.from_string('diff', None, None, None)
870
diff_obj = diff.DiffFromTool.from_string(
871
['diff', '{old_path}', '{new_path}'],
871
873
self.addCleanup(diff_obj.finish)
872
self.assertEqual(['diff', '@old_path', '@new_path'],
874
self.assertEqual(['diff', '{old_path}', '{new_path}'],
873
875
diff_obj.command_template)
875
877
def test_from_string_u5(self):
876
diff_obj = diff.DiffFromTool.from_string('diff "-u 5"',
878
diff_obj = diff.DiffFromTool.from_string(
879
['diff',"-u 5", '{old_path}', '{new_path}'], None, None, None)
878
880
self.addCleanup(diff_obj.finish)
879
self.assertEqual(['diff', '-u 5', '@old_path', '@new_path'],
881
self.assertEqual(['diff', '-u 5', '{old_path}', '{new_path}'],
880
882
diff_obj.command_template)
881
883
self.assertEqual(['diff', '-u 5', 'old-path', 'new-path'],
882
884
diff_obj._get_command('old-path', 'new-path'))
884
886
def test_from_string_path_with_backslashes(self):
885
887
self.requireFeature(features.backslashdir_feature)
886
tool = 'C:\\Tools\\Diff.exe'
888
tool = ['C:\\Tools\\Diff.exe', '{old_path}', '{new_path}']
887
889
diff_obj = diff.DiffFromTool.from_string(tool, None, None, None)
888
890
self.addCleanup(diff_obj.finish)
889
self.assertEqual(['C:\\Tools\\Diff.exe', '@old_path', '@new_path'],
891
self.assertEqual(['C:\\Tools\\Diff.exe', '{old_path}', '{new_path}'],
890
892
diff_obj.command_template)
891
893
self.assertEqual(['C:\\Tools\\Diff.exe', 'old-path', 'new-path'],
892
894
diff_obj._get_command('old-path', 'new-path'))
894
896
def test_execute(self):
895
897
output = BytesIO()
896
898
diff_obj = diff.DiffFromTool([sys.executable, '-c',
897
'print("@old_path @new_path")'],
899
'print("{old_path} {new_path}")'],
898
900
None, None, output)
899
901
self.addCleanup(diff_obj.finish)
900
902
diff_obj._execute('old', 'new')
922
924
basis_tree.lock_read()
923
925
self.addCleanup(basis_tree.unlock)
924
926
diff_obj = diff.DiffFromTool([sys.executable, '-c',
925
'print "@old_path @new_path"'],
927
'print "{old_path} {new_path}"'],
926
928
basis_tree, tree, output)
927
929
diff_obj._prepare_files('file', 'file', file_id=b'file-id')
928
930
# The old content should be readonly
959
961
self.addCleanup(tree.unlock)
960
962
diff_obj = diff.DiffFromTool([sys.executable, '-c',
961
'print "@old_path @new_path"'],
963
'print "{old_path} {new_path}"'],
962
964
old_tree, tree, output)
963
965
self.addCleanup(diff_obj.finish)
964
966
self.assertContainsRe(diff_obj._root, 'brz-diff-[^/]*')
980
982
def test_encodable_filename(self):
981
983
# Just checks file path for external diff tool.
982
984
# We cannot change CPython's internal encoding used by os.exec*.
983
diffobj = diff.DiffFromTool(['dummy', '@old_path', '@new_path'],
985
diffobj = diff.DiffFromTool(['dummy', '{old_path}', '{new_path}'],
984
986
None, None, None)
985
987
for _, scenario in EncodingAdapter.encoding_scenarios:
986
988
encoding = scenario['encoding']
995
997
self.assertTrue(fullpath.startswith(diffobj._root + '/safe'))
997
999
def test_unencodable_filename(self):
998
diffobj = diff.DiffFromTool(['dummy', '@old_path', '@new_path'],
1000
diffobj = diff.DiffFromTool(['dummy', '{old_path}', '{new_path}'],
999
1001
None, None, None)
1000
1002
for _, scenario in EncodingAdapter.encoding_scenarios:
1001
1003
encoding = scenario['encoding']