/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_diff.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-06-30 16:06:19 UTC
  • mfrom: (5971.1.80 bzr-gpgme)
  • Revision ID: pqm@pqm.ubuntu.com-20110630160619-3022zmfchft893nt
(jr) A new command ``bzr verify-signatures`` has been added to check that
 commits
 are correctly signed with trusted keys by GPG. This requires python-gpgme to
 be installed. ``bzr log`` has gained a ``--signatures`` option to list the
 validity of signatures for each commit. New config options
 ``acceptable_keys``
 and ``validate_signatures_in_log`` can be set to control options to these
 commands. (Jonathan Riddell)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
2
 
 
 
1
# Copyright (C) 2006-2011 Canonical Ltd
 
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
 
 
7
#
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
 
 
12
#
13
13
# You should have received a copy of the GNU General Public License
14
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
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
 
18
18
"""Black-box tests for bzr diff.
19
19
"""
20
20
 
21
21
import os
22
 
 
23
 
import bzrlib
24
 
from bzrlib.branch import Branch
25
 
from bzrlib.tests.blackbox import ExternalBase
26
 
 
27
 
 
28
 
class TestDiff(ExternalBase):
29
 
 
30
 
    def make_example_branch(test):
31
 
        # FIXME: copied from test_too_much -- share elsewhere?
32
 
        test.runbzr('init')
33
 
        file('hello', 'wt').write('foo')
34
 
        test.runbzr('add hello')
35
 
        test.runbzr('commit -m setup hello')
36
 
        file('goodbye', 'wt').write('baz')
37
 
        test.runbzr('add goodbye')
38
 
        test.runbzr('commit -m setup goodbye')
 
22
import re
 
23
 
 
24
from bzrlib import (
 
25
    tests,
 
26
    workingtree,
 
27
    )
 
28
from bzrlib.diff import (
 
29
    DiffTree,
 
30
    format_registry as diff_format_registry,
 
31
    )
 
32
from bzrlib.tests import (
 
33
    features,
 
34
    )
 
35
 
 
36
 
 
37
def subst_dates(string):
 
38
    """Replace date strings with constant values."""
 
39
    return re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-\+]\d{4}',
 
40
                  'YYYY-MM-DD HH:MM:SS +ZZZZ', string)
 
41
 
 
42
 
 
43
class DiffBase(tests.TestCaseWithTransport):
 
44
    """Base class with common setup method"""
 
45
 
 
46
    def make_example_branch(self):
 
47
        tree = self.make_branch_and_tree('.')
 
48
        self.build_tree_contents([
 
49
            ('hello', 'foo\n'),
 
50
            ('goodbye', 'baz\n')])
 
51
        tree.add(['hello'])
 
52
        tree.commit('setup')
 
53
        tree.add(['goodbye'])
 
54
        tree.commit('setup')
 
55
        return tree
 
56
 
 
57
 
 
58
class TestDiff(DiffBase):
39
59
 
40
60
    def test_diff(self):
41
 
        self.make_example_branch()
42
 
        file('hello', 'wt').write('hello world!')
43
 
        self.runbzr('commit -m fixing hello')
44
 
        output = self.runbzr('diff -r 2..3', backtick=1, retcode=1)
45
 
        self.assert_('\n+hello world!' in output)
46
 
        output = self.runbzr('diff -r last:3..last:1', backtick=1, retcode=1)
47
 
        self.assert_('\n+baz' in output)
48
 
        file('moo', 'wb').write('moo')
49
 
        self.runbzr('add moo')
 
61
        tree = self.make_example_branch()
 
62
        self.build_tree_contents([('hello', 'hello world!')])
 
63
        tree.commit(message='fixing hello')
 
64
        output = self.run_bzr('diff -r 2..3', retcode=1)[0]
 
65
        self.assert_('\n+hello world!' in output)
 
66
        output = self.run_bzr('diff -c 3', retcode=1)[0]
 
67
        self.assert_('\n+hello world!' in output)
 
68
        output = self.run_bzr('diff -r last:3..last:1', retcode=1)[0]
 
69
        self.assert_('\n+baz' in output)
 
70
        output = self.run_bzr('diff -c last:2', retcode=1)[0]
 
71
        self.assert_('\n+baz' in output)
 
72
        self.build_tree(['moo'])
 
73
        tree.add('moo')
50
74
        os.unlink('moo')
51
 
        self.runbzr('diff')
 
75
        self.run_bzr('diff')
 
76
 
 
77
    def test_diff_prefix(self):
 
78
        """diff --prefix appends to filenames in output"""
 
79
        self.make_example_branch()
 
80
        self.build_tree_contents([('hello', 'hello world!\n')])
 
81
        out, err = self.run_bzr('diff --prefix old/:new/', retcode=1)
 
82
        self.assertEquals(err, '')
 
83
        self.assertEqualDiff(subst_dates(out), '''\
 
84
=== modified file 'hello'
 
85
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
86
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
87
@@ -1,1 +1,1 @@
 
88
-foo
 
89
+hello world!
 
90
 
 
91
''')
 
92
 
 
93
    def test_diff_illegal_prefix_value(self):
 
94
        # There was an error in error reporting for this option
 
95
        out, err = self.run_bzr('diff --prefix old/', retcode=3)
 
96
        self.assertContainsRe(err,
 
97
            '--prefix expects two values separated by a colon')
 
98
 
 
99
    def test_diff_p1(self):
 
100
        """diff -p1 produces lkml-style diffs"""
 
101
        self.make_example_branch()
 
102
        self.build_tree_contents([('hello', 'hello world!\n')])
 
103
        out, err = self.run_bzr('diff -p1', retcode=1)
 
104
        self.assertEquals(err, '')
 
105
        self.assertEqualDiff(subst_dates(out), '''\
 
106
=== modified file 'hello'
 
107
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
108
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
109
@@ -1,1 +1,1 @@
 
110
-foo
 
111
+hello world!
 
112
 
 
113
''')
 
114
 
 
115
    def test_diff_p0(self):
 
116
        """diff -p0 produces diffs with no prefix"""
 
117
        self.make_example_branch()
 
118
        self.build_tree_contents([('hello', 'hello world!\n')])
 
119
        out, err = self.run_bzr('diff -p0', retcode=1)
 
120
        self.assertEquals(err, '')
 
121
        self.assertEqualDiff(subst_dates(out), '''\
 
122
=== modified file 'hello'
 
123
--- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
124
+++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
125
@@ -1,1 +1,1 @@
 
126
-foo
 
127
+hello world!
 
128
 
 
129
''')
52
130
 
53
131
    def test_diff_nonexistent(self):
54
132
        # Get an error from a file that does not exist at all
55
133
        # (Malone #3619)
56
134
        self.make_example_branch()
57
 
        out, err = self.runbzr('diff does-not-exist', retcode=3)
58
 
        self.assertContainsRe(err, 'not versioned.*does-not-exist')
 
135
        out, err = self.run_bzr('diff does-not-exist', retcode=3,
 
136
            error_regexes=('not versioned.*does-not-exist',))
 
137
 
 
138
    def test_diff_illegal_revision_specifiers(self):
 
139
        out, err = self.run_bzr('diff -r 1..23..123', retcode=3,
 
140
            error_regexes=('one or two revision specifiers',))
 
141
 
 
142
    def test_diff_using_and_format(self):
 
143
        out, err = self.run_bzr('diff --format=default --using=mydi', retcode=3,
 
144
            error_regexes=('are mutually exclusive',))
 
145
 
 
146
    def test_diff_nonexistent_revision(self):
 
147
        out, err = self.run_bzr('diff -r 123', retcode=3,
 
148
            error_regexes=("Requested revision: '123' does not "
 
149
                "exist in branch:",))
 
150
 
 
151
    def test_diff_nonexistent_dotted_revision(self):
 
152
        out, err = self.run_bzr('diff -r 1.1', retcode=3)
 
153
        self.assertContainsRe(err,
 
154
            "Requested revision: '1.1' does not exist in branch:")
 
155
 
 
156
    def test_diff_nonexistent_dotted_revision_change(self):
 
157
        out, err = self.run_bzr('diff -c 1.1', retcode=3)
 
158
        self.assertContainsRe(err,
 
159
            "Requested revision: '1.1' does not exist in branch:")
59
160
 
60
161
    def test_diff_unversioned(self):
61
162
        # Get an error when diffing a non-versioned file.
62
163
        # (Malone #3619)
63
164
        self.make_example_branch()
64
165
        self.build_tree(['unversioned-file'])
65
 
        out, err = self.runbzr('diff unversioned-file', retcode=3)
 
166
        out, err = self.run_bzr('diff unversioned-file', retcode=3)
66
167
        self.assertContainsRe(err, 'not versioned.*unversioned-file')
67
168
 
68
169
    # TODO: What should diff say for a file deleted in working tree?
69
170
 
70
171
    def example_branches(self):
71
 
        self.build_tree(['branch1/', 'branch1/file'], line_endings='binary')
72
 
        self.capture('init branch1')
73
 
        self.capture('add branch1/file')
74
 
        self.run_bzr_captured(['commit', '-m', 'add file', 'branch1'])
75
 
        self.capture('branch branch1 branch2')
76
 
        print >> open('branch2/file', 'wb'), 'new content'
77
 
        self.run_bzr_captured(['commit', '-m', 'update file', 'branch2'])
 
172
        branch1_tree = self.make_branch_and_tree('branch1')
 
173
        self.build_tree(['branch1/file'], line_endings='binary')
 
174
        self.build_tree(['branch1/file2'], line_endings='binary')
 
175
        branch1_tree.add('file')
 
176
        branch1_tree.add('file2')
 
177
        branch1_tree.commit(message='add file and file2')
 
178
        branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
 
179
        self.build_tree_contents([('branch2/file', 'new content\n')])
 
180
        branch2_tree.commit(message='update file')
 
181
        return branch1_tree, branch2_tree
 
182
 
 
183
    def check_b2_vs_b1(self, cmd):
 
184
        # Compare branch2 vs branch1 using cmd and check the result
 
185
        out, err = self.run_bzr(cmd, retcode=1)
 
186
        self.assertEquals('', err)
 
187
        self.assertEquals("=== modified file 'file'\n"
 
188
                          "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
189
                          "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
190
                          "@@ -1,1 +1,1 @@\n"
 
191
                          "-new content\n"
 
192
                          "+contents of branch1/file\n"
 
193
                          "\n", subst_dates(out))
 
194
 
 
195
    def check_b1_vs_b2(self, cmd):
 
196
        # Compare branch1 vs branch2 using cmd and check the result
 
197
        out, err = self.run_bzr(cmd, retcode=1)
 
198
        self.assertEquals('', err)
 
199
        self.assertEqualDiff("=== modified file 'file'\n"
 
200
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
201
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
202
                              "@@ -1,1 +1,1 @@\n"
 
203
                              "-contents of branch1/file\n"
 
204
                              "+new content\n"
 
205
                              "\n", subst_dates(out))
 
206
 
 
207
    def check_no_diffs(self, cmd):
 
208
        # Check that running cmd returns an empty diff
 
209
        out, err = self.run_bzr(cmd, retcode=0)
 
210
        self.assertEquals('', err)
 
211
        self.assertEquals('', out)
78
212
 
79
213
    def test_diff_branches(self):
80
214
        self.example_branches()
81
 
        # should open branch1 and diff against branch2, 
82
 
        output = self.run_bzr_captured(['diff', '-r', 'branch:branch2', 
83
 
                                        'branch1'],
84
 
                                       retcode=1)
85
 
        self.assertEquals(("=== modified file 'a/file'\n"
86
 
                           "--- a/file\t\n"
87
 
                           "+++ b/file\t\n"
88
 
                           "@@ -1,1 +1,1 @@\n"
89
 
                           "-new content\n"
90
 
                           "+contents of branch1/file\n"
91
 
                           "\n", ''), output)
92
 
        output = self.run_bzr_captured(['diff', 'branch2', 'branch1'],
93
 
                                       retcode=1)
94
 
        self.assertEqualDiff(("=== modified file 'a/file'\n"
95
 
                              "--- a/file\t\n"
96
 
                              "+++ b/file\t\n"
 
215
        # should open branch1 and diff against branch2,
 
216
        self.check_b2_vs_b1('diff -r branch:branch2 branch1')
 
217
        # Compare two working trees using various syntax forms
 
218
        self.check_b2_vs_b1('diff --old branch2 --new branch1')
 
219
        self.check_b2_vs_b1('diff --old branch2 branch1')
 
220
        self.check_b2_vs_b1('diff branch2 --new branch1')
 
221
        # Test with a selected file that was changed
 
222
        self.check_b2_vs_b1('diff --old branch2 --new branch1 file')
 
223
        self.check_b2_vs_b1('diff --old branch2 branch1/file')
 
224
        self.check_b2_vs_b1('diff branch2/file --new branch1')
 
225
        # Test with a selected file that was not changed
 
226
        self.check_no_diffs('diff --old branch2 --new branch1 file2')
 
227
        self.check_no_diffs('diff --old branch2 branch1/file2')
 
228
        self.check_no_diffs('diff branch2/file2 --new branch1')
 
229
 
 
230
    def test_diff_branches_no_working_trees(self):
 
231
        branch1_tree, branch2_tree = self.example_branches()
 
232
        # Compare a working tree to a branch without a WT
 
233
        dir1 = branch1_tree.bzrdir
 
234
        dir1.destroy_workingtree()
 
235
        self.assertFalse(dir1.has_workingtree())
 
236
        self.check_b2_vs_b1('diff --old branch2 --new branch1')
 
237
        self.check_b2_vs_b1('diff --old branch2 branch1')
 
238
        self.check_b2_vs_b1('diff branch2 --new branch1')
 
239
        # Compare a branch without a WT to one with a WT
 
240
        self.check_b1_vs_b2('diff --old branch1 --new branch2')
 
241
        self.check_b1_vs_b2('diff --old branch1 branch2')
 
242
        self.check_b1_vs_b2('diff branch1 --new branch2')
 
243
        # Compare a branch with a WT against another without a WT
 
244
        dir2 = branch2_tree.bzrdir
 
245
        dir2.destroy_workingtree()
 
246
        self.assertFalse(dir2.has_workingtree())
 
247
        self.check_b1_vs_b2('diff --old branch1 --new branch2')
 
248
        self.check_b1_vs_b2('diff --old branch1 branch2')
 
249
        self.check_b1_vs_b2('diff branch1 --new branch2')
 
250
 
 
251
    def test_diff_revno_branches(self):
 
252
        self.example_branches()
 
253
        branch2_tree = workingtree.WorkingTree.open_containing('branch2')[0]
 
254
        self.build_tree_contents([('branch2/file', 'even newer content')])
 
255
        branch2_tree.commit(message='update file once more')
 
256
 
 
257
        out, err = self.run_bzr('diff -r revno:1:branch2..revno:1:branch1',
 
258
                                )
 
259
        self.assertEquals('', err)
 
260
        self.assertEquals('', out)
 
261
        out, err = self.run_bzr('diff -r revno:2:branch2..revno:1:branch1',
 
262
                                retcode=1)
 
263
        self.assertEquals('', err)
 
264
        self.assertEqualDiff("=== modified file 'file'\n"
 
265
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
266
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
97
267
                              "@@ -1,1 +1,1 @@\n"
98
268
                              "-new content\n"
99
269
                              "+contents of branch1/file\n"
100
 
                              "\n", ''), output)
 
270
                              "\n", subst_dates(out))
101
271
 
102
272
    def example_branch2(self):
103
 
        self.build_tree(['branch1/', 'branch1/file1'], line_endings='binary')
104
 
        self.capture('init branch1')
105
 
        self.capture('add branch1/file1')
106
 
        print >> open('branch1/file1', 'wb'), 'original line'
107
 
        self.run_bzr_captured(['commit', '-m', 'first commit', 'branch1'])
108
 
        
109
 
        print >> open('branch1/file1', 'wb'), 'repo line'
110
 
        self.run_bzr_captured(['commit', '-m', 'second commit', 'branch1'])
 
273
        branch1_tree = self.make_branch_and_tree('branch1')
 
274
        self.build_tree_contents([('branch1/file1', 'original line\n')])
 
275
        branch1_tree.add('file1')
 
276
        branch1_tree.commit(message='first commit')
 
277
        self.build_tree_contents([('branch1/file1', 'repo line\n')])
 
278
        branch1_tree.commit(message='second commit')
 
279
        return branch1_tree
111
280
 
112
281
    def test_diff_to_working_tree(self):
113
282
        self.example_branch2()
114
 
        
115
 
        print >> open('branch1/file1', 'wb'), 'new line'
116
 
        output = self.run_bzr_captured(['diff', '-r', '1..', 'branch1'], retcode=1)
117
 
        self.assertTrue('\n-original line\n+new line\n' in output[0])
 
283
        self.build_tree_contents([('branch1/file1', 'new line')])
 
284
        output = self.run_bzr('diff -r 1.. branch1', retcode=1)
 
285
        self.assertContainsRe(output[0], '\n\\-original line\n\\+new line\n')
 
286
 
 
287
    def test_diff_to_working_tree_in_subdir(self):
 
288
        self.example_branch2()
 
289
        self.build_tree_contents([('branch1/file1', 'new line')])
 
290
        os.mkdir('branch1/dir1')
 
291
        os.chdir('branch1/dir1')
 
292
        output = self.run_bzr('diff -r 1..', retcode=1)
 
293
        self.assertContainsRe(output[0], '\n\\-original line\n\\+new line\n')
 
294
 
 
295
    def test_diff_across_rename(self):
 
296
        """The working tree path should always be considered for diffing"""
 
297
        tree = self.make_example_branch()
 
298
        self.run_bzr('diff -r 0..1 hello', retcode=1)
 
299
        tree.rename_one('hello', 'hello1')
 
300
        self.run_bzr('diff hello1', retcode=1)
 
301
        self.run_bzr('diff -r 0..1 hello1', retcode=1)
 
302
 
 
303
    def test_diff_to_branch_no_working_tree(self):
 
304
        branch1_tree = self.example_branch2()
 
305
        dir1 = branch1_tree.bzrdir
 
306
        dir1.destroy_workingtree()
 
307
        self.assertFalse(dir1.has_workingtree())
 
308
        output = self.run_bzr('diff -r 1.. branch1', retcode=1)
 
309
        self.assertContainsRe(output[0], '\n\\-original line\n\\+repo line\n')
 
310
 
 
311
    def test_custom_format(self):
 
312
        class BooDiffTree(DiffTree):
 
313
 
 
314
            def show_diff(self, specific_files, extra_trees=None):
 
315
                self.to_file.write("BOO!\n")
 
316
                return super(BooDiffTree, self).show_diff(specific_files,
 
317
                    extra_trees)
 
318
 
 
319
        diff_format_registry.register("boo", BooDiffTree, 
 
320
            "Scary diff format")
 
321
        self.addCleanup(diff_format_registry.remove, "boo")
 
322
        self.make_example_branch()
 
323
        self.build_tree_contents([('hello', 'hello world!\n')])
 
324
        output = self.run_bzr('diff --format=boo', retcode=1)
 
325
        self.assertTrue("BOO!" in output[0])
 
326
        output = self.run_bzr('diff -Fboo', retcode=1)
 
327
        self.assertTrue("BOO!" in output[0])
118
328
 
119
329
 
120
330
class TestCheckoutDiff(TestDiff):
121
331
 
122
332
    def make_example_branch(self):
123
 
        super(TestCheckoutDiff, self).make_example_branch()
124
 
        self.runbzr('checkout . checkout')
 
333
        tree = super(TestCheckoutDiff, self).make_example_branch()
 
334
        tree = tree.branch.create_checkout('checkout')
125
335
        os.chdir('checkout')
 
336
        return tree
126
337
 
127
338
    def example_branch2(self):
128
 
        super(TestCheckoutDiff, self).example_branch2()
 
339
        tree = super(TestCheckoutDiff, self).example_branch2()
129
340
        os.mkdir('checkouts')
130
 
        self.runbzr('checkout branch1 checkouts/branch1')
 
341
        tree = tree.branch.create_checkout('checkouts/branch1')
131
342
        os.chdir('checkouts')
 
343
        return tree
132
344
 
133
345
    def example_branches(self):
134
 
        super(TestCheckoutDiff, self).example_branches()
 
346
        branch1_tree, branch2_tree = super(TestCheckoutDiff, self).example_branches()
135
347
        os.mkdir('checkouts')
136
 
        self.runbzr('checkout branch1 checkouts/branch1')
137
 
        self.runbzr('checkout branch2 checkouts/branch2')
 
348
        branch1_tree = branch1_tree.branch.create_checkout('checkouts/branch1')
 
349
        branch2_tree = branch2_tree.branch.create_checkout('checkouts/branch2')
138
350
        os.chdir('checkouts')
139
 
 
140
 
 
141
 
class TestDiffLabels(TestDiff):
 
351
        return branch1_tree, branch2_tree
 
352
 
 
353
 
 
354
class TestDiffLabels(DiffBase):
142
355
 
143
356
    def test_diff_label_removed(self):
144
 
        super(TestDiffLabels, self).make_example_branch()
145
 
        self.runbzr('remove hello')
146
 
        diff = self.run_bzr_captured(['diff'], retcode=1)
147
 
        self.assertTrue("=== removed file 'a/hello'" in diff[0])
 
357
        tree = super(TestDiffLabels, self).make_example_branch()
 
358
        tree.remove('hello', keep_files=False)
 
359
        diff = self.run_bzr('diff', retcode=1)
 
360
        self.assertTrue("=== removed file 'hello'" in diff[0])
148
361
 
149
362
    def test_diff_label_added(self):
150
 
        super(TestDiffLabels, self).make_example_branch()
151
 
        file('barbar', 'wt').write('barbar')
152
 
        self.runbzr('add barbar')
153
 
        diff = self.run_bzr_captured(['diff'], retcode=1)
154
 
        self.assertTrue("=== added file 'b/barbar'" in diff[0])
 
363
        tree = super(TestDiffLabels, self).make_example_branch()
 
364
        self.build_tree_contents([('barbar', 'barbar')])
 
365
        tree.add('barbar')
 
366
        diff = self.run_bzr('diff', retcode=1)
 
367
        self.assertTrue("=== added file 'barbar'" in diff[0])
155
368
 
156
369
    def test_diff_label_modified(self):
157
370
        super(TestDiffLabels, self).make_example_branch()
158
 
        file('hello', 'wt').write('barbar')
159
 
        diff = self.run_bzr_captured(['diff'], retcode=1)
160
 
        self.assertTrue("=== modified file 'a/hello'" in diff[0])
 
371
        self.build_tree_contents([('hello', 'barbar')])
 
372
        diff = self.run_bzr('diff', retcode=1)
 
373
        self.assertTrue("=== modified file 'hello'" in diff[0])
161
374
 
162
375
    def test_diff_label_renamed(self):
163
 
        super(TestDiffLabels, self).make_example_branch()
164
 
        self.runbzr('rename hello gruezi')
165
 
        diff = self.run_bzr_captured(['diff'], retcode=1)
166
 
        self.assertTrue("=== renamed file 'a/hello' => 'b/gruezi'" in diff[0])
 
376
        tree = super(TestDiffLabels, self).make_example_branch()
 
377
        tree.rename_one('hello', 'gruezi')
 
378
        diff = self.run_bzr('diff', retcode=1)
 
379
        self.assertTrue("=== renamed file 'hello' => 'gruezi'" in diff[0])
 
380
 
 
381
 
 
382
class TestExternalDiff(DiffBase):
 
383
 
 
384
    def test_external_diff(self):
 
385
        """Test that we can spawn an external diff process"""
 
386
        self.disable_missing_extensions_warning()
 
387
        # We have to use run_bzr_subprocess, because we need to
 
388
        # test writing directly to stdout, (there was a bug in
 
389
        # subprocess.py that we had to workaround).
 
390
        # However, if 'diff' may not be available
 
391
        self.make_example_branch()
 
392
        self.overrideEnv('BZR_PROGRESS_BAR', 'none')
 
393
        out, err = self.run_bzr_subprocess('diff -r 1 --diff-options -ub',
 
394
                                           universal_newlines=True,
 
395
                                           retcode=None)
 
396
        if 'Diff is not installed on this machine' in err:
 
397
            raise tests.TestSkipped("No external 'diff' is available")
 
398
        self.assertEqual('', err)
 
399
        # We have to skip the stuff in the middle, because it depends
 
400
        # on time.time()
 
401
        self.assertStartsWith(out, "=== added file 'goodbye'\n"
 
402
                                   "--- goodbye\t1970-01-01 00:00:00 +0000\n"
 
403
                                   "+++ goodbye\t")
 
404
        self.assertEndsWith(out, "\n@@ -0,0 +1 @@\n"
 
405
                                 "+baz\n\n")
 
406
 
 
407
    def test_external_diff_options_and_using(self):
 
408
        """Test that the options are passed correctly to an external diff process"""
 
409
        self.requireFeature(features.diff_feature)
 
410
        self.make_example_branch()
 
411
        self.build_tree_contents([('hello', 'Foo\n')])
 
412
        out, err = self.run_bzr('diff --diff-options -i --using diff',
 
413
                                    retcode=1)
 
414
        self.assertEquals("=== modified file 'hello'\n", out)
 
415
        self.assertEquals('', err)
 
416
 
 
417
 
 
418
class TestDiffOutput(DiffBase):
 
419
 
 
420
    def test_diff_output(self):
 
421
        # check that output doesn't mangle line-endings
 
422
        self.make_example_branch()
 
423
        self.build_tree_contents([('hello', 'hello world!\n')])
 
424
        output = self.run_bzr_subprocess('diff', retcode=1)[0]
 
425
        self.assert_('\n+hello world!\n' in output)