~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

(vila) Forbid more operations on ReadonlyTransportDecorator (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2006-2012 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
 
18
 
"""Black-box tests for bzr diff.
19
 
"""
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
 
 
18
"""Black-box tests for bzr diff."""
20
19
 
21
20
import os
22
21
import re
23
22
 
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
 
23
from bzrlib import (
 
24
    tests,
 
25
    workingtree,
 
26
    )
 
27
from bzrlib.diff import (
 
28
    DiffTree,
 
29
    format_registry as diff_format_registry,
 
30
    )
 
31
from bzrlib.tests import (
 
32
    features,
 
33
    )
29
34
 
30
35
 
31
36
def subst_dates(string):
34
39
                  'YYYY-MM-DD HH:MM:SS +ZZZZ', string)
35
40
 
36
41
 
37
 
class DiffBase(ExternalBase):
 
42
class DiffBase(tests.TestCaseWithTransport):
38
43
    """Base class with common setup method"""
39
44
 
40
45
    def make_example_branch(self):
126
131
        # Get an error from a file that does not exist at all
127
132
        # (Malone #3619)
128
133
        self.make_example_branch()
129
 
        out, err = self.run_bzr('diff does-not-exist', retcode=3)
130
 
        self.assertContainsRe(err, 'not versioned.*does-not-exist')
 
134
        out, err = self.run_bzr('diff does-not-exist', retcode=3,
 
135
            error_regexes=('not versioned.*does-not-exist',))
131
136
 
132
137
    def test_diff_illegal_revision_specifiers(self):
133
 
        out, err = self.run_bzr('diff -r 1..23..123', retcode=3)
134
 
        self.assertContainsRe(err, 'one or two revision specifiers')
 
138
        out, err = self.run_bzr('diff -r 1..23..123', retcode=3,
 
139
            error_regexes=('one or two revision specifiers',))
 
140
 
 
141
    def test_diff_using_and_format(self):
 
142
        out, err = self.run_bzr('diff --format=default --using=mydi', retcode=3,
 
143
            error_regexes=('are mutually exclusive',))
 
144
 
 
145
    def test_diff_nonexistent_revision(self):
 
146
        out, err = self.run_bzr('diff -r 123', retcode=3,
 
147
            error_regexes=("Requested revision: '123' does not "
 
148
                "exist in branch:",))
 
149
 
 
150
    def test_diff_nonexistent_dotted_revision(self):
 
151
        out, err = self.run_bzr('diff -r 1.1', retcode=3)
 
152
        self.assertContainsRe(err,
 
153
            "Requested revision: '1.1' does not exist in branch:")
 
154
 
 
155
    def test_diff_nonexistent_dotted_revision_change(self):
 
156
        out, err = self.run_bzr('diff -c 1.1', retcode=3)
 
157
        self.assertContainsRe(err,
 
158
            "Requested revision: '1.1' does not exist in branch:")
135
159
 
136
160
    def test_diff_unversioned(self):
137
161
        # Get an error when diffing a non-versioned file.
187
211
 
188
212
    def test_diff_branches(self):
189
213
        self.example_branches()
190
 
        # should open branch1 and diff against branch2, 
 
214
        # should open branch1 and diff against branch2,
191
215
        self.check_b2_vs_b1('diff -r branch:branch2 branch1')
192
216
        # Compare two working trees using various syntax forms
193
217
        self.check_b2_vs_b1('diff --old branch2 --new branch1')
263
287
        self.example_branch2()
264
288
        self.build_tree_contents([('branch1/file1', 'new line')])
265
289
        os.mkdir('branch1/dir1')
266
 
        os.chdir('branch1/dir1')
267
 
        output = self.run_bzr('diff -r 1..', retcode=1)
 
290
        output = self.run_bzr('diff -r 1..', retcode=1,
 
291
                              working_dir='branch1/dir1')
268
292
        self.assertContainsRe(output[0], '\n\\-original line\n\\+new line\n')
269
293
 
270
294
    def test_diff_across_rename(self):
283
307
        output = self.run_bzr('diff -r 1.. branch1', retcode=1)
284
308
        self.assertContainsRe(output[0], '\n\\-original line\n\\+repo line\n')
285
309
 
 
310
    def test_custom_format(self):
 
311
        class BooDiffTree(DiffTree):
 
312
 
 
313
            def show_diff(self, specific_files, extra_trees=None):
 
314
                self.to_file.write("BOO!\n")
 
315
                return super(BooDiffTree, self).show_diff(specific_files,
 
316
                    extra_trees)
 
317
 
 
318
        diff_format_registry.register("boo", BooDiffTree, "Scary diff format")
 
319
        self.addCleanup(diff_format_registry.remove, "boo")
 
320
        self.make_example_branch()
 
321
        self.build_tree_contents([('hello', 'hello world!\n')])
 
322
        output = self.run_bzr('diff --format=boo', retcode=1)
 
323
        self.assertTrue("BOO!" in output[0])
 
324
        output = self.run_bzr('diff -Fboo', retcode=1)
 
325
        self.assertTrue("BOO!" in output[0])
 
326
 
286
327
 
287
328
class TestCheckoutDiff(TestDiff):
288
329
 
300
341
        return tree
301
342
 
302
343
    def example_branches(self):
303
 
        branch1_tree, branch2_tree = super(TestCheckoutDiff, self).example_branches()
 
344
        branch1_tree, branch2_tree = super(TestCheckoutDiff,
 
345
                                           self).example_branches()
304
346
        os.mkdir('checkouts')
305
347
        branch1_tree = branch1_tree.branch.create_checkout('checkouts/branch1')
306
348
        branch2_tree = branch2_tree.branch.create_checkout('checkouts/branch2')
340
382
 
341
383
    def test_external_diff(self):
342
384
        """Test that we can spawn an external diff process"""
 
385
        self.disable_missing_extensions_warning()
343
386
        # We have to use run_bzr_subprocess, because we need to
344
387
        # test writing directly to stdout, (there was a bug in
345
388
        # subprocess.py that we had to workaround).
346
389
        # However, if 'diff' may not be available
347
390
        self.make_example_branch()
348
 
        orig_progress = os.environ.get('BZR_PROGRESS_BAR')
349
 
        try:
350
 
            os.environ['BZR_PROGRESS_BAR'] = 'none'
351
 
            out, err = self.run_bzr_subprocess('diff -r 1 --diff-options -ub',
352
 
                                               universal_newlines=True,
353
 
                                               retcode=None)
354
 
        finally:
355
 
            if orig_progress is None:
356
 
                del os.environ['BZR_PROGRESS_BAR']
357
 
            else:
358
 
                os.environ['BZR_PROGRESS_BAR'] = orig_progress
359
 
            
 
391
        out, err = self.run_bzr_subprocess(
 
392
            'diff -Oprogress_bar=none -r 1 --diff-options -ub',
 
393
            universal_newlines=True,
 
394
            retcode=None)
360
395
        if 'Diff is not installed on this machine' in err:
361
 
            raise TestSkipped("No external 'diff' is available")
 
396
            raise tests.TestSkipped("No external 'diff' is available")
362
397
        self.assertEqual('', err)
363
398
        # We have to skip the stuff in the middle, because it depends
364
399
        # on time.time()
368
403
        self.assertEndsWith(out, "\n@@ -0,0 +1 @@\n"
369
404
                                 "+baz\n\n")
370
405
 
 
406
    def test_external_diff_options_and_using(self):
 
407
        """Test that the options are passed correctly to an external diff process"""
 
408
        self.requireFeature(features.diff_feature)
 
409
        self.make_example_branch()
 
410
        self.build_tree_contents([('hello', 'Foo\n')])
 
411
        out, err = self.run_bzr('diff --diff-options -i --using diff',
 
412
                                    retcode=1)
 
413
        self.assertEquals("=== modified file 'hello'\n", out)
 
414
        self.assertEquals('', err)
 
415
 
371
416
 
372
417
class TestDiffOutput(DiffBase):
373
418