/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4183.6.2 by Martin Pool
Add better message and test for 251352
1
# Copyright (C) 2005, 2006, 2007, 2009 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
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
#
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
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
#
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
16
17
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
18
"""Black-box tests for bzr log."""
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
19
3940.1.2 by Ian Clatworthy
add test
20
import os, re
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
21
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
22
from bzrlib import osutils
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
23
from bzrlib.tests.blackbox import ExternalBase
3936.3.12 by Ian Clatworthy
more single revision & sequence tuning
24
from bzrlib.tests import KnownFailure, TestCaseInTempDir, TestCaseWithTransport
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
25
from bzrlib.tests.test_log import (
26
    normalize_log,
27
    )
3144.7.9 by Guillermo Gonzalez
* bzrlib.log.show_roperties don't hide handler errors
28
from bzrlib.tests import test_log
29
30
3842.2.5 by Vincent Ladeuil
Better fix for bug #300055.
31
class TestCaseWithoutPropsHandler(ExternalBase,
32
                                  test_log.TestCaseWithoutPropsHandler):
3144.7.9 by Guillermo Gonzalez
* bzrlib.log.show_roperties don't hide handler errors
33
    pass
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
34
35
36
class TestLog(ExternalBase):
37
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
38
    def _prepare(self, path='.', format=None):
2809.1.2 by Daniel Watkins
Removed unnecessary check as per abentley's on-list comments.
39
        tree = self.make_branch_and_tree(path, format=format)
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
40
        self.build_tree(
41
            [path + '/hello.txt', path + '/goodbye.txt', path + '/meep.txt'])
42
        tree.add('hello.txt')
43
        tree.commit(message='message1')
44
        tree.add('goodbye.txt')
45
        tree.commit(message='message2')
46
        tree.add('meep.txt')
47
        tree.commit(message='message3')
48
        self.full_log = self.run_bzr(["log", path])[0]
49
        return tree
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
50
51
    def test_log_null_end_revspec(self):
52
        self._prepare()
53
        self.assertTrue('revno: 1\n' in self.full_log)
54
        self.assertTrue('revno: 2\n' in self.full_log)
55
        self.assertTrue('revno: 3\n' in self.full_log)
56
        self.assertTrue('message:\n  message1\n' in self.full_log)
57
        self.assertTrue('message:\n  message2\n' in self.full_log)
58
        self.assertTrue('message:\n  message3\n' in self.full_log)
59
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
60
        log = self.run_bzr("log -r 1..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
61
        self.assertEqualDiff(log, self.full_log)
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
62
63
    def test_log_null_begin_revspec(self):
64
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
65
        log = self.run_bzr("log -r ..3")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
66
        self.assertEqualDiff(self.full_log, log)
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
67
68
    def test_log_null_both_revspecs(self):
69
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
70
        log = self.run_bzr("log -r ..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
71
        self.assertEqualDiff(self.full_log, log)
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
72
2978.4.1 by Kent Gibson
Logging revision 0 returns error.
73
    def test_log_zero_revspec(self):
74
        self._prepare()
75
        self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
76
                           ['log', '-r0'])
77
78
    def test_log_zero_begin_revspec(self):
79
        self._prepare()
80
        self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
81
                           ['log', '-r0..2'])
82
83
    def test_log_zero_end_revspec(self):
84
        self._prepare()
85
        self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
86
                           ['log', '-r-2..0'])
87
3144.1.1 by Lukáš Lalinský
Fixed error reporting of unsupported timezone format.
88
    def test_log_unsupported_timezone(self):
89
        self._prepare()
90
        self.run_bzr_error('bzr: ERROR: Unsupported timezone format "foo", '
91
                           'options are "utc", "original", "local".',
92
                           ['log', '--timezone', 'foo'])
93
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
94
    def test_log_negative_begin_revspec_full_log(self):
95
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
96
        log = self.run_bzr("log -r -3..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
97
        self.assertEqualDiff(self.full_log, log)
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
98
99
    def test_log_negative_both_revspec_full_log(self):
100
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
101
        log = self.run_bzr("log -r -3..-1")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
102
        self.assertEqualDiff(self.full_log, log)
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
103
104
    def test_log_negative_both_revspec_partial(self):
105
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
106
        log = self.run_bzr("log -r -3..-2")[0]
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
107
        self.assertTrue('revno: 1\n' in log)
108
        self.assertTrue('revno: 2\n' in log)
109
        self.assertTrue('revno: 3\n' not in log)
110
111
    def test_log_negative_begin_revspec(self):
112
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
113
        log = self.run_bzr("log -r -2..")[0]
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
114
        self.assertTrue('revno: 1\n' not in log)
115
        self.assertTrue('revno: 2\n' in log)
116
        self.assertTrue('revno: 3\n' in log)
117
2978.4.1 by Kent Gibson
Logging revision 0 returns error.
118
    def test_log_positive_revspecs(self):
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
119
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
120
        log = self.run_bzr("log -r 1..3")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
121
        self.assertEqualDiff(self.full_log, log)
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
122
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
123
    def test_log_reversed_revspecs(self):
124
        self._prepare()
125
        self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
126
                            'the end revision.\n',),
2581.1.6 by Martin Pool
fix up more run_bzr callers
127
                           ['log', '-r3..1'])
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
128
1907.4.2 by Matthieu Moy
Make log work nicely with revno:N:path too.
129
    def test_log_revno_n_path(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
130
        self._prepare(path='branch1')
131
        self._prepare(path='branch2')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
132
        log = self.run_bzr("log -r revno:2:branch1..revno:3:branch2",
1907.4.2 by Matthieu Moy
Make log work nicely with revno:N:path too.
133
                          retcode=3)[0]
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
134
        log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
135
        self.assertEqualDiff(self.full_log, log)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
136
        log = self.run_bzr("log -r revno:1:branch2")[0]
1907.4.2 by Matthieu Moy
Make log work nicely with revno:N:path too.
137
        self.assertTrue('revno: 1\n' in log)
138
        self.assertTrue('revno: 2\n' not in log)
139
        self.assertTrue('branch nick: branch2\n' in log)
140
        self.assertTrue('branch nick: branch1\n' not in log)
3734.1.1 by Vincent Ladeuil
Fix bug #248427 by adding a --change option to log.
141
3878.3.3 by Marius Kruger
Add tests for log -r with non-exising revno's
142
    def test_log_nonexistent_revno(self):
143
        self._prepare()
144
        (out, err) = self.run_bzr_error(args="log -r 1234",
145
            error_regexes=["bzr: ERROR: Requested revision: '1234' "
146
                "does not exist in branch:"])
147
148
    def test_log_nonexistent_dotted_revno(self):
149
        self._prepare()
150
        (out, err) = self.run_bzr_error(args="log -r 123.123",
151
            error_regexes=["bzr: ERROR: Requested revision: '123.123' "
152
                "does not exist in branch:"])
153
3734.1.1 by Vincent Ladeuil
Fix bug #248427 by adding a --change option to log.
154
    def test_log_change_revno(self):
155
        self._prepare()
156
        expected_log = self.run_bzr("log -r 1")[0]
157
        log = self.run_bzr("log -c 1")[0]
158
        self.assertEqualDiff(expected_log, log)
159
3878.3.2 by Marius Kruger
Add tests for log -c with non-exising revno's
160
    def test_log_change_nonexistent_revno(self):
161
        self._prepare()
162
        (out, err) = self.run_bzr_error(args="log -c 1234",
163
            error_regexes=["bzr: ERROR: Requested revision: '1234' "
164
                "does not exist in branch:"])
165
166
    def test_log_change_nonexistent_dotted_revno(self):
167
        self._prepare()
168
        (out, err) = self.run_bzr_error(args="log -c 123.123",
169
            error_regexes=["bzr: ERROR: Requested revision: '123.123' "
170
                "does not exist in branch:"])
171
3734.1.1 by Vincent Ladeuil
Fix bug #248427 by adding a --change option to log.
172
    def test_log_change_single_revno(self):
173
        self._prepare()
174
        self.run_bzr_error('bzr: ERROR: Option --change does not'
175
                           ' accept revision ranges',
176
                           ['log', '--change', '2..3'])
177
178
    def test_log_change_incompatible_with_revision(self):
179
        self._prepare()
180
        self.run_bzr_error('bzr: ERROR: --revision and --change'
181
                           ' are mutually exclusive',
182
                           ['log', '--change', '2', '--revision', '3'])
183
2100.1.1 by wang
Running ``bzr log`` on nonexistent file gives an error instead of the
184
    def test_log_nonexistent_file(self):
185
        # files that don't exist in either the basis tree or working tree
186
        # should give an error
187
        wt = self.make_branch_and_tree('.')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
188
        out, err = self.run_bzr('log does-not-exist', retcode=3)
2100.1.1 by wang
Running ``bzr log`` on nonexistent file gives an error instead of the
189
        self.assertContainsRe(
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
190
            err, 'Path unknown at end or start of revision range: does-not-exist')
2388.1.11 by Alexander Belchenko
changes after John's review
191
2388.1.3 by Erik Bagfors
tests for tags in log output
192
    def test_log_with_tags(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
193
        tree = self._prepare(format='dirstate-tags')
194
        branch = tree.branch
195
        branch.tags.set_tag('tag1', branch.get_rev_id(1))
196
        branch.tags.set_tag('tag1.1', branch.get_rev_id(1))
3842.2.5 by Vincent Ladeuil
Better fix for bug #300055.
197
        branch.tags.set_tag('tag3', branch.last_revision())
198
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
199
        log = self.run_bzr("log -r-1")[0]
2388.1.3 by Erik Bagfors
tests for tags in log output
200
        self.assertTrue('tags: tag3' in log)
201
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
202
        log = self.run_bzr("log -r1")[0]
2388.1.3 by Erik Bagfors
tests for tags in log output
203
        # I guess that we can't know the order of tags in the output
204
        # since dicts are unordered, need to check both possibilities
2388.1.11 by Alexander Belchenko
changes after John's review
205
        self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
206
2388.1.9 by Erik Bagfors
test for merges with tags in log
207
    def test_merged_log_with_tags(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
208
        branch1_tree = self._prepare(path='branch1', format='dirstate-tags')
209
        branch1 = branch1_tree.branch
210
        branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
211
        branch1_tree.commit(message='foobar', allow_pointless=True)
212
        branch1.tags.set_tag('tag1', branch1.last_revision())
213
        os.chdir('branch2')
214
        self.run_bzr('merge ../branch1') # tags don't propagate otherwise
215
        branch2_tree.commit(message='merge branch 1')
4206.1.1 by Ian Clatworthy
log mainline by default
216
        log = self.run_bzr("log -n0 -r-1")[0]
2388.1.11 by Alexander Belchenko
changes after John's review
217
        self.assertContainsRe(log, r'    tags: tag1')
4206.1.1 by Ian Clatworthy
log mainline by default
218
        log = self.run_bzr("log -n0 -r3.1.1")[0]
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
219
        self.assertContainsRe(log, r'tags: tag1')
2388.1.3 by Erik Bagfors
tests for tags in log output
220
2466.9.1 by Kent Gibson
add bzr log --limit
221
    def test_log_limit(self):
3660.1.1 by Robert Collins
Fix log --limit (broken by log filtering patch).
222
        tree = self.make_branch_and_tree('.')
223
        # We want more commits than our batch size starts at
224
        for pos in range(10):
225
            tree.commit("%s" % pos)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
226
        log = self.run_bzr("log --limit 2")[0]
3108.1.3 by Matt Nordhoff
Use assertContainsRe/assertNotContainsRe in tests.
227
        self.assertNotContainsRe(log, r'revno: 1\n')
3660.1.1 by Robert Collins
Fix log --limit (broken by log filtering patch).
228
        self.assertNotContainsRe(log, r'revno: 2\n')
229
        self.assertNotContainsRe(log, r'revno: 3\n')
230
        self.assertNotContainsRe(log, r'revno: 4\n')
231
        self.assertNotContainsRe(log, r'revno: 5\n')
232
        self.assertNotContainsRe(log, r'revno: 6\n')
233
        self.assertNotContainsRe(log, r'revno: 7\n')
234
        self.assertNotContainsRe(log, r'revno: 8\n')
235
        self.assertContainsRe(log, r'revno: 9\n')
236
        self.assertContainsRe(log, r'revno: 10\n')
2466.9.1 by Kent Gibson
add bzr log --limit
237
3108.1.2 by Matt Nordhoff
Simple copied unit test.
238
    def test_log_limit_short(self):
239
        self._prepare()
240
        log = self.run_bzr("log -l 2")[0]
3108.1.3 by Matt Nordhoff
Use assertContainsRe/assertNotContainsRe in tests.
241
        self.assertNotContainsRe(log, r'revno: 1\n')
242
        self.assertContainsRe(log, r'revno: 2\n')
243
        self.assertContainsRe(log, r'revno: 3\n')
3144.7.9 by Guillermo Gonzalez
* bzrlib.log.show_roperties don't hide handler errors
244
4183.6.2 by Martin Pool
Add better message and test for 251352
245
    def test_log_bad_message_re(self):
246
        """Bad --message argument gives a sensible message
247
        
248
        See https://bugs.launchpad.net/bzr/+bug/251352
249
        """
250
        self._prepare()
251
        out, err = self.run_bzr(['log', '-m', '*'], retcode=3)
4183.6.4 by Martin Pool
Separate out re_compile_checked
252
        self.assertEqual("bzr: ERROR: Invalid regular expression"
253
            " in log message filter"
254
            ": '*'"
255
            ": nothing to repeat\n", err)
4183.6.2 by Martin Pool
Add better message and test for 251352
256
        self.assertEqual('', out)
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
257
4202.2.1 by Ian Clatworthy
get directory logging working again
258
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
259
class TestLogVerbose(TestCaseWithTransport):
260
261
    def setUp(self):
262
        super(TestLogVerbose, self).setUp()
263
        tree = self.make_branch_and_tree('.')
264
        self.build_tree(['hello.txt'])
265
        tree.add('hello.txt')
266
        tree.commit(message='message1')
267
268
    def assertUseShortDeltaFormat(self, cmd):
269
        log = self.run_bzr(cmd)[0]
270
        # Check that we use the short status format
3947.1.7 by Ian Clatworthy
tweak indenting/offsetting for --short given dotted revno lengths
271
        self.assertContainsRe(log, '(?m)^\s*A  hello.txt$')
272
        self.assertNotContainsRe(log, '(?m)^\s*added:$')
3874.1.4 by Vincent Ladeuil
Fixed as per Aarons' comment.
273
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
274
    def assertUseLongDeltaFormat(self, cmd):
275
        log = self.run_bzr(cmd)[0]
276
        # Check that we use the long status format
3947.1.7 by Ian Clatworthy
tweak indenting/offsetting for --short given dotted revno lengths
277
        self.assertNotContainsRe(log, '(?m)^\s*A  hello.txt$')
278
        self.assertContainsRe(log, '(?m)^\s*added:$')
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
279
280
    def test_log_short_verbose(self):
281
        self.assertUseShortDeltaFormat(['log', '--short', '-v'])
282
3874.1.4 by Vincent Ladeuil
Fixed as per Aarons' comment.
283
    def test_log_short_verbose_verbose(self):
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
284
        self.assertUseLongDeltaFormat(['log', '--short', '-vv'])
3874.1.4 by Vincent Ladeuil
Fixed as per Aarons' comment.
285
286
    def test_log_long_verbose(self):
3874.1.7 by Vincent Ladeuil
Restrict '-v' change to log --short only.
287
        # Check that we use the long status format, ignoring the verbosity
288
        # level
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
289
        self.assertUseLongDeltaFormat(['log', '--long', '-v'])
3874.1.4 by Vincent Ladeuil
Fixed as per Aarons' comment.
290
291
    def test_log_long_verbose_verbose(self):
3874.1.7 by Vincent Ladeuil
Restrict '-v' change to log --short only.
292
        # Check that we use the long status format, ignoring the verbosity
293
        # level
3874.1.8 by Vincent Ladeuil
Fixed as ber Robert's review.
294
        self.assertUseLongDeltaFormat(['log', '--long', '-vv'])
3874.1.1 by Vincent Ladeuil
Fix #87179 by using the short status format when the short format is used for log.
295
3144.7.9 by Guillermo Gonzalez
* bzrlib.log.show_roperties don't hide handler errors
296
297
class TestLogMerges(TestCaseWithoutPropsHandler):
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
298
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
299
    def _prepare(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
300
        parent_tree = self.make_branch_and_tree('parent')
301
        parent_tree.commit(message='first post', allow_pointless=True)
302
        child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
303
        child_tree.commit(message='branch 1', allow_pointless=True)
304
        smaller_tree = \
305
                child_tree.bzrdir.sprout('smallerchild').open_workingtree()
306
        smaller_tree.commit(message='branch 2', allow_pointless=True)
307
        child_tree.merge_from_branch(smaller_tree.branch)
308
        child_tree.commit(message='merge branch 2')
309
        parent_tree.merge_from_branch(child_tree.branch)
310
        parent_tree.commit(message='merge branch 1')
311
        os.chdir('parent')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
312
3947.1.3 by Ian Clatworthy
blackbox tests
313
    def _prepare_short(self):
314
        parent_tree = self.make_branch_and_tree('parent')
315
        parent_tree.commit(message='first post',
316
            timestamp=1132586700, timezone=36000,
317
            committer='Joe Foo <joe@foo.com>')
318
        child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
319
        child_tree.commit(message='branch 1',
320
            timestamp=1132586800, timezone=36000,
321
            committer='Joe Foo <joe@foo.com>')
322
        smaller_tree = \
323
                child_tree.bzrdir.sprout('smallerchild').open_workingtree()
324
        smaller_tree.commit(message='branch 2',
325
            timestamp=1132586900, timezone=36000,
326
            committer='Joe Foo <joe@foo.com>')
327
        child_tree.merge_from_branch(smaller_tree.branch)
328
        child_tree.commit(message='merge branch 2',
329
            timestamp=1132587000, timezone=36000,
330
            committer='Joe Foo <joe@foo.com>')
331
        parent_tree.merge_from_branch(child_tree.branch)
332
        parent_tree.commit(message='merge branch 1',
333
            timestamp=1132587100, timezone=36000,
334
            committer='Joe Foo <joe@foo.com>')
335
        os.chdir('parent')
336
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
337
    def test_merges_are_indented_by_level(self):
338
        self._prepare()
4206.1.1 by Ian Clatworthy
log mainline by default
339
        out,err = self.run_bzr('log -n0')
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
340
        self.assertEqual('', err)
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
341
        log = normalize_log(out)
342
        self.assertEqualDiff(log, """\
343
------------------------------------------------------------
4208.2.1 by Ian Clatworthy
merge indicators in log --long
344
revno: 2 [merge]
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
345
committer: Lorem Ipsum <test@example.com>
346
branch nick: parent
347
timestamp: Just now
348
message:
349
  merge branch 1
350
    ------------------------------------------------------------
4208.2.1 by Ian Clatworthy
merge indicators in log --long
351
    revno: 1.1.2 [merge]
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
352
    committer: Lorem Ipsum <test@example.com>
353
    branch nick: child
354
    timestamp: Just now
355
    message:
356
      merge branch 2
357
        ------------------------------------------------------------
3170.3.4 by John Arbash Meinel
Update the tests for the new revision numbering.
358
        revno: 1.2.1
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
359
        committer: Lorem Ipsum <test@example.com>
360
        branch nick: smallerchild
361
        timestamp: Just now
362
        message:
363
          branch 2
364
    ------------------------------------------------------------
365
    revno: 1.1.1
366
    committer: Lorem Ipsum <test@example.com>
367
    branch nick: child
368
    timestamp: Just now
369
    message:
370
      branch 1
371
------------------------------------------------------------
372
revno: 1
373
committer: Lorem Ipsum <test@example.com>
374
branch nick: parent
375
timestamp: Just now
376
message:
377
  first post
378
""")
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
379
3947.1.3 by Ian Clatworthy
blackbox tests
380
    def test_force_merge_revisions_off(self):
381
        self._prepare()
3947.1.6 by Ian Clatworthy
log -n/--level-count N option
382
        out,err = self.run_bzr('log --long -n1')
3947.1.3 by Ian Clatworthy
blackbox tests
383
        self.assertEqual('', err)
384
        log = normalize_log(out)
385
        self.assertEqualDiff(log, """\
386
------------------------------------------------------------
4208.2.1 by Ian Clatworthy
merge indicators in log --long
387
revno: 2 [merge]
3947.1.3 by Ian Clatworthy
blackbox tests
388
committer: Lorem Ipsum <test@example.com>
389
branch nick: parent
390
timestamp: Just now
391
message:
392
  merge branch 1
393
------------------------------------------------------------
394
revno: 1
395
committer: Lorem Ipsum <test@example.com>
396
branch nick: parent
397
timestamp: Just now
398
message:
399
  first post
4208.2.1 by Ian Clatworthy
merge indicators in log --long
400
------------------------------------------------------------
4208.2.2 by Ian Clatworthy
show --levels 0 in advice, not just -n0
401
Use --levels 0 (or -n0) to see merged revisions.
3947.1.3 by Ian Clatworthy
blackbox tests
402
""")
403
404
    def test_force_merge_revisions_on(self):
405
        self._prepare_short()
3947.1.6 by Ian Clatworthy
log -n/--level-count N option
406
        out,err = self.run_bzr('log --short -n0')
3947.1.3 by Ian Clatworthy
blackbox tests
407
        self.assertEqual('', err)
408
        log = normalize_log(out)
409
        self.assertEqualDiff(log, """\
410
    2 Joe Foo\t2005-11-22 [merge]
411
      merge branch 1
412
3947.1.10 by Ian Clatworthy
review feedback from vila
413
          1.1.2 Joe Foo\t2005-11-22 [merge]
414
                merge branch 2
415
416
              1.2.1 Joe Foo\t2005-11-22
417
                    branch 2
418
419
          1.1.1 Joe Foo\t2005-11-22
420
                branch 1
3947.1.7 by Ian Clatworthy
tweak indenting/offsetting for --short given dotted revno lengths
421
422
    1 Joe Foo\t2005-11-22
423
      first post
424
425
""")
426
427
    def test_force_merge_revisions_N(self):
428
        self._prepare_short()
429
        out,err = self.run_bzr('log --short -n2')
430
        self.assertEqual('', err)
431
        log = normalize_log(out)
432
        self.assertEqualDiff(log, """\
433
    2 Joe Foo\t2005-11-22 [merge]
434
      merge branch 1
435
3947.1.10 by Ian Clatworthy
review feedback from vila
436
          1.1.2 Joe Foo\t2005-11-22 [merge]
437
                merge branch 2
3947.1.7 by Ian Clatworthy
tweak indenting/offsetting for --short given dotted revno lengths
438
3947.1.10 by Ian Clatworthy
review feedback from vila
439
          1.1.1 Joe Foo\t2005-11-22
440
                branch 1
3947.1.3 by Ian Clatworthy
blackbox tests
441
442
    1 Joe Foo\t2005-11-22
443
      first post
444
445
""")
446
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
447
    def test_merges_single_merge_rev(self):
448
        self._prepare()
4206.1.1 by Ian Clatworthy
log mainline by default
449
        out,err = self.run_bzr('log -n0 -r1.1.2')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
450
        self.assertEqual('', err)
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
451
        log = normalize_log(out)
452
        self.assertEqualDiff(log, """\
453
------------------------------------------------------------
4208.2.1 by Ian Clatworthy
merge indicators in log --long
454
revno: 1.1.2 [merge]
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
455
committer: Lorem Ipsum <test@example.com>
456
branch nick: child
457
timestamp: Just now
458
message:
459
  merge branch 2
460
    ------------------------------------------------------------
3170.3.4 by John Arbash Meinel
Update the tests for the new revision numbering.
461
    revno: 1.2.1
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
462
    committer: Lorem Ipsum <test@example.com>
463
    branch nick: smallerchild
464
    timestamp: Just now
465
    message:
466
      branch 2
467
""")
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
468
469
    def test_merges_partial_range(self):
470
        self._prepare()
4206.1.1 by Ian Clatworthy
log mainline by default
471
        out, err = self.run_bzr('log -n0 -r1.1.1..1.1.2')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
472
        self.assertEqual('', err)
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
473
        log = normalize_log(out)
474
        self.assertEqualDiff(log, """\
475
------------------------------------------------------------
4208.2.1 by Ian Clatworthy
merge indicators in log --long
476
revno: 1.1.2 [merge]
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
477
committer: Lorem Ipsum <test@example.com>
478
branch nick: child
479
timestamp: Just now
480
message:
481
  merge branch 2
482
    ------------------------------------------------------------
3170.3.4 by John Arbash Meinel
Update the tests for the new revision numbering.
483
    revno: 1.2.1
2978.6.1 by Kent Gibson
Use normalize_log to more accurately test blackbox log output.
484
    committer: Lorem Ipsum <test@example.com>
485
    branch nick: smallerchild
486
    timestamp: Just now
487
    message:
488
      branch 2
489
------------------------------------------------------------
490
revno: 1.1.1
491
committer: Lorem Ipsum <test@example.com>
492
branch nick: child
493
timestamp: Just now
494
message:
495
  branch 1
496
""")
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
497
2978.3.1 by Kent Gibson
Return an error if the revisionspec contains merge revisions, but the log formatter doesn't support them.
498
    def test_merges_nonsupporting_formatter(self):
3936.3.12 by Ian Clatworthy
more single revision & sequence tuning
499
        # This "feature" of log formatters is madness. If a log
500
        # formatter cannot display a dotted-revno, it ought to ignore it.
501
        # Otherwise, a linear sequence is always expected to be handled now.
502
        raise KnownFailure('log formatters must support linear sequences now')
2978.3.1 by Kent Gibson
Return an error if the revisionspec contains merge revisions, but the log formatter doesn't support them.
503
        self._prepare()
504
        err_msg = 'Selected log formatter only supports mainline revisions.'
2997.1.1 by Kent Gibson
Support logging single merge revisions with short and line log formatters.
505
        # The single revision case is tested in the core tests
506
        # since all standard formatters support single merge revisions.
3936.3.8 by Ian Clatworthy
back-out --strict
507
        out,err = self.run_bzr('log --short -r1..1.1.2', retcode=3)
2978.3.1 by Kent Gibson
Return an error if the revisionspec contains merge revisions, but the log formatter doesn't support them.
508
        self.assertContainsRe(err, err_msg)
3936.3.8 by Ian Clatworthy
back-out --strict
509
        out,err = self.run_bzr('log --short -r1.1.1..1.1.2', retcode=3)
2978.3.1 by Kent Gibson
Return an error if the revisionspec contains merge revisions, but the log formatter doesn't support them.
510
        self.assertContainsRe(err, err_msg)
511
3842.2.5 by Vincent Ladeuil
Better fix for bug #300055.
512
3943.5.3 by Ian Clatworthy
add tests
513
def subst_dates(string):
514
    """Replace date strings with constant values."""
515
    return re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-\+]\d{4}',
516
                  'YYYY-MM-DD HH:MM:SS +ZZZZ', string)
517
518
519
class TestLogDiff(TestCaseWithoutPropsHandler):
520
521
    def _prepare(self):
522
        parent_tree = self.make_branch_and_tree('parent')
523
        self.build_tree(['parent/file1', 'parent/file2'])
524
        parent_tree.add('file1')
525
        parent_tree.add('file2')
526
        parent_tree.commit(message='first post',
527
            timestamp=1132586655, timezone=36000,
528
            committer='Lorem Ipsum <test@example.com>')
529
        child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
530
        self.build_tree_contents([('child/file2', 'hello\n')])
531
        child_tree.commit(message='branch 1',
532
            timestamp=1132586700, timezone=36000,
533
            committer='Lorem Ipsum <test@example.com>')
534
        parent_tree.merge_from_branch(child_tree.branch)
535
        parent_tree.commit(message='merge branch 1',
536
            timestamp=1132586800, timezone=36000,
537
            committer='Lorem Ipsum <test@example.com>')
538
        os.chdir('parent')
539
4206.1.1 by Ian Clatworthy
log mainline by default
540
    def test_log_show_diff_long_with_merges(self):
3943.5.3 by Ian Clatworthy
add tests
541
        self._prepare()
4206.1.1 by Ian Clatworthy
log mainline by default
542
        out,err = self.run_bzr('log -p -n0')
3943.5.3 by Ian Clatworthy
add tests
543
        self.assertEqual('', err)
544
        log = normalize_log(out)
545
        self.assertEqualDiff(subst_dates(log), """\
546
------------------------------------------------------------
4208.2.1 by Ian Clatworthy
merge indicators in log --long
547
revno: 2 [merge]
3943.5.3 by Ian Clatworthy
add tests
548
committer: Lorem Ipsum <test@example.com>
549
branch nick: parent
550
timestamp: Just now
551
message:
552
  merge branch 1
553
diff:
3943.5.6 by Ian Clatworthy
feedback from jam's review
554
=== modified file 'file2'
555
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
556
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
557
@@ -1,1 +1,1 @@
558
-contents of parent/file2
559
+hello
3943.5.3 by Ian Clatworthy
add tests
560
    ------------------------------------------------------------
561
    revno: 1.1.1
562
    committer: Lorem Ipsum <test@example.com>
563
    branch nick: child
564
    timestamp: Just now
565
    message:
566
      branch 1
567
    diff:
3943.5.6 by Ian Clatworthy
feedback from jam's review
568
    === modified file 'file2'
569
    --- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
570
    +++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
571
    @@ -1,1 +1,1 @@
572
    -contents of parent/file2
573
    +hello
3943.5.3 by Ian Clatworthy
add tests
574
------------------------------------------------------------
575
revno: 1
576
committer: Lorem Ipsum <test@example.com>
577
branch nick: parent
578
timestamp: Just now
579
message:
580
  first post
581
diff:
3943.5.6 by Ian Clatworthy
feedback from jam's review
582
=== added file 'file1'
583
--- file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
584
+++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
585
@@ -0,0 +1,1 @@
586
+contents of parent/file1
587
588
=== added file 'file2'
589
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
590
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
591
@@ -0,0 +1,1 @@
592
+contents of parent/file2
3943.5.3 by Ian Clatworthy
add tests
593
""")
594
595
    def test_log_show_diff_short(self):
596
        self._prepare()
3943.5.5 by Ian Clatworthy
tweak option name as requested in bug report
597
        out,err = self.run_bzr('log -p --short')
3943.5.3 by Ian Clatworthy
add tests
598
        self.assertEqual('', err)
599
        log = normalize_log(out)
600
        self.assertEqualDiff(subst_dates(log), """\
601
    2 Lorem Ipsum\t2005-11-22 [merge]
602
      merge branch 1
603
      === modified file 'file2'
604
      --- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
605
      +++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
606
      @@ -1,1 +1,1 @@
607
      -contents of parent/file2
608
      +hello
609
610
    1 Lorem Ipsum\t2005-11-22
611
      first post
612
      === added file 'file1'
613
      --- file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
614
      +++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
615
      @@ -0,0 +1,1 @@
616
      +contents of parent/file1
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
617
\x20\x20\x20\x20\x20\x20
3943.5.3 by Ian Clatworthy
add tests
618
      === added file 'file2'
619
      --- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
620
      +++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
621
      @@ -0,0 +1,1 @@
622
      +contents of parent/file2
623
624
""")
625
626
    def test_log_show_diff_line(self):
627
        self._prepare()
3943.5.5 by Ian Clatworthy
tweak option name as requested in bug report
628
        out,err = self.run_bzr('log -p --line')
3943.5.3 by Ian Clatworthy
add tests
629
        self.assertEqual('', err)
630
        log = normalize_log(out)
631
        # Not supported by this formatter so expect plain output
632
        self.assertEqualDiff(subst_dates(log), """\
3983.2.1 by Neil Martinsen-Burrell
add merge indication to the line format
633
2: Lorem Ipsum 2005-11-22 [merge] merge branch 1
3943.5.3 by Ian Clatworthy
add tests
634
1: Lorem Ipsum 2005-11-22 first post
635
""")
636
3943.5.4 by Ian Clatworthy
filter diff by file
637
    def test_log_show_diff_file(self):
638
        """Only the diffs for the given file are to be shown"""
639
        self._prepare()
3943.5.5 by Ian Clatworthy
tweak option name as requested in bug report
640
        out,err = self.run_bzr('log -p --short file2')
3943.5.4 by Ian Clatworthy
filter diff by file
641
        self.assertEqual('', err)
642
        log = normalize_log(out)
643
        self.assertEqualDiff(subst_dates(log), """\
644
    2 Lorem Ipsum\t2005-11-22 [merge]
645
      merge branch 1
646
      === modified file 'file2'
647
      --- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
648
      +++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
649
      @@ -1,1 +1,1 @@
650
      -contents of parent/file2
651
      +hello
652
653
    1 Lorem Ipsum\t2005-11-22
654
      first post
655
      === added file 'file2'
656
      --- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
657
      +++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
658
      @@ -0,0 +1,1 @@
659
      +contents of parent/file2
660
661
""")
3943.5.5 by Ian Clatworthy
tweak option name as requested in bug report
662
        out,err = self.run_bzr('log -p --short file1')
3943.5.4 by Ian Clatworthy
filter diff by file
663
        self.assertEqual('', err)
664
        log = normalize_log(out)
665
        self.assertEqualDiff(subst_dates(log), """\
666
    1 Lorem Ipsum\t2005-11-22
667
      first post
668
      === added file 'file1'
669
      --- file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
670
      +++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
671
      @@ -0,0 +1,1 @@
672
      +contents of parent/file1
673
674
""")
675
4110.1.1 by Alexander Belchenko
Fixed problem with `log -p` and non-ascii content of files: show_diff should write the diff to exact [stdout] stream.
676
    def test_log_show_diff_non_ascii(self):
677
        # Smoke test for bug #328007 UnicodeDecodeError on 'log -p'
678
        message = u'Message with \xb5'
679
        body = 'Body with \xb5\n'
680
        wt = self.make_branch_and_tree('.')
681
        self.build_tree_contents([('foo', body)])
682
        wt.add('foo')
683
        wt.commit(message=message)
684
        # check that command won't fail with unicode error
685
        # don't care about exact output because we have other tests for this
686
        out,err = self.run_bzr('log -p --long')
687
        self.assertNotEqual('', out)
688
        self.assertEqual('', err)
689
        out,err = self.run_bzr('log -p --short')
690
        self.assertNotEqual('', out)
691
        self.assertEqual('', err)
692
        out,err = self.run_bzr('log -p --line')
693
        self.assertNotEqual('', out)
694
        self.assertEqual('', err)
695
3943.5.3 by Ian Clatworthy
add tests
696
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
697
class TestLogEncodings(TestCaseInTempDir):
698
699
    _mu = u'\xb5'
700
    _message = u'Message with \xb5'
701
702
    # Encodings which can encode mu
703
    good_encodings = [
704
        'utf-8',
705
        'latin-1',
706
        'iso-8859-1',
707
        'cp437', # Common windows encoding
4110.1.1 by Alexander Belchenko
Fixed problem with `log -p` and non-ascii content of files: show_diff should write the diff to exact [stdout] stream.
708
        'cp1251', # Russian windows encoding
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
709
        'cp1258', # Common windows encoding
710
    ]
711
    # Encodings which cannot encode mu
712
    bad_encodings = [
713
        'ascii',
714
        'iso-8859-2',
715
        'koi8_r',
716
    ]
717
718
    def setUp(self):
719
        TestCaseInTempDir.setUp(self)
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
720
        self.user_encoding = osutils._cached_user_encoding
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
721
722
    def tearDown(self):
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
723
        osutils._cached_user_encoding = self.user_encoding
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
724
        TestCaseInTempDir.tearDown(self)
725
726
    def create_branch(self):
727
        bzr = self.run_bzr
728
        bzr('init')
729
        open('a', 'wb').write('some stuff\n')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
730
        bzr('add a')
731
        bzr(['commit', '-m', self._message])
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
732
733
    def try_encoding(self, encoding, fail=False):
734
        bzr = self.run_bzr
735
        if fail:
736
            self.assertRaises(UnicodeEncodeError,
737
                self._mu.encode, encoding)
738
            encoded_msg = self._message.encode(encoding, 'replace')
739
        else:
740
            encoded_msg = self._message.encode(encoding)
741
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
742
        old_encoding = osutils._cached_user_encoding
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
743
        # This test requires that 'run_bzr' uses the current
744
        # bzrlib, because we override user_encoding, and expect
745
        # it to be used
746
        try:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
747
            osutils._cached_user_encoding = 'ascii'
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
748
            # We should be able to handle any encoding
749
            out, err = bzr('log', encoding=encoding)
750
            if not fail:
751
                # Make sure we wrote mu as we expected it to exist
752
                self.assertNotEqual(-1, out.find(encoded_msg))
753
                out_unicode = out.decode(encoding)
754
                self.assertNotEqual(-1, out_unicode.find(self._message))
755
            else:
756
                self.assertNotEqual(-1, out.find('Message with ?'))
757
        finally:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
758
            osutils._cached_user_encoding = old_encoding
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
759
760
    def test_log_handles_encoding(self):
761
        self.create_branch()
762
763
        for encoding in self.good_encodings:
764
            self.try_encoding(encoding)
765
766
    def test_log_handles_bad_encoding(self):
767
        self.create_branch()
768
769
        for encoding in self.bad_encodings:
770
            self.try_encoding(encoding, fail=True)
771
772
    def test_stdout_encoding(self):
773
        bzr = self.run_bzr
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
774
        osutils._cached_user_encoding = "cp1251"
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
775
776
        bzr('init')
777
        self.build_tree(['a'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
778
        bzr('add a')
779
        bzr(['commit', '-m', u'\u0422\u0435\u0441\u0442'])
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
780
        stdout, stderr = self.run_bzr('log', encoding='cp866')
781
782
        message = stdout.splitlines()[-1]
783
784
        # explanation of the check:
785
        # u'\u0422\u0435\u0441\u0442' is word 'Test' in russian
786
        # in cp866  encoding this is string '\x92\xa5\xe1\xe2'
787
        # in cp1251 encoding this is string '\xd2\xe5\xf1\xf2'
788
        # This test should check that output of log command
789
        # encoded to sys.stdout.encoding
790
        test_in_cp866 = '\x92\xa5\xe1\xe2'
791
        test_in_cp1251 = '\xd2\xe5\xf1\xf2'
792
        # Make sure the log string is encoded in cp866
793
        self.assertEquals(test_in_cp866, message[2:])
794
        # Make sure the cp1251 string is not found anywhere
795
        self.assertEquals(-1, stdout.find(test_in_cp1251))
796
1551.10.18 by Aaron Bentley
Log works in local treeless branches (#84247)
797
798
class TestLogFile(TestCaseWithTransport):
799
800
    def test_log_local_branch_file(self):
801
        """We should be able to log files in local treeless branches"""
802
        tree = self.make_branch_and_tree('tree')
803
        self.build_tree(['tree/file'])
804
        tree.add('file')
805
        tree.commit('revision 1')
806
        tree.bzrdir.destroy_workingtree()
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
807
        self.run_bzr('log tree/file')
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
808
3943.6.1 by Ian Clatworthy
find file using the end revision
809
    def prepare_tree(self, complex=False):
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
810
        # The complex configuration includes deletes and renames
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
811
        tree = self.make_branch_and_tree('parent')
812
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
813
        tree.add('file1')
814
        tree.commit('add file1')
815
        tree.add('file2')
816
        tree.commit('add file2')
817
        tree.add('file3')
818
        tree.commit('add file3')
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
819
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
820
        self.build_tree_contents([('child/file2', 'hello')])
821
        child_tree.commit(message='branch 1')
822
        tree.merge_from_branch(child_tree.branch)
823
        tree.commit(message='merge child branch')
3943.6.1 by Ian Clatworthy
find file using the end revision
824
        if complex:
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
825
            tree.remove('file2')
826
            tree.commit('remove file2')
827
            tree.rename_one('file3', 'file4')
828
            tree.commit('file3 is now called file4')
3943.6.1 by Ian Clatworthy
find file using the end revision
829
            tree.remove('file1')
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
830
            tree.commit('remove file1')
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
831
        os.chdir('parent')
3940.1.2 by Ian Clatworthy
add test
832
833
    def test_log_file(self):
834
        """The log for a particular file should only list revs for that file"""
835
        self.prepare_tree()
4206.1.1 by Ian Clatworthy
log mainline by default
836
        log = self.run_bzr('log -n0 file1')[0]
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
837
        self.assertContainsRe(log, 'revno: 1\n')
838
        self.assertNotContainsRe(log, 'revno: 2\n')
839
        self.assertNotContainsRe(log, 'revno: 3\n')
840
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
841
        self.assertNotContainsRe(log, 'revno: 4 ')
4206.1.1 by Ian Clatworthy
log mainline by default
842
        log = self.run_bzr('log -n0 file2')[0]
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
843
        self.assertNotContainsRe(log, 'revno: 1\n')
844
        self.assertContainsRe(log, 'revno: 2\n')
845
        self.assertNotContainsRe(log, 'revno: 3\n')
846
        self.assertContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
847
        self.assertContainsRe(log, 'revno: 4 ')
4206.1.1 by Ian Clatworthy
log mainline by default
848
        log = self.run_bzr('log -n0 file3')[0]
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
849
        self.assertNotContainsRe(log, 'revno: 1\n')
850
        self.assertNotContainsRe(log, 'revno: 2\n')
851
        self.assertContainsRe(log, 'revno: 3\n')
852
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
853
        self.assertNotContainsRe(log, 'revno: 4 ')
4206.1.1 by Ian Clatworthy
log mainline by default
854
        log = self.run_bzr('log -n0 -r3.1.1 file2')[0]
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
855
        self.assertNotContainsRe(log, 'revno: 1\n')
856
        self.assertNotContainsRe(log, 'revno: 2\n')
857
        self.assertNotContainsRe(log, 'revno: 3\n')
858
        self.assertContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
859
        self.assertNotContainsRe(log, 'revno: 4 ')
4206.1.1 by Ian Clatworthy
log mainline by default
860
        log = self.run_bzr('log -n0 -r4 file2')[0]
861
        self.assertNotContainsRe(log, 'revno: 1\n')
862
        self.assertNotContainsRe(log, 'revno: 2\n')
863
        self.assertNotContainsRe(log, 'revno: 3\n')
864
        self.assertContainsRe(log, 'revno: 3.1.1\n')
4214.1.1 by Ian Clatworthy
log mainline only by default (Ian Clatworthy)
865
        self.assertContainsRe(log, 'revno: 4 ')
4206.1.1 by Ian Clatworthy
log mainline by default
866
        log = self.run_bzr('log -n0 -r3.. file2')[0]
867
        self.assertNotContainsRe(log, 'revno: 1\n')
868
        self.assertNotContainsRe(log, 'revno: 2\n')
869
        self.assertNotContainsRe(log, 'revno: 3\n')
870
        self.assertContainsRe(log, 'revno: 3.1.1\n')
4214.1.1 by Ian Clatworthy
log mainline only by default (Ian Clatworthy)
871
        self.assertContainsRe(log, 'revno: 4 ')
4206.1.1 by Ian Clatworthy
log mainline by default
872
        log = self.run_bzr('log -n0 -r..3 file2')[0]
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
873
        self.assertNotContainsRe(log, 'revno: 1\n')
874
        self.assertContainsRe(log, 'revno: 2\n')
875
        self.assertNotContainsRe(log, 'revno: 3\n')
876
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
877
        self.assertNotContainsRe(log, 'revno: 4 ')
3940.1.2 by Ian Clatworthy
add test
878
3943.6.4 by Ian Clatworthy
review feedback from vila
879
    def test_log_file_historical_missing(self):
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
880
        # Check logging a deleted file gives an error if the
881
        # file isn't found at the end or start of the revision range
3943.6.4 by Ian Clatworthy
review feedback from vila
882
        self.prepare_tree(complex=True)
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
883
        err_msg = "Path unknown at end or start of revision range: file2"
884
        err = self.run_bzr('log file2', retcode=3)[1]
3943.6.1 by Ian Clatworthy
find file using the end revision
885
        self.assertContainsRe(err, err_msg)
886
3943.6.4 by Ian Clatworthy
review feedback from vila
887
    def test_log_file_historical_end(self):
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
888
        # Check logging a deleted file is ok if the file existed
889
        # at the end the revision range
3943.6.4 by Ian Clatworthy
review feedback from vila
890
        self.prepare_tree(complex=True)
4206.1.1 by Ian Clatworthy
log mainline by default
891
        log, err = self.run_bzr('log -n0 -r..4 file2')
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
892
        self.assertEquals('', err)
893
        self.assertNotContainsRe(log, 'revno: 1\n')
894
        self.assertContainsRe(log, 'revno: 2\n')
895
        self.assertNotContainsRe(log, 'revno: 3\n')
896
        self.assertContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
897
        self.assertContainsRe(log, 'revno: 4 ')
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
898
3943.6.4 by Ian Clatworthy
review feedback from vila
899
    def test_log_file_historical_start(self):
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
900
        # Check logging a deleted file is ok if the file existed
901
        # at the start of the revision range
3943.6.4 by Ian Clatworthy
review feedback from vila
902
        self.prepare_tree(complex=True)
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
903
        log, err = self.run_bzr('log file1')
904
        self.assertEquals('', err)
3943.6.1 by Ian Clatworthy
find file using the end revision
905
        self.assertContainsRe(log, 'revno: 1\n')
906
        self.assertNotContainsRe(log, 'revno: 2\n')
907
        self.assertNotContainsRe(log, 'revno: 3\n')
908
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
909
        self.assertNotContainsRe(log, 'revno: 4 ')
3943.6.1 by Ian Clatworthy
find file using the end revision
910
911
    def test_log_file_renamed(self):
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
912
        """File matched against revision range, not current tree."""
3943.6.1 by Ian Clatworthy
find file using the end revision
913
        self.prepare_tree(complex=True)
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
914
3943.6.1 by Ian Clatworthy
find file using the end revision
915
        # Check logging a renamed file gives an error by default
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
916
        err_msg = "Path unknown at end or start of revision range: file3"
3943.6.1 by Ian Clatworthy
find file using the end revision
917
        err = self.run_bzr('log file3', retcode=3)[1]
918
        self.assertContainsRe(err, err_msg)
919
920
        # Check we can see a renamed file if we give the right end revision
3943.6.3 by Ian Clatworthy
search the start tree if the end tree doesn't have a file
921
        log, err = self.run_bzr('log -r..4 file3')
922
        self.assertEquals('', err)
3943.6.1 by Ian Clatworthy
find file using the end revision
923
        self.assertNotContainsRe(log, 'revno: 1\n')
924
        self.assertNotContainsRe(log, 'revno: 2\n')
925
        self.assertContainsRe(log, 'revno: 3\n')
926
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
4208.2.1 by Ian Clatworthy
merge indicators in log --long
927
        self.assertNotContainsRe(log, 'revno: 4 ')
3943.6.1 by Ian Clatworthy
find file using the end revision
928
3940.1.2 by Ian Clatworthy
add test
929
    def test_line_log_file(self):
930
        """The line log for a file should only list relevant mainline revs"""
931
        # Note: this also implicitly  covers the short logging case.
932
        # We test using --line in preference to --short because matching
933
        # revnos in the output of --line is more reliable.
934
        self.prepare_tree()
3940.1.5 by Ian Clatworthy
feedback from vila
935
936
        # full history of file1
3940.1.2 by Ian Clatworthy
add test
937
        log = self.run_bzr('log --line file1')[0]
938
        self.assertContainsRe(log, '^1:', re.MULTILINE)
939
        self.assertNotContainsRe(log, '^2:', re.MULTILINE)
940
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
941
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
942
        self.assertNotContainsRe(log, '^4:', re.MULTILINE)
3940.1.5 by Ian Clatworthy
feedback from vila
943
944
        # full history of file2
3940.1.2 by Ian Clatworthy
add test
945
        log = self.run_bzr('log --line file2')[0]
946
        self.assertNotContainsRe(log, '^1:', re.MULTILINE)
947
        self.assertContainsRe(log, '^2:', re.MULTILINE)
948
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
949
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
950
        self.assertContainsRe(log, '^4:', re.MULTILINE)
3940.1.5 by Ian Clatworthy
feedback from vila
951
952
        # full history of file3
3940.1.2 by Ian Clatworthy
add test
953
        log = self.run_bzr('log --line file3')[0]
954
        self.assertNotContainsRe(log, '^1:', re.MULTILINE)
955
        self.assertNotContainsRe(log, '^2:', re.MULTILINE)
956
        self.assertContainsRe(log, '^3:', re.MULTILINE)
957
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
958
        self.assertNotContainsRe(log, '^4:', re.MULTILINE)
3940.1.5 by Ian Clatworthy
feedback from vila
959
960
        # file in a merge revision
3940.1.2 by Ian Clatworthy
add test
961
        log = self.run_bzr('log --line -r3.1.1 file2')[0]
962
        self.assertNotContainsRe(log, '^1:', re.MULTILINE)
963
        self.assertNotContainsRe(log, '^2:', re.MULTILINE)
964
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
965
        self.assertContainsRe(log, '^3.1.1:', re.MULTILINE)
966
        self.assertNotContainsRe(log, '^4:', re.MULTILINE)
3940.1.5 by Ian Clatworthy
feedback from vila
967
968
        # file in a mainline revision
3940.1.2 by Ian Clatworthy
add test
969
        log = self.run_bzr('log --line -r4 file2')[0]
970
        self.assertNotContainsRe(log, '^1:', re.MULTILINE)
971
        self.assertNotContainsRe(log, '^2:', re.MULTILINE)
972
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
973
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
974
        self.assertContainsRe(log, '^4:', re.MULTILINE)
3940.1.5 by Ian Clatworthy
feedback from vila
975
976
        # file since a revision
3940.1.2 by Ian Clatworthy
add test
977
        log = self.run_bzr('log --line -r3.. file2')[0]
978
        self.assertNotContainsRe(log, '^1:', re.MULTILINE)
979
        self.assertNotContainsRe(log, '^2:', re.MULTILINE)
980
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
981
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
982
        self.assertContainsRe(log, '^4:', re.MULTILINE)
3940.1.5 by Ian Clatworthy
feedback from vila
983
984
        # file up to a revision
3940.1.2 by Ian Clatworthy
add test
985
        log = self.run_bzr('log --line -r..3 file2')[0]
986
        self.assertNotContainsRe(log, '^1:', re.MULTILINE)
987
        self.assertContainsRe(log, '^2:', re.MULTILINE)
988
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
989
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
990
        self.assertNotContainsRe(log, '^4:', re.MULTILINE)
4202.2.1 by Ian Clatworthy
get directory logging working again
991
992
993
class TestLogMultiple(TestCaseWithTransport):
994
995
    def prepare_tree(self):
996
        tree = self.make_branch_and_tree('parent')
997
        self.build_tree([
998
            'parent/file1',
999
            'parent/file2',
1000
            'parent/dir1/',
1001
            'parent/dir1/file5',
1002
            'parent/dir1/dir2/',
1003
            'parent/dir1/dir2/file3',
1004
            'parent/file4'])
1005
        tree.add('file1')
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1006
        tree.commit('add file1')
4202.2.1 by Ian Clatworthy
get directory logging working again
1007
        tree.add('file2')
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1008
        tree.commit('add file2')
4202.2.1 by Ian Clatworthy
get directory logging working again
1009
        tree.add(['dir1', 'dir1/dir2', 'dir1/dir2/file3'])
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1010
        tree.commit('add file3')
4202.2.1 by Ian Clatworthy
get directory logging working again
1011
        tree.add('file4')
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1012
        tree.commit('add file4')
4202.2.1 by Ian Clatworthy
get directory logging working again
1013
        tree.add('dir1/file5')
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1014
        tree.commit('add file5')
4202.2.1 by Ian Clatworthy
get directory logging working again
1015
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
1016
        self.build_tree_contents([('child/file2', 'hello')])
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1017
        child_tree.commit(message='branch 1')
4202.2.1 by Ian Clatworthy
get directory logging working again
1018
        tree.merge_from_branch(child_tree.branch)
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1019
        tree.commit(message='merge child branch')
4202.2.1 by Ian Clatworthy
get directory logging working again
1020
        os.chdir('parent')
1021
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1022
    def assertRevnos(self, paths_str, expected_revnos):
1023
        # confirm the revision numbers in log --line output are those expected
1024
        out, err = self.run_bzr('log --line -n0 %s' % (paths_str,))
1025
        self.assertEqual('', err)
1026
        revnos = [s.split(':', 1)[0].lstrip() for s in out.splitlines()]
4202.2.5 by Ian Clatworthy
apply review tweaks & update help
1027
        self.assertEqual(expected_revnos, revnos)
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1028
4202.2.1 by Ian Clatworthy
get directory logging working again
1029
    def test_log_files(self):
1030
        """The log for multiple file should only list revs for those files"""
1031
        self.prepare_tree()
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1032
        self.assertRevnos('file1 file2 dir1/dir2/file3',
1033
            ['6', '5.1.1', '3', '2', '1'])
4202.2.1 by Ian Clatworthy
get directory logging working again
1034
1035
    def test_log_directory(self):
1036
        """The log for a directory should show all nested files."""
1037
        self.prepare_tree()
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1038
        self.assertRevnos('dir1', ['5', '3'])
4202.2.1 by Ian Clatworthy
get directory logging working again
1039
1040
    def test_log_nested_directory(self):
1041
        """The log for a directory should show all nested files."""
1042
        self.prepare_tree()
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1043
        self.assertRevnos('dir1/dir2', ['3'])
4202.2.1 by Ian Clatworthy
get directory logging working again
1044
1045
    def test_log_in_nested_directory(self):
1046
        """The log for a directory should show all nested files."""
1047
        self.prepare_tree()
1048
        os.chdir("dir1")
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1049
        self.assertRevnos('.', ['5', '3'])
4202.2.1 by Ian Clatworthy
get directory logging working again
1050
1051
    def test_log_files_and_directories(self):
1052
        """Logging files and directories together should be fine."""
1053
        self.prepare_tree()
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1054
        self.assertRevnos('file4 dir1/dir2', ['4', '3'])
4202.2.1 by Ian Clatworthy
get directory logging working again
1055
1056
    def test_log_files_and_dirs_in_nested_directory(self):
1057
        """The log for a directory should show all nested files."""
1058
        self.prepare_tree()
1059
        os.chdir("dir1")
4202.2.2 by Ian Clatworthy
improve signal-to-noise ratio in tests
1060
        self.assertRevnos('dir2 file5', ['5', '3'])