/brz/remove-bazaar

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