/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005, 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
13
# You should have received a copy of the GNU General Public License
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
"""
20
21
import os
1740.2.5 by Aaron Bentley
Merge from bzr.dev
22
import re
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
23
24
import bzrlib
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
25
from bzrlib import workingtree
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
26
from bzrlib.branch import Branch
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
27
from bzrlib.tests import TestSkipped
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
28
from bzrlib.tests.blackbox import ExternalBase
29
30
1740.2.5 by Aaron Bentley
Merge from bzr.dev
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
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
37
class DiffBase(ExternalBase):
38
    """Base class with common setup method"""
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
39
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
40
    def make_example_branch(self):
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
41
        # FIXME: copied from test_too_much -- share elsewhere?
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
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')
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
49
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
50
51
class TestDiff(DiffBase):
52
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
53
    def test_diff(self):
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
54
        self.make_example_branch()
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
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')
63
        os.unlink('moo')
64
        self.runbzr('diff')
65
1694.2.2 by Martin Pool
Add test for diff --diff-prefix, which was previously untested.
66
    def test_diff_prefix(self):
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
67
        """diff --prefix appends to filenames in output"""
68
        self.make_example_branch()
1711.7.14 by John Arbash Meinel
diff tests check exact texts, should use binary mode for files.
69
        file('hello', 'wb').write('hello world!\n')
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
70
        out, err = self.runbzr('diff --prefix old/:new/', retcode=1)
71
        self.assertEquals(err, '')
1740.2.5 by Aaron Bentley
Merge from bzr.dev
72
        self.assertEqualDiff(subst_dates(out), '''\
1694.2.4 by Martin Pool
When a diff prefix is given, don't show it in === summary lines, only on the diffs themselves.
73
=== modified file 'hello'
1740.2.5 by Aaron Bentley
Merge from bzr.dev
74
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
75
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
76
@@ -1,1 +1,1 @@
77
-foo
78
+hello world!
79
80
''')
81
82
    def test_diff_p1(self):
83
        """diff -p1 produces lkml-style diffs"""
84
        self.make_example_branch()
1711.7.14 by John Arbash Meinel
diff tests check exact texts, should use binary mode for files.
85
        file('hello', 'wb').write('hello world!\n')
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
86
        out, err = self.runbzr('diff -p1', retcode=1)
87
        self.assertEquals(err, '')
1740.2.5 by Aaron Bentley
Merge from bzr.dev
88
        self.assertEqualDiff(subst_dates(out), '''\
1694.2.4 by Martin Pool
When a diff prefix is given, don't show it in === summary lines, only on the diffs themselves.
89
=== modified file 'hello'
1740.2.5 by Aaron Bentley
Merge from bzr.dev
90
--- old/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
91
+++ new/hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
92
@@ -1,1 +1,1 @@
93
-foo
94
+hello world!
95
96
''')
97
98
    def test_diff_p0(self):
99
        """diff -p0 produces diffs with no prefix"""
100
        self.make_example_branch()
1711.7.14 by John Arbash Meinel
diff tests check exact texts, should use binary mode for files.
101
        file('hello', 'wb').write('hello world!\n')
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
102
        out, err = self.runbzr('diff -p0', retcode=1)
103
        self.assertEquals(err, '')
1740.2.5 by Aaron Bentley
Merge from bzr.dev
104
        self.assertEqualDiff(subst_dates(out), '''\
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
105
=== modified file 'hello'
1740.2.5 by Aaron Bentley
Merge from bzr.dev
106
--- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
107
+++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
1694.2.2 by Martin Pool
Add test for diff --diff-prefix, which was previously untested.
108
@@ -1,1 +1,1 @@
109
-foo
110
+hello world!
111
112
''')
113
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
114
    def test_diff_nonexistent(self):
115
        # Get an error from a file that does not exist at all
116
        # (Malone #3619)
117
        self.make_example_branch()
118
        out, err = self.runbzr('diff does-not-exist', retcode=3)
119
        self.assertContainsRe(err, 'not versioned.*does-not-exist')
120
1658.1.10 by Martin Pool
diff on unversiond files should give an error (Malone #3619)
121
    def test_diff_unversioned(self):
122
        # Get an error when diffing a non-versioned file.
123
        # (Malone #3619)
124
        self.make_example_branch()
125
        self.build_tree(['unversioned-file'])
126
        out, err = self.runbzr('diff unversioned-file', retcode=3)
127
        self.assertContainsRe(err, 'not versioned.*unversioned-file')
128
129
    # TODO: What should diff say for a file deleted in working tree?
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
130
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
131
    def example_branches(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
132
        self.build_tree(['branch1/', 'branch1/file'], line_endings='binary')
133
        self.capture('init branch1')
134
        self.capture('add branch1/file')
135
        self.run_bzr_captured(['commit', '-m', 'add file', 'branch1'])
136
        self.capture('branch branch1 branch2')
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
137
        print >> open('branch2/file', 'wb'), 'new content'
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
138
        self.run_bzr_captured(['commit', '-m', 'update file', 'branch2'])
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
139
140
    def test_diff_branches(self):
141
        self.example_branches()
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
142
        # should open branch1 and diff against branch2, 
1740.2.5 by Aaron Bentley
Merge from bzr.dev
143
        out, err = self.run_bzr_captured(['diff', '-r', 'branch:branch2', 
144
                                          'branch1'],
145
                                         retcode=1)
146
        self.assertEquals('', err)
147
        self.assertEquals("=== modified file 'file'\n"
148
                          "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
149
                          "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
150
                          "@@ -1,1 +1,1 @@\n"
151
                          "-new content\n"
152
                          "+contents of branch1/file\n"
153
                          "\n", subst_dates(out))
1881.1.2 by Matthieu Moy
Formatting and style for the last patch.
154
        out, err = self.run_bzr_captured(['diff', 'branch2', 'branch1'],
1740.2.5 by Aaron Bentley
Merge from bzr.dev
155
                                         retcode=1)
156
        self.assertEquals('', err)
157
        self.assertEqualDiff("=== modified file 'file'\n"
158
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
159
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
160
                              "@@ -1,1 +1,1 @@\n"
161
                              "-new content\n"
162
                              "+contents of branch1/file\n"
1740.2.5 by Aaron Bentley
Merge from bzr.dev
163
                              "\n", subst_dates(out))
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
164
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
165
    def test_diff_revno_branches(self):
166
        self.example_branches()
167
        print >> open('branch2/file', 'wb'), 'even newer content'
1881.1.2 by Matthieu Moy
Formatting and style for the last patch.
168
        self.run_bzr_captured(['commit', '-m', 
169
                               'update file once more', 'branch2'])
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
170
1881.1.2 by Matthieu Moy
Formatting and style for the last patch.
171
        out, err = self.run_bzr_captured(['diff', '-r',
172
                                          'revno:1:branch2..revno:1:branch1'],
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
173
                                         retcode=0)
174
        self.assertEquals('', err)
175
        self.assertEquals('', out)
1881.1.2 by Matthieu Moy
Formatting and style for the last patch.
176
        out, err = self.run_bzr_captured(['diff', '-r', 
177
                                          'revno:2:branch2..revno:1:branch1'],
1732.3.3 by Matthieu Moy
Testcases for revno:N:path
178
                                         retcode=1)
179
        self.assertEquals('', err)
180
        self.assertEqualDiff("=== modified file 'file'\n"
181
                              "--- file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
182
                              "+++ file\tYYYY-MM-DD HH:MM:SS +ZZZZ\n"
183
                              "@@ -1,1 +1,1 @@\n"
184
                              "-new content\n"
185
                              "+contents of branch1/file\n"
186
                              "\n", subst_dates(out))
187
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
188
    def example_branch2(self):
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
189
        self.build_tree(['branch1/', 'branch1/file1'], line_endings='binary')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
190
        self.capture('init branch1')
191
        self.capture('add branch1/file1')
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
192
        print >> open('branch1/file1', 'wb'), 'original line'
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
193
        self.run_bzr_captured(['commit', '-m', 'first commit', 'branch1'])
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
194
        
195
        print >> open('branch1/file1', 'wb'), 'repo line'
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
196
        self.run_bzr_captured(['commit', '-m', 'second commit', 'branch1'])
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
197
198
    def test_diff_to_working_tree(self):
199
        self.example_branch2()
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
200
        
201
        print >> open('branch1/file1', 'wb'), 'new line'
1881.1.2 by Matthieu Moy
Formatting and style for the last patch.
202
        output = self.run_bzr_captured(['diff', '-r', '1..', 'branch1'],
203
                                       retcode=1)
1185.50.44 by John Arbash Meinel
[patch] Robey Pointer: diff -r 1.. should diff against working tree.
204
        self.assertTrue('\n-original line\n+new line\n' in output[0])
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
205
1551.7.19 by Aaron Bentley
Always include working tree when calculating file ids for diff
206
    def test_diff_across_rename(self):
207
        """The working tree path should always be considered for diffing"""
208
        self.make_example_branch()
209
        self.run_bzr('diff', '-r', '0..1', 'hello', retcode=1)
210
        wt = workingtree.WorkingTree.open_containing('.')[0]
211
        wt.rename_one('hello', 'hello1')
212
        self.run_bzr('diff', 'hello1', retcode=1)
213
        self.run_bzr('diff', '-r', '0..1', 'hello1', retcode=1)
214
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
215
216
class TestCheckoutDiff(TestDiff):
217
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
218
    def make_example_branch(self):
219
        super(TestCheckoutDiff, self).make_example_branch()
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
220
        self.runbzr('checkout . checkout')
221
        os.chdir('checkout')
222
223
    def example_branch2(self):
224
        super(TestCheckoutDiff, self).example_branch2()
225
        os.mkdir('checkouts')
226
        self.runbzr('checkout branch1 checkouts/branch1')
227
        os.chdir('checkouts')
228
229
    def example_branches(self):
230
        super(TestCheckoutDiff, self).example_branches()
231
        os.mkdir('checkouts')
232
        self.runbzr('checkout branch1 checkouts/branch1')
233
        self.runbzr('checkout branch2 checkouts/branch2')
234
        os.chdir('checkouts')
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
235
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
236
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
237
class TestDiffLabels(DiffBase):
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
238
239
    def test_diff_label_removed(self):
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
240
        super(TestDiffLabels, self).make_example_branch()
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
241
        self.runbzr('remove hello')
242
        diff = self.run_bzr_captured(['diff'], retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
243
        self.assertTrue("=== removed file 'hello'" in diff[0])
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
244
245
    def test_diff_label_added(self):
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
246
        super(TestDiffLabels, self).make_example_branch()
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
247
        file('barbar', 'wt').write('barbar')
248
        self.runbzr('add barbar')
249
        diff = self.run_bzr_captured(['diff'], retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
250
        self.assertTrue("=== added file 'barbar'" in diff[0])
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
251
252
    def test_diff_label_modified(self):
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
253
        super(TestDiffLabels, self).make_example_branch()
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
254
        file('hello', 'wt').write('barbar')
255
        diff = self.run_bzr_captured(['diff'], retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
256
        self.assertTrue("=== modified file 'hello'" in diff[0])
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
257
258
    def test_diff_label_renamed(self):
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
259
        super(TestDiffLabels, self).make_example_branch()
1583.1.1 by Michael Ellerman
Change to -p1 format diffs. Update existing tests to cope, and add some
260
        self.runbzr('rename hello gruezi')
261
        diff = self.run_bzr_captured(['diff'], retcode=1)
1694.2.1 by Martin Pool
Remove 'a/', 'b/' default prefixes on diff output.
262
        self.assertTrue("=== renamed file 'hello' => 'gruezi'" in diff[0])
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
263
264
2172.2.1 by Alexander Belchenko
Remove unnecessary duplication of tests in blackbox/test_diff.py
265
class TestExternalDiff(DiffBase):
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
266
267
    def test_external_diff(self):
268
        """Test that we can spawn an external diff process"""
269
        # We have to use run_bzr_subprocess, because we need to
270
        # test writing directly to stdout, (there was a bug in
271
        # subprocess.py that we had to workaround).
272
        # However, if 'diff' may not be available
273
        self.make_example_branch()
274
        orig_progress = os.environ.get('BZR_PROGRESS_BAR')
275
        try:
276
            os.environ['BZR_PROGRESS_BAR'] = 'none'
2110.1.2 by John Arbash Meinel
Cleanup patch so it only adds universal_newlines
277
            out, err = self.run_bzr_subprocess('diff', '-r', '1',
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
278
                                               '--diff-options', '-ub',
2052.5.1 by Alexander Belchenko
blackbox.test_diff fix: don't load plugins when in test bzr run as subprocess
279
                                               universal_newlines=True,
1899.1.2 by John Arbash Meinel
Add a test that we can use an external diff program.
280
                                               retcode=None)
281
        finally:
282
            if orig_progress is None:
283
                del os.environ['BZR_PROGRESS_BAR']
284
            else:
285
                os.environ['BZR_PROGRESS_BAR'] = orig_progress
286
            
287
        if 'Diff is not installed on this machine' in err:
288
            raise TestSkipped("No external 'diff' is available")
289
        self.assertEqual('', err)
290
        # We have to skip the stuff in the middle, because it depends
291
        # on time.time()
292
        self.assertStartsWith(out, "=== added file 'goodbye'\n"
293
                                   "--- goodbye\t1970-01-01 00:00:00 +0000\n"
294
                                   "+++ goodbye\t")
295
        self.assertEndsWith(out, "\n@@ -0,0 +1 @@\n"
1899.1.6 by John Arbash Meinel
internal_diff always adds a trailing \n, make sure external_diff does too
296
                                 "+baz\n\n")