~bzr-pqm/bzr/bzr.dev

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]
1553.4.2 by Michael Ellerman
Make bzr log -r .. work, fixes bug #4609. Add a bunch of tests to make sure
63
        self.assertEquals(self.full_log, log)
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
64
        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
65
66
    def test_log_negative_begin_revspec_full_log(self):
67
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
68
        log = self.run_bzr("log -r -3..")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
69
        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
70
71
    def test_log_negative_both_revspec_full_log(self):
72
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
73
        log = self.run_bzr("log -r -3..-1")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
74
        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
75
76
    def test_log_negative_both_revspec_partial(self):
77
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
78
        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
79
        self.assertTrue('revno: 1\n' in log)
80
        self.assertTrue('revno: 2\n' in log)
81
        self.assertTrue('revno: 3\n' not in log)
82
83
    def test_log_negative_begin_revspec(self):
84
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
85
        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
86
        self.assertTrue('revno: 1\n' not in log)
87
        self.assertTrue('revno: 2\n' in log)
88
        self.assertTrue('revno: 3\n' in log)
89
90
    def test_log_postive_revspecs(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 1..3")[0]
2466.11.2 by Kent Gibson
Add tests for deltas in merge revisions
93
        self.assertEqualDiff(self.full_log, log)
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
94
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
95
    def test_log_reversed_revspecs(self):
96
        self._prepare()
97
        self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
98
                            'the end revision.\n',),
2581.1.6 by Martin Pool
fix up more run_bzr callers
99
                           ['log', '-r3..1'])
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
100
1907.4.2 by Matthieu Moy
Make log work nicely with revno:N:path too.
101
    def test_log_revno_n_path(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
102
        self._prepare(path='branch1')
103
        self._prepare(path='branch2')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
104
        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.
105
                          retcode=3)[0]
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
106
        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
107
        self.assertEqualDiff(self.full_log, log)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
108
        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.
109
        self.assertTrue('revno: 1\n' in log)
110
        self.assertTrue('revno: 2\n' not in log)
111
        self.assertTrue('branch nick: branch2\n' in log)
112
        self.assertTrue('branch nick: branch1\n' not in log)
113
        
2100.1.1 by wang
Running ``bzr log`` on nonexistent file gives an error instead of the
114
    def test_log_nonexistent_file(self):
115
        # files that don't exist in either the basis tree or working tree
116
        # should give an error
117
        wt = self.make_branch_and_tree('.')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
118
        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
119
        self.assertContainsRe(
120
            err, 'Path does not have any revision history: does-not-exist')
2388.1.11 by Alexander Belchenko
changes after John's review
121
2388.1.3 by Erik Bagfors
tests for tags in log output
122
    def test_log_with_tags(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
123
        tree = self._prepare(format='dirstate-tags')
124
        branch = tree.branch
125
        branch.tags.set_tag('tag1', branch.get_rev_id(1))
126
        branch.tags.set_tag('tag1.1', branch.get_rev_id(1))
127
        branch.tags.set_tag('tag3', branch.last_revision()) 
2388.1.3 by Erik Bagfors
tests for tags in log output
128
        
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
129
        log = self.run_bzr("log -r-1")[0]
2388.1.3 by Erik Bagfors
tests for tags in log output
130
        self.assertTrue('tags: tag3' in log)
131
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
132
        log = self.run_bzr("log -r1")[0]
2388.1.3 by Erik Bagfors
tests for tags in log output
133
        # I guess that we can't know the order of tags in the output
134
        # since dicts are unordered, need to check both possibilities
2388.1.11 by Alexander Belchenko
changes after John's review
135
        self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
136
2388.1.9 by Erik Bagfors
test for merges with tags in log
137
    def test_merged_log_with_tags(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
138
        branch1_tree = self._prepare(path='branch1', format='dirstate-tags')
139
        branch1 = branch1_tree.branch
140
        branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
141
        branch1_tree.commit(message='foobar', allow_pointless=True)
142
        branch1.tags.set_tag('tag1', branch1.last_revision())
143
        os.chdir('branch2')
144
        self.run_bzr('merge ../branch1') # tags don't propagate otherwise
145
        branch2_tree.commit(message='merge branch 1')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
146
        log = self.run_bzr("log -r-1")[0]
2388.1.11 by Alexander Belchenko
changes after John's review
147
        self.assertContainsRe(log, r'    tags: tag1')
2578.2.1 by Andrew Bennetts
Merge Kent Gibson's fix for bug #4663, resolving conflicts.
148
        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
149
        self.assertContainsRe(log, r'tags: tag1')
2388.1.3 by Erik Bagfors
tests for tags in log output
150
2466.9.1 by Kent Gibson
add bzr log --limit
151
    def test_log_limit(self):
152
        self._prepare()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
153
        log = self.run_bzr("log --limit 2")[0]
2466.9.1 by Kent Gibson
add bzr log --limit
154
        self.assertTrue('revno: 1\n' not in log)
155
        self.assertTrue('revno: 2\n' in log)
156
        self.assertTrue('revno: 3\n' in log)
157
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
158
class TestLogMerges(ExternalBase):
159
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
160
    def _prepare(self):
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
161
        parent_tree = self.make_branch_and_tree('parent')
162
        parent_tree.commit(message='first post', allow_pointless=True)
163
        child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
164
        child_tree.commit(message='branch 1', allow_pointless=True)
165
        smaller_tree = \
166
                child_tree.bzrdir.sprout('smallerchild').open_workingtree()
167
        smaller_tree.commit(message='branch 2', allow_pointless=True)
168
        child_tree.merge_from_branch(smaller_tree.branch)
169
        child_tree.commit(message='merge branch 2')
170
        parent_tree.merge_from_branch(child_tree.branch)
171
        parent_tree.commit(message='merge branch 1')
172
        os.chdir('parent')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
173
174
    def test_merges_are_indented_by_level(self):
175
        self._prepare()
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
176
        out,err = self.run_bzr('log')
177
        # the log will look something like:
178
#        self.assertEqual("""\
179
#------------------------------------------------------------
180
#revno: 2
181
#committer: Robert Collins <foo@example.com>
182
#branch nick: parent
183
#timestamp: Tue 2006-03-28 22:31:40 +1100
184
#message:
185
#  merge branch 1
186
#    ------------------------------------------------------------
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
187
#    revno: 1.1.2  
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
188
#    committer: Robert Collins <foo@example.com>
189
#    branch nick: child
190
#    timestamp: Tue 2006-03-28 22:31:40 +1100
191
#    message:
192
#      merge branch 2
193
#        ------------------------------------------------------------
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
194
#        revno: 1.1.1.1
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
195
#        committer: Robert Collins <foo@example.com>
196
#        branch nick: smallerchild
197
#        timestamp: Tue 2006-03-28 22:31:40 +1100
198
#        message:
199
#          branch 2
200
#    ------------------------------------------------------------
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
201
#    revno: 1.1.1
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
#      branch 1
207
#------------------------------------------------------------
208
#revno: 1
209
#committer: Robert Collins <foo@example.com>
210
#branch nick: parent
211
#timestamp: Tue 2006-03-28 22:31:39 +1100
212
#message:
213
#  first post
214
#""", out)
215
        # 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,
216
        # we check for the indenting of the commit message and the 
217
        # revision numbers 
218
        self.assertTrue('revno: 2' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
219
        self.assertTrue('  merge branch 1' in out)
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
220
        self.assertTrue('    revno: 1.1.2' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
221
        self.assertTrue('      merge branch 2' in out)
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
222
        self.assertTrue('        revno: 1.1.1.1' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
223
        self.assertTrue('          branch 2' in out)
1988.4.2 by Robert Collins
``bzr log`` Now shows dotted-decimal revision numbers for all revisions,
224
        self.assertTrue('    revno: 1.1.1' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
225
        self.assertTrue('      branch 1' in out)
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
226
        self.assertTrue('revno: 1\n' in out)
2552.2.5 by Vincent Ladeuil
Revert the intrusive run_bzr('commit') rewritings.
227
        self.assertTrue('  first post' in out)
1624.1.3 by Robert Collins
Convert log to use the new tsort.merge_sort routine.
228
        self.assertEqual('', err)
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
229
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
230
    def test_merges_single_merge_rev(self):
231
        self._prepare()
2581.1.6 by Martin Pool
fix up more run_bzr callers
232
        out,err = self.run_bzr('log -r1.1.2')
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
233
        # the log will look something like:
234
#        self.assertEqual("""\
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
235
#------------------------------------------------------------
236
#revno: 1.1.2  
237
#committer: Robert Collins <foo@example.com>
238
#branch nick: child
239
#timestamp: Tue 2006-03-28 22:31:40 +1100
240
#message:
241
#  merge branch 2
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
242
#    ------------------------------------------------------------
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
243
#    revno: 1.1.1.1
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
244
#    committer: Robert Collins <foo@example.com>
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
245
#    branch nick: smallerchild
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
246
#    timestamp: Tue 2006-03-28 22:31:40 +1100
247
#    message:
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
248
#      branch 2
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
249
#""", out)
250
        # but we dont have a nice pattern matcher hooked up yet, so:
251
        # we check for the indenting of the commit message and the 
252
        # revision numbers 
253
        self.assertTrue('revno: 2' not in out)
254
        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
255
        self.assertTrue('revno: 1.1.2' in out)
256
        self.assertTrue('  merge branch 2' in out)
257
        self.assertTrue('    revno: 1.1.1.1' in out)
258
        self.assertTrue('      branch 2' in out)
259
        self.assertTrue('revno: 1.1.1\n' not in out)
260
        self.assertTrue('  branch 1' not in out)
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
261
        self.assertTrue('revno: 1\n' not in out)
262
        self.assertTrue('  first post' not in out)
263
        self.assertEqual('', err)
264
265
    def test_merges_partial_range(self):
266
        self._prepare()
2581.1.6 by Martin Pool
fix up more run_bzr callers
267
        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.
268
        # the log will look something like:
269
#        self.assertEqual("""\
2466.12.2 by Kent Gibson
shift log output with only merge revisions to the left margin
270
#------------------------------------------------------------
271
#revno: 1.1.2  
272
#committer: Robert Collins <foo@example.com>
273
#branch nick: child
274
#timestamp: Tue 2006-03-28 22:31:40 +1100
275
#message:
276
#  merge branch 2
277
#    ------------------------------------------------------------
278
#    revno: 1.1.1.1
279
#    committer: Robert Collins <foo@example.com>
280
#    branch nick: smallerchild
281
#    timestamp: Tue 2006-03-28 22:31:40 +1100
282
#    message:
283
#      branch 2
284
#------------------------------------------------------------
285
#revno: 1.1.1
286
#committer: Robert Collins <foo@example.com>
287
#branch nick: child
288
#timestamp: Tue 2006-03-28 22:31:40 +1100
289
#message:
290
#  branch 1
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
291
#""", out)
292
        # but we dont have a nice pattern matcher hooked up yet, so:
293
        # we check for the indenting of the commit message and the 
294
        # revision numbers 
295
        self.assertTrue('revno: 2' not in out)
296
        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
297
        self.assertTrue('revno: 1.1.2' in out)
298
        self.assertTrue('  merge branch 2' in out)
299
        self.assertTrue('    revno: 1.1.1.1' in out)
300
        self.assertTrue('      branch 2' in out)
301
        self.assertTrue('revno: 1.1.1' in out)
302
        self.assertTrue('  branch 1' in out)
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
303
        self.assertTrue('revno: 1\n' not in out)
304
        self.assertTrue('  first post' not in out)
305
        self.assertEqual('', err)
306
307
 
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
308
class TestLogEncodings(TestCaseInTempDir):
309
310
    _mu = u'\xb5'
311
    _message = u'Message with \xb5'
312
313
    # Encodings which can encode mu
314
    good_encodings = [
315
        'utf-8',
316
        'latin-1',
317
        'iso-8859-1',
318
        'cp437', # Common windows encoding
319
        'cp1251', # Alexander Belchenko's windows encoding
320
        'cp1258', # Common windows encoding
321
    ]
322
    # Encodings which cannot encode mu
323
    bad_encodings = [
324
        'ascii',
325
        'iso-8859-2',
326
        'koi8_r',
327
    ]
328
329
    def setUp(self):
330
        TestCaseInTempDir.setUp(self)
331
        self.user_encoding = bzrlib.user_encoding
332
333
    def tearDown(self):
334
        bzrlib.user_encoding = self.user_encoding
335
        TestCaseInTempDir.tearDown(self)
336
337
    def create_branch(self):
338
        bzr = self.run_bzr
339
        bzr('init')
340
        open('a', 'wb').write('some stuff\n')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
341
        bzr('add a')
342
        bzr(['commit', '-m', self._message])
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
343
344
    def try_encoding(self, encoding, fail=False):
345
        bzr = self.run_bzr
346
        if fail:
347
            self.assertRaises(UnicodeEncodeError,
348
                self._mu.encode, encoding)
349
            encoded_msg = self._message.encode(encoding, 'replace')
350
        else:
351
            encoded_msg = self._message.encode(encoding)
352
353
        old_encoding = bzrlib.user_encoding
354
        # This test requires that 'run_bzr' uses the current
355
        # bzrlib, because we override user_encoding, and expect
356
        # it to be used
357
        try:
358
            bzrlib.user_encoding = 'ascii'
359
            # We should be able to handle any encoding
360
            out, err = bzr('log', encoding=encoding)
361
            if not fail:
362
                # Make sure we wrote mu as we expected it to exist
363
                self.assertNotEqual(-1, out.find(encoded_msg))
364
                out_unicode = out.decode(encoding)
365
                self.assertNotEqual(-1, out_unicode.find(self._message))
366
            else:
367
                self.assertNotEqual(-1, out.find('Message with ?'))
368
        finally:
369
            bzrlib.user_encoding = old_encoding
370
371
    def test_log_handles_encoding(self):
372
        self.create_branch()
373
374
        for encoding in self.good_encodings:
375
            self.try_encoding(encoding)
376
377
    def test_log_handles_bad_encoding(self):
378
        self.create_branch()
379
380
        for encoding in self.bad_encodings:
381
            self.try_encoding(encoding, fail=True)
382
383
    def test_stdout_encoding(self):
384
        bzr = self.run_bzr
385
        bzrlib.user_encoding = "cp1251"
386
387
        bzr('init')
388
        self.build_tree(['a'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
389
        bzr('add a')
390
        bzr(['commit', '-m', u'\u0422\u0435\u0441\u0442'])
1685.1.5 by John Arbash Meinel
Merged test_log.py.moved into test_log.py
391
        stdout, stderr = self.run_bzr('log', encoding='cp866')
392
393
        message = stdout.splitlines()[-1]
394
395
        # explanation of the check:
396
        # u'\u0422\u0435\u0441\u0442' is word 'Test' in russian
397
        # in cp866  encoding this is string '\x92\xa5\xe1\xe2'
398
        # in cp1251 encoding this is string '\xd2\xe5\xf1\xf2'
399
        # This test should check that output of log command
400
        # encoded to sys.stdout.encoding
401
        test_in_cp866 = '\x92\xa5\xe1\xe2'
402
        test_in_cp1251 = '\xd2\xe5\xf1\xf2'
403
        # Make sure the log string is encoded in cp866
404
        self.assertEquals(test_in_cp866, message[2:])
405
        # Make sure the cp1251 string is not found anywhere
406
        self.assertEquals(-1, stdout.find(test_in_cp1251))
407
1551.10.18 by Aaron Bentley
Log works in local treeless branches (#84247)
408
409
class TestLogFile(TestCaseWithTransport):
410
411
    def test_log_local_branch_file(self):
412
        """We should be able to log files in local treeless branches"""
413
        tree = self.make_branch_and_tree('tree')
414
        self.build_tree(['tree/file'])
415
        tree.add('file')
416
        tree.commit('revision 1')
417
        tree.bzrdir.destroy_workingtree()
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
418
        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.
419
420
    def test_log_file(self):
421
        """The log for a particular file should only list revs for that file"""
422
        tree = self.make_branch_and_tree('parent')
423
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
424
        tree.add('file1')
425
        tree.commit('add file1')
426
        tree.add('file2')
427
        tree.commit('add file2')
428
        tree.add('file3')
429
        tree.commit('add file3')
2664.14.1 by Daniel Watkins
Fixed tests.blackbox.test_log to use internals where appropriate.
430
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
431
        self.build_tree_contents([('child/file2', 'hello')])
432
        child_tree.commit(message='branch 1')
433
        tree.merge_from_branch(child_tree.branch)
434
        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.
435
        os.chdir('parent')
2581.1.6 by Martin Pool
fix up more run_bzr callers
436
        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.
437
        self.assertContainsRe(log, 'revno: 1\n')
438
        self.assertNotContainsRe(log, 'revno: 2\n')
439
        self.assertNotContainsRe(log, 'revno: 3\n')
440
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
441
        self.assertNotContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
442
        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.
443
        self.assertNotContainsRe(log, 'revno: 1\n')
444
        self.assertContainsRe(log, 'revno: 2\n')
445
        self.assertNotContainsRe(log, 'revno: 3\n')
446
        self.assertContainsRe(log, 'revno: 3.1.1\n')
2359.1.2 by Kent Gibson
add logging of merge revisions
447
        self.assertContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
448
        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.
449
        self.assertNotContainsRe(log, 'revno: 1\n')
450
        self.assertNotContainsRe(log, 'revno: 2\n')
451
        self.assertContainsRe(log, 'revno: 3\n')
452
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
453
        self.assertNotContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
454
        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.
455
        self.assertNotContainsRe(log, 'revno: 1\n')
456
        self.assertNotContainsRe(log, 'revno: 2\n')
457
        self.assertNotContainsRe(log, 'revno: 3\n')
458
        self.assertContainsRe(log, 'revno: 3.1.1\n')
459
        self.assertNotContainsRe(log, 'revno: 4\n')
2581.1.6 by Martin Pool
fix up more run_bzr callers
460
        log = self.run_bzr('log -r4 file2')[0]
461
        self.assertNotContainsRe(log, 'revno: 1\n')
462
        self.assertNotContainsRe(log, 'revno: 2\n')
463
        self.assertNotContainsRe(log, 'revno: 3\n')
464
        self.assertContainsRe(log, 'revno: 3.1.1\n')
465
        self.assertContainsRe(log, 'revno: 4\n')
466
        log = self.run_bzr('log -r3.. file2')[0]
467
        self.assertNotContainsRe(log, 'revno: 1\n')
468
        self.assertNotContainsRe(log, 'revno: 2\n')
469
        self.assertNotContainsRe(log, 'revno: 3\n')
470
        self.assertContainsRe(log, 'revno: 3.1.1\n')
471
        self.assertContainsRe(log, 'revno: 4\n')
472
        log = self.run_bzr('log -r..3 file2')[0]
2466.12.1 by Kent Gibson
Fix ``bzr log -r`` to support selecting merge revisions.
473
        self.assertNotContainsRe(log, 'revno: 1\n')
474
        self.assertContainsRe(log, 'revno: 2\n')
475
        self.assertNotContainsRe(log, 'revno: 3\n')
476
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
477
        self.assertNotContainsRe(log, 'revno: 4\n')