/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: 2007-07-03 07:35:46 UTC
  • mfrom: (2574.1.1 ianc-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20070703073546-9dv8bocak8u3ou6m
(Vincent Ladeuil) Fix #115209 - Unable to handle http code 400: Bad Request When issuing too many ranges

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
2
 
 
 
1
# Copyright (C) 2005, 2006 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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
19
"""
20
20
 
21
21
import os
 
22
import re
22
23
 
23
24
import bzrlib
 
25
from bzrlib import workingtree
24
26
from bzrlib.branch import Branch
 
27
from bzrlib.tests import TestSkipped
25
28
from bzrlib.tests.blackbox import ExternalBase
26
29
 
27
30
 
28
 
class TestDiff(ExternalBase):
29
 
 
30
 
    def make_example_branch(test):
 
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
 
 
37
class DiffBase(ExternalBase):
 
38
    """Base class with common setup method"""
 
39
 
 
40
    def make_example_branch(self):
31
41
        # 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')
 
42
        tree = self.make_branch_and_tree('.')
 
43
        open('hello', 'wb').write('foo\n')
 
44
        tree.add(['hello'])
 
45
        tree.commit('setup')
 
46
        open('goodbye', 'wb').write('baz\n')
 
47
        tree.add(['goodbye'])
 
48
        tree.commit('setup')
 
49
 
 
50
 
 
51
class TestDiff(DiffBase):
39
52
 
40
53
    def test_diff(self):
41
54
        self.make_example_branch()
42
55
        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)
 
56
        self.run_bzr('commit -m fixing hello')
 
57
        output = self.run_bzr('diff -r 2..3', retcode=1)[0]
45
58
        self.assert_('\n+hello world!' in output)
46
 
        output = self.runbzr('diff -r last:3..last:1', backtick=1, retcode=1)
 
59
        output = self.run_bzr('diff -r last:3..last:1',
 
60
                retcode=1)[0]
47
61
        self.assert_('\n+baz' in output)
48
 
        file('moo', 'wb').write('moo')
49
 
        self.runbzr('add moo')
 
62
        self.build_tree(['moo'])
 
63
        self.run_bzr('add moo')
50
64
        os.unlink('moo')
51
 
        self.runbzr('diff')
 
65
        self.run_bzr('diff')
 
66
 
 
67
    def test_diff_prefix(self):
 
68
        """diff --prefix appends to filenames in output"""
 
69
        self.make_example_branch()
 
70
        file('hello', 'wb').write('hello world!\n')
 
71
        out, err = self.run_bzr('diff --prefix old/:new/', retcode=1)
 
72
        self.assertEquals(err, '')
 
73
        self.assertEqualDiff(subst_dates(out), '''\
 
74
=== modified file 'hello'
 
75
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
76
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
77
@@ -1,1 +1,1 @@
 
78
-foo
 
79
+hello world!
 
80
 
 
81
''')
 
82
 
 
83
    def test_diff_illegal_prefix_value(self):
 
84
        # There was an error in error reporting for this option
 
85
        out, err = self.run_bzr('diff --prefix old/', retcode=3)
 
86
        self.assertContainsRe(err,
 
87
            '--prefix expects two values separated by a colon')
 
88
 
 
89
    def test_diff_p1(self):
 
90
        """diff -p1 produces lkml-style diffs"""
 
91
        self.make_example_branch()
 
92
        file('hello', 'wb').write('hello world!\n')
 
93
        out, err = self.run_bzr('diff -p1', retcode=1)
 
94
        self.assertEquals(err, '')
 
95
        self.assertEqualDiff(subst_dates(out), '''\
 
96
=== modified file 'hello'
 
97
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
98
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
99
@@ -1,1 +1,1 @@
 
100
-foo
 
101
+hello world!
 
102
 
 
103
''')
 
104
 
 
105
    def test_diff_p0(self):
 
106
        """diff -p0 produces diffs with no prefix"""
 
107
        self.make_example_branch()
 
108
        file('hello', 'wb').write('hello world!\n')
 
109
        out, err = self.run_bzr('diff -p0', retcode=1)
 
110
        self.assertEquals(err, '')
 
111
        self.assertEqualDiff(subst_dates(out), '''\
 
112
=== modified file 'hello'
 
113
--- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
114
+++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
115
@@ -1,1 +1,1 @@
 
116
-foo
 
117
+hello world!
 
118
 
 
119
''')
52
120
 
53
121
    def test_diff_nonexistent(self):
54
122
        # Get an error from a file that does not exist at all
55
123
        # (Malone #3619)
56
124
        self.make_example_branch()
57
 
        out, err = self.runbzr('diff does-not-exist', retcode=3)
 
125
        out, err = self.run_bzr('diff does-not-exist', retcode=3)
58
126
        self.assertContainsRe(err, 'not versioned.*does-not-exist')
59
127
 
 
128
    def test_diff_illegal_revision_specifiers(self):
 
129
        out, err = self.run_bzr('diff -r 1..23..123', retcode=3)
 
130
        self.assertContainsRe(err, 'one or two revision specifiers')
 
131
 
60
132
    def test_diff_unversioned(self):
61
133
        # Get an error when diffing a non-versioned file.
62
134
        # (Malone #3619)
63
135
        self.make_example_branch()
64
136
        self.build_tree(['unversioned-file'])
65
 
        out, err = self.runbzr('diff unversioned-file', retcode=3)
 
137
        out, err = self.run_bzr('diff unversioned-file', retcode=3)
66
138
        self.assertContainsRe(err, 'not versioned.*unversioned-file')
67
139
 
68
140
    # TODO: What should diff say for a file deleted in working tree?
69
141
 
70
142
    def example_branches(self):
71
143
        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'])
 
144
        self.run_bzr(['init', 'branch1'])[0]
 
145
        self.run_bzr(['add', 'branch1/file'])[0]
 
146
        self.run_bzr(['commit', '-m', 'add file', 'branch1'])
 
147
        self.run_bzr(['branch', 'branch1', 'branch2'])[0]
 
148
        self.build_tree_contents([('branch2/file', 'new content\n')])
 
149
        self.run_bzr(['commit', '-m', 'update file', 'branch2'])
78
150
 
79
151
    def test_diff_branches(self):
80
152
        self.example_branches()
81
153
        # 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"
97
 
                              "@@ -1,1 +1,1 @@\n"
98
 
                              "-new content\n"
99
 
                              "+contents of branch1/file\n"
100
 
                              "\n", ''), output)
 
154
        out, err = self.run_bzr(['diff', '-r', 'branch:branch2', 
 
155
                                          'branch1'],
 
156
                                         retcode=1)
 
157
        self.assertEquals('', err)
 
158
        self.assertEquals("=== modified file 'file'\n"
 
159
                          "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
160
                          "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
161
                          "@@ -1,1 +1,1 @@\n"
 
162
                          "-new content\n"
 
163
                          "+contents of branch1/file\n"
 
164
                          "\n", subst_dates(out))
 
165
        out, err = self.run_bzr(['diff', 'branch2', 'branch1'],
 
166
                                         retcode=1)
 
167
        self.assertEquals('', err)
 
168
        self.assertEqualDiff("=== modified file 'file'\n"
 
169
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
170
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
171
                              "@@ -1,1 +1,1 @@\n"
 
172
                              "-new content\n"
 
173
                              "+contents of branch1/file\n"
 
174
                              "\n", subst_dates(out))
 
175
 
 
176
    def test_diff_revno_branches(self):
 
177
        self.example_branches()
 
178
        print >> open('branch2/file', 'wb'), 'even newer content'
 
179
        self.run_bzr(['commit', '-m', 
 
180
                               'update file once more', 'branch2'])
 
181
 
 
182
        out, err = self.run_bzr(['diff', '-r',
 
183
                                          'revno:1:branch2..revno:1:branch1'],
 
184
                                         retcode=0)
 
185
        self.assertEquals('', err)
 
186
        self.assertEquals('', out)
 
187
        out, err = self.run_bzr(['diff', '-r', 
 
188
                                          'revno:2:branch2..revno:1:branch1'],
 
189
                                         retcode=1)
 
190
        self.assertEquals('', err)
 
191
        self.assertEqualDiff("=== modified file 'file'\n"
 
192
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
193
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
 
194
                              "@@ -1,1 +1,1 @@\n"
 
195
                              "-new content\n"
 
196
                              "+contents of branch1/file\n"
 
197
                              "\n", subst_dates(out))
101
198
 
102
199
    def example_branch2(self):
103
200
        self.build_tree(['branch1/', 'branch1/file1'], line_endings='binary')
104
 
        self.capture('init branch1')
105
 
        self.capture('add branch1/file1')
 
201
        self.run_bzr(['init', 'branch1'])[0]
 
202
        self.run_bzr(['add', 'branch1/file1'])[0]
106
203
        print >> open('branch1/file1', 'wb'), 'original line'
107
 
        self.run_bzr_captured(['commit', '-m', 'first commit', 'branch1'])
 
204
        self.run_bzr(['commit', '-m', 'first commit', 'branch1'])
108
205
        
109
206
        print >> open('branch1/file1', 'wb'), 'repo line'
110
 
        self.run_bzr_captured(['commit', '-m', 'second commit', 'branch1'])
 
207
        self.run_bzr(['commit', '-m', 'second commit', 'branch1'])
111
208
 
112
209
    def test_diff_to_working_tree(self):
113
210
        self.example_branch2()
114
211
        
115
212
        print >> open('branch1/file1', 'wb'), 'new line'
116
 
        output = self.run_bzr_captured(['diff', '-r', '1..', 'branch1'], retcode=1)
 
213
        output = self.run_bzr(['diff', '-r', '1..', 'branch1'],
 
214
                                       retcode=1)
117
215
        self.assertTrue('\n-original line\n+new line\n' in output[0])
118
216
 
 
217
    def test_diff_across_rename(self):
 
218
        """The working tree path should always be considered for diffing"""
 
219
        self.make_example_branch()
 
220
        self.run_bzr('diff', '-r', '0..1', 'hello', retcode=1)
 
221
        wt = workingtree.WorkingTree.open_containing('.')[0]
 
222
        wt.rename_one('hello', 'hello1')
 
223
        self.run_bzr('diff', 'hello1', retcode=1)
 
224
        self.run_bzr('diff', '-r', '0..1', 'hello1', retcode=1)
 
225
 
119
226
 
120
227
class TestCheckoutDiff(TestDiff):
121
228
 
122
229
    def make_example_branch(self):
123
230
        super(TestCheckoutDiff, self).make_example_branch()
124
 
        self.runbzr('checkout . checkout')
 
231
        self.run_bzr('checkout . checkout')
125
232
        os.chdir('checkout')
126
233
 
127
234
    def example_branch2(self):
128
235
        super(TestCheckoutDiff, self).example_branch2()
129
236
        os.mkdir('checkouts')
130
 
        self.runbzr('checkout branch1 checkouts/branch1')
 
237
        self.run_bzr('checkout branch1 checkouts/branch1')
131
238
        os.chdir('checkouts')
132
239
 
133
240
    def example_branches(self):
134
241
        super(TestCheckoutDiff, self).example_branches()
135
242
        os.mkdir('checkouts')
136
 
        self.runbzr('checkout branch1 checkouts/branch1')
137
 
        self.runbzr('checkout branch2 checkouts/branch2')
 
243
        self.run_bzr('checkout branch1 checkouts/branch1')
 
244
        self.run_bzr('checkout branch2 checkouts/branch2')
138
245
        os.chdir('checkouts')
139
246
 
140
247
 
141
 
class TestDiffLabels(TestDiff):
 
248
class TestDiffLabels(DiffBase):
142
249
 
143
250
    def test_diff_label_removed(self):
144
251
        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])
 
252
        self.run_bzr('remove hello')
 
253
        diff = self.run_bzr(['diff'], retcode=1)
 
254
        self.assertTrue("=== removed file 'hello'" in diff[0])
148
255
 
149
256
    def test_diff_label_added(self):
150
257
        super(TestDiffLabels, self).make_example_branch()
151
258
        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])
 
259
        self.run_bzr('add barbar')
 
260
        diff = self.run_bzr(['diff'], retcode=1)
 
261
        self.assertTrue("=== added file 'barbar'" in diff[0])
155
262
 
156
263
    def test_diff_label_modified(self):
157
264
        super(TestDiffLabels, self).make_example_branch()
158
265
        file('hello', 'wt').write('barbar')
159
 
        diff = self.run_bzr_captured(['diff'], retcode=1)
160
 
        self.assertTrue("=== modified file 'a/hello'" in diff[0])
 
266
        diff = self.run_bzr(['diff'], retcode=1)
 
267
        self.assertTrue("=== modified file 'hello'" in diff[0])
161
268
 
162
269
    def test_diff_label_renamed(self):
163
270
        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])
 
271
        self.run_bzr('rename hello gruezi')
 
272
        diff = self.run_bzr(['diff'], retcode=1)
 
273
        self.assertTrue("=== renamed file 'hello' => 'gruezi'" in diff[0])
 
274
 
 
275
 
 
276
class TestExternalDiff(DiffBase):
 
277
 
 
278
    def test_external_diff(self):
 
279
        """Test that we can spawn an external diff process"""
 
280
        # We have to use run_bzr_subprocess, because we need to
 
281
        # test writing directly to stdout, (there was a bug in
 
282
        # subprocess.py that we had to workaround).
 
283
        # However, if 'diff' may not be available
 
284
        self.make_example_branch()
 
285
        orig_progress = os.environ.get('BZR_PROGRESS_BAR')
 
286
        try:
 
287
            os.environ['BZR_PROGRESS_BAR'] = 'none'
 
288
            out, err = self.run_bzr_subprocess('diff', '-r', '1',
 
289
                                               '--diff-options', '-ub',
 
290
                                               universal_newlines=True,
 
291
                                               retcode=None)
 
292
        finally:
 
293
            if orig_progress is None:
 
294
                del os.environ['BZR_PROGRESS_BAR']
 
295
            else:
 
296
                os.environ['BZR_PROGRESS_BAR'] = orig_progress
 
297
            
 
298
        if 'Diff is not installed on this machine' in err:
 
299
            raise TestSkipped("No external 'diff' is available")
 
300
        self.assertEqual('', err)
 
301
        # We have to skip the stuff in the middle, because it depends
 
302
        # on time.time()
 
303
        self.assertStartsWith(out, "=== added file 'goodbye'\n"
 
304
                                   "--- goodbye\t1970-01-01 00:00:00 +0000\n"
 
305
                                   "+++ goodbye\t")
 
306
        self.assertEndsWith(out, "\n@@ -0,0 +1 @@\n"
 
307
                                 "+baz\n\n")
 
308
 
 
309
 
 
310
class TestDiffOutput(DiffBase):
 
311
 
 
312
    def test_diff_output(self):
 
313
        # check that output doesn't mangle line-endings
 
314
        self.make_example_branch()
 
315
        file('hello', 'wb').write('hello world!\n')
 
316
        output = self.run_bzr_subprocess('diff', retcode=1)[0]
 
317
        self.assert_('\n+hello world!\n' in output)