214
216
builder.build_snapshot(None, [
215
('add', ('', b'root-id', 'directory', ''))],
217
builder.build_snapshot([b'1'], [], revision_id=b'2')
217
('add', ('', 'root-id', 'directory', ''))],
219
builder.build_snapshot(['1'], [], revision_id='2')
219
builder.build_snapshot([b'1'], [], revision_id=b'1.1.1')
221
builder.build_snapshot(['1'], [], revision_id='1.1.1')
220
222
# merge branch into mainline
221
builder.build_snapshot([b'2', b'1.1.1'], [], revision_id=b'3')
223
builder.build_snapshot(['2', '1.1.1'], [], revision_id='3')
222
224
# new commits in branch
223
builder.build_snapshot([b'1.1.1'], [], revision_id=b'1.1.2')
224
builder.build_snapshot([b'1.1.2'], [], revision_id=b'1.1.3')
225
builder.build_snapshot(['1.1.1'], [], revision_id='1.1.2')
226
builder.build_snapshot(['1.1.2'], [], revision_id='1.1.3')
225
227
# merge branch into mainline
226
builder.build_snapshot([b'3', b'1.1.3'], [], revision_id=b'4')
228
builder.build_snapshot(['3', '1.1.3'], [], revision_id='4')
227
229
# merge mainline into branch
228
builder.build_snapshot([b'1.1.3', b'4'], [], revision_id=b'1.1.4')
230
builder.build_snapshot(['1.1.3', '4'], [], revision_id='1.1.4')
229
231
# merge branch into mainline
230
builder.build_snapshot([b'4', b'1.1.4'], [], revision_id=b'5')
231
builder.build_snapshot([b'5'], [], revision_id=b'5.1.1')
232
builder.build_snapshot([b'5', b'5.1.1'], [], revision_id=b'6')
232
builder.build_snapshot(['4', '1.1.4'], [], revision_id='5')
233
builder.build_snapshot(['5'], [], revision_id='5.1.1')
234
builder.build_snapshot(['5', '5.1.1'], [], revision_id='6')
233
235
builder.finish_series()
235
237
def test_n0(self):
287
289
builder.build_snapshot(None, [
288
('add', ('', b'root-id', 'directory', ''))], revision_id=b'1')
289
builder.build_snapshot([b'1'], [], revision_id=b'2')
290
builder.build_snapshot([b'1'], [], revision_id=b'1.1.1')
291
builder.build_snapshot([b'2'], [], revision_id=b'2.1.1')
292
builder.build_snapshot([b'2', b'1.1.1'], [], revision_id=b'3')
293
builder.build_snapshot([b'2.1.1'], [], revision_id=b'2.1.2')
294
builder.build_snapshot([b'2.1.1'], [], revision_id=b'2.2.1')
295
builder.build_snapshot([b'2.1.2', b'2.2.1'], [], revision_id=b'2.1.3')
296
builder.build_snapshot([b'3', b'2.1.3'], [], revision_id=b'4')
297
builder.build_snapshot([b'4', b'2.1.2'], [], revision_id=b'5')
290
('add', ('', 'root-id', 'directory', ''))], revision_id='1')
291
builder.build_snapshot(['1'], [], revision_id='2')
292
builder.build_snapshot(['1'], [], revision_id='1.1.1')
293
builder.build_snapshot(['2'], [], revision_id='2.1.1')
294
builder.build_snapshot(['2', '1.1.1'], [], revision_id='3')
295
builder.build_snapshot(['2.1.1'], [], revision_id='2.1.2')
296
builder.build_snapshot(['2.1.1'], [], revision_id='2.2.1')
297
builder.build_snapshot(['2.1.2', '2.2.1'], [], revision_id='2.1.3')
298
builder.build_snapshot(['3', '2.1.3'], [], revision_id='4')
299
builder.build_snapshot(['4', '2.1.2'], [], revision_id='5')
298
300
builder.finish_series()
301
303
def test_not_an_ancestor(self):
302
self.assertRaises(errors.CommandError,
304
self.assertRaises(errors.BzrCommandError,
303
305
log._generate_all_revisions,
304
306
self.branch, '1.1.1', '2.1.3', 'reverse',
305
307
delayed_graph_generation=True)
307
309
def test_wrong_order(self):
308
self.assertRaises(errors.CommandError,
310
self.assertRaises(errors.BzrCommandError,
309
311
log._generate_all_revisions,
310
312
self.branch, '5', '2.1.3', 'reverse',
311
313
delayed_graph_generation=True)
382
384
def test_log_change_single_revno_only(self):
383
385
self.make_minimal_branch()
384
386
self.run_bzr_error(['brz: ERROR: Option --change does not'
385
' accept revision ranges'],
387
' accept revision ranges'],
386
388
['log', '--change', '2..3'])
388
390
def test_log_change_incompatible_with_revision(self):
389
391
self.run_bzr_error(['brz: ERROR: --revision and --change'
390
' are mutually exclusive'],
392
' are mutually exclusive'],
391
393
['log', '--change', '2', '--revision', '3'])
393
395
def test_log_nonexistent_file(self):
504
504
def assertUseShortDeltaFormat(self, cmd):
505
505
log = self.run_bzr(cmd)[0]
506
506
# Check that we use the short status format
507
self.assertContainsRe(log, '(?m)^\\s*A hello.txt$')
508
self.assertNotContainsRe(log, '(?m)^\\s*added:$')
507
self.assertContainsRe(log, '(?m)^\s*A hello.txt$')
508
self.assertNotContainsRe(log, '(?m)^\s*added:$')
510
510
def assertUseLongDeltaFormat(self, cmd):
511
511
log = self.run_bzr(cmd)[0]
512
512
# Check that we use the long status format
513
self.assertNotContainsRe(log, '(?m)^\\s*A hello.txt$')
514
self.assertContainsRe(log, '(?m)^\\s*added:$')
513
self.assertNotContainsRe(log, '(?m)^\s*A hello.txt$')
514
self.assertContainsRe(log, '(?m)^\s*added:$')
516
516
def test_log_short_verbose(self):
517
517
self.assertUseShortDeltaFormat(['log', '--short', '-v'])
588
588
def test_merges_partial_range(self):
589
589
self.assertLogRevnosAndDepths(
590
['-n0', '-r1.1.1..1.1.2'],
591
[('1.1.2', 0), ('1.2.1', 1), ('1.1.1', 0)],
592
working_dir='level0')
590
['-n0', '-r1.1.1..1.1.2'],
591
[('1.1.2', 0), ('1.2.1', 1), ('1.1.1', 0)],
592
working_dir='level0')
594
594
def test_merges_partial_range_ignore_before_lower_bound(self):
595
595
"""Dont show revisions before the lower bound's merged revs"""
596
596
self.assertLogRevnosAndDepths(
597
['-n0', '-r1.1.2..2'],
598
[('2', 0), ('1.1.2', 1), ('1.2.1', 2)],
599
working_dir='level0')
597
['-n0', '-r1.1.2..2'],
598
[('2', 0), ('1.1.2', 1), ('1.2.1', 2)],
599
working_dir='level0')
601
601
def test_omit_merges_with_sidelines(self):
602
602
self.assertLogRevnos(['--omit-merges', '-n0'], ['1.2.1', '1.1.1', '1'],
625
625
self.wt_commit(level0, 'in branch level0')
627
627
level1 = level0.controldir.sprout('level1').open_workingtree()
628
self.build_tree_contents([('level1/file2', b'hello\n')])
628
self.build_tree_contents([('level1/file2', 'hello\n')])
629
629
self.wt_commit(level1, 'in branch level1')
630
630
level0.merge_from_branch(level1.branch)
631
631
self.wt_commit(level0, 'merge branch level1')
633
633
def _diff_file1_revno1(self):
634
return b"""=== added file 'file1'
634
return """=== added file 'file1'
635
635
--- file1\t1970-01-01 00:00:00 +0000
636
636
+++ file1\t2005-11-22 00:00:00 +0000
671
671
def assertLogRevnosAndDiff(self, args, expected,
673
673
self.run_bzr(['log', '-p'] + args, working_dir=working_dir)
674
674
expected_revnos_and_depths = [
675
675
(revno, depth) for revno, depth, diff in expected]
676
676
# Check the revnos and depths first to make debugging easier
677
677
self.assertEqual(expected_revnos_and_depths,
678
678
[(r.revno, r.merge_depth)
679
for r in self.get_captured_revisions()])
679
for r in self.get_captured_revisions()])
680
680
# Now check the diffs, adding the revno in case of failure
681
681
fmt = 'In revno %s\n%s'
682
682
for expected_rev, actual_rev in zip(expected,
692
692
[('2', 0, self._diff_file2_revno2()),
693
693
('1.1.1', 1, self._diff_file2_revno1_1_1()),
694
('1', 0, self._diff_file1_revno1() +
695
self._diff_file2_revno1())],
694
('1', 0, self._diff_file1_revno1()
695
+ self._diff_file2_revno1())],
696
696
working_dir='level0')
698
699
def test_log_diff_file1(self):
699
700
self.assertLogRevnosAndDiff(['-n0', 'file1'],
700
701
[('1', 0, self._diff_file1_revno1())],
986
989
super(MainlineGhostTests, self).setUp()
987
990
tree = self.make_branch_and_tree('')
988
tree.set_parent_ids([b"spooky"], allow_leftmost_as_ghost=True)
991
tree.set_parent_ids(["spooky"], allow_leftmost_as_ghost=True)
990
tree.commit('msg1', rev_id=b'rev1')
991
tree.commit('msg2', rev_id=b'rev2')
993
tree.commit('msg1', rev_id='rev1')
994
tree.commit('msg2', rev_id='rev2')
993
996
def test_log_range(self):
994
997
self.assertLogRevnos(["-r1..2"], ["2", "1"])
1029
1030
self.assertLogRevnos(["--match-message", "message1"], ["1"])
1030
1031
self.assertLogRevnos(["--match-message", "message2"], ["2"])
1031
1032
self.assertLogRevnos(["--match-message", "message"], ["2", "1"])
1032
self.assertLogRevnos(["--match-message", "message1",
1033
self.assertLogRevnos(["--match-message", "message1",
1033
1034
"--match-message", "message2"], ["2", "1"])
1034
1035
self.assertLogRevnos(["--message", "message1"], ["1"])
1035
1036
self.assertLogRevnos(["--message", "message2"], ["2"])
1036
1037
self.assertLogRevnos(["--message", "message"], ["2", "1"])
1037
self.assertLogRevnos(["--match-message", "message1",
1038
self.assertLogRevnos(["--match-message", "message1",
1038
1039
"--message", "message2"], ["2", "1"])
1039
self.assertLogRevnos(["--message", "message1",
1040
self.assertLogRevnos(["--message", "message1",
1040
1041
"--match-message", "message2"], ["2", "1"])
1042
1043
def test_committer(self):
1044
1045
self.assertLogRevnos(["-m", "committer1"], ["1"])
1045
1046
self.assertLogRevnos(["-m", "committer2"], ["2"])
1046
1047
self.assertLogRevnos(["-m", "committer"], ["2", "1"])
1047
self.assertLogRevnos(["-m", "committer1", "-m", "committer2"],
1048
self.assertLogRevnos(["-m", "committer1", "-m", "committer2"],
1049
1050
self.assertLogRevnos(["--match-committer", "committer1"], ["1"])
1050
1051
self.assertLogRevnos(["--match-committer", "committer2"], ["2"])
1051
1052
self.assertLogRevnos(["--match-committer", "committer"], ["2", "1"])
1052
self.assertLogRevnos(["--match-committer", "committer1",
1053
self.assertLogRevnos(["--match-committer", "committer1",
1053
1054
"--match-committer", "committer2"], ["2", "1"])
1055
1056
def test_author(self):
1057
1058
self.assertLogRevnos(["-m", "author1"], ["1"])
1058
1059
self.assertLogRevnos(["-m", "author2"], ["2"])
1059
1060
self.assertLogRevnos(["-m", "author"], ["2", "1"])
1060
self.assertLogRevnos(["-m", "author1", "-m", "author2"],
1061
self.assertLogRevnos(["-m", "author1", "-m", "author2"],
1062
1063
self.assertLogRevnos(["--match-author", "author1"], ["1"])
1063
1064
self.assertLogRevnos(["--match-author", "author2"], ["2"])
1064
1065
self.assertLogRevnos(["--match-author", "author"], ["2", "1"])
1065
self.assertLogRevnos(["--match-author", "author1",
1066
self.assertLogRevnos(["--match-author", "author1",
1066
1067
"--match-author", "author2"], ["2", "1"])
1070
class TestSmartServerLog(tests.TestCaseWithTransport):
1072
def test_standard_log(self):
1073
self.setup_smart_server_with_call_log()
1074
t = self.make_branch_and_tree('branch')
1075
self.build_tree_contents([('branch/foo', 'thecontents')])
1078
self.reset_smart_call_log()
1079
out, err = self.run_bzr(['log', self.get_url('branch')])
1080
# This figure represent the amount of work to perform this use case. It
1081
# is entirely ok to reduce this number if a test fails due to rpc_count
1082
# being too low. If rpc_count increases, more network roundtrips have
1083
# become necessary for this use case. Please do not adjust this number
1084
# upwards without agreement from bzr's network support maintainers.
1085
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
1086
self.assertLength(1, self.hpss_connections)
1087
self.assertLength(9, self.hpss_calls)
1089
def test_verbose_log(self):
1090
self.setup_smart_server_with_call_log()
1091
t = self.make_branch_and_tree('branch')
1092
self.build_tree_contents([('branch/foo', 'thecontents')])
1095
self.reset_smart_call_log()
1096
out, err = self.run_bzr(['log', '-v', self.get_url('branch')])
1097
# This figure represent the amount of work to perform this use case. It
1098
# is entirely ok to reduce this number if a test fails due to rpc_count
1099
# being too low. If rpc_count increases, more network roundtrips have
1100
# become necessary for this use case. Please do not adjust this number
1101
# upwards without agreement from bzr's network support maintainers.
1102
self.assertLength(10, self.hpss_calls)
1103
self.assertLength(1, self.hpss_connections)
1104
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
1106
def test_per_file(self):
1107
self.setup_smart_server_with_call_log()
1108
t = self.make_branch_and_tree('branch')
1109
self.build_tree_contents([('branch/foo', 'thecontents')])
1112
self.reset_smart_call_log()
1113
out, err = self.run_bzr(['log', '-v', self.get_url('branch') + "/foo"])
1114
# This figure represent the amount of work to perform this use case. It
1115
# is entirely ok to reduce this number if a test fails due to rpc_count
1116
# being too low. If rpc_count increases, more network roundtrips have
1117
# become necessary for this use case. Please do not adjust this number
1118
# upwards without agreement from bzr's network support maintainers.
1119
self.assertLength(14, self.hpss_calls)
1120
self.assertLength(1, self.hpss_connections)
1121
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)