/brz/remove-bazaar

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