35
from bzrlib.symbol_versioning import deprecated_in
36
from bzrlib.tests import test_win32utils
39
class _AttribFeature(tests.Feature):
42
if (sys.platform not in ('cygwin', 'win32')):
45
proc = subprocess.Popen(['attrib', '.'], stdout=subprocess.PIPE)
48
return (0 == proc.wait())
50
def feature_name(self):
51
return 'attrib Windows command-line tool'
53
AttribFeature = _AttribFeature()
56
compiled_patiencediff_feature = tests.ModuleAvailableFeature(
57
'bzrlib._patiencediff_c')
33
from ..sixish import (
40
from ..tests.blackbox.test_diff import subst_dates
41
from ..tests.scenarios import load_tests_apply_scenarios
44
load_tests = load_tests_apply_scenarios
60
47
def udiff_lines(old, new, allow_binary=False):
62
49
diff.internal_diff('old', old, 'new', new, output, allow_binary)
64
51
return output.readlines()
71
"""Simple file-like object that allows writes with any type and records."""
74
self.write_record = []
76
def write(self, data):
77
self.write_record.append(data)
79
def check_types(self, testcase, expected_type):
81
any(not isinstance(o, expected_type) for o in self.write_record),
82
"Not all writes of type %s: %r" % (
83
expected_type.__name__, self.write_record))
86
class TestDiffOptions(tests.TestCase):
88
def test_unified_added(self):
89
"""Check for default style '-u' only if no other style specified
92
# Verify that style defaults to unified, id est '-u' appended
93
# to option list, in the absence of an alternative style.
94
self.assertEqual(['-a', '-u'], diff.default_style_unified(['-a']))
97
class TestDiffOptionsScenarios(tests.TestCase):
99
scenarios = [(s, dict(style=s)) for s in diff.style_option_list]
100
style = None # Set by load_tests_apply_scenarios from scenarios
102
def test_unified_not_added(self):
103
# Verify that for all valid style options, '-u' is not
104
# appended to option list.
105
ret_opts = diff.default_style_unified(diff_opts=["%s" % (self.style,)])
106
self.assertEqual(["%s" % (self.style,)], ret_opts)
83
109
class TestDiff(tests.TestCase):
85
111
def test_add_nl(self):
86
112
"""diff generates a valid diff for patches that add a newline"""
87
113
lines = udiff_lines(['boo'], ['boo\n'])
88
114
self.check_patch(lines)
89
self.assertEquals(lines[4], '\\ No newline at end of file\n')
115
self.assertEqual(lines[4], '\\ No newline at end of file\n')
90
116
## "expected no-nl, got %r" % lines[4]
92
118
def test_add_nl_2(self):
105
131
lines = udiff_lines(['boo\n'], ['boo'])
106
132
self.check_patch(lines)
107
self.assertEquals(lines[5], '\\ No newline at end of file\n')
133
self.assertEqual(lines[5], '\\ No newline at end of file\n')
108
134
## "expected no-nl, got %r" % lines[5]
110
136
def check_patch(self, lines):
111
self.assert_(len(lines) > 1)
137
self.assertTrue(len(lines) > 1)
112
138
## "Not enough lines for a file header for patch:\n%s" % "".join(lines)
113
self.assert_(lines[0].startswith ('---'))
139
self.assertTrue(lines[0].startswith ('---'))
114
140
## 'No orig line for patch:\n%s' % "".join(lines)
115
self.assert_(lines[1].startswith ('+++'))
141
self.assertTrue(lines[1].startswith ('+++'))
116
142
## 'No mod line for patch:\n%s' % "".join(lines)
117
self.assert_(len(lines) > 2)
143
self.assertTrue(len(lines) > 2)
118
144
## "No hunks for patch:\n%s" % "".join(lines)
119
self.assert_(lines[2].startswith('@@'))
145
self.assertTrue(lines[2].startswith('@@'))
120
146
## "No hunk header for patch:\n%s" % "".join(lines)
121
self.assert_('@@' in lines[2][2:])
147
self.assertTrue('@@' in lines[2][2:])
122
148
## "Unterminated hunk header for patch:\n%s" % "".join(lines)
124
150
def test_binary_lines(self):
143
169
self.check_patch(lines)
145
171
def test_external_diff_binary_lang_c(self):
147
172
for lang in ('LANG', 'LC_ALL', 'LANGUAGE'):
148
old_env[lang] = osutils.set_or_unset_env(lang, 'C')
150
lines = external_udiff_lines(['\x00foobar\n'], ['foo\x00bar\n'])
151
# Older versions of diffutils say "Binary files", newer
152
# versions just say "Files".
153
self.assertContainsRe(lines[0],
154
'(Binary f|F)iles old and new differ\n')
155
self.assertEquals(lines[1:], ['\n'])
157
for lang, old_val in old_env.iteritems():
158
osutils.set_or_unset_env(lang, old_val)
173
self.overrideEnv(lang, 'C')
174
lines = external_udiff_lines(['\x00foobar\n'], ['foo\x00bar\n'])
175
# Older versions of diffutils say "Binary files", newer
176
# versions just say "Files".
177
self.assertContainsRe(lines[0], '(Binary f|F)iles old and new differ\n')
178
self.assertEqual(lines[1:], ['\n'])
160
180
def test_no_external_diff(self):
161
181
"""Check that NoDiff is raised when diff is not available"""
162
# Use os.environ['PATH'] to make sure no 'diff' command is available
163
orig_path = os.environ['PATH']
165
os.environ['PATH'] = ''
166
self.assertRaises(errors.NoDiff, diff.external_diff,
167
'old', ['boo\n'], 'new', ['goo\n'],
168
StringIO(), diff_opts=['-u'])
170
os.environ['PATH'] = orig_path
182
# Make sure no 'diff' command is available
183
# XXX: Weird, using None instead of '' breaks the test -- vila 20101216
184
self.overrideEnv('PATH', '')
185
self.assertRaises(errors.NoDiff, diff.external_diff,
186
'old', ['boo\n'], 'new', ['goo\n'],
187
BytesIO(), diff_opts=['-u'])
172
189
def test_internal_diff_default(self):
173
190
# Default internal diff encoding is utf8
175
192
diff.internal_diff(u'old_\xb5', ['old_text\n'],
176
193
u'new_\xe5', ['new_text\n'], output)
177
194
lines = output.getvalue().splitlines(True)
178
195
self.check_patch(lines)
179
self.assertEquals(['--- old_\xc2\xb5\n',
196
self.assertEqual(['--- old_\xc2\xb5\n',
180
197
'+++ new_\xc3\xa5\n',
181
198
'@@ -1,1 +1,1 @@\n',
220
237
def test_internal_diff_no_content(self):
222
239
diff.internal_diff(u'old', [], u'new', [], output)
223
240
self.assertEqual('', output.getvalue())
225
242
def test_internal_diff_no_changes(self):
227
244
diff.internal_diff(u'old', ['text\n', 'contents\n'],
228
245
u'new', ['text\n', 'contents\n'],
230
247
self.assertEqual('', output.getvalue())
232
249
def test_internal_diff_returns_bytes(self):
234
output = StringIO.StringIO()
235
251
diff.internal_diff(u'old_\xb5', ['old_text\n'],
236
252
u'new_\xe5', ['new_text\n'], output)
237
self.failUnless(isinstance(output.getvalue(), str),
238
'internal_diff should return bytestrings')
253
output.check_types(self, bytes)
255
def test_internal_diff_default_context(self):
257
diff.internal_diff('old', ['same_text\n','same_text\n','same_text\n',
258
'same_text\n','same_text\n','old_text\n'],
259
'new', ['same_text\n','same_text\n','same_text\n',
260
'same_text\n','same_text\n','new_text\n'], output)
261
lines = output.getvalue().splitlines(True)
262
self.check_patch(lines)
263
self.assertEqual(['--- old\n',
275
def test_internal_diff_no_context(self):
277
diff.internal_diff('old', ['same_text\n','same_text\n','same_text\n',
278
'same_text\n','same_text\n','old_text\n'],
279
'new', ['same_text\n','same_text\n','same_text\n',
280
'same_text\n','same_text\n','new_text\n'], output,
282
lines = output.getvalue().splitlines(True)
283
self.check_patch(lines)
284
self.assertEqual(['--- old\n',
293
def test_internal_diff_more_context(self):
295
diff.internal_diff('old', ['same_text\n','same_text\n','same_text\n',
296
'same_text\n','same_text\n','old_text\n'],
297
'new', ['same_text\n','same_text\n','same_text\n',
298
'same_text\n','same_text\n','new_text\n'], output,
300
lines = output.getvalue().splitlines(True)
301
self.check_patch(lines)
302
self.assertEqual(['--- old\n',
241
319
class TestDiffFiles(tests.TestCaseInTempDir):
246
324
lines = external_udiff_lines(['\x00foobar\n'], ['foo\x00bar\n'])
248
326
cmd = ['diff', '-u', '--binary', 'old', 'new']
249
open('old', 'wb').write('\x00foobar\n')
250
open('new', 'wb').write('foo\x00bar\n')
327
with open('old', 'wb') as f: f.write('\x00foobar\n')
328
with open('new', 'wb') as f: f.write('foo\x00bar\n')
251
329
pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE,
252
330
stdin=subprocess.PIPE)
253
331
out, err = pipe.communicate()
254
# Diff returns '2' on Binary files.
255
self.assertEqual(2, pipe.returncode)
256
332
# We should output whatever diff tells us, plus a trailing newline
257
333
self.assertEqual(out.splitlines(True) + ['\n'], lines)
260
class TestShowDiffTreesHelper(tests.TestCaseWithTransport):
261
"""Has a helper for running show_diff_trees"""
263
def get_diff(self, tree1, tree2, specific_files=None, working_tree=None):
265
if working_tree is not None:
266
extra_trees = (working_tree,)
269
diff.show_diff_trees(tree1, tree2, output,
270
specific_files=specific_files,
271
extra_trees=extra_trees, old_label='old/',
273
return output.getvalue()
276
class TestDiffDates(TestShowDiffTreesHelper):
336
def get_diff_as_string(tree1, tree2, specific_files=None, working_tree=None):
338
if working_tree is not None:
339
extra_trees = (working_tree,)
342
diff.show_diff_trees(tree1, tree2, output,
343
specific_files=specific_files,
344
extra_trees=extra_trees, old_label='old/',
346
return output.getvalue()
349
class TestDiffDates(tests.TestCaseWithTransport):
279
352
super(TestDiffDates, self).setUp()
394
467
self.wt.rename_one('file1', 'dir1/file1')
395
468
old_tree = self.b.repository.revision_tree('rev-1')
396
469
new_tree = self.b.repository.revision_tree('rev-4')
397
out = self.get_diff(old_tree, new_tree, specific_files=['dir1'],
470
out = get_diff_as_string(old_tree, new_tree, specific_files=['dir1'],
398
471
working_tree=self.wt)
399
472
self.assertContainsRe(out, 'file1\t')
400
out = self.get_diff(old_tree, new_tree, specific_files=['dir2'],
473
out = get_diff_as_string(old_tree, new_tree, specific_files=['dir2'],
401
474
working_tree=self.wt)
402
475
self.assertNotContainsRe(out, 'file1\t')
406
class TestShowDiffTrees(TestShowDiffTreesHelper):
478
class TestShowDiffTrees(tests.TestCaseWithTransport):
407
479
"""Direct tests for show_diff_trees"""
409
481
def test_modified_file(self):
521
593
self.assertNotContainsRe(d, r"file 'e'")
522
594
self.assertNotContainsRe(d, r"file 'f'")
525
596
def test_binary_unicode_filenames(self):
526
597
"""Test that contents of files are *not* encoded in UTF-8 when there
527
598
is a binary file in the diff.
529
600
# See https://bugs.launchpad.net/bugs/110092.
530
self.requireFeature(tests.UnicodeFilenameFeature)
601
self.requireFeature(features.UnicodeFilenameFeature)
532
# This bug isn't triggered with cStringIO.
533
from StringIO import StringIO
534
603
tree = self.make_branch_and_tree('tree')
535
604
alpha, omega = u'\u03b1', u'\u03c9'
536
605
alpha_utf8, omega_utf8 = alpha.encode('utf8'), omega.encode('utf8')
540
609
('The %s and the %s\n' % (alpha_utf8, omega_utf8)))])
541
610
tree.add([alpha], ['file-id'])
542
611
tree.add([omega], ['file-id-2'])
543
diff_content = StringIO()
612
diff_content = StubO()
544
613
diff.show_diff_trees(tree.basis_tree(), tree, diff_content)
545
d = diff_content.getvalue()
614
diff_content.check_types(self, bytes)
615
d = b''.join(diff_content.write_record)
546
616
self.assertContainsRe(d, r"=== added file '%s'" % alpha_utf8)
547
617
self.assertContainsRe(d, "Binary files a/%s.*and b/%s.* differ\n"
548
618
% (alpha_utf8, alpha_utf8))
573
643
tree.add(['add_'+alpha], ['file-id'])
574
644
self.build_tree_contents([('tree/mod_'+alpha, 'contents_mod\n')])
576
d = self.get_diff(tree.basis_tree(), tree)
646
d = get_diff_as_string(tree.basis_tree(), tree)
577
647
self.assertContainsRe(d,
578
648
"=== renamed file 'ren_%s' => 'ren_%s'\n"%(autf8, outf8))
579
649
self.assertContainsRe(d, "=== added file 'add_%s'"%autf8)
580
650
self.assertContainsRe(d, "=== modified file 'mod_%s'"%autf8)
581
651
self.assertContainsRe(d, "=== removed file 'del_%s'"%autf8)
653
def test_unicode_filename_path_encoding(self):
654
"""Test for bug #382699: unicode filenames on Windows should be shown
657
self.requireFeature(features.UnicodeFilenameFeature)
658
# The word 'test' in Russian
659
_russian_test = u'\u0422\u0435\u0441\u0442'
660
directory = _russian_test + u'/'
661
test_txt = _russian_test + u'.txt'
662
u1234 = u'\u1234.txt'
664
tree = self.make_branch_and_tree('.')
665
self.build_tree_contents([
670
tree.add([test_txt, u1234, directory])
673
diff.show_diff_trees(tree.basis_tree(), tree, sio,
674
path_encoding='cp1251')
676
output = subst_dates(sio.getvalue())
678
=== added directory '%(directory)s'
679
=== added file '%(test_txt)s'
680
--- a/%(test_txt)s\tYYYY-MM-DD HH:MM:SS +ZZZZ
681
+++ b/%(test_txt)s\tYYYY-MM-DD HH:MM:SS +ZZZZ
685
=== added file '?.txt'
686
--- a/?.txt\tYYYY-MM-DD HH:MM:SS +ZZZZ
687
+++ b/?.txt\tYYYY-MM-DD HH:MM:SS +ZZZZ
691
''' % {'directory': _russian_test.encode('cp1251'),
692
'test_txt': test_txt.encode('cp1251'),
694
self.assertEqualDiff(output, shouldbe)
584
697
class DiffWasIs(diff.DiffPath):
647
760
self.assertContainsRe(self.differ.to_file.getvalue(), '\+contents')
649
762
def test_diff_symlink(self):
650
differ = diff.DiffSymlink(self.old_tree, self.new_tree, StringIO())
763
differ = diff.DiffSymlink(self.old_tree, self.new_tree, BytesIO())
651
764
differ.diff_symlink('old target', None)
652
765
self.assertEqual("=== target was 'old target'\n",
653
766
differ.to_file.getvalue())
655
differ = diff.DiffSymlink(self.old_tree, self.new_tree, StringIO())
768
differ = diff.DiffSymlink(self.old_tree, self.new_tree, BytesIO())
656
769
differ.diff_symlink(None, 'new target')
657
770
self.assertEqual("=== target is 'new target'\n",
658
771
differ.to_file.getvalue())
660
differ = diff.DiffSymlink(self.old_tree, self.new_tree, StringIO())
773
differ = diff.DiffSymlink(self.old_tree, self.new_tree, BytesIO())
661
774
differ.diff_symlink('old target', 'new target')
662
775
self.assertEqual("=== target changed 'old target' => 'new target'\n",
663
776
differ.to_file.getvalue())
764
877
b = ''.join([unichr(i) for i in range(4300, 4800, 2)])
765
878
sm = self._PatienceSequenceMatcher(None, a, b)
766
879
mb = sm.get_matching_blocks()
767
self.assertEquals(35, len(mb))
880
self.assertEqual(35, len(mb))
769
882
def test_unique_lcs(self):
770
883
unique_lcs = self._unique_lcs
771
self.assertEquals(unique_lcs('', ''), [])
772
self.assertEquals(unique_lcs('', 'a'), [])
773
self.assertEquals(unique_lcs('a', ''), [])
774
self.assertEquals(unique_lcs('a', 'a'), [(0,0)])
775
self.assertEquals(unique_lcs('a', 'b'), [])
776
self.assertEquals(unique_lcs('ab', 'ab'), [(0,0), (1,1)])
777
self.assertEquals(unique_lcs('abcde', 'cdeab'), [(2,0), (3,1), (4,2)])
778
self.assertEquals(unique_lcs('cdeab', 'abcde'), [(0,2), (1,3), (2,4)])
779
self.assertEquals(unique_lcs('abXde', 'abYde'), [(0,0), (1,1),
884
self.assertEqual(unique_lcs('', ''), [])
885
self.assertEqual(unique_lcs('', 'a'), [])
886
self.assertEqual(unique_lcs('a', ''), [])
887
self.assertEqual(unique_lcs('a', 'a'), [(0,0)])
888
self.assertEqual(unique_lcs('a', 'b'), [])
889
self.assertEqual(unique_lcs('ab', 'ab'), [(0,0), (1,1)])
890
self.assertEqual(unique_lcs('abcde', 'cdeab'), [(2,0), (3,1), (4,2)])
891
self.assertEqual(unique_lcs('cdeab', 'abcde'), [(0,2), (1,3), (2,4)])
892
self.assertEqual(unique_lcs('abXde', 'abYde'), [(0,0), (1,1),
781
self.assertEquals(unique_lcs('acbac', 'abc'), [(2,1)])
894
self.assertEqual(unique_lcs('acbac', 'abc'), [(2,1)])
783
896
def test_recurse_matches(self):
784
897
def test_one(a, b, matches):
785
898
test_matches = []
786
899
self._recurse_matches(
787
900
a, b, 0, 0, len(a), len(b), test_matches, 10)
788
self.assertEquals(test_matches, matches)
901
self.assertEqual(test_matches, matches)
790
903
test_one(['a', '', 'b', '', 'c'], ['a', 'a', 'b', 'c', 'c'],
791
904
[(0, 0), (2, 2), (4, 4)])
1194
1307
, list(unified_diff_files('a1', 'b1',
1195
1308
sequencematcher=psm)))
1197
txt_a = map(lambda x: x+'\n', 'abcdefghijklmnop')
1198
txt_b = map(lambda x: x+'\n', 'abcdefxydefghijklmnop')
1199
open('a2', 'wb').writelines(txt_a)
1200
open('b2', 'wb').writelines(txt_b)
1310
txt_a = [x+'\n' for x in 'abcdefghijklmnop']
1311
txt_b = [x+'\n' for x in 'abcdefxydefghijklmnop']
1312
with open('a2', 'wb') as f: f.writelines(txt_a)
1313
with open('b2', 'wb') as f: f.writelines(txt_b)
1202
1315
# This is the result with LongestCommonSubstring matching
1203
self.assertEquals(['--- a2\n',
1316
self.assertEqual(['--- a2\n',
1205
1318
'@@ -1,6 +1,11 @@\n',
1217
1330
, list(unified_diff_files('a2', 'b2')))
1219
1332
# And the patience diff
1220
self.assertEquals(['--- a2\n',
1222
'@@ -4,6 +4,11 @@\n',
1235
, list(unified_diff_files('a2', 'b2',
1236
sequencematcher=psm)))
1333
self.assertEqual(['--- a2\n',
1335
'@@ -4,6 +4,11 @@\n',
1347
list(unified_diff_files('a2', 'b2',
1348
sequencematcher=psm)))
1239
1351
class TestPatienceDiffLibFiles_c(TestPatienceDiffLibFiles):
1241
_test_needs_features = [compiled_patiencediff_feature]
1353
_test_needs_features = [features.compiled_patiencediff_feature]
1243
1355
def setUp(self):
1244
1356
super(TestPatienceDiffLibFiles_c, self).setUp()
1245
from bzrlib import _patiencediff_c
1357
from breezy import _patiencediff_c
1246
1358
self._PatienceSequenceMatcher = \
1247
1359
_patiencediff_c.PatienceSequenceMatcher_c
1250
1362
class TestUsingCompiledIfAvailable(tests.TestCase):
1252
1364
def test_PatienceSequenceMatcher(self):
1253
if compiled_patiencediff_feature.available():
1254
from bzrlib._patiencediff_c import PatienceSequenceMatcher_c
1365
if features.compiled_patiencediff_feature.available():
1366
from breezy._patiencediff_c import PatienceSequenceMatcher_c
1255
1367
self.assertIs(PatienceSequenceMatcher_c,
1256
1368
patiencediff.PatienceSequenceMatcher)
1258
from bzrlib._patiencediff_py import PatienceSequenceMatcher_py
1370
from breezy._patiencediff_py import PatienceSequenceMatcher_py
1259
1371
self.assertIs(PatienceSequenceMatcher_py,
1260
1372
patiencediff.PatienceSequenceMatcher)
1262
1374
def test_unique_lcs(self):
1263
if compiled_patiencediff_feature.available():
1264
from bzrlib._patiencediff_c import unique_lcs_c
1375
if features.compiled_patiencediff_feature.available():
1376
from breezy._patiencediff_c import unique_lcs_c
1265
1377
self.assertIs(unique_lcs_c,
1266
1378
patiencediff.unique_lcs)
1268
from bzrlib._patiencediff_py import unique_lcs_py
1380
from breezy._patiencediff_py import unique_lcs_py
1269
1381
self.assertIs(unique_lcs_py,
1270
1382
patiencediff.unique_lcs)
1272
1384
def test_recurse_matches(self):
1273
if compiled_patiencediff_feature.available():
1274
from bzrlib._patiencediff_c import recurse_matches_c
1385
if features.compiled_patiencediff_feature.available():
1386
from breezy._patiencediff_c import recurse_matches_c
1275
1387
self.assertIs(recurse_matches_c,
1276
1388
patiencediff.recurse_matches)
1278
from bzrlib._patiencediff_py import recurse_matches_py
1390
from breezy._patiencediff_py import recurse_matches_py
1279
1391
self.assertIs(recurse_matches_py,
1280
1392
patiencediff.recurse_matches)
1391
1503
diff_obj._prepare_files('file2-id', 'oldname2', 'newname2')
1506
class TestDiffFromToolEncodedFilename(tests.TestCaseWithTransport):
1508
def test_encodable_filename(self):
1509
# Just checks file path for external diff tool.
1510
# We cannot change CPython's internal encoding used by os.exec*.
1511
diffobj = diff.DiffFromTool(['dummy', '@old_path', '@new_path'],
1513
for _, scenario in EncodingAdapter.encoding_scenarios:
1514
encoding = scenario['encoding']
1515
dirname = scenario['info']['directory']
1516
filename = scenario['info']['filename']
1518
self.overrideAttr(diffobj, '_fenc', lambda: encoding)
1519
relpath = dirname + u'/' + filename
1520
fullpath = diffobj._safe_filename('safe', relpath)
1521
self.assertEqual(fullpath,
1522
fullpath.encode(encoding).decode(encoding))
1523
self.assertTrue(fullpath.startswith(diffobj._root + '/safe'))
1525
def test_unencodable_filename(self):
1526
diffobj = diff.DiffFromTool(['dummy', '@old_path', '@new_path'],
1528
for _, scenario in EncodingAdapter.encoding_scenarios:
1529
encoding = scenario['encoding']
1530
dirname = scenario['info']['directory']
1531
filename = scenario['info']['filename']
1533
if encoding == 'iso-8859-1':
1534
encoding = 'iso-8859-2'
1536
encoding = 'iso-8859-1'
1538
self.overrideAttr(diffobj, '_fenc', lambda: encoding)
1539
relpath = dirname + u'/' + filename
1540
fullpath = diffobj._safe_filename('safe', relpath)
1541
self.assertEqual(fullpath,
1542
fullpath.encode(encoding).decode(encoding))
1543
self.assertTrue(fullpath.startswith(diffobj._root + '/safe'))
1394
1546
class TestGetTreesAndBranchesToDiffLocked(tests.TestCaseWithTransport):
1396
1548
def call_gtabtd(self, path_list, revision_specs, old_url, new_url):
1397
"""Call get_trees_and_branches_to_diff_locked. Overridden by
1398
TestGetTreesAndBranchesToDiff.
1549
"""Call get_trees_and_branches_to_diff_locked."""
1400
1550
return diff.get_trees_and_branches_to_diff_locked(
1401
1551
path_list, revision_specs, old_url, new_url, self.addCleanup)
1439
1589
self.assertEqual(tree.branch.base, new_branch.base)
1440
1590
self.assertIs(None, specific_files)
1441
1591
self.assertEqual(tree.basedir, extra_trees[0].basedir)
1444
class TestGetTreesAndBranchesToDiff(TestGetTreesAndBranchesToDiffLocked):
1445
"""Apply the tests for get_trees_and_branches_to_diff_locked to the
1446
deprecated get_trees_and_branches_to_diff function.
1449
def call_gtabtd(self, path_list, revision_specs, old_url, new_url):
1450
return self.applyDeprecated(
1451
deprecated_in((2, 2, 0)), diff.get_trees_and_branches_to_diff,
1452
path_list, revision_specs, old_url, new_url)