278
340
def test_log_zero_revspec(self):
279
341
self.make_minimal_branch()
280
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
342
self.run_bzr_error(['brz: ERROR: Logging revision 0 is invalid.'],
283
345
def test_log_zero_begin_revspec(self):
284
346
self.make_linear_branch()
285
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
347
self.run_bzr_error(['brz: ERROR: Logging revision 0 is invalid.'],
286
348
['log', '-r0..2'])
288
350
def test_log_zero_end_revspec(self):
289
351
self.make_linear_branch()
290
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
352
self.run_bzr_error(['brz: ERROR: Logging revision 0 is invalid.'],
291
353
['log', '-r-2..0'])
293
355
def test_log_nonexistent_revno(self):
294
356
self.make_minimal_branch()
295
self.run_bzr_error(["bzr: ERROR: Requested revision: '1234' "
357
self.run_bzr_error(["brz: ERROR: Requested revision: '1234' "
296
358
"does not exist in branch:"],
297
359
['log', '-r1234'])
299
361
def test_log_nonexistent_dotted_revno(self):
300
362
self.make_minimal_branch()
301
self.run_bzr_error(["bzr: ERROR: Requested revision: '123.123' "
363
self.run_bzr_error(["brz: ERROR: Requested revision: '123.123' "
302
364
"does not exist in branch:"],
303
365
['log', '-r123.123'])
305
367
def test_log_change_nonexistent_revno(self):
306
368
self.make_minimal_branch()
307
self.run_bzr_error(["bzr: ERROR: Requested revision: '1234' "
369
self.run_bzr_error(["brz: ERROR: Requested revision: '1234' "
308
370
"does not exist in branch:"],
309
371
['log', '-c1234'])
311
373
def test_log_change_nonexistent_dotted_revno(self):
312
374
self.make_minimal_branch()
313
self.run_bzr_error(["bzr: ERROR: Requested revision: '123.123' "
375
self.run_bzr_error(["brz: ERROR: Requested revision: '123.123' "
314
376
"does not exist in branch:"],
315
377
['log', '-c123.123'])
317
379
def test_log_change_single_revno_only(self):
318
380
self.make_minimal_branch()
319
self.run_bzr_error(['bzr: ERROR: Option --change does not'
381
self.run_bzr_error(['brz: ERROR: Option --change does not'
320
382
' accept revision ranges'],
321
383
['log', '--change', '2..3'])
323
385
def test_log_change_incompatible_with_revision(self):
324
self.run_bzr_error(['bzr: ERROR: --revision and --change'
386
self.run_bzr_error(['brz: ERROR: --revision and --change'
325
387
' are mutually exclusive'],
326
388
['log', '--change', '2', '--revision', '3'])
337
399
def test_log_reversed_revspecs(self):
338
400
self.make_linear_branch()
339
self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
401
self.run_bzr_error(('brz: ERROR: Start revision must be older than '
340
402
'the end revision.\n',),
341
403
['log', '-r3..1'])
343
405
def test_log_reversed_dotted_revspecs(self):
344
406
self.make_merged_branch()
345
self.run_bzr_error(('bzr: ERROR: Start revision not found in '
346
'left-hand history of end revision.\n',),
407
self.run_bzr_error(('brz: ERROR: Start revision not found in '
408
'history of end revision.\n',),
347
409
"log -r 1.1.1..1")
349
411
def test_log_bad_message_re(self):
350
412
"""Bad --message argument gives a sensible message
352
414
See https://bugs.launchpad.net/bzr/+bug/251352
354
416
self.make_minimal_branch()
355
417
out, err = self.run_bzr(['log', '-m', '*'], retcode=3)
356
self.assertEqual("bzr: ERROR: Invalid regular expression"
357
" in log message filter"
359
": nothing to repeat\n", err)
360
self.assertEqual('', out)
418
self.assertContainsRe(err, "ERROR.*Invalid pattern.*nothing to repeat")
419
self.assertNotContainsRe(err, "Unprintable exception")
420
self.assertEqual(out, '')
362
422
def test_log_unsupported_timezone(self):
363
423
self.make_linear_branch()
364
self.run_bzr_error(['bzr: ERROR: Unsupported timezone format "foo", '
424
self.run_bzr_error(['brz: ERROR: Unsupported timezone format "foo", '
365
425
'options are "utc", "original", "local".'],
366
426
['log', '--timezone', 'foo'])
368
428
def test_log_exclude_ancestry_no_range(self):
369
429
self.make_linear_branch()
370
self.run_bzr_error(['bzr: ERROR: --exclude-common-ancestry'
430
self.run_bzr_error(['brz: ERROR: --exclude-common-ancestry'
371
431
' requires -r with two revisions'],
372
432
['log', '--exclude-common-ancestry'])
374
434
def test_log_exclude_ancestry_single_revision(self):
375
435
self.make_merged_branch()
376
self.run_bzr_error(['bzr: ERROR: --exclude-common-ancestry'
436
self.run_bzr_error(['brz: ERROR: --exclude-common-ancestry'
377
437
' requires two different revisions'],
378
438
['log', '--exclude-common-ancestry',
379
439
'-r1.1.1..1.1.1'])
480
562
self.assertLogRevnos(['-n0'], ['2', '1.1.2', '1.2.1', '1.1.1', '1'],
481
563
working_dir='level0')
483
def test_include_merges(self):
484
# Confirm --include-merges gives the same output as -n0
485
self.assertLogRevnos(['--include-merges'],
486
['2', '1.1.2', '1.2.1', '1.1.1', '1'],
487
working_dir='level0')
488
self.assertLogRevnos(['--include-merges'],
489
['2', '1.1.2', '1.2.1', '1.1.1', '1'],
490
working_dir='level0')
491
out_im, err_im = self.run_bzr('log --include-merges',
492
working_dir='level0')
493
out_n0, err_n0 = self.run_bzr('log -n0', working_dir='level0')
494
self.assertEqual('', err_im)
495
self.assertEqual('', err_n0)
496
self.assertEqual(out_im, out_n0)
565
def test_include_merged(self):
566
# Confirm --include-merged gives the same output as -n0
567
expected = ['2', '1.1.2', '1.2.1', '1.1.1', '1']
568
self.assertLogRevnos(['--include-merged'],
569
expected, working_dir='level0')
570
self.assertLogRevnos(['--include-merged'],
571
expected, working_dir='level0')
498
573
def test_force_merge_revisions_N(self):
499
574
self.assertLogRevnos(['-n2'],
893
976
self.prepare_tree()
895
978
self.assertLogRevnos(['dir2', 'file5'], ['5', '3'])
981
class MainlineGhostTests(TestLogWithLogCatcher):
984
super(MainlineGhostTests, self).setUp()
985
tree = self.make_branch_and_tree('')
986
tree.set_parent_ids(["spooky"], allow_leftmost_as_ghost=True)
988
tree.commit('msg1', rev_id='rev1')
989
tree.commit('msg2', rev_id='rev2')
991
def test_log_range(self):
992
self.assertLogRevnos(["-r1..2"], ["2", "1"])
994
def test_log_norange(self):
995
self.assertLogRevnos([], ["2", "1"])
997
def test_log_range_open_begin(self):
998
self.knownFailure("log with ghosts fails. bug #726466")
999
(stdout, stderr) = self.run_bzr(['log', '-r..2'], retcode=3)
1000
self.assertEqual(["2", "1"],
1001
[r.revno for r in self.get_captured_revisions()])
1002
self.assertEqual("brz: ERROR: Further revision history missing.", stderr)
1004
def test_log_range_open_end(self):
1005
self.assertLogRevnos(["-r1.."], ["2", "1"])
1007
class TestLogMatch(TestLogWithLogCatcher):
1008
def prepare_tree(self):
1009
tree = self.make_branch_and_tree('')
1011
['/hello.txt', '/goodbye.txt'])
1012
tree.add('hello.txt')
1013
tree.commit(message='message1', committer='committer1', authors=['author1'])
1014
tree.add('goodbye.txt')
1015
tree.commit(message='message2', committer='committer2', authors=['author2'])
1017
def test_message(self):
1019
self.assertLogRevnos(["-m", "message1"], ["1"])
1020
self.assertLogRevnos(["-m", "message2"], ["2"])
1021
self.assertLogRevnos(["-m", "message"], ["2", "1"])
1022
self.assertLogRevnos(["-m", "message1", "-m", "message2"], ["2", "1"])
1023
self.assertLogRevnos(["--match-message", "message1"], ["1"])
1024
self.assertLogRevnos(["--match-message", "message2"], ["2"])
1025
self.assertLogRevnos(["--match-message", "message"], ["2", "1"])
1026
self.assertLogRevnos(["--match-message", "message1",
1027
"--match-message", "message2"], ["2", "1"])
1028
self.assertLogRevnos(["--message", "message1"], ["1"])
1029
self.assertLogRevnos(["--message", "message2"], ["2"])
1030
self.assertLogRevnos(["--message", "message"], ["2", "1"])
1031
self.assertLogRevnos(["--match-message", "message1",
1032
"--message", "message2"], ["2", "1"])
1033
self.assertLogRevnos(["--message", "message1",
1034
"--match-message", "message2"], ["2", "1"])
1036
def test_committer(self):
1038
self.assertLogRevnos(["-m", "committer1"], ["1"])
1039
self.assertLogRevnos(["-m", "committer2"], ["2"])
1040
self.assertLogRevnos(["-m", "committer"], ["2", "1"])
1041
self.assertLogRevnos(["-m", "committer1", "-m", "committer2"],
1043
self.assertLogRevnos(["--match-committer", "committer1"], ["1"])
1044
self.assertLogRevnos(["--match-committer", "committer2"], ["2"])
1045
self.assertLogRevnos(["--match-committer", "committer"], ["2", "1"])
1046
self.assertLogRevnos(["--match-committer", "committer1",
1047
"--match-committer", "committer2"], ["2", "1"])
1049
def test_author(self):
1051
self.assertLogRevnos(["-m", "author1"], ["1"])
1052
self.assertLogRevnos(["-m", "author2"], ["2"])
1053
self.assertLogRevnos(["-m", "author"], ["2", "1"])
1054
self.assertLogRevnos(["-m", "author1", "-m", "author2"],
1056
self.assertLogRevnos(["--match-author", "author1"], ["1"])
1057
self.assertLogRevnos(["--match-author", "author2"], ["2"])
1058
self.assertLogRevnos(["--match-author", "author"], ["2", "1"])
1059
self.assertLogRevnos(["--match-author", "author1",
1060
"--match-author", "author2"], ["2", "1"])
1063
class TestSmartServerLog(tests.TestCaseWithTransport):
1065
def test_standard_log(self):
1066
self.setup_smart_server_with_call_log()
1067
t = self.make_branch_and_tree('branch')
1068
self.build_tree_contents([('branch/foo', 'thecontents')])
1071
self.reset_smart_call_log()
1072
out, err = self.run_bzr(['log', self.get_url('branch')])
1073
# This figure represent the amount of work to perform this use case. It
1074
# is entirely ok to reduce this number if a test fails due to rpc_count
1075
# being too low. If rpc_count increases, more network roundtrips have
1076
# become necessary for this use case. Please do not adjust this number
1077
# upwards without agreement from bzr's network support maintainers.
1078
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
1079
self.assertLength(1, self.hpss_connections)
1080
self.assertLength(9, self.hpss_calls)
1082
def test_verbose_log(self):
1083
self.setup_smart_server_with_call_log()
1084
t = self.make_branch_and_tree('branch')
1085
self.build_tree_contents([('branch/foo', 'thecontents')])
1088
self.reset_smart_call_log()
1089
out, err = self.run_bzr(['log', '-v', self.get_url('branch')])
1090
# This figure represent the amount of work to perform this use case. It
1091
# is entirely ok to reduce this number if a test fails due to rpc_count
1092
# being too low. If rpc_count increases, more network roundtrips have
1093
# become necessary for this use case. Please do not adjust this number
1094
# upwards without agreement from bzr's network support maintainers.
1095
self.assertLength(10, self.hpss_calls)
1096
self.assertLength(1, self.hpss_connections)
1097
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
1099
def test_per_file(self):
1100
self.setup_smart_server_with_call_log()
1101
t = self.make_branch_and_tree('branch')
1102
self.build_tree_contents([('branch/foo', 'thecontents')])
1105
self.reset_smart_call_log()
1106
out, err = self.run_bzr(['log', '-v', self.get_url('branch') + "/foo"])
1107
# This figure represent the amount of work to perform this use case. It
1108
# is entirely ok to reduce this number if a test fails due to rpc_count
1109
# being too low. If rpc_count increases, more network roundtrips have
1110
# become necessary for this use case. Please do not adjust this number
1111
# upwards without agreement from bzr's network support maintainers.
1112
self.assertLength(14, self.hpss_calls)
1113
self.assertLength(1, self.hpss_connections)
1114
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)