63
64
tree.commit(message='merge')
66
def assertRevnos(self, log, must_have=(), must_not_have=()):
67
"""Check if revnos are in or not in the log output"""
68
for revno in must_have:
69
self.assertTrue(('revno: %s\n' % revno) in log,
70
'Does not contain expected revno %s' % revno)
71
for revno in must_not_have:
72
self.assertFalse(('revno: %s\n' % revno) in log,
73
'Contains unexpected revno %s' % revno)
75
def commit_options(self):
76
"""Use some mostly fixed values for commits to simplify tests.
78
Tests can use this function to get some commit attributes. The time
79
stamp is incremented at each commit.
81
self.timestamp += 1 # 1 second between each commit
82
return dict(committer='Lorem Ipsum <joe@foo.com>',
83
timezone=self.timezone,
84
timestamp=self.timestamp,
87
def check_log(self, expected, args, working_dir='level0'):
88
out, err = self.run_bzr(['log', '--timezone', 'utc'] + args,
89
working_dir=working_dir)
90
self.assertEqual('', err)
91
self.assertEqualDiff(expected, test_log.normalize_log(out))
94
class TestLogRevSpecs(TestLog):
68
class TestLogWithLogCatcher(TestLog):
71
super(TestLogWithLogCatcher, self).setUp()
72
# Capture log formatter creations
73
class MyLogFormatter(test_log.LogCatcher):
75
def __new__(klass, *args, **kwargs):
76
self.log_catcher = test_log.LogCatcher(*args, **kwargs)
77
# Always return our own log formatter
78
return self.log_catcher
80
self.addAttrCleanup(log.log_formatter_registry, 'get_default')
82
# Always return our own log formatter class hijacking the
83
# default behavior (which requires setting up a config
86
log.log_formatter_registry.get_default = getme
88
def get_captured_revisions(self):
89
return self.log_catcher.revisions
91
def assertLogRevnos(self, args, expected_revnos, working_dir='.'):
92
self.run_bzr(['log'] + args, working_dir=working_dir)
93
self.assertEqual(expected_revnos,
94
[r.revno for r in self.get_captured_revisions()])
96
def assertLogRevnosAndDepths(self, args, expected_revnos_and_depths,
98
self.run_bzr(['log'] + args, working_dir=working_dir)
99
self.assertEqual(expected_revnos_and_depths,
100
[(r.revno, r.merge_depth)
101
for r in self.get_captured_revisions()])
104
class TestLogRevSpecs(TestLogWithLogCatcher):
106
def test_log_no_revspec(self):
107
self.make_linear_branch()
108
self.assertLogRevnos([], ['3', '2', '1'])
96
110
def test_log_null_end_revspec(self):
97
111
self.make_linear_branch()
98
log = self.run_bzr(['log'])[0]
99
self.assertTrue('revno: 1\n' in log)
100
self.assertTrue('revno: 2\n' in log)
101
self.assertTrue('revno: 3\n' in log)
102
self.assertTrue('message:\n message1\n' in log)
103
self.assertTrue('message:\n message2\n' in log)
104
self.assertTrue('message:\n message3\n' in log)
106
full_log = self.run_bzr(['log'])[0]
107
log = self.run_bzr("log -r 1..")[0]
108
self.assertEqualDiff(log, full_log)
112
self.assertLogRevnos(['-r1..'], ['3', '2', '1'])
110
114
def test_log_null_begin_revspec(self):
111
115
self.make_linear_branch()
112
full_log = self.run_bzr(['log'])[0]
113
log = self.run_bzr("log -r ..3")[0]
114
self.assertEqualDiff(full_log, log)
116
self.assertLogRevnos(['-r..3'], ['3', '2', '1'])
116
118
def test_log_null_both_revspecs(self):
117
119
self.make_linear_branch()
118
full_log = self.run_bzr(['log'])[0]
119
log = self.run_bzr("log -r ..")[0]
120
self.assertEqualDiff(full_log, log)
122
def test_log_zero_revspec(self):
123
self.make_minimal_branch()
124
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
127
def test_log_zero_begin_revspec(self):
128
self.make_linear_branch()
129
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
132
def test_log_zero_end_revspec(self):
133
self.make_linear_branch()
134
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
120
self.assertLogRevnos(['-r..'], ['3', '2', '1'])
137
122
def test_log_negative_begin_revspec_full_log(self):
138
123
self.make_linear_branch()
139
full_log = self.run_bzr(['log'])[0]
140
log = self.run_bzr("log -r -3..")[0]
141
self.assertEqualDiff(full_log, log)
124
self.assertLogRevnos(['-r-3..'], ['3', '2', '1'])
143
126
def test_log_negative_both_revspec_full_log(self):
144
127
self.make_linear_branch()
145
full_log = self.run_bzr(['log'])[0]
146
log = self.run_bzr("log -r -3..-1")[0]
147
self.assertEqualDiff(full_log, log)
128
self.assertLogRevnos(['-r-3..-1'], ['3', '2', '1'])
149
130
def test_log_negative_both_revspec_partial(self):
150
131
self.make_linear_branch()
151
log = self.run_bzr("log -r -3..-2")[0]
152
self.assertTrue('revno: 1\n' in log)
153
self.assertTrue('revno: 2\n' in log)
154
self.assertTrue('revno: 3\n' not in log)
132
self.assertLogRevnos(['-r-3..-2'], ['2', '1'])
156
134
def test_log_negative_begin_revspec(self):
157
135
self.make_linear_branch()
158
log = self.run_bzr("log -r -2..")[0]
159
self.assertTrue('revno: 1\n' not in log)
160
self.assertTrue('revno: 2\n' in log)
161
self.assertTrue('revno: 3\n' in log)
136
self.assertLogRevnos(['-r-2..'], ['3', '2'])
163
138
def test_log_positive_revspecs(self):
164
139
self.make_linear_branch()
165
full_log = self.run_bzr(['log'])[0]
166
log = self.run_bzr("log -r 1..3")[0]
167
self.assertEqualDiff(full_log, log)
140
self.assertLogRevnos(['-r1..3'], ['3', '2', '1'])
169
142
def test_log_dotted_revspecs(self):
170
143
self.make_merged_branch()
171
log = self.run_bzr("log -n0 -r 1..1.1.1")[0]
172
self.assertRevnos(log, (1, '1.1.1'), (2, 3, '1.1.2', 4))
174
def test_log_reversed_revspecs(self):
175
self.make_linear_branch()
176
self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
177
'the end revision.\n',),
180
def test_log_reversed_dotted_revspecs(self):
181
self.make_merged_branch()
182
self.run_bzr_error(('bzr: ERROR: Start revision not found in '
183
'left-hand history of end revision.\n',),
144
self.assertLogRevnos(['-n0', '-r1..1.1.1'], ['1.1.1', '1'])
146
def test_log_limit(self):
147
tree = self.make_branch_and_tree('.')
148
# We want more commits than our batch size starts at
149
for pos in range(10):
150
tree.commit("%s" % pos)
151
self.assertLogRevnos(['--limit', '2'], ['10', '9'])
153
def test_log_limit_short(self):
154
self.make_linear_branch()
155
self.assertLogRevnos(['-l', '2'], ['3', '2'])
157
def test_log_change_revno(self):
158
self.make_linear_branch()
159
self.assertLogRevnos(['-c1'], ['1'])
162
class TestBug474807(TestLogWithLogCatcher):
165
super(TestBug474807, self).setUp()
166
# FIXME: Using a MemoryTree would be even better here (but until we
167
# stop calling run_bzr, there is no point) --vila 100118.
168
builder = branchbuilder.BranchBuilder(self.get_transport())
169
builder.start_series()
171
builder.build_snapshot('1', None, [
172
('add', ('', 'root-id', 'directory', ''))])
173
builder.build_snapshot('2', ['1'], [])
175
builder.build_snapshot('1.1.1', ['1'], [])
176
# merge branch into mainline
177
builder.build_snapshot('3', ['2', '1.1.1'], [])
178
# new commits in branch
179
builder.build_snapshot('1.1.2', ['1.1.1'], [])
180
builder.build_snapshot('1.1.3', ['1.1.2'], [])
181
# merge branch into mainline
182
builder.build_snapshot('4', ['3', '1.1.3'], [])
183
# merge mainline into branch
184
builder.build_snapshot('1.1.4', ['1.1.3', '4'], [])
185
# merge branch into mainline
186
builder.build_snapshot('5', ['4', '1.1.4'], [])
187
builder.finish_series()
190
self.assertLogRevnos(['-n0', '-r1.1.1..1.1.4'],
191
['1.1.4', '4', '1.1.3', '1.1.2', '3', '1.1.1'])
192
def test_n0_forward(self):
193
self.assertLogRevnos(['-n0', '-r1.1.1..1.1.4', '--forward'],
194
['3', '1.1.1', '4', '1.1.2', '1.1.3', '1.1.4'])
197
# starting from 1.1.4 we follow the left-hand ancestry
198
self.assertLogRevnos(['-n1', '-r1.1.1..1.1.4'],
199
['1.1.4', '1.1.3', '1.1.2', '1.1.1'])
201
def test_n1_forward(self):
202
self.assertLogRevnos(['-n1', '-r1.1.1..1.1.4', '--forward'],
203
['1.1.1', '1.1.2', '1.1.3', '1.1.4'])
206
class TestLogRevSpecsWithPaths(TestLogWithLogCatcher):
208
def test_log_revno_n_path_wrong_namespace(self):
209
self.make_linear_branch('branch1')
210
self.make_linear_branch('branch2')
211
# There is no guarantee that a path exist between two arbitrary
213
self.run_bzr("log -r revno:2:branch1..revno:3:branch2", retcode=3)
214
# But may be it's worth trying though ? -- vila 100115
216
def test_log_revno_n_path_correct_order(self):
217
self.make_linear_branch('branch2')
218
self.assertLogRevnos(['-rrevno:1:branch2..revno:3:branch2'],
186
221
def test_log_revno_n_path(self):
187
self.make_linear_branch('branch1')
188
222
self.make_linear_branch('branch2')
190
self.run_bzr("log -r revno:2:branch1..revno:3:branch2", retcode=3)[0]
192
log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
193
full_log = self.run_bzr(['log'], working_dir='branch2')[0]
194
self.assertEqualDiff(full_log, log)
195
log = self.run_bzr("log -r revno:1:branch2")[0]
196
self.assertTrue('revno: 1\n' in log)
197
self.assertTrue('revno: 2\n' not in log)
198
self.assertTrue('branch nick: branch2\n' in log)
199
self.assertTrue('branch nick: branch1\n' not in log)
223
self.assertLogRevnos(['-rrevno:1:branch2'],
225
rev_props = self.log_catcher.revisions[0].rev.properties
226
self.assertEqual('branch2', rev_props['branch-nick'])
229
class TestLogErrors(TestLog):
231
def test_log_zero_revspec(self):
232
self.make_minimal_branch()
233
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
236
def test_log_zero_begin_revspec(self):
237
self.make_linear_branch()
238
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
241
def test_log_zero_end_revspec(self):
242
self.make_linear_branch()
243
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
201
246
def test_log_nonexistent_revno(self):
202
247
self.make_minimal_branch()
203
(out, err) = self.run_bzr_error(
204
["bzr: ERROR: Requested revision: '1234' "
205
"does not exist in branch:"],
248
self.run_bzr_error(["bzr: ERROR: Requested revision: '1234' "
249
"does not exist in branch:"],
208
252
def test_log_nonexistent_dotted_revno(self):
209
253
self.make_minimal_branch()
210
(out, err) = self.run_bzr_error(
211
["bzr: ERROR: Requested revision: '123.123' "
212
"does not exist in branch:"],
213
['log', '-r123.123'])
215
def test_log_change_revno(self):
216
self.make_linear_branch()
217
expected_log = self.run_bzr("log -r 1")[0]
218
log = self.run_bzr("log -c 1")[0]
219
self.assertEqualDiff(expected_log, log)
254
self.run_bzr_error(["bzr: ERROR: Requested revision: '123.123' "
255
"does not exist in branch:"],
256
['log', '-r123.123'])
221
258
def test_log_change_nonexistent_revno(self):
222
259
self.make_minimal_branch()
223
(out, err) = self.run_bzr_error(
224
["bzr: ERROR: Requested revision: '1234' "
225
"does not exist in branch:"],
260
self.run_bzr_error(["bzr: ERROR: Requested revision: '1234' "
261
"does not exist in branch:"],
228
264
def test_log_change_nonexistent_dotted_revno(self):
229
265
self.make_minimal_branch()
230
(out, err) = self.run_bzr_error(
231
["bzr: ERROR: Requested revision: '123.123' "
232
"does not exist in branch:"],
233
['log', '-c123.123'])
266
self.run_bzr_error(["bzr: ERROR: Requested revision: '123.123' "
267
"does not exist in branch:"],
268
['log', '-c123.123'])
235
270
def test_log_change_single_revno_only(self):
236
271
self.make_minimal_branch()
373
396
def make_branches_with_merges(self):
374
397
level0 = self.make_branch_and_tree('level0')
375
level0.commit(message='in branch level0', **self.commit_options())
398
self.wt_commit(level0, 'in branch level0')
377
399
level1 = level0.bzrdir.sprout('level1').open_workingtree()
378
level1.commit(message='in branch level1', **self.commit_options())
400
self.wt_commit(level1, 'in branch level1')
380
401
level2 = level1.bzrdir.sprout('level2').open_workingtree()
381
level2.commit(message='in branch level2', **self.commit_options())
402
self.wt_commit(level2, 'in branch level2')
383
403
level1.merge_from_branch(level2.branch)
384
level1.commit(message='merge branch level2', **self.commit_options())
404
self.wt_commit(level1, 'merge branch level2')
386
405
level0.merge_from_branch(level1.branch)
387
level0.commit(message='merge branch level1', **self.commit_options())
406
self.wt_commit(level0, 'merge branch level1')
389
408
def test_merges_are_indented_by_level(self):
391
------------------------------------------------------------
393
committer: Lorem Ipsum <test@example.com>
398
------------------------------------------------------------
400
committer: Lorem Ipsum <test@example.com>
405
------------------------------------------------------------
407
committer: Lorem Ipsum <test@example.com>
412
------------------------------------------------------------
414
committer: Lorem Ipsum <test@example.com>
419
------------------------------------------------------------
421
committer: Lorem Ipsum <test@example.com>
427
self.check_log(expected, ['-n0'])
409
self.run_bzr(['log', '-n0'], working_dir='level0')
410
revnos_and_depth = [(r.revno, r.merge_depth)
411
for r in self.get_captured_revisions()]
412
self.assertEqual([('2', 0), ('1.1.2', 1), ('1.2.1', 2), ('1.1.1', 1),
414
[(r.revno, r.merge_depth)
415
for r in self.get_captured_revisions()])
429
417
def test_force_merge_revisions_off(self):
431
------------------------------------------------------------
433
committer: Lorem Ipsum <test@example.com>
438
------------------------------------------------------------
440
committer: Lorem Ipsum <test@example.com>
446
self.check_log(expected, ['--long', '-n1'])
418
self.assertLogRevnos(['-n1'], ['2', '1'], working_dir='level0')
448
420
def test_force_merge_revisions_on(self):
450
2 Lorem Ipsum\t2005-11-22 [merge]
453
1.1.2 Lorem Ipsum\t2005-11-22 [merge]
456
1.2.1 Lorem Ipsum\t2005-11-22
459
1.1.1 Lorem Ipsum\t2005-11-22
462
1 Lorem Ipsum\t2005-11-22
466
self.check_log(expected, ['--short', '-n0'])
421
self.assertLogRevnos(['-n0'], ['2', '1.1.2', '1.2.1', '1.1.1', '1'],
422
working_dir='level0')
468
424
def test_include_merges(self):
469
425
# Confirm --include-merges gives the same output as -n0
426
self.assertLogRevnos(['--include-merges'],
427
['2', '1.1.2', '1.2.1', '1.1.1', '1'],
428
working_dir='level0')
429
self.assertLogRevnos(['--include-merges'],
430
['2', '1.1.2', '1.2.1', '1.1.1', '1'],
431
working_dir='level0')
470
432
out_im, err_im = self.run_bzr('log --include-merges',
471
433
working_dir='level0')
472
434
out_n0, err_n0 = self.run_bzr('log -n0', working_dir='level0')
548
475
self.build_tree(['level0/file1', 'level0/file2'])
549
476
level0.add('file1')
550
477
level0.add('file2')
551
level0.commit(message='in branch level0', **self.commit_options())
478
self.wt_commit(level0, 'in branch level0')
553
480
level1 = level0.bzrdir.sprout('level1').open_workingtree()
554
481
self.build_tree_contents([('level1/file2', 'hello\n')])
555
level1.commit(message='in branch level1', **self.commit_options())
482
self.wt_commit(level1, 'in branch level1')
556
483
level0.merge_from_branch(level1.branch)
557
level0.commit(message='merge branch level1', **self.commit_options())
484
self.wt_commit(level0, 'merge branch level1')
559
def test_log_show_diff_long_with_merges(self):
560
out,err = self.run_bzr('log -p -n0')
561
self.assertEqual('', err)
562
log = test_log.normalize_log(out)
564
------------------------------------------------------------
566
committer: Lorem Ipsum <test@example.com>
572
=== modified file 'file2'
573
--- file2\t2005-11-22 00:00:01 +0000
574
+++ file2\t2005-11-22 00:00:02 +0000
576
-contents of level0/file2
578
------------------------------------------------------------
580
committer: Lorem Ipsum <test@example.com>
586
=== modified file 'file2'
587
--- file2\t2005-11-22 00:00:01 +0000
588
+++ file2\t2005-11-22 00:00:02 +0000
590
-contents of level0/file2
592
------------------------------------------------------------
594
committer: Lorem Ipsum <test@example.com>
600
=== added file 'file1'
486
def _diff_file1_revno1(self):
487
return """=== added file 'file1'
601
488
--- file1\t1970-01-01 00:00:00 +0000
602
+++ file1\t2005-11-22 00:00:01 +0000
489
+++ file1\t2005-11-22 00:00:00 +0000
604
491
+contents of level0/file1
606
=== added file 'file2'
495
def _diff_file2_revno2(self):
496
return """=== modified file 'file2'
497
--- file2\t2005-11-22 00:00:00 +0000
498
+++ file2\t2005-11-22 00:00:01 +0000
500
-contents of level0/file2
505
def _diff_file2_revno1_1_1(self):
506
return """=== modified file 'file2'
507
--- file2\t2005-11-22 00:00:00 +0000
508
+++ file2\t2005-11-22 00:00:01 +0000
510
-contents of level0/file2
515
def _diff_file2_revno1(self):
516
return """=== added file 'file2'
607
517
--- file2\t1970-01-01 00:00:00 +0000
608
+++ file2\t2005-11-22 00:00:01 +0000
518
+++ file2\t2005-11-22 00:00:00 +0000
610
520
+contents of level0/file2
612
self.check_log(expected, ['-p', '-n0'])
614
def test_log_show_diff_short(self):
616
2 Lorem Ipsum\t2005-11-22 [merge]
618
=== modified file 'file2'
619
--- file2\t2005-11-22 00:00:01 +0000
620
+++ file2\t2005-11-22 00:00:02 +0000
622
-contents of level0/file2
625
1 Lorem Ipsum\t2005-11-22
627
=== added file 'file1'
628
--- file1\t1970-01-01 00:00:00 +0000
629
+++ file1\t2005-11-22 00:00:01 +0000
631
+contents of level0/file1
632
\x20\x20\x20\x20\x20\x20
633
=== added file 'file2'
634
--- file2\t1970-01-01 00:00:00 +0000
635
+++ file2\t2005-11-22 00:00:01 +0000
637
+contents of level0/file2
639
Use --include-merges or -n0 to see merged revisions.
641
self.check_log(expected, ['-p', '--short'])
643
def test_log_show_diff_line(self):
644
# Not supported by this formatter so expect plain output
646
2: Lorem Ipsum 2005-11-22 [merge] merge branch level1
647
1: Lorem Ipsum 2005-11-22 in branch level0
649
self.check_log(expected, ['-p', '--line'])
651
def test_log_show_diff_file1(self):
652
"""Only the diffs for the given file are to be shown"""
654
1 Lorem Ipsum\t2005-11-22
656
=== added file 'file1'
657
--- file1\t1970-01-01 00:00:00 +0000
658
+++ file1\t2005-11-22 00:00:01 +0000
660
+contents of level0/file1
663
self.check_log(expected, ['-p', '--short', 'file1'])
665
def test_log_show_diff_file2(self):
666
"""Only the diffs for the given file are to be shown"""
668
2 Lorem Ipsum\t2005-11-22 [merge]
670
=== modified file 'file2'
671
--- file2\t2005-11-22 00:00:01 +0000
672
+++ file2\t2005-11-22 00:00:02 +0000
674
-contents of level0/file2
677
1 Lorem Ipsum\t2005-11-22
679
=== added file 'file2'
680
--- file2\t1970-01-01 00:00:00 +0000
681
+++ file2\t2005-11-22 00:00:01 +0000
683
+contents of level0/file2
685
Use --include-merges or -n0 to see merged revisions.
687
self.check_log(expected, ['-p', '--short', 'file2'])
524
def assertLogRevnosAndDiff(self, args, expected,
526
self.run_bzr(['log', '-p'] + args, working_dir=working_dir)
527
expected_revnos_and_depths = [
528
(revno, depth) for revno, depth, diff in expected]
529
# Check the revnos and depths first to make debugging easier
530
self.assertEqual(expected_revnos_and_depths,
531
[(r.revno, r.merge_depth)
532
for r in self.get_captured_revisions()])
533
# Now check the diffs, adding the revno in case of failure
534
fmt = 'In revno %s\n%s'
535
for expected_rev, actual_rev in izip(expected,
536
self.get_captured_revisions()):
537
revno, depth, expected_diff = expected_rev
538
actual_diff = actual_rev.diff
539
self.assertEqualDiff(fmt % (revno, expected_diff),
540
fmt % (revno, actual_diff))
542
def test_log_diff_with_merges(self):
543
self.assertLogRevnosAndDiff(
545
[('2', 0, self._diff_file2_revno2()),
546
('1.1.1', 1, self._diff_file2_revno1_1_1()),
547
('1', 0, self._diff_file1_revno1()
548
+ self._diff_file2_revno1())],
549
working_dir='level0')
552
def test_log_diff_file1(self):
553
self.assertLogRevnosAndDiff(['-n0', 'file1'],
554
[('1', 0, self._diff_file1_revno1())],
555
working_dir='level0')
557
def test_log_diff_file2(self):
558
self.assertLogRevnosAndDiff(['-n1', 'file2'],
559
[('2', 0, self._diff_file2_revno2()),
560
('1', 0, self._diff_file2_revno1())],
561
working_dir='level0')
690
564
class TestLogUnicodeDiff(TestLog):
845
716
tree.commit('remove file1')
846
717
os.chdir('parent')
848
def test_log_file(self):
849
"""The log for a particular file should only list revs for that file"""
851
log = self.run_bzr('log -n0 file1')[0]
852
self.assertContainsRe(log, 'revno: 1\n')
853
self.assertNotContainsRe(log, 'revno: 2\n')
854
self.assertNotContainsRe(log, 'revno: 3\n')
855
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
856
self.assertNotContainsRe(log, 'revno: 4 ')
857
log = self.run_bzr('log -n0 file2')[0]
858
self.assertNotContainsRe(log, 'revno: 1\n')
859
self.assertContainsRe(log, 'revno: 2\n')
860
self.assertNotContainsRe(log, 'revno: 3\n')
861
self.assertContainsRe(log, 'revno: 3.1.1\n')
862
self.assertContainsRe(log, 'revno: 4 ')
863
log = self.run_bzr('log -n0 file3')[0]
864
self.assertNotContainsRe(log, 'revno: 1\n')
865
self.assertNotContainsRe(log, 'revno: 2\n')
866
self.assertContainsRe(log, 'revno: 3\n')
867
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
868
self.assertNotContainsRe(log, 'revno: 4 ')
869
log = self.run_bzr('log -n0 -r3.1.1 file2')[0]
870
self.assertNotContainsRe(log, 'revno: 1\n')
871
self.assertNotContainsRe(log, 'revno: 2\n')
872
self.assertNotContainsRe(log, 'revno: 3\n')
873
self.assertContainsRe(log, 'revno: 3.1.1\n')
874
self.assertNotContainsRe(log, 'revno: 4 ')
875
log = self.run_bzr('log -n0 -r4 file2')[0]
876
self.assertNotContainsRe(log, 'revno: 1\n')
877
self.assertNotContainsRe(log, 'revno: 2\n')
878
self.assertNotContainsRe(log, 'revno: 3\n')
879
self.assertContainsRe(log, 'revno: 3.1.1\n')
880
self.assertContainsRe(log, 'revno: 4 ')
881
log = self.run_bzr('log -n0 -r3.. file2')[0]
882
self.assertNotContainsRe(log, 'revno: 1\n')
883
self.assertNotContainsRe(log, 'revno: 2\n')
884
self.assertNotContainsRe(log, 'revno: 3\n')
885
self.assertContainsRe(log, 'revno: 3.1.1\n')
886
self.assertContainsRe(log, 'revno: 4 ')
887
log = self.run_bzr('log -n0 -r..3 file2')[0]
888
self.assertNotContainsRe(log, 'revno: 1\n')
889
self.assertContainsRe(log, 'revno: 2\n')
890
self.assertNotContainsRe(log, 'revno: 3\n')
891
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
892
self.assertNotContainsRe(log, 'revno: 4 ')
719
# FIXME: It would be good to parametrize the following tests against all
720
# formatters. But the revisions selection is not *currently* part of the
721
# LogFormatter contract, so using LogCatcher is sufficient -- vila 100118
722
def test_log_file1(self):
724
self.assertLogRevnos(['-n0', 'file1'], ['1'])
726
def test_log_file2(self):
729
self.assertLogRevnos(['-n0', 'file2'], ['4', '3.1.1', '2'])
730
# file2 in a merge revision
731
self.assertLogRevnos(['-n0', '-r3.1.1', 'file2'], ['3.1.1'])
732
# file2 in a mainline revision
733
self.assertLogRevnos(['-n0', '-r4', 'file2'], ['4', '3.1.1'])
734
# file2 since a revision
735
self.assertLogRevnos(['-n0', '-r3..', 'file2'], ['4', '3.1.1'])
736
# file2 up to a revision
737
self.assertLogRevnos(['-n0', '-r..3', 'file2'], ['2'])
739
def test_log_file3(self):
741
self.assertLogRevnos(['-n0', 'file3'], ['3'])
894
743
def test_log_file_historical_missing(self):
895
744
# Check logging a deleted file gives an error if the
933
770
self.assertContainsRe(err, err_msg)
935
772
# Check we can see a renamed file if we give the right end revision
936
log, err = self.run_bzr('log -r..4 file3')
937
self.assertEquals('', err)
938
self.assertNotContainsRe(log, 'revno: 1\n')
939
self.assertNotContainsRe(log, 'revno: 2\n')
940
self.assertContainsRe(log, 'revno: 3\n')
941
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
942
self.assertNotContainsRe(log, 'revno: 4 ')
944
def test_line_log_file(self):
945
"""The line log for a file should only list relevant mainline revs"""
946
# Note: this also implicitly covers the short logging case.
947
# We test using --line in preference to --short because matching
948
# revnos in the output of --line is more reliable.
951
# full history of file1
952
log = self.run_bzr('log --line file1')[0]
953
self.assertContainsRe(log, '^1:', re.MULTILINE)
954
self.assertNotContainsRe(log, '^2:', re.MULTILINE)
955
self.assertNotContainsRe(log, '^3:', re.MULTILINE)
956
self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
957
self.assertNotContainsRe(log, '^4:', re.MULTILINE)
959
# full history of file2
960
log = self.run_bzr('log --line file2')[0]
961
self.assertNotContainsRe(log, '^1:', re.MULTILINE)
962
self.assertContainsRe(log, '^2:', re.MULTILINE)
963
self.assertNotContainsRe(log, '^3:', re.MULTILINE)
964
self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
965
self.assertContainsRe(log, '^4:', re.MULTILINE)
967
# full history of file3
968
log = self.run_bzr('log --line file3')[0]
969
self.assertNotContainsRe(log, '^1:', re.MULTILINE)
970
self.assertNotContainsRe(log, '^2:', re.MULTILINE)
971
self.assertContainsRe(log, '^3:', re.MULTILINE)
972
self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
973
self.assertNotContainsRe(log, '^4:', re.MULTILINE)
975
# file in a merge revision
976
log = self.run_bzr('log --line -r3.1.1 file2')[0]
977
self.assertNotContainsRe(log, '^1:', re.MULTILINE)
978
self.assertNotContainsRe(log, '^2:', re.MULTILINE)
979
self.assertNotContainsRe(log, '^3:', re.MULTILINE)
980
self.assertContainsRe(log, '^3.1.1:', re.MULTILINE)
981
self.assertNotContainsRe(log, '^4:', re.MULTILINE)
983
# file in a mainline revision
984
log = self.run_bzr('log --line -r4 file2')[0]
985
self.assertNotContainsRe(log, '^1:', re.MULTILINE)
986
self.assertNotContainsRe(log, '^2:', re.MULTILINE)
987
self.assertNotContainsRe(log, '^3:', re.MULTILINE)
988
self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
989
self.assertContainsRe(log, '^4:', re.MULTILINE)
991
# file since a revision
992
log = self.run_bzr('log --line -r3.. file2')[0]
993
self.assertNotContainsRe(log, '^1:', re.MULTILINE)
994
self.assertNotContainsRe(log, '^2:', re.MULTILINE)
995
self.assertNotContainsRe(log, '^3:', re.MULTILINE)
996
self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
997
self.assertContainsRe(log, '^4:', re.MULTILINE)
999
# file up to a revision
1000
log = self.run_bzr('log --line -r..3 file2')[0]
1001
self.assertNotContainsRe(log, '^1:', re.MULTILINE)
1002
self.assertContainsRe(log, '^2:', re.MULTILINE)
1003
self.assertNotContainsRe(log, '^3:', re.MULTILINE)
1004
self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
1005
self.assertNotContainsRe(log, '^4:', re.MULTILINE)
1008
class TestLogMultiple(tests.TestCaseWithTransport):
773
self.assertLogRevnos(['-r..4', 'file3'], ['3'])
776
class TestLogMultiple(TestLogWithLogCatcher):
1010
778
def prepare_tree(self):
1011
779
tree = self.make_branch_and_tree('parent')