~bzr-pqm/bzr/bzr.dev

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