/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/test_annotate.py

  • Committer: Jelmer Vernooij
  • Date: 2018-07-02 20:37:44 UTC
  • mfrom: (7025 work)
  • mto: This revision was merged to the branch mainline in revision 7027.
  • Revision ID: jelmer@jelmer.uk-20180702203744-3i0bimk0r5pfzjzl
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
 
30
30
 
31
31
def annotation(text):
32
 
    return [tuple(l.split(' ', 1)) for l in text.splitlines(True)]
33
 
 
34
 
 
35
 
parent_1 = annotation("""\
 
32
    return [tuple(l.split(b' ', 1)) for l in text.splitlines(True)]
 
33
 
 
34
 
 
35
parent_1 = annotation(b"""\
36
36
rev1 a
37
37
rev2 b
38
38
rev3 c
41
41
""")
42
42
 
43
43
 
44
 
parent_2 = annotation("""\
 
44
parent_2 = annotation(b"""\
45
45
rev1 a
46
46
rev3 c
47
47
rev4 d
51
51
""")
52
52
 
53
53
 
54
 
expected_2_1 = annotation("""\
 
54
expected_2_1 = annotation(b"""\
55
55
rev1 a
56
56
blahblah b
57
57
rev3 c
68
68
# f: in 2, but not in new, so ignored
69
69
# g: not in 1 or 2, so it goes to blahblah
70
70
# h: only in parent 2, so 2 gets it
71
 
expected_1_2_2 = annotation("""\
 
71
expected_1_2_2 = annotation(b"""\
72
72
rev1 a
73
73
rev2 b
74
74
rev3 c
79
79
""")
80
80
 
81
81
 
82
 
new_1 = """\
 
82
new_1 = b"""\
83
83
a
84
84
b
85
85
c
87
87
e
88
88
""".splitlines(True)
89
89
 
90
 
expected_1 = annotation("""\
 
90
expected_1 = annotation(b"""\
91
91
blahblah a
92
92
blahblah b
93
93
blahblah c
96
96
""")
97
97
 
98
98
 
99
 
new_2 = """\
 
99
new_2 = b"""\
100
100
a
101
101
b
102
102
c
120
120
#  |/
121
121
#  E    # D should supersede A and stay as D (not become E because C references
122
122
#         A)
123
 
duplicate_base = annotation("""\
 
123
duplicate_base = annotation(b"""\
124
124
rev-base first
125
125
rev-base second
126
126
rev-base third
127
127
rev-base fourth-base
128
128
""")
129
129
 
130
 
duplicate_A = annotation("""\
 
130
duplicate_A = annotation(b"""\
131
131
rev-base first
132
132
rev-A alt-second
133
133
rev-base third
134
134
rev-A fourth-A
135
135
""")
136
136
 
137
 
duplicate_B = annotation("""\
 
137
duplicate_B = annotation(b"""\
138
138
rev-base first
139
139
rev-B alt-second
140
140
rev-base third
141
141
rev-B fourth-B
142
142
""")
143
143
 
144
 
duplicate_C = annotation("""\
 
144
duplicate_C = annotation(b"""\
145
145
rev-base first
146
146
rev-A alt-second
147
147
rev-base third
148
148
rev-C fourth-C
149
149
""")
150
150
 
151
 
duplicate_D = annotation("""\
 
151
duplicate_D = annotation(b"""\
152
152
rev-base first
153
153
rev-A alt-second
154
154
rev-base third
155
155
rev-D fourth-D
156
156
""")
157
157
 
158
 
duplicate_E = annotation("""\
 
158
duplicate_E = annotation(b"""\
159
159
rev-base first
160
160
rev-A alt-second
161
161
rev-base third
180
180
        builder.start_series()
181
181
        self.addCleanup(builder.finish_series)
182
182
        builder.build_snapshot(None, [
183
 
            ('add', ('', 'root-id', 'directory', None)),
184
 
            ('add', ('a', 'a-id', 'file', 'first\n')),
 
183
            ('add', ('', b'root-id', 'directory', None)),
 
184
            ('add', ('a', b'a-id', 'file', 'first\n')),
185
185
            ], timestamp=1166046000.00, timezone=0, committer="joe@foo.com",
186
186
            revision_id=b'rev-1')
187
 
        builder.build_snapshot(['rev-1'], [
188
 
            ('modify', ('a', 'first\nsecond\n')),
 
187
        builder.build_snapshot([b'rev-1'], [
 
188
            ('modify', ('a', b'first\nsecond\n')),
189
189
            ], timestamp=1166046001.00, timezone=0, committer="joe@foo.com",
190
190
            revision_id=b'rev-2')
191
 
        builder.build_snapshot(['rev-1'], [
192
 
            ('modify', ('a', 'first\nthird\n')),
 
191
        builder.build_snapshot([b'rev-1'], [
 
192
            ('modify', ('a', b'first\nthird\n')),
193
193
            ], timestamp=1166046002.00, timezone=0, committer="barry@foo.com",
194
194
            revision_id=b'rev-1_1_1')
195
 
        builder.build_snapshot(['rev-2', 'rev-1_1_1'], [
196
 
            ('modify', ('a', 'first\nsecond\nthird\n')),
 
195
        builder.build_snapshot([b'rev-2', b'rev-1_1_1'], [
 
196
            ('modify', ('a', b'first\nsecond\nthird\n')),
197
197
            ], timestamp=1166046003.00, timezone=0, committer="sal@foo.com",
198
198
            revision_id=b'rev-3')
199
199
        return builder
222
222
        rev-6
223
223
        """
224
224
        builder = self.create_merged_trees()
225
 
        builder.build_snapshot(['rev-1_1_1'], [], revision_id=b'rev-1_1_2')
226
 
        builder.build_snapshot(['rev-3', 'rev-1_1_2'], [], revision_id=b'rev-4')
227
 
        builder.build_snapshot(['rev-1_1_1'], [
228
 
            ('modify', ('a', 'first\nthird\nfourth\n')),
 
225
        builder.build_snapshot([b'rev-1_1_1'], [], revision_id=b'rev-1_1_2')
 
226
        builder.build_snapshot([b'rev-3', b'rev-1_1_2'], [], revision_id=b'rev-4')
 
227
        builder.build_snapshot([b'rev-1_1_1'], [
 
228
            ('modify', ('a', b'first\nthird\nfourth\n')),
229
229
            ], timestamp=1166046003.00, timezone=0, committer="jerry@foo.com",
230
230
            revision_id=b'rev-1_2_1')
231
 
        builder.build_snapshot(['rev-1_2_1'], [],
 
231
        builder.build_snapshot([b'rev-1_2_1'], [],
232
232
            timestamp=1166046004.00, timezone=0, committer="jerry@foo.com",
233
233
            revision_id=b'rev-1_2_2')
234
 
        builder.build_snapshot(['rev-4', 'rev-1_2_2'], [
235
 
            ('modify', ('a', 'first\nsecond\nthird\nfourth\n')),
 
234
        builder.build_snapshot([b'rev-4', b'rev-1_2_2'], [
 
235
            ('modify', ('a', b'first\nsecond\nthird\nfourth\n')),
236
236
            ], timestamp=1166046004.00, timezone=0, committer="jerry@foo.com",
237
237
            revision_id=b'rev-5')
238
 
        builder.build_snapshot(['rev-1_2_1'], [
239
 
            ('modify', ('a', 'first\nthird\nfourth\nfifth\nsixth\n')),
 
238
        builder.build_snapshot([b'rev-1_2_1'], [
 
239
            ('modify', ('a', b'first\nthird\nfourth\nfifth\nsixth\n')),
240
240
            ], timestamp=1166046005.00, timezone=0, committer="george@foo.com",
241
241
            revision_id=b'rev-1_3_1')
242
 
        builder.build_snapshot(['rev-5', 'rev-1_3_1'], [
 
242
        builder.build_snapshot([b'rev-5', b'rev-1_3_1'], [
243
243
            ('modify', ('a',
244
 
                        'first\nsecond\nthird\nfourth\nfifth\nsixth\n')),
 
244
                        b'first\nsecond\nthird\nfourth\nfifth\nsixth\n')),
245
245
            ], revision_id=b'rev-6')
246
246
        return builder
247
247
 
249
249
        builder = self.make_branch_builder('branch')
250
250
        builder.start_series()
251
251
        self.addCleanup(builder.finish_series)
252
 
        base_text = ''.join(l for r, l in duplicate_base)
253
 
        a_text = ''.join(l for r, l in duplicate_A)
254
 
        b_text = ''.join(l for r, l in duplicate_B)
255
 
        c_text = ''.join(l for r, l in duplicate_C)
256
 
        d_text = ''.join(l for r, l in duplicate_D)
257
 
        e_text = ''.join(l for r, l in duplicate_E)
 
252
        base_text = b''.join(l for r, l in duplicate_base)
 
253
        a_text = b''.join(l for r, l in duplicate_A)
 
254
        b_text = b''.join(l for r, l in duplicate_B)
 
255
        c_text = b''.join(l for r, l in duplicate_C)
 
256
        d_text = b''.join(l for r, l in duplicate_D)
 
257
        e_text = b''.join(l for r, l in duplicate_E)
258
258
        builder.build_snapshot(None, [
259
 
            ('add', ('', 'root-id', 'directory', None)),
260
 
            ('add', ('file', 'file-id', 'file', base_text)),
 
259
            ('add', ('', b'root-id', 'directory', None)),
 
260
            ('add', ('file', b'file-id', 'file', base_text)),
261
261
            ], revision_id=b'rev-base')
262
 
        builder.build_snapshot(['rev-base'], [
 
262
        builder.build_snapshot([b'rev-base'], [
263
263
            ('modify', ('file', a_text))],
264
264
            revision_id=b'rev-A')
265
 
        builder.build_snapshot(['rev-base'], [
 
265
        builder.build_snapshot([b'rev-base'], [
266
266
            ('modify', ('file', b_text))],
267
267
            revision_id=b'rev-B')
268
 
        builder.build_snapshot(['rev-A'], [
 
268
        builder.build_snapshot([b'rev-A'], [
269
269
            ('modify', ('file', c_text))],
270
270
            revision_id=b'rev-C')
271
 
        builder.build_snapshot(['rev-B', 'rev-A'], [
 
271
        builder.build_snapshot([b'rev-B', b'rev-A'], [
272
272
            ('modify', ('file', d_text))],
273
273
            revision_id=b'rev-D')
274
 
        builder.build_snapshot(['rev-C', 'rev-D'], [
 
274
        builder.build_snapshot([b'rev-C', b'rev-D'], [
275
275
            ('modify', ('file', e_text))],
276
276
            revision_id=b'rev-E')
277
277
        return builder
280
280
        if actual != expected:
281
281
            # Create an easier to understand diff when the lines don't actually
282
282
            # match
283
 
            self.assertEqualDiff(''.join('\t'.join(l) for l in expected),
284
 
                                 ''.join('\t'.join(l) for l in actual))
 
283
            self.assertEqualDiff(b''.join('\t'.join(l) for l in expected),
 
284
                                 b''.join('\t'.join(l) for l in actual))
285
285
 
286
286
    def assertBranchAnnotate(self, expected, branch, path, revision_id,
287
287
            verbose=False, full=False, show_ids=False):
302
302
        repo = builder.get_branch().repository
303
303
        repo.lock_read()
304
304
        self.addCleanup(repo.unlock)
305
 
        self.assertRepoAnnotate(duplicate_base, repo, 'file', 'rev-base')
306
 
        self.assertRepoAnnotate(duplicate_A, repo, 'file', 'rev-A')
307
 
        self.assertRepoAnnotate(duplicate_B, repo, 'file', 'rev-B')
308
 
        self.assertRepoAnnotate(duplicate_C, repo, 'file', 'rev-C')
309
 
        self.assertRepoAnnotate(duplicate_D, repo, 'file', 'rev-D')
310
 
        self.assertRepoAnnotate(duplicate_E, repo, 'file', 'rev-E')
 
305
        self.assertRepoAnnotate(duplicate_base, repo, 'file', b'rev-base')
 
306
        self.assertRepoAnnotate(duplicate_A, repo, 'file', b'rev-A')
 
307
        self.assertRepoAnnotate(duplicate_B, repo, 'file', b'rev-B')
 
308
        self.assertRepoAnnotate(duplicate_C, repo, 'file', b'rev-C')
 
309
        self.assertRepoAnnotate(duplicate_D, repo, 'file', b'rev-D')
 
310
        self.assertRepoAnnotate(duplicate_E, repo, 'file', b'rev-E')
311
311
 
312
312
    def test_annotate_shows_dotted_revnos(self):
313
313
        builder = self.create_merged_trees()
314
314
 
315
 
        self.assertBranchAnnotate('1     joe@foo | first\n'
316
 
                                  '2     joe@foo | second\n'
317
 
                                  '1.1.1 barry@f | third\n',
318
 
                                  builder.get_branch(), 'a', 'rev-3')
 
315
        self.assertBranchAnnotate(b'1     joe@foo | first\n'
 
316
                                  b'2     joe@foo | second\n'
 
317
                                  b'1.1.1 barry@f | third\n',
 
318
                                  builder.get_branch(), 'a', b'rev-3')
319
319
 
320
320
    def test_annotate_limits_dotted_revnos(self):
321
321
        """Annotate should limit dotted revnos to a depth of 12"""
322
322
        builder = self.create_deeply_merged_trees()
323
323
 
324
 
        self.assertBranchAnnotate('1     joe@foo | first\n'
325
 
                                  '2     joe@foo | second\n'
326
 
                                  '1.1.1 barry@f | third\n'
327
 
                                  '1.2.1 jerry@f | fourth\n'
328
 
                                  '1.3.1 george@ | fifth\n'
329
 
                                  '              | sixth\n',
330
 
                                  builder.get_branch(), 'a', 'rev-6',
 
324
        self.assertBranchAnnotate(b'1     joe@foo | first\n'
 
325
                                  b'2     joe@foo | second\n'
 
326
                                  b'1.1.1 barry@f | third\n'
 
327
                                  b'1.2.1 jerry@f | fourth\n'
 
328
                                  b'1.3.1 george@ | fifth\n'
 
329
                                  b'              | sixth\n',
 
330
                                  builder.get_branch(), 'a', b'rev-6',
331
331
                                  verbose=False, full=False)
332
332
 
333
 
        self.assertBranchAnnotate('1     joe@foo | first\n'
334
 
                                  '2     joe@foo | second\n'
335
 
                                  '1.1.1 barry@f | third\n'
336
 
                                  '1.2.1 jerry@f | fourth\n'
337
 
                                  '1.3.1 george@ | fifth\n'
338
 
                                  '1.3.1 george@ | sixth\n',
339
 
                                  builder.get_branch(), 'a', 'rev-6',
 
333
        self.assertBranchAnnotate(b'1     joe@foo | first\n'
 
334
                                  b'2     joe@foo | second\n'
 
335
                                  b'1.1.1 barry@f | third\n'
 
336
                                  b'1.2.1 jerry@f | fourth\n'
 
337
                                  b'1.3.1 george@ | fifth\n'
 
338
                                  b'1.3.1 george@ | sixth\n',
 
339
                                  builder.get_branch(), 'a', b'rev-6',
340
340
                                  verbose=False, full=True)
341
341
 
342
342
        # verbose=True shows everything, the full revno, user id, and date
343
 
        self.assertBranchAnnotate('1     joe@foo.com    20061213 | first\n'
344
 
                                  '2     joe@foo.com    20061213 | second\n'
345
 
                                  '1.1.1 barry@foo.com  20061213 | third\n'
346
 
                                  '1.2.1 jerry@foo.com  20061213 | fourth\n'
347
 
                                  '1.3.1 george@foo.com 20061213 | fifth\n'
348
 
                                  '                              | sixth\n',
349
 
                                  builder.get_branch(), 'a', 'rev-6',
 
343
        self.assertBranchAnnotate(b'1     joe@foo.com    20061213 | first\n'
 
344
                                  b'2     joe@foo.com    20061213 | second\n'
 
345
                                  b'1.1.1 barry@foo.com  20061213 | third\n'
 
346
                                  b'1.2.1 jerry@foo.com  20061213 | fourth\n'
 
347
                                  b'1.3.1 george@foo.com 20061213 | fifth\n'
 
348
                                  b'                              | sixth\n',
 
349
                                  builder.get_branch(), 'a', b'rev-6',
350
350
                                  verbose=True, full=False)
351
351
 
352
 
        self.assertBranchAnnotate('1     joe@foo.com    20061213 | first\n'
353
 
                                  '2     joe@foo.com    20061213 | second\n'
354
 
                                  '1.1.1 barry@foo.com  20061213 | third\n'
355
 
                                  '1.2.1 jerry@foo.com  20061213 | fourth\n'
356
 
                                  '1.3.1 george@foo.com 20061213 | fifth\n'
357
 
                                  '1.3.1 george@foo.com 20061213 | sixth\n',
358
 
                                  builder.get_branch(), 'a', 'rev-6',
 
352
        self.assertBranchAnnotate(b'1     joe@foo.com    20061213 | first\n'
 
353
                                  b'2     joe@foo.com    20061213 | second\n'
 
354
                                  b'1.1.1 barry@foo.com  20061213 | third\n'
 
355
                                  b'1.2.1 jerry@foo.com  20061213 | fourth\n'
 
356
                                  b'1.3.1 george@foo.com 20061213 | fifth\n'
 
357
                                  b'1.3.1 george@foo.com 20061213 | sixth\n',
 
358
                                  builder.get_branch(), 'a', b'rev-6',
359
359
                                  verbose=True, full=True)
360
360
 
361
361
    def test_annotate_uses_branch_context(self):
366
366
        """
367
367
        builder = self.create_deeply_merged_trees()
368
368
 
369
 
        self.assertBranchAnnotate('1     joe@foo | first\n'
370
 
                                  '1.1.1 barry@f | third\n'
371
 
                                  '1.2.1 jerry@f | fourth\n'
372
 
                                  '1.3.1 george@ | fifth\n'
373
 
                                  '              | sixth\n',
374
 
                                  builder.get_branch(), 'a', 'rev-1_3_1',
 
369
        self.assertBranchAnnotate(b'1     joe@foo | first\n'
 
370
                                  b'1.1.1 barry@f | third\n'
 
371
                                  b'1.2.1 jerry@f | fourth\n'
 
372
                                  b'1.3.1 george@ | fifth\n'
 
373
                                  b'              | sixth\n',
 
374
                                  builder.get_branch(), 'a', b'rev-1_3_1',
375
375
                                  verbose=False, full=False)
376
376
 
377
377
    def test_annotate_show_ids(self):
378
378
        builder = self.create_deeply_merged_trees()
379
379
 
380
380
        # It looks better with real revision ids :)
381
 
        self.assertBranchAnnotate('    rev-1 | first\n'
382
 
                                  '    rev-2 | second\n'
383
 
                                  'rev-1_1_1 | third\n'
384
 
                                  'rev-1_2_1 | fourth\n'
385
 
                                  'rev-1_3_1 | fifth\n'
386
 
                                  '          | sixth\n',
387
 
                                  builder.get_branch(), 'a', 'rev-6',
 
381
        self.assertBranchAnnotate(b'    rev-1 | first\n'
 
382
                                  b'    rev-2 | second\n'
 
383
                                  b'rev-1_1_1 | third\n'
 
384
                                  b'rev-1_2_1 | fourth\n'
 
385
                                  b'rev-1_3_1 | fifth\n'
 
386
                                  b'          | sixth\n',
 
387
                                  builder.get_branch(), 'a', b'rev-6',
388
388
                                  show_ids=True, full=False)
389
389
 
390
 
        self.assertBranchAnnotate('    rev-1 | first\n'
391
 
                                  '    rev-2 | second\n'
392
 
                                  'rev-1_1_1 | third\n'
393
 
                                  'rev-1_2_1 | fourth\n'
394
 
                                  'rev-1_3_1 | fifth\n'
395
 
                                  'rev-1_3_1 | sixth\n',
396
 
                                  builder.get_branch(), 'a', 'rev-6',
 
390
        self.assertBranchAnnotate(b'    rev-1 | first\n'
 
391
                                  b'    rev-2 | second\n'
 
392
                                  b'rev-1_1_1 | third\n'
 
393
                                  b'rev-1_2_1 | fourth\n'
 
394
                                  b'rev-1_3_1 | fifth\n'
 
395
                                  b'rev-1_3_1 | sixth\n',
 
396
                                  builder.get_branch(), 'a', b'rev-6',
397
397
                                  show_ids=True, full=True)
398
398
 
399
399
    def test_annotate_unicode_author(self):
426
426
        to_file = codecs.getwriter('ascii')(sio, 'replace')
427
427
        annotate.annotate_file_tree(revtree_2, 'b',
428
428
            to_file=to_file, branch=tree1.branch)
429
 
        self.assertEqualDiff('2   p?rez   | bye\n', sio.getvalue())
 
429
        self.assertEqualDiff(b'2   p?rez   | bye\n', sio.getvalue())
430
430
 
431
431
        # test now with unicode file-like
432
432
        to_file = StringIOWithEncoding()
453
453
        tree1.lock_read()
454
454
        self.addCleanup(tree1.unlock)
455
455
 
456
 
        self.assertBranchAnnotate('1   committ | hello\n', tree1.branch,
457
 
            'a', 'rev-1')
 
456
        self.assertBranchAnnotate(b'1   committ | hello\n', tree1.branch,
 
457
            'a', b'rev-1')
458
458
 
459
459
        to_file = BytesIO()
460
 
        self.assertBranchAnnotate('2   author@ | bye\n', tree1.branch,
461
 
            'b', 'rev-2')
 
460
        self.assertBranchAnnotate(b'2   author@ | bye\n', tree1.branch,
 
461
            'b', b'rev-2')
462
462
 
463
463
 
464
464
class TestReannotate(tests.TestCase):
472
472
            self.assertEqual(e, a)
473
473
 
474
474
    def test_reannotate(self):
475
 
        self.annotateEqual(parent_1, [parent_1], new_1, 'blahblah')
476
 
        self.annotateEqual(expected_2_1, [parent_2], new_1, 'blahblah')
 
475
        self.annotateEqual(parent_1, [parent_1], new_1, b'blahblah')
 
476
        self.annotateEqual(expected_2_1, [parent_2], new_1, b'blahblah')
477
477
        self.annotateEqual(expected_1_2_2, [parent_1, parent_2], new_2,
478
 
                           'blahblah')
 
478
                           b'blahblah')
479
479
 
480
480
    def test_reannotate_no_parents(self):
481
 
        self.annotateEqual(expected_1, [], new_1, 'blahblah')
 
481
        self.annotateEqual(expected_1, [], new_1, b'blahblah')
482
482
 
483
483
    def test_reannotate_left_matching_blocks(self):
484
484
        """Ensure that left_matching_blocks has an impact.
486
486
        In this case, the annotation is ambiguous, so the hint isn't actually
487
487
        lying.
488
488
        """
489
 
        parent = [('rev1', 'a\n')]
490
 
        new_text = ['a\n', 'a\n']
 
489
        parent = [(b'rev1', b'a\n')]
 
490
        new_text = [b'a\n', b'a\n']
491
491
        blocks = [(0, 0, 1), (1, 2, 0)]
492
 
        self.annotateEqual([('rev1', 'a\n'), ('rev2', 'a\n')], [parent],
493
 
                           new_text, 'rev2', blocks)
 
492
        self.annotateEqual([(b'rev1', b'a\n'), (b'rev2', b'a\n')], [parent],
 
493
                           new_text, b'rev2', blocks)
494
494
        blocks = [(0, 1, 1), (1, 2, 0)]
495
 
        self.annotateEqual([('rev2', 'a\n'), ('rev1', 'a\n')], [parent],
496
 
                           new_text, 'rev2', blocks)
 
495
        self.annotateEqual([(b'rev2', b'a\n'), (b'rev1', b'a\n')], [parent],
 
496
                           new_text, b'rev2', blocks)