~bzr-pqm/bzr/bzr.dev

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