/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1551.10.18 by Aaron Bentley
Log works in local treeless branches (#84247)
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
2
# -*- coding: utf-8 -*-
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
3
#
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
8
#
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
13
#
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
19
"""Black-box tests for bzr log."""
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
20
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
21
import os
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
22
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
23
import bzrlib
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
24
from bzrlib.tests.blackbox import ExternalBase
1551.10.18 by Aaron Bentley
Log works in local treeless branches (#84247)
25
from bzrlib.tests import TestCaseInTempDir, TestCaseWithTransport
1540.2.6 by Robey Pointer
make 'log' and 'status' treat '-r N..' as implicitly '-r N..-1'
26
27
28
class TestLog(ExternalBase):
29
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
30
    def _prepare(self, path='.', format=None):
2809.1.2 by Daniel Watkins
Removed unnecessary check as per abentley's on-list comments.
31
        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.
32
        self.build_tree(
33
            [path + '/hello.txt', path + '/goodbye.txt', path + '/meep.txt'])
34
        tree.add('hello.txt')
35
        tree.commit(message='message1')
36
        tree.add('goodbye.txt')
37
        tree.commit(message='message2')
38
        tree.add('meep.txt')
39
        tree.commit(message='message3')
40
        self.full_log = self.run_bzr(["log", path])[0]
41
        return tree
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
42
43
    def test_log_null_end_revspec(self):
44
        self._prepare()
45
        self.assertTrue('revno: 1\n' in self.full_log)
46
        self.assertTrue('revno: 2\n' in self.full_log)
47
        self.assertTrue('revno: 3\n' in self.full_log)
48
        self.assertTrue('message:\n  message1\n' in self.full_log)
49
        self.assertTrue('message:\n  message2\n' in self.full_log)
50
        self.assertTrue('message:\n  message3\n' in self.full_log)
51
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
52
        log = self.run_bzr("log -r 1..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
53
        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
54
55
    def test_log_null_begin_revspec(self):
56
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
57
        log = self.run_bzr("log -r ..3")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
58
        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
59
60
    def test_log_null_both_revspecs(self):
61
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
62
        log = self.run_bzr("log -r ..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
63
        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
64
2978.4.1 by Kent Gibson
Logging revision 0 returns error.
65
    def test_log_zero_revspec(self):
66
        self._prepare()
67
        self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
68
                           ['log', '-r0'])
69
70
    def test_log_zero_begin_revspec(self):
71
        self._prepare()
72
        self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
73
                           ['log', '-r0..2'])
74
75
    def test_log_zero_end_revspec(self):
76
        self._prepare()
77
        self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
78
                           ['log', '-r-2..0'])
79
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
80
    def test_log_negative_begin_revspec_full_log(self):
81
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
82
        log = self.run_bzr("log -r -3..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
83
        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
84
85
    def test_log_negative_both_revspec_full_log(self):
86
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
87
        log = self.run_bzr("log -r -3..-1")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
88
        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
89
90
    def test_log_negative_both_revspec_partial(self):
91
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
92
        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
93
        self.assertTrue('revno: 1\n' in log)
94
        self.assertTrue('revno: 2\n' in log)
95
        self.assertTrue('revno: 3\n' not in log)
96
97
    def test_log_negative_begin_revspec(self):
98
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
99
        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
100
        self.assertTrue('revno: 1\n' not in log)
101
        self.assertTrue('revno: 2\n' in log)
102
        self.assertTrue('revno: 3\n' in log)
103
2978.4.1 by Kent Gibson
Logging revision 0 returns error.
104
    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
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 1..3")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
107
        self.assertEqualDiff(self.full_log, log)
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
108
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
109
    def test_log_reversed_revspecs(self):
110
        self._prepare()
111
        self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
112
                            'the end revision.\n',),
2581.1.6 by Martin Pool
fix up more run_bzr callers
113
                           ['log', '-r3..1'])
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
114
1907.4.2 by Matthieu Moy
Make log work nicely with revno:N:path too.
115
    def test_log_revno_n_path(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
116
        self._prepare(path='branch1')
117
        self._prepare(path='branch2')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
118
        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.
119
                          retcode=3)[0]
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
120
        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
121
        self.assertEqualDiff(self.full_log, log)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
122
        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.
123
        self.assertTrue('revno: 1\n' in log)
124
        self.assertTrue('revno: 2\n' not in log)
125
        self.assertTrue('branch nick: branch2\n' in log)
126
        self.assertTrue('branch nick: branch1\n' not in log)
127
        
2100.1.1 by wang
Running ``bzr log`` on nonexistent file gives an error instead of the
128
    def test_log_nonexistent_file(self):
129
        # files that don't exist in either the basis tree or working tree
130
        # should give an error
131
        wt = self.make_branch_and_tree('.')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
132
        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
133
        self.assertContainsRe(
134
            err, 'Path does not have any revision history: does-not-exist')
2388.1.11 by Alexander Belchenko
changes after John's review
135
2388.1.3 by Erik Bagfors
tests for tags in log output
136
    def test_log_with_tags(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
137
        tree = self._prepare(format='dirstate-tags')
138
        branch = tree.branch
139
        branch.tags.set_tag('tag1', branch.get_rev_id(1))
140
        branch.tags.set_tag('tag1.1', branch.get_rev_id(1))
141
        branch.tags.set_tag('tag3', branch.last_revision()) 
2388.1.3 by Erik Bagfors
tests for tags in log output
142
        
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
143
        log = self.run_bzr("log -r-1")[0]
2388.1.3 by Erik Bagfors
tests for tags in log output
144
        self.assertTrue('tags: tag3' in log)
145
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
146
        log = self.run_bzr("log -r1")[0]
2388.1.3 by Erik Bagfors
tests for tags in log output
147
        # I guess that we can't know the order of tags in the output
148
        # since dicts are unordered, need to check both possibilities
2388.1.11 by Alexander Belchenko
changes after John's review
149
        self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
150
2388.1.9 by Erik Bagfors
test for merges with tags in log
151
    def test_merged_log_with_tags(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
152
        branch1_tree = self._prepare(path='branch1', format='dirstate-tags')
153
        branch1 = branch1_tree.branch
154
        branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
155
        branch1_tree.commit(message='foobar', allow_pointless=True)
156
        branch1.tags.set_tag('tag1', branch1.last_revision())
157
        os.chdir('branch2')
158
        self.run_bzr('merge ../branch1') # tags don't propagate otherwise
159
        branch2_tree.commit(message='merge branch 1')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
160
        log = self.run_bzr("log -r-1")[0]
2388.1.11 by Alexander Belchenko
changes after John's review
161
        self.assertContainsRe(log, r'    tags: tag1')
2578.2.1 by Andrew Bennetts
Merge Kent Gibson's fix for bug #4663, resolving conflicts.
162
        log = self.run_bzr("log -r3.1.1")[0]
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
163
        self.assertContainsRe(log, r'tags: tag1')
2388.1.3 by Erik Bagfors
tests for tags in log output
164
2466.9.1 by Kent Gibson
add bzr log --limit
165
    def test_log_limit(self):
166
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
167
        log = self.run_bzr("log --limit 2")[0]
2466.9.1 by Kent Gibson
add bzr log --limit
168
        self.assertTrue('revno: 1\n' not in log)
169
        self.assertTrue('revno: 2\n' in log)
170
        self.assertTrue('revno: 3\n' in log)
171
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
172
class TestLogMerges(ExternalBase):
173
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
174
    def _prepare(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
175
        parent_tree = self.make_branch_and_tree('parent')
176
        parent_tree.commit(message='first post', allow_pointless=True)
177
        child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
178
        child_tree.commit(message='branch 1', allow_pointless=True)
179
        smaller_tree = \
180
                child_tree.bzrdir.sprout('smallerchild').open_workingtree()
181
        smaller_tree.commit(message='branch 2', allow_pointless=True)
182
        child_tree.merge_from_branch(smaller_tree.branch)
183
        child_tree.commit(message='merge branch 2')
184
        parent_tree.merge_from_branch(child_tree.branch)
185
        parent_tree.commit(message='merge branch 1')
186
        os.chdir('parent')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
187
188
    def test_merges_are_indented_by_level(self):
189
        self._prepare()
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
190
        out,err = self.run_bzr('log')
191
        # the log will look something like:
192
#        self.assertEqual("""\
193
#------------------------------------------------------------
194
#revno: 2
195
#committer: Robert Collins <foo@example.com>
196
#branch nick: parent
197
#timestamp: Tue 2006-03-28 22:31:40 +1100
198
#message:
199
#  merge branch 1
200
#    ------------------------------------------------------------
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
201
#    revno: 1.1.2  
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
202
#    committer: Robert Collins <foo@example.com>
203
#    branch nick: child
204
#    timestamp: Tue 2006-03-28 22:31:40 +1100
205
#    message:
206
#      merge branch 2
207
#        ------------------------------------------------------------
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
208
#        revno: 1.1.1.1
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
209
#        committer: Robert Collins <foo@example.com>
210
#        branch nick: smallerchild
211
#        timestamp: Tue 2006-03-28 22:31:40 +1100
212
#        message:
213
#          branch 2
214
#    ------------------------------------------------------------
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
215
#    revno: 1.1.1
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
216
#    committer: Robert Collins <foo@example.com>
217
#    branch nick: child
218
#    timestamp: Tue 2006-03-28 22:31:40 +1100
219
#    message:
220
#      branch 1
221
#------------------------------------------------------------
222
#revno: 1
223
#committer: Robert Collins <foo@example.com>
224
#branch nick: parent
225
#timestamp: Tue 2006-03-28 22:31:39 +1100
226
#message:
227
#  first post
228
#""", out)
229
        # but we dont have a nice pattern matcher hooked up yet, so:
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
230
        # we check for the indenting of the commit message and the 
231
        # revision numbers 
232
        self.assertTrue('revno: 2' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
233
        self.assertTrue('  merge branch 1' in out)
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
234
        self.assertTrue('    revno: 1.1.2' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
235
        self.assertTrue('      merge branch 2' in out)
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
236
        self.assertTrue('        revno: 1.1.1.1' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
237
        self.assertTrue('          branch 2' in out)
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
238
        self.assertTrue('    revno: 1.1.1' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
239
        self.assertTrue('      branch 1' in out)
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
240
        self.assertTrue('revno: 1\n' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
241
        self.assertTrue('  first post' in out)
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
242
        self.assertEqual('', err)
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
243
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
244
    def test_merges_single_merge_rev(self):
245
        self._prepare()
2581.1.6 by Martin Pool
fix up more run_bzr callers
246
        out,err = self.run_bzr('log -r1.1.2')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
247
        # the log will look something like:
248
#        self.assertEqual("""\
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
249
#------------------------------------------------------------
250
#revno: 1.1.2  
251
#committer: Robert Collins <foo@example.com>
252
#branch nick: child
253
#timestamp: Tue 2006-03-28 22:31:40 +1100
254
#message:
255
#  merge branch 2
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
256
#    ------------------------------------------------------------
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
257
#    revno: 1.1.1.1
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
258
#    committer: Robert Collins <foo@example.com>
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
259
#    branch nick: smallerchild
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
260
#    timestamp: Tue 2006-03-28 22:31:40 +1100
261
#    message:
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
262
#      branch 2
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
263
#""", out)
264
        # but we dont have a nice pattern matcher hooked up yet, so:
265
        # we check for the indenting of the commit message and the 
266
        # revision numbers 
267
        self.assertTrue('revno: 2' not in out)
268
        self.assertTrue('  merge branch 1' not in out)
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
269
        self.assertTrue('revno: 1.1.2' in out)
270
        self.assertTrue('  merge branch 2' in out)
271
        self.assertTrue('    revno: 1.1.1.1' in out)
272
        self.assertTrue('      branch 2' in out)
273
        self.assertTrue('revno: 1.1.1\n' not in out)
274
        self.assertTrue('  branch 1' not in out)
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
275
        self.assertTrue('revno: 1\n' not in out)
276
        self.assertTrue('  first post' not in out)
277
        self.assertEqual('', err)
278
279
    def test_merges_partial_range(self):
280
        self._prepare()
2581.1.6 by Martin Pool
fix up more run_bzr callers
281
        out,err = self.run_bzr('log -r1.1.1..1.1.2')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
282
        # the log will look something like:
283
#        self.assertEqual("""\
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
284
#------------------------------------------------------------
285
#revno: 1.1.2  
286
#committer: Robert Collins <foo@example.com>
287
#branch nick: child
288
#timestamp: Tue 2006-03-28 22:31:40 +1100
289
#message:
290
#  merge branch 2
291
#    ------------------------------------------------------------
292
#    revno: 1.1.1.1
293
#    committer: Robert Collins <foo@example.com>
294
#    branch nick: smallerchild
295
#    timestamp: Tue 2006-03-28 22:31:40 +1100
296
#    message:
297
#      branch 2
298
#------------------------------------------------------------
299
#revno: 1.1.1
300
#committer: Robert Collins <foo@example.com>
301
#branch nick: child
302
#timestamp: Tue 2006-03-28 22:31:40 +1100
303
#message:
304
#  branch 1
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
305
#""", out)
306
        # but we dont have a nice pattern matcher hooked up yet, so:
307
        # we check for the indenting of the commit message and the 
308
        # revision numbers 
309
        self.assertTrue('revno: 2' not in out)
310
        self.assertTrue('  merge branch 1' not in out)
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
311
        self.assertTrue('revno: 1.1.2' in out)
312
        self.assertTrue('  merge branch 2' in out)
313
        self.assertTrue('    revno: 1.1.1.1' in out)
314
        self.assertTrue('      branch 2' in out)
315
        self.assertTrue('revno: 1.1.1' in out)
316
        self.assertTrue('  branch 1' in out)
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
317
        self.assertTrue('revno: 1\n' not in out)
318
        self.assertTrue('  first post' not in out)
319
        self.assertEqual('', err)
320
2978.3.1 by Kent Gibson
Return an error if the revisionspec contains merge revisions, but the log formatter doesn't support them.
321
    def test_merges_nonsupporting_formatter(self):
322
        self._prepare()
323
        err_msg = 'Selected log formatter only supports mainline revisions.'
324
        out,err = self.run_bzr('log --short -r1.1.2', retcode=3)
325
        self.assertContainsRe(err, err_msg)
326
        out,err = self.run_bzr('log --short -r1..1.1.2', retcode=3)
327
        self.assertContainsRe(err, err_msg)
328
        out,err = self.run_bzr('log --short -r1.1.1..1.1.2', retcode=3)
329
        self.assertContainsRe(err, err_msg)
330
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
331
 
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
332
class TestLogEncodings(TestCaseInTempDir):
333
334
    _mu = u'\xb5'
335
    _message = u'Message with \xb5'
336
337
    # Encodings which can encode mu
338
    good_encodings = [
339
        'utf-8',
340
        'latin-1',
341
        'iso-8859-1',
342
        'cp437', # Common windows encoding
343
        'cp1251', # Alexander Belchenko's windows encoding
344
        'cp1258', # Common windows encoding
345
    ]
346
    # Encodings which cannot encode mu
347
    bad_encodings = [
348
        'ascii',
349
        'iso-8859-2',
350
        'koi8_r',
351
    ]
352
353
    def setUp(self):
354
        TestCaseInTempDir.setUp(self)
355
        self.user_encoding = bzrlib.user_encoding
356
357
    def tearDown(self):
358
        bzrlib.user_encoding = self.user_encoding
359
        TestCaseInTempDir.tearDown(self)
360
361
    def create_branch(self):
362
        bzr = self.run_bzr
363
        bzr('init')
364
        open('a', 'wb').write('some stuff\n')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
365
        bzr('add a')
366
        bzr(['commit', '-m', self._message])
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
367
368
    def try_encoding(self, encoding, fail=False):
369
        bzr = self.run_bzr
370
        if fail:
371
            self.assertRaises(UnicodeEncodeError,
372
                self._mu.encode, encoding)
373
            encoded_msg = self._message.encode(encoding, 'replace')
374
        else:
375
            encoded_msg = self._message.encode(encoding)
376
377
        old_encoding = bzrlib.user_encoding
378
        # This test requires that 'run_bzr' uses the current
379
        # bzrlib, because we override user_encoding, and expect
380
        # it to be used
381
        try:
382
            bzrlib.user_encoding = 'ascii'
383
            # We should be able to handle any encoding
384
            out, err = bzr('log', encoding=encoding)
385
            if not fail:
386
                # Make sure we wrote mu as we expected it to exist
387
                self.assertNotEqual(-1, out.find(encoded_msg))
388
                out_unicode = out.decode(encoding)
389
                self.assertNotEqual(-1, out_unicode.find(self._message))
390
            else:
391
                self.assertNotEqual(-1, out.find('Message with ?'))
392
        finally:
393
            bzrlib.user_encoding = old_encoding
394
395
    def test_log_handles_encoding(self):
396
        self.create_branch()
397
398
        for encoding in self.good_encodings:
399
            self.try_encoding(encoding)
400
401
    def test_log_handles_bad_encoding(self):
402
        self.create_branch()
403
404
        for encoding in self.bad_encodings:
405
            self.try_encoding(encoding, fail=True)
406
407
    def test_stdout_encoding(self):
408
        bzr = self.run_bzr
409
        bzrlib.user_encoding = "cp1251"
410
411
        bzr('init')
412
        self.build_tree(['a'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
413
        bzr('add a')
414
        bzr(['commit', '-m', u'\u0422\u0435\u0441\u0442'])
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
415
        stdout, stderr = self.run_bzr('log', encoding='cp866')
416
417
        message = stdout.splitlines()[-1]
418
419
        # explanation of the check:
420
        # u'\u0422\u0435\u0441\u0442' is word 'Test' in russian
421
        # in cp866  encoding this is string '\x92\xa5\xe1\xe2'
422
        # in cp1251 encoding this is string '\xd2\xe5\xf1\xf2'
423
        # This test should check that output of log command
424
        # encoded to sys.stdout.encoding
425
        test_in_cp866 = '\x92\xa5\xe1\xe2'
426
        test_in_cp1251 = '\xd2\xe5\xf1\xf2'
427
        # Make sure the log string is encoded in cp866
428
        self.assertEquals(test_in_cp866, message[2:])
429
        # Make sure the cp1251 string is not found anywhere
430
        self.assertEquals(-1, stdout.find(test_in_cp1251))
431
1551.10.18 by Aaron Bentley
Log works in local treeless branches (#84247)
432
433
class TestLogFile(TestCaseWithTransport):
434
435
    def test_log_local_branch_file(self):
436
        """We should be able to log files in local treeless branches"""
437
        tree = self.make_branch_and_tree('tree')
438
        self.build_tree(['tree/file'])
439
        tree.add('file')
440
        tree.commit('revision 1')
441
        tree.bzrdir.destroy_workingtree()
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
442
        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.
443
444
    def test_log_file(self):
445
        """The log for a particular file should only list revs for that file"""
446
        tree = self.make_branch_and_tree('parent')
447
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
448
        tree.add('file1')
449
        tree.commit('add file1')
450
        tree.add('file2')
451
        tree.commit('add file2')
452
        tree.add('file3')
453
        tree.commit('add file3')
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
454
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
455
        self.build_tree_contents([('child/file2', 'hello')])
456
        child_tree.commit(message='branch 1')
457
        tree.merge_from_branch(child_tree.branch)
458
        tree.commit(message='merge child branch')
2359.1.1 by Kent Gibson
Fix ``bzr log <file>`` so it only logs the revisions that changed the file, and does it faster.
459
        os.chdir('parent')
2581.1.6 by Martin Pool
fix up more run_bzr callers
460
        log = self.run_bzr('log 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.
461
        self.assertContainsRe(log, 'revno: 1\n')
462
        self.assertNotContainsRe(log, 'revno: 2\n')
463
        self.assertNotContainsRe(log, 'revno: 3\n')
464
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
465
        self.assertNotContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
466
        log = self.run_bzr('log 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.
467
        self.assertNotContainsRe(log, 'revno: 1\n')
468
        self.assertContainsRe(log, 'revno: 2\n')
469
        self.assertNotContainsRe(log, 'revno: 3\n')
470
        self.assertContainsRe(log, 'revno: 3.1.1\n')
2359.1.2 by Kent Gibson
add logging of merge revisions
471
        self.assertContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
472
        log = self.run_bzr('log 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.
473
        self.assertNotContainsRe(log, 'revno: 1\n')
474
        self.assertNotContainsRe(log, 'revno: 2\n')
475
        self.assertContainsRe(log, 'revno: 3\n')
476
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
477
        self.assertNotContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
478
        log = self.run_bzr('log -r3.1.1 file2')[0]
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
479
        self.assertNotContainsRe(log, 'revno: 1\n')
480
        self.assertNotContainsRe(log, 'revno: 2\n')
481
        self.assertNotContainsRe(log, 'revno: 3\n')
482
        self.assertContainsRe(log, 'revno: 3.1.1\n')
483
        self.assertNotContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
484
        log = self.run_bzr('log -r4 file2')[0]
485
        self.assertNotContainsRe(log, 'revno: 1\n')
486
        self.assertNotContainsRe(log, 'revno: 2\n')
487
        self.assertNotContainsRe(log, 'revno: 3\n')
488
        self.assertContainsRe(log, 'revno: 3.1.1\n')
489
        self.assertContainsRe(log, 'revno: 4\n')
490
        log = self.run_bzr('log -r3.. file2')[0]
491
        self.assertNotContainsRe(log, 'revno: 1\n')
492
        self.assertNotContainsRe(log, 'revno: 2\n')
493
        self.assertNotContainsRe(log, 'revno: 3\n')
494
        self.assertContainsRe(log, 'revno: 3.1.1\n')
495
        self.assertContainsRe(log, 'revno: 4\n')
496
        log = self.run_bzr('log -r..3 file2')[0]
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
497
        self.assertNotContainsRe(log, 'revno: 1\n')
498
        self.assertContainsRe(log, 'revno: 2\n')
499
        self.assertNotContainsRe(log, 'revno: 3\n')
500
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
501
        self.assertNotContainsRe(log, 'revno: 4\n')