~bzr-pqm/bzr/bzr.dev

6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
1
# Copyright (C) 2006-2012 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
16
17
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
18
"""Black-box tests for bzr diff."""
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
19
20
import os
1740.2.5 by Aaron Bentley
Merge from bzr.dev
21
import re
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
22
4695.3.1 by Vincent Ladeuil
Fix test failures with no C extensions loaded.
23
from bzrlib import (
24
    tests,
25
    workingtree,
26
    )
5131.1.4 by Jelmer Vernooij
Add test for custom diff format.
27
from bzrlib.diff import (
28
    DiffTree,
29
    format_registry as diff_format_registry,
30
    )
5349.1.5 by Matthäus G. Chajdas
Fix issues raised by Vincent Ladeuil.
31
from bzrlib.tests import (
32
    features,
33
    )
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
34
35
1740.2.5 by Aaron Bentley
Merge from bzr.dev
36
def subst_dates(string):
37
    """Replace date strings with constant values."""
38
    return re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-\+]\d{4}',
39
                  'YYYY-MM-DD HH:MM:SS +ZZZZ', string)
40
41
4695.3.1 by Vincent Ladeuil
Fix test failures with no C extensions loaded.
42
class DiffBase(tests.TestCaseWithTransport):
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
43
    """Base class with common setup method"""
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
44
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
45
    def make_example_branch(self):
46
        tree = self.make_branch_and_tree('.')
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
47
        self.build_tree_contents([
2738.1.3 by Daniel Watkins
Fixed whitespace issues.
48
            ('hello', 'foo\n'),
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
49
            ('goodbye', 'baz\n')])
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
50
        tree.add(['hello'])
51
        tree.commit('setup')
52
        tree.add(['goodbye'])
53
        tree.commit('setup')
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
54
        return tree
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
55
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
56
57
class TestDiff(DiffBase):
58
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
59
    def test_diff(self):
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
60
        tree = self.make_example_branch()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
61
        self.build_tree_contents([('hello', 'hello world!')])
62
        tree.commit(message='fixing hello')
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
63
        output = self.run_bzr('diff -r 2..3', retcode=1)[0]
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
64
        self.assert_('\n+hello world!' in output)
2745.4.3 by Lukáš Lalinsky
Change -C to -c.
65
        output = self.run_bzr('diff -c 3', retcode=1)[0]
2745.4.1 by Lukáš Lalinsky
New option -C/--change for diff and status to show changes in one revision. (#56299)
66
        self.assert_('\n+hello world!' in output)
67
        output = self.run_bzr('diff -r last:3..last:1', retcode=1)[0]
68
        self.assert_('\n+baz' in output)
2745.4.3 by Lukáš Lalinsky
Change -C to -c.
69
        output = self.run_bzr('diff -c last:2', retcode=1)[0]
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
70
        self.assert_('\n+baz' in output)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
71
        self.build_tree(['moo'])
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
72
        tree.add('moo')
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
73
        os.unlink('moo')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
74
        self.run_bzr('diff')
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
75
1694.2.2 by Martin Pool
Add test for diff --diff-prefix, which was previously untested.
76
    def test_diff_prefix(self):
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
77
        """diff --prefix appends to filenames in output"""
78
        self.make_example_branch()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
79
        self.build_tree_contents([('hello', 'hello world!\n')])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
80
        out, err = self.run_bzr('diff --prefix old/:new/', retcode=1)
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
81
        self.assertEquals(err, '')
1740.2.5 by Aaron Bentley
Merge from bzr.dev
82
        self.assertEqualDiff(subst_dates(out), '''\
1694.2.4 by Martin Pool
When a diff prefix is given, don't show it in === summary lines, only on the diffs themselves.
83
=== modified file 'hello'
1740.2.5 by Aaron Bentley
Merge from bzr.dev
84
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
85
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
86
@@ -1,1 +1,1 @@
87
-foo
88
+hello world!
89
90
''')
91
2324.1.2 by Dmitry Vasiliev
Added test for bzr diff --prefix illegal_value
92
    def test_diff_illegal_prefix_value(self):
93
        # There was an error in error reporting for this option
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
94
        out, err = self.run_bzr('diff --prefix old/', retcode=3)
2324.1.2 by Dmitry Vasiliev
Added test for bzr diff --prefix illegal_value
95
        self.assertContainsRe(err,
96
            '--prefix expects two values separated by a colon')
97
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
98
    def test_diff_p1(self):
99
        """diff -p1 produces lkml-style diffs"""
100
        self.make_example_branch()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
101
        self.build_tree_contents([('hello', 'hello world!\n')])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
102
        out, err = self.run_bzr('diff -p1', retcode=1)
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
103
        self.assertEquals(err, '')
1740.2.5 by Aaron Bentley
Merge from bzr.dev
104
        self.assertEqualDiff(subst_dates(out), '''\
1694.2.4 by Martin Pool
When a diff prefix is given, don't show it in === summary lines, only on the diffs themselves.
105
=== modified file 'hello'
1740.2.5 by Aaron Bentley
Merge from bzr.dev
106
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
107
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
108
@@ -1,1 +1,1 @@
109
-foo
110
+hello world!
111
112
''')
113
114
    def test_diff_p0(self):
115
        """diff -p0 produces diffs with no prefix"""
116
        self.make_example_branch()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
117
        self.build_tree_contents([('hello', 'hello world!\n')])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
118
        out, err = self.run_bzr('diff -p0', retcode=1)
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
119
        self.assertEquals(err, '')
1740.2.5 by Aaron Bentley
Merge from bzr.dev
120
        self.assertEqualDiff(subst_dates(out), '''\
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
121
=== modified file 'hello'
1740.2.5 by Aaron Bentley
Merge from bzr.dev
122
--- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
123
+++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
1694.2.2 by Martin Pool
Add test for diff --diff-prefix, which was previously untested.
124
@@ -1,1 +1,1 @@
125
-foo
126
+hello world!
127
128
''')
129
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
130
    def test_diff_nonexistent(self):
131
        # Get an error from a file that does not exist at all
132
        # (Malone #3619)
133
        self.make_example_branch()
3872.2.1 by Marius Kruger
add tests for diff with non-existing revno's
134
        out, err = self.run_bzr('diff does-not-exist', retcode=3,
135
            error_regexes=('not versioned.*does-not-exist',))
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
136
2197.2.1 by Martin Pool
Refactor cmd_diff
137
    def test_diff_illegal_revision_specifiers(self):
3872.2.1 by Marius Kruger
add tests for diff with non-existing revno's
138
        out, err = self.run_bzr('diff -r 1..23..123', retcode=3,
139
            error_regexes=('one or two revision specifiers',))
140
5131.1.2 by Jelmer Vernooij
Refuse both --using and --format to 'bzr diff'.
141
    def test_diff_using_and_format(self):
142
        out, err = self.run_bzr('diff --format=default --using=mydi', retcode=3,
143
            error_regexes=('are mutually exclusive',))
144
3872.2.1 by Marius Kruger
add tests for diff with non-existing revno's
145
    def test_diff_nonexistent_revision(self):
146
        out, err = self.run_bzr('diff -r 123', retcode=3,
5105.1.4 by Vincent Ladeuil
Use single quotes so that no test need to be updated.
147
            error_regexes=("Requested revision: '123' does not "
3872.2.1 by Marius Kruger
add tests for diff with non-existing revno's
148
                "exist in branch:",))
149
150
    def test_diff_nonexistent_dotted_revision(self):
151
        out, err = self.run_bzr('diff -r 1.1', retcode=3)
3872.2.3 by Marius Kruger
since the -c case seems to be fixed, add a test for it
152
        self.assertContainsRe(err,
5105.1.4 by Vincent Ladeuil
Use single quotes so that no test need to be updated.
153
            "Requested revision: '1.1' does not exist in branch:")
3872.2.3 by Marius Kruger
since the -c case seems to be fixed, add a test for it
154
155
    def test_diff_nonexistent_dotted_revision_change(self):
156
        out, err = self.run_bzr('diff -c 1.1', retcode=3)
3872.2.1 by Marius Kruger
add tests for diff with non-existing revno's
157
        self.assertContainsRe(err,
5105.1.4 by Vincent Ladeuil
Use single quotes so that no test need to be updated.
158
            "Requested revision: '1.1' does not exist in branch:")
2197.2.1 by Martin Pool
Refactor cmd_diff
159
1658.1.10 by Martin Pool
diff on unversiond files should give an error (Malone #3619)
160
    def test_diff_unversioned(self):
161
        # Get an error when diffing a non-versioned file.
162
        # (Malone #3619)
163
        self.make_example_branch()
164
        self.build_tree(['unversioned-file'])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
165
        out, err = self.run_bzr('diff unversioned-file', retcode=3)
1658.1.10 by Martin Pool
diff on unversiond files should give an error (Malone #3619)
166
        self.assertContainsRe(err, 'not versioned.*unversioned-file')
167
168
    # TODO: What should diff say for a file deleted in working tree?
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
169
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
170
    def example_branches(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
171
        branch1_tree = self.make_branch_and_tree('branch1')
172
        self.build_tree(['branch1/file'], line_endings='binary')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
173
        self.build_tree(['branch1/file2'], line_endings='binary')
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
174
        branch1_tree.add('file')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
175
        branch1_tree.add('file2')
176
        branch1_tree.commit(message='add file and file2')
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
177
        branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
178
        self.build_tree_contents([('branch2/file', 'new content\n')])
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
179
        branch2_tree.commit(message='update file')
180
        return branch1_tree, branch2_tree
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
181
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
182
    def check_b2_vs_b1(self, cmd):
183
        # Compare branch2 vs branch1 using cmd and check the result
184
        out, err = self.run_bzr(cmd, retcode=1)
1740.2.5 by Aaron Bentley
Merge from bzr.dev
185
        self.assertEquals('', err)
186
        self.assertEquals("=== modified file 'file'\n"
187
                          "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
188
                          "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
189
                          "@@ -1,1 +1,1 @@\n"
190
                          "-new content\n"
191
                          "+contents of branch1/file\n"
192
                          "\n", subst_dates(out))
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
193
3072.1.3 by Ian Clatworthy
Test more --old and --new combinations
194
    def check_b1_vs_b2(self, cmd):
195
        # Compare branch1 vs branch2 using cmd and check the result
196
        out, err = self.run_bzr(cmd, retcode=1)
197
        self.assertEquals('', err)
198
        self.assertEqualDiff("=== modified file 'file'\n"
199
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
200
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
201
                              "@@ -1,1 +1,1 @@\n"
202
                              "-contents of branch1/file\n"
203
                              "+new content\n"
204
                              "\n", subst_dates(out))
205
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
206
    def check_no_diffs(self, cmd):
207
        # Check that running cmd returns an empty diff
208
        out, err = self.run_bzr(cmd, retcode=0)
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
209
        self.assertEquals('', err)
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
210
        self.assertEquals('', out)
211
212
    def test_diff_branches(self):
213
        self.example_branches()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
214
        # should open branch1 and diff against branch2,
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
215
        self.check_b2_vs_b1('diff -r branch:branch2 branch1')
216
        # Compare two working trees using various syntax forms
217
        self.check_b2_vs_b1('diff --old branch2 --new branch1')
218
        self.check_b2_vs_b1('diff --old branch2 branch1')
219
        self.check_b2_vs_b1('diff branch2 --new branch1')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
220
        # Test with a selected file that was changed
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
221
        self.check_b2_vs_b1('diff --old branch2 --new branch1 file')
222
        self.check_b2_vs_b1('diff --old branch2 branch1/file')
223
        self.check_b2_vs_b1('diff branch2/file --new branch1')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
224
        # Test with a selected file that was not changed
3072.1.2 by Ian Clatworthy
Test various --old and --new combinations
225
        self.check_no_diffs('diff --old branch2 --new branch1 file2')
226
        self.check_no_diffs('diff --old branch2 branch1/file2')
227
        self.check_no_diffs('diff branch2/file2 --new branch1')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
228
229
    def test_diff_branches_no_working_trees(self):
230
        branch1_tree, branch2_tree = self.example_branches()
231
        # Compare a working tree to a branch without a WT
232
        dir1 = branch1_tree.bzrdir
233
        dir1.destroy_workingtree()
234
        self.assertFalse(dir1.has_workingtree())
3072.1.3 by Ian Clatworthy
Test more --old and --new combinations
235
        self.check_b2_vs_b1('diff --old branch2 --new branch1')
236
        self.check_b2_vs_b1('diff --old branch2 branch1')
237
        self.check_b2_vs_b1('diff branch2 --new branch1')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
238
        # Compare a branch without a WT to one with a WT
3072.1.3 by Ian Clatworthy
Test more --old and --new combinations
239
        self.check_b1_vs_b2('diff --old branch1 --new branch2')
240
        self.check_b1_vs_b2('diff --old branch1 branch2')
241
        self.check_b1_vs_b2('diff branch1 --new branch2')
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
242
        # Compare a branch with a WT against another without a WT
243
        dir2 = branch2_tree.bzrdir
244
        dir2.destroy_workingtree()
245
        self.assertFalse(dir2.has_workingtree())
3072.1.3 by Ian Clatworthy
Test more --old and --new combinations
246
        self.check_b1_vs_b2('diff --old branch1 --new branch2')
247
        self.check_b1_vs_b2('diff --old branch1 branch2')
248
        self.check_b1_vs_b2('diff branch1 --new branch2')
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
249
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
250
    def test_diff_revno_branches(self):
251
        self.example_branches()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
252
        branch2_tree = workingtree.WorkingTree.open_containing('branch2')[0]
253
        self.build_tree_contents([('branch2/file', 'even newer content')])
254
        branch2_tree.commit(message='update file once more')
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
255
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
256
        out, err = self.run_bzr('diff -r revno:1:branch2..revno:1:branch1',
2581.1.2 by Martin Pool
Remove unnecessary retcode=0 to run_bzr calls
257
                                )
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
258
        self.assertEquals('', err)
259
        self.assertEquals('', out)
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
260
        out, err = self.run_bzr('diff -r revno:2:branch2..revno:1:branch1',
261
                                retcode=1)
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
262
        self.assertEquals('', err)
263
        self.assertEqualDiff("=== modified file 'file'\n"
264
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
265
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
266
                              "@@ -1,1 +1,1 @@\n"
267
                              "-new content\n"
268
                              "+contents of branch1/file\n"
269
                              "\n", subst_dates(out))
270
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
271
    def example_branch2(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
272
        branch1_tree = self.make_branch_and_tree('branch1')
273
        self.build_tree_contents([('branch1/file1', 'original line\n')])
274
        branch1_tree.add('file1')
275
        branch1_tree.commit(message='first commit')
276
        self.build_tree_contents([('branch1/file1', 'repo line\n')])
277
        branch1_tree.commit(message='second commit')
278
        return branch1_tree
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
279
280
    def test_diff_to_working_tree(self):
281
        self.example_branch2()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
282
        self.build_tree_contents([('branch1/file1', 'new line')])
283
        output = self.run_bzr('diff -r 1.. branch1', retcode=1)
2598.5.12 by Aaron Bentley
Merge bzr.dev
284
        self.assertContainsRe(output[0], '\n\\-original line\n\\+new line\n')
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
285
3164.1.1 by Ian Clatworthy
diff without arguments means the current tree, not the current directory
286
    def test_diff_to_working_tree_in_subdir(self):
287
        self.example_branch2()
288
        self.build_tree_contents([('branch1/file1', 'new line')])
289
        os.mkdir('branch1/dir1')
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
290
        output = self.run_bzr('diff -r 1..', retcode=1,
291
                              working_dir='branch1/dir1')
3164.1.1 by Ian Clatworthy
diff without arguments means the current tree, not the current directory
292
        self.assertContainsRe(output[0], '\n\\-original line\n\\+new line\n')
293
1551.7.19 by Aaron Bentley
Always include working tree when calculating file ids for diff
294
    def test_diff_across_rename(self):
295
        """The working tree path should always be considered for diffing"""
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
296
        tree = self.make_example_branch()
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
297
        self.run_bzr('diff -r 0..1 hello', retcode=1)
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
298
        tree.rename_one('hello', 'hello1')
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
299
        self.run_bzr('diff hello1', retcode=1)
300
        self.run_bzr('diff -r 0..1 hello1', retcode=1)
1551.7.19 by Aaron Bentley
Always include working tree when calculating file ids for diff
301
3072.1.1 by Ian Clatworthy
Improved diff based on feedback from abentley
302
    def test_diff_to_branch_no_working_tree(self):
303
        branch1_tree = self.example_branch2()
304
        dir1 = branch1_tree.bzrdir
305
        dir1.destroy_workingtree()
306
        self.assertFalse(dir1.has_workingtree())
307
        output = self.run_bzr('diff -r 1.. branch1', retcode=1)
308
        self.assertContainsRe(output[0], '\n\\-original line\n\\+repo line\n')
309
5131.1.4 by Jelmer Vernooij
Add test for custom diff format.
310
    def test_custom_format(self):
311
        class BooDiffTree(DiffTree):
312
313
            def show_diff(self, specific_files, extra_trees=None):
314
                self.to_file.write("BOO!\n")
315
                return super(BooDiffTree, self).show_diff(specific_files,
316
                    extra_trees)
317
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
318
        diff_format_registry.register("boo", BooDiffTree, "Scary diff format")
5131.1.4 by Jelmer Vernooij
Add test for custom diff format.
319
        self.addCleanup(diff_format_registry.remove, "boo")
320
        self.make_example_branch()
321
        self.build_tree_contents([('hello', 'hello world!\n')])
322
        output = self.run_bzr('diff --format=boo', retcode=1)
323
        self.assertTrue("BOO!" in output[0])
5574.9.5 by Jelmer Vernooij
Fix test.
324
        output = self.run_bzr('diff -Fboo', retcode=1)
5574.9.2 by Jelmer Vernooij
Add test.
325
        self.assertTrue("BOO!" in output[0])
326
5131.1.4 by Jelmer Vernooij
Add test for custom diff format.
327
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
328
class TestCheckoutDiff(TestDiff):
329
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
330
    def make_example_branch(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
331
        tree = super(TestCheckoutDiff, self).make_example_branch()
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
332
        tree = tree.branch.create_checkout('checkout')
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
333
        os.chdir('checkout')
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
334
        return tree
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
335
336
    def example_branch2(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
337
        tree = super(TestCheckoutDiff, self).example_branch2()
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
338
        os.mkdir('checkouts')
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
339
        tree = tree.branch.create_checkout('checkouts/branch1')
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
340
        os.chdir('checkouts')
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
341
        return tree
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
342
343
    def example_branches(self):
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
344
        branch1_tree, branch2_tree = super(TestCheckoutDiff,
345
                                           self).example_branches()
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
346
        os.mkdir('checkouts')
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
347
        branch1_tree = branch1_tree.branch.create_checkout('checkouts/branch1')
348
        branch2_tree = branch2_tree.branch.create_checkout('checkouts/branch2')
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
349
        os.chdir('checkouts')
2738.1.2 by Daniel Watkins
Tests now run on both branches and checkouts.
350
        return branch1_tree, branch2_tree
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
351
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
352
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
353
class TestDiffLabels(DiffBase):
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
354
355
    def test_diff_label_removed(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
356
        tree = super(TestDiffLabels, self).make_example_branch()
357
        tree.remove('hello', keep_files=False)
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
358
        diff = self.run_bzr('diff', retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
359
        self.assertTrue("=== removed file 'hello'" in diff[0])
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
360
361
    def test_diff_label_added(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
362
        tree = super(TestDiffLabels, self).make_example_branch()
363
        self.build_tree_contents([('barbar', 'barbar')])
364
        tree.add('barbar')
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
365
        diff = self.run_bzr('diff', retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
366
        self.assertTrue("=== added file 'barbar'" in diff[0])
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
367
368
    def test_diff_label_modified(self):
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
369
        super(TestDiffLabels, self).make_example_branch()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
370
        self.build_tree_contents([('hello', 'barbar')])
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
371
        diff = self.run_bzr('diff', retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
372
        self.assertTrue("=== modified file 'hello'" in diff[0])
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
373
374
    def test_diff_label_renamed(self):
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
375
        tree = super(TestDiffLabels, self).make_example_branch()
376
        tree.rename_one('hello', 'gruezi')
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
377
        diff = self.run_bzr('diff', retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
378
        self.assertTrue("=== renamed file 'hello' => 'gruezi'" in diff[0])
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
379
380
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
381
class TestExternalDiff(DiffBase):
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
382
383
    def test_external_diff(self):
384
        """Test that we can spawn an external diff process"""
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
385
        self.disable_missing_extensions_warning()
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
386
        # We have to use run_bzr_subprocess, because we need to
387
        # test writing directly to stdout, (there was a bug in
388
        # subprocess.py that we had to workaround).
389
        # However, if 'diff' may not be available
390
        self.make_example_branch()
6561.2.1 by Vincent Ladeuil
Add a ``progress_bar`` config option.
391
        out, err = self.run_bzr_subprocess(
392
            'diff -Oprogress_bar=none -r 1 --diff-options -ub',
393
            universal_newlines=True,
394
            retcode=None)
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
395
        if 'Diff is not installed on this machine' in err:
4695.3.1 by Vincent Ladeuil
Fix test failures with no C extensions loaded.
396
            raise tests.TestSkipped("No external 'diff' is available")
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
397
        self.assertEqual('', err)
398
        # We have to skip the stuff in the middle, because it depends
399
        # on time.time()
400
        self.assertStartsWith(out, "=== added file 'goodbye'\n"
401
                                   "--- goodbye\t1970-01-01 00:00:00 +0000\n"
402
                                   "+++ goodbye\t")
403
        self.assertEndsWith(out, "\n@@ -0,0 +1 @@\n"
1899.1.6 by John Arbash Meinel
internal_diff always adds a trailing \n, make sure external_diff does too
404
                                 "+baz\n\n")
2178.4.1 by Alexander Belchenko
Provide tests to illustrate bug #55276 on win32.
405
5349.1.4 by Matthäus G. Chajdas
Allow both --using and --diff-options.
406
    def test_external_diff_options_and_using(self):
407
        """Test that the options are passed correctly to an external diff process"""
5349.1.5 by Matthäus G. Chajdas
Fix issues raised by Vincent Ladeuil.
408
        self.requireFeature(features.diff_feature)
5349.1.4 by Matthäus G. Chajdas
Allow both --using and --diff-options.
409
        self.make_example_branch()
410
        self.build_tree_contents([('hello', 'Foo\n')])
5349.1.5 by Matthäus G. Chajdas
Fix issues raised by Vincent Ladeuil.
411
        out, err = self.run_bzr('diff --diff-options -i --using diff',
412
                                    retcode=1)
5349.1.4 by Matthäus G. Chajdas
Allow both --using and --diff-options.
413
        self.assertEquals("=== modified file 'hello'\n", out)
414
        self.assertEquals('', err)
415
2178.4.1 by Alexander Belchenko
Provide tests to illustrate bug #55276 on win32.
416
417
class TestDiffOutput(DiffBase):
418
419
    def test_diff_output(self):
2178.4.5 by Alexander Belchenko
Spell-checking (thanks to Aaron)
420
        # check that output doesn't mangle line-endings
2178.4.1 by Alexander Belchenko
Provide tests to illustrate bug #55276 on win32.
421
        self.make_example_branch()
2664.10.1 by Daniel Watkins
tests.blackbox.test_diff now uses internals where appropriate.
422
        self.build_tree_contents([('hello', 'hello world!\n')])
2178.4.1 by Alexander Belchenko
Provide tests to illustrate bug #55276 on win32.
423
        output = self.run_bzr_subprocess('diff', retcode=1)[0]
424
        self.assert_('\n+hello world!\n' in output)