/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: 2010-08-05 07:02:32 UTC
  • mfrom: (5365.2.2 smaller-inventory-entries)
  • Revision ID: pqm@pqm.ubuntu.com-20100805070232-ezo69a4k078j1xmp
(spiv) Reduce the memory consumption of InventoryEntry instances. (Andrew
 Bennetts)

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