/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: John Arbash Meinel
  • Date: 2007-03-20 00:49:11 UTC
  • mto: This revision was merged to the branch mainline in revision 2366.
  • Revision ID: john@arbash-meinel.com-20070320004911-0qajqnddr3rf9r2e
Simplify the test even further....
Basically, if you have a file deleted as removed, and then you unversion its directory
it deletes all records in the dirblock, not realizing that some of them might
already be marked as removed.

Show diffs side-by-side

added added

removed removed

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