/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2006-2009, 2011 Canonical Ltd
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
2
#
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.
7
#
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.
12
#
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
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
16
17
"""Whitebox tests for annotate functionality."""
18
2593.1.1 by Adeodato Simó
Improve annotate to prevent unicode exceptions in certain situations.
19
import codecs
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
20
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
21
from .. import (
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
22
    annotate,
23
    tests,
24
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
25
from ..sixish import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
26
    BytesIO,
27
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
28
from .ui_testing import StringIOWithEncoding
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
29
30
1551.9.19 by Aaron Bentley
Merge from bzr.dev
31
def annotation(text):
32
    return [tuple(l.split(' ', 1)) for l in text.splitlines(True)]
33
34
35
parent_1 = annotation("""\
36
rev1 a
37
rev2 b
38
rev3 c
39
rev4 d
40
rev5 e
41
""")
42
43
44
parent_2 = annotation("""\
45
rev1 a
46
rev3 c
47
rev4 d
48
rev6 f
49
rev7 e
50
rev8 h
51
""")
52
53
54
expected_2_1 = annotation("""\
55
rev1 a
56
blahblah b
57
rev3 c
58
rev4 d
59
rev7 e
60
""")
61
62
63
# a: in both, same value, kept
64
# b: in 1, kept
65
# c: in both, same value, kept
66
# d: in both, same value, kept
67
# e: 1 and 2 disagree, so it goes to blahblah
68
# f: in 2, but not in new, so ignored
69
# g: not in 1 or 2, so it goes to blahblah
70
# h: only in parent 2, so 2 gets it
71
expected_1_2_2 = annotation("""\
72
rev1 a
73
rev2 b
74
rev3 c
75
rev4 d
76
blahblah e
77
blahblah g
78
rev8 h
79
""")
80
81
82
new_1 = """\
83
a
84
b
85
c
86
d
87
e
88
""".splitlines(True)
89
2770.1.1 by Aaron Bentley
Initial implmentation of plain knit annotation
90
expected_1 = annotation("""\
91
blahblah a
92
blahblah b
93
blahblah c
94
blahblah d
95
blahblah e
96
""")
97
1551.9.19 by Aaron Bentley
Merge from bzr.dev
98
99
new_2 = """\
100
a
101
b
102
c
103
d
104
e
105
g
106
h
107
""".splitlines(True)
108
109
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
110
# For the 'duplicate' series, both sides introduce the same change, which then
111
# gets merged around. The last-modified should properly reflect this.
112
# We always change the fourth line so that the file is properly tracked as
113
# being modified in each revision. In reality, this probably would happen over
114
# many revisions, and it would be a different line that changes.
115
# BASE
116
#  |\
117
#  A B  # line should be annotated as new for A and B
118
#  |\|
3588.3.1 by John Arbash Meinel
Simple patch to the annotate logic to handle bug #232188
119
#  C D  # line should 'converge' and say A
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
120
#  |/
121
#  E    # D should supersede A and stay as D (not become E because C references
122
#         A)
123
duplicate_base = annotation("""\
124
rev-base first
125
rev-base second
126
rev-base third
127
rev-base fourth-base
128
""")
129
130
duplicate_A = annotation("""\
131
rev-base first
132
rev-A alt-second
133
rev-base third
134
rev-A fourth-A
135
""")
136
137
duplicate_B = annotation("""\
138
rev-base first
139
rev-B alt-second
140
rev-base third
141
rev-B fourth-B
142
""")
143
144
duplicate_C = annotation("""\
145
rev-base first
146
rev-A alt-second
147
rev-base third
148
rev-C fourth-C
149
""")
150
151
duplicate_D = annotation("""\
152
rev-base first
3588.3.1 by John Arbash Meinel
Simple patch to the annotate logic to handle bug #232188
153
rev-A alt-second
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
154
rev-base third
155
rev-D fourth-D
156
""")
157
158
duplicate_E = annotation("""\
159
rev-base first
3588.3.1 by John Arbash Meinel
Simple patch to the annotate logic to handle bug #232188
160
rev-A alt-second
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
161
rev-base third
162
rev-E fourth-E
163
""")
164
165
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
166
class TestAnnotate(tests.TestCaseWithTransport):
167
168
    def create_merged_trees(self):
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
169
        """create 2 trees with merges between them.
170
171
        rev-1 --+
172
         |      |
173
        rev-2  rev-1_1_1
174
         |      |
175
         +------+
176
         |
177
        rev-3
178
        """
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
179
        builder = self.make_branch_builder('branch')
180
        builder.start_series()
181
        self.addCleanup(builder.finish_series)
182
        builder.build_snapshot('rev-1', None, [
183
            ('add', ('', 'root-id', 'directory', None)),
184
            ('add', ('a', 'a-id', 'file', 'first\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
185
            ], timestamp=1166046000.00, timezone=0, committer="joe@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
186
        builder.build_snapshot('rev-2', ['rev-1'], [
187
            ('modify', ('a-id', 'first\nsecond\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
188
            ], timestamp=1166046001.00, timezone=0, committer="joe@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
189
        builder.build_snapshot('rev-1_1_1', ['rev-1'], [
190
            ('modify', ('a-id', 'first\nthird\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
191
            ], timestamp=1166046002.00, timezone=0, committer="barry@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
192
        builder.build_snapshot('rev-3', ['rev-2', 'rev-1_1_1'], [
193
            ('modify', ('a-id', 'first\nsecond\nthird\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
194
            ], timestamp=1166046003.00, timezone=0, committer="sal@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
195
        return builder
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
196
197
    def create_deeply_merged_trees(self):
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
198
        """Create some trees with a more complex merge history.
199
200
        rev-1 --+
201
         |      |
202
        rev-2  rev-1_1_1 --+
203
         |      |          |
204
         +------+          |
205
         |      |          |
3170.3.4 by John Arbash Meinel
Update the tests for the new revision numbering.
206
        rev-3  rev-1_1_2  rev-1_2_1 ------+
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
207
         |      |          |              |
208
         +------+          |              |
209
         |                 |              |
3170.3.4 by John Arbash Meinel
Update the tests for the new revision numbering.
210
        rev-4             rev-1_2_2  rev-1_3_1
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
211
         |                 |              |
212
         +-----------------+              |
213
         |                                |
214
        rev-5                             |
215
         |                                |
216
         +--------------------------------+
217
         |
218
        rev-6
219
        """
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
220
        builder = self.create_merged_trees()
221
        builder.build_snapshot('rev-1_1_2', ['rev-1_1_1'], [])
222
        builder.build_snapshot('rev-4', ['rev-3', 'rev-1_1_2'], [])
223
        builder.build_snapshot('rev-1_2_1', ['rev-1_1_1'], [
224
            ('modify', ('a-id', 'first\nthird\nfourth\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
225
            ], timestamp=1166046003.00, timezone=0, committer="jerry@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
226
        builder.build_snapshot('rev-1_2_2', ['rev-1_2_1'], [],
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
227
            timestamp=1166046004.00, timezone=0, committer="jerry@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
228
        builder.build_snapshot('rev-5', ['rev-4', 'rev-1_2_2'], [
229
            ('modify', ('a-id', 'first\nsecond\nthird\nfourth\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
230
            ], timestamp=1166046004.00, timezone=0, committer="jerry@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
231
        builder.build_snapshot('rev-1_3_1', ['rev-1_2_1'], [
232
            ('modify', ('a-id', 'first\nthird\nfourth\nfifth\nsixth\n')),
4523.2.1 by Vincent Ladeuil
Fix TZ-dependent tests.
233
            ], timestamp=1166046005.00, timezone=0, committer="george@foo.com")
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
234
        builder.build_snapshot('rev-6', ['rev-5', 'rev-1_3_1'], [
235
            ('modify', ('a-id',
236
                        'first\nsecond\nthird\nfourth\nfifth\nsixth\n')),
237
            ])
238
        return builder
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
239
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
240
    def create_duplicate_lines_tree(self):
4454.3.25 by John Arbash Meinel
Use BranchBuilder for duplicate_lines_tree
241
        builder = self.make_branch_builder('branch')
242
        builder.start_series()
243
        self.addCleanup(builder.finish_series)
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
244
        base_text = ''.join(l for r, l in duplicate_base)
245
        a_text = ''.join(l for r, l in duplicate_A)
246
        b_text = ''.join(l for r, l in duplicate_B)
247
        c_text = ''.join(l for r, l in duplicate_C)
248
        d_text = ''.join(l for r, l in duplicate_D)
249
        e_text = ''.join(l for r, l in duplicate_E)
4454.3.25 by John Arbash Meinel
Use BranchBuilder for duplicate_lines_tree
250
        builder.build_snapshot('rev-base', None, [
251
            ('add', ('', 'root-id', 'directory', None)),
252
            ('add', ('file', 'file-id', 'file', base_text)),
253
            ])
254
        builder.build_snapshot('rev-A', ['rev-base'], [
255
            ('modify', ('file-id', a_text))])
256
        builder.build_snapshot('rev-B', ['rev-base'], [
257
            ('modify', ('file-id', b_text))])
258
        builder.build_snapshot('rev-C', ['rev-A'], [
259
            ('modify', ('file-id', c_text))])
260
        builder.build_snapshot('rev-D', ['rev-B', 'rev-A'], [
261
            ('modify', ('file-id', d_text))])
262
        builder.build_snapshot('rev-E', ['rev-C', 'rev-D'], [
263
            ('modify', ('file-id', e_text))])
264
        return builder
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
265
5815.3.7 by Jelmer Vernooij
Factor out assertAnnotateEqualDiff.
266
    def assertAnnotateEqualDiff(self, actual, expected):
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
267
        if actual != expected:
268
            # Create an easier to understand diff when the lines don't actually
269
            # match
270
            self.assertEqualDiff(''.join('\t'.join(l) for l in expected),
271
                                 ''.join('\t'.join(l) for l in actual))
272
5815.3.8 by Jelmer Vernooij
Add convenience method for testing annotate_file_revision_tree.
273
    def assertBranchAnnotate(self, expected, branch, file_id, revision_id,
274
            verbose=False, full=False, show_ids=False):
275
        tree = branch.repository.revision_tree(revision_id)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
276
        to_file = BytesIO()
5815.3.14 by Jelmer Vernooij
Kill annotate_file_revision_tree() in favor annotate_file_tree().
277
        annotate.annotate_file_tree(tree, file_id, to_file,
5815.3.8 by Jelmer Vernooij
Add convenience method for testing annotate_file_revision_tree.
278
            verbose=verbose, full=full, show_ids=show_ids, branch=branch)
279
        self.assertAnnotateEqualDiff(to_file.getvalue(), expected)
280
5815.3.7 by Jelmer Vernooij
Factor out assertAnnotateEqualDiff.
281
    def assertRepoAnnotate(self, expected, repo, file_id, revision_id):
282
        """Assert that the revision is properly annotated."""
283
        actual = list(repo.revision_tree(revision_id).annotate_iter(file_id))
284
        self.assertAnnotateEqualDiff(actual, expected)
285
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
286
    def test_annotate_duplicate_lines(self):
3689.1.4 by John Arbash Meinel
Doc strings that reference repository_implementations
287
        # XXX: Should this be a per_repository test?
4454.3.25 by John Arbash Meinel
Use BranchBuilder for duplicate_lines_tree
288
        builder = self.create_duplicate_lines_tree()
289
        repo = builder.get_branch().repository
3224.1.4 by John Arbash Meinel
Add a *failing* test to expose why we need better handling when a line is introduced on two sides of a merge.
290
        repo.lock_read()
291
        self.addCleanup(repo.unlock)
292
        self.assertRepoAnnotate(duplicate_base, repo, 'file-id', 'rev-base')
293
        self.assertRepoAnnotate(duplicate_A, repo, 'file-id', 'rev-A')
294
        self.assertRepoAnnotate(duplicate_B, repo, 'file-id', 'rev-B')
295
        self.assertRepoAnnotate(duplicate_C, repo, 'file-id', 'rev-C')
296
        self.assertRepoAnnotate(duplicate_D, repo, 'file-id', 'rev-D')
297
        self.assertRepoAnnotate(duplicate_E, repo, 'file-id', 'rev-E')
298
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
299
    def test_annotate_shows_dotted_revnos(self):
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
300
        builder = self.create_merged_trees()
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
301
5815.3.8 by Jelmer Vernooij
Add convenience method for testing annotate_file_revision_tree.
302
        self.assertBranchAnnotate('1     joe@foo | first\n'
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
303
                                  '2     joe@foo | second\n'
304
                                  '1.1.1 barry@f | third\n',
305
                                  builder.get_branch(), 'a-id', 'rev-3')
306
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
307
    def test_annotate_limits_dotted_revnos(self):
308
        """Annotate should limit dotted revnos to a depth of 12"""
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
309
        builder = self.create_deeply_merged_trees()
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
310
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
311
        self.assertBranchAnnotate('1     joe@foo | first\n'
312
                                  '2     joe@foo | second\n'
313
                                  '1.1.1 barry@f | third\n'
314
                                  '1.2.1 jerry@f | fourth\n'
315
                                  '1.3.1 george@ | fifth\n'
316
                                  '              | sixth\n',
317
                                  builder.get_branch(), 'a-id', 'rev-6',
318
                                  verbose=False, full=False)
2182.3.4 by John Arbash Meinel
add show-ids and test that nearby areas are collapsed without full
319
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
320
        self.assertBranchAnnotate('1     joe@foo | first\n'
321
                                  '2     joe@foo | second\n'
322
                                  '1.1.1 barry@f | third\n'
323
                                  '1.2.1 jerry@f | fourth\n'
324
                                  '1.3.1 george@ | fifth\n'
325
                                  '1.3.1 george@ | sixth\n',
326
                                  builder.get_branch(), 'a-id', 'rev-6',
327
                                  verbose=False, full=True)
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
328
329
        # verbose=True shows everything, the full revno, user id, and date
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
330
        self.assertBranchAnnotate('1     joe@foo.com    20061213 | first\n'
331
                                  '2     joe@foo.com    20061213 | second\n'
332
                                  '1.1.1 barry@foo.com  20061213 | third\n'
333
                                  '1.2.1 jerry@foo.com  20061213 | fourth\n'
334
                                  '1.3.1 george@foo.com 20061213 | fifth\n'
335
                                  '                              | sixth\n',
336
                                  builder.get_branch(), 'a-id', 'rev-6',
337
                                  verbose=True, full=False)
2182.3.4 by John Arbash Meinel
add show-ids and test that nearby areas are collapsed without full
338
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
339
        self.assertBranchAnnotate('1     joe@foo.com    20061213 | first\n'
340
                                  '2     joe@foo.com    20061213 | second\n'
341
                                  '1.1.1 barry@foo.com  20061213 | third\n'
342
                                  '1.2.1 jerry@foo.com  20061213 | fourth\n'
343
                                  '1.3.1 george@foo.com 20061213 | fifth\n'
344
                                  '1.3.1 george@foo.com 20061213 | sixth\n',
345
                                  builder.get_branch(), 'a-id', 'rev-6',
346
                                  verbose=True, full=True)
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
347
348
    def test_annotate_uses_branch_context(self):
349
        """Dotted revnos should use the Branch context.
350
351
        When annotating a non-mainline revision, the annotation should still
352
        use dotted revnos from the mainline.
353
        """
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
354
        builder = self.create_deeply_merged_trees()
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
355
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
356
        self.assertBranchAnnotate('1     joe@foo | first\n'
357
                                  '1.1.1 barry@f | third\n'
358
                                  '1.2.1 jerry@f | fourth\n'
359
                                  '1.3.1 george@ | fifth\n'
360
                                  '              | sixth\n',
361
                                  builder.get_branch(), 'a-id', 'rev-1_3_1',
362
                                  verbose=False, full=False)
2245.3.1 by John Arbash Meinel
bzr annotate should use Branch's dotted revnos.
363
2182.3.4 by John Arbash Meinel
add show-ids and test that nearby areas are collapsed without full
364
    def test_annotate_show_ids(self):
4454.3.24 by John Arbash Meinel
update BranchBuilder to support 'committer'
365
        builder = self.create_deeply_merged_trees()
2182.3.4 by John Arbash Meinel
add show-ids and test that nearby areas are collapsed without full
366
367
        # It looks better with real revision ids :)
5815.3.9 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
368
        self.assertBranchAnnotate('    rev-1 | first\n'
369
                                  '    rev-2 | second\n'
370
                                  'rev-1_1_1 | third\n'
371
                                  'rev-1_2_1 | fourth\n'
372
                                  'rev-1_3_1 | fifth\n'
373
                                  '          | sixth\n',
374
                                  builder.get_branch(), 'a-id', 'rev-6',
375
                                  show_ids=True, full=False)
376
377
        self.assertBranchAnnotate('    rev-1 | first\n'
378
                                  '    rev-2 | second\n'
379
                                  'rev-1_1_1 | third\n'
380
                                  'rev-1_2_1 | fourth\n'
381
                                  'rev-1_3_1 | fifth\n'
382
                                  'rev-1_3_1 | sixth\n',
383
                                  builder.get_branch(), 'a-id', 'rev-6',
384
                                  show_ids=True, full=True)
1551.9.19 by Aaron Bentley
Merge from bzr.dev
385
2593.1.1 by Adeodato Simó
Improve annotate to prevent unicode exceptions in certain situations.
386
    def test_annotate_unicode_author(self):
387
        tree1 = self.make_branch_and_tree('tree1')
388
389
        self.build_tree_contents([('tree1/a', 'adi\xc3\xb3s')])
390
        tree1.add(['a'], ['a-id'])
391
        tree1.commit('a', rev_id='rev-1',
392
                     committer=u'Pepe P\xe9rez <pperez@ejemplo.com>',
393
                     timestamp=1166046000.00, timezone=0)
394
395
        self.build_tree_contents([('tree1/b', 'bye')])
396
        tree1.add(['b'], ['b-id'])
397
        tree1.commit('b', rev_id='rev-2',
398
                     committer=u'p\xe9rez',
399
                     timestamp=1166046000.00, timezone=0)
400
3010.1.1 by Robert Collins
Lock the tree's used to test annotate_file, and add a docstring for annotate_file explaining its needs.
401
        tree1.lock_read()
402
        self.addCleanup(tree1.unlock)
5815.3.10 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
403
404
        revtree_1 = tree1.branch.repository.revision_tree('rev-1')
405
        revtree_2 = tree1.branch.repository.revision_tree('rev-2')
406
2593.1.2 by Adeodato Simó
Improve tests a bit, actually checking for the replace encoding.
407
        # this passes if no exception is raised
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
408
        to_file = BytesIO()
5815.3.14 by Jelmer Vernooij
Kill annotate_file_revision_tree() in favor annotate_file_tree().
409
        annotate.annotate_file_tree(revtree_1, 'a-id',
5815.3.10 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
410
            to_file=to_file, branch=tree1.branch)
2593.1.1 by Adeodato Simó
Improve annotate to prevent unicode exceptions in certain situations.
411
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
412
        sio = BytesIO()
413
        to_file = codecs.getwriter('ascii')(sio, 'replace')
5815.3.14 by Jelmer Vernooij
Kill annotate_file_revision_tree() in favor annotate_file_tree().
414
        annotate.annotate_file_tree(revtree_2, 'b-id',
5815.3.10 by Jelmer Vernooij
Convert more tests to use annotate_file_revision_tree.
415
            to_file=to_file, branch=tree1.branch)
2593.1.2 by Adeodato Simó
Improve tests a bit, actually checking for the replace encoding.
416
        self.assertEqualDiff('2   p?rez   | bye\n', sio.getvalue())
2593.1.1 by Adeodato Simó
Improve annotate to prevent unicode exceptions in certain situations.
417
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
418
        # test now with unicode file-like
419
        to_file = StringIOWithEncoding()
420
        annotate.annotate_file_tree(revtree_2, 'b-id',
421
            to_file=to_file, branch=tree1.branch)
422
        self.assertContainsRe(u'2   p\xe9rez   | bye\n', to_file.getvalue())
2593.1.3 by Adeodato Simó
Cope with to_file.encoding being None or not present.
423
2671.5.3 by Lukáš Lalinsky
Use the author name in annotate.
424
    def test_annotate_author_or_committer(self):
425
        tree1 = self.make_branch_and_tree('tree1')
426
427
        self.build_tree_contents([('tree1/a', 'hello')])
428
        tree1.add(['a'], ['a-id'])
429
        tree1.commit('a', rev_id='rev-1',
430
                     committer='Committer <committer@example.com>',
431
                     timestamp=1166046000.00, timezone=0)
432
433
        self.build_tree_contents([('tree1/b', 'bye')])
434
        tree1.add(['b'], ['b-id'])
435
        tree1.commit('b', rev_id='rev-2',
436
                     committer='Committer <committer@example.com>',
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
437
                     authors=['Author <author@example.com>'],
2671.5.3 by Lukáš Lalinsky
Use the author name in annotate.
438
                     timestamp=1166046000.00, timezone=0)
439
3010.1.1 by Robert Collins
Lock the tree's used to test annotate_file, and add a docstring for annotate_file explaining its needs.
440
        tree1.lock_read()
441
        self.addCleanup(tree1.unlock)
5815.3.11 by Jelmer Vernooij
Remove last use of deprecated method.
442
443
        self.assertBranchAnnotate('1   committ | hello\n', tree1.branch,
444
            'a-id', 'rev-1')
445
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
446
        to_file = BytesIO()
5815.3.11 by Jelmer Vernooij
Remove last use of deprecated method.
447
        self.assertBranchAnnotate('2   author@ | bye\n', tree1.branch,
448
            'b-id', 'rev-2')
2671.5.3 by Lukáš Lalinsky
Use the author name in annotate.
449
1551.9.19 by Aaron Bentley
Merge from bzr.dev
450
451
class TestReannotate(tests.TestCase):
452
2770.1.5 by Aaron Bentley
Clean up docs, test matching blocks for reannotate
453
    def annotateEqual(self, expected, parents, newlines, revision_id,
454
                      blocks=None):
1551.9.19 by Aaron Bentley
Merge from bzr.dev
455
        annotate_list = list(annotate.reannotate(parents, newlines,
2770.1.5 by Aaron Bentley
Clean up docs, test matching blocks for reannotate
456
                             revision_id, blocks))
1551.9.19 by Aaron Bentley
Merge from bzr.dev
457
        self.assertEqual(len(expected), len(annotate_list))
458
        for e, a in zip(expected, annotate_list):
459
            self.assertEqual(e, a)
460
461
    def test_reannotate(self):
462
        self.annotateEqual(parent_1, [parent_1], new_1, 'blahblah')
463
        self.annotateEqual(expected_2_1, [parent_2], new_1, 'blahblah')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
464
        self.annotateEqual(expected_1_2_2, [parent_1, parent_2], new_2,
1551.9.19 by Aaron Bentley
Merge from bzr.dev
465
                           'blahblah')
2770.1.1 by Aaron Bentley
Initial implmentation of plain knit annotation
466
467
    def test_reannotate_no_parents(self):
468
        self.annotateEqual(expected_1, [], new_1, 'blahblah')
2770.1.5 by Aaron Bentley
Clean up docs, test matching blocks for reannotate
469
470
    def test_reannotate_left_matching_blocks(self):
471
        """Ensure that left_matching_blocks has an impact.
472
473
        In this case, the annotation is ambiguous, so the hint isn't actually
474
        lying.
475
        """
476
        parent = [('rev1', 'a\n')]
477
        new_text = ['a\n', 'a\n']
478
        blocks = [(0, 0, 1), (1, 2, 0)]
479
        self.annotateEqual([('rev1', 'a\n'), ('rev2', 'a\n')], [parent],
480
                           new_text, 'rev2', blocks)
481
        blocks = [(0, 1, 1), (1, 2, 0)]
482
        self.annotateEqual([('rev2', 'a\n'), ('rev1', 'a\n')], [parent],
483
                           new_text, 'rev2', blocks)