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