61
61
def make_merged_branch(self, path='.', format=None):
62
62
tree = self.make_linear_branch(path, format)
63
63
tree2 = tree.controldir.sprout('tree2',
64
revision_id=tree.branch.get_rev_id(1)).open_workingtree()
64
revision_id=tree.branch.get_rev_id(1)).open_workingtree()
65
65
tree2.commit(message='tree2 message2')
66
66
tree2.commit(message='tree2 message3')
67
67
tree.merge_from_branch(tree2.branch)
75
75
super(TestLogWithLogCatcher, self).setUp()
76
76
# Capture log formatter creations
77
78
class MyLogFormatter(test_log.LogCatcher):
79
80
def __new__(klass, *args, **kwargs):
84
85
self.addCleanup(setattr, MyLogFormatter, "__new__", None)
87
# Always return our own log formatter class hijacking the
88
# default behavior (which requires setting up a config
88
# Always return our own log formatter class hijacking the
89
# default behavior (which requires setting up a config
90
91
return MyLogFormatter
91
92
self.overrideAttr(log.log_formatter_registry, 'get_default', getme)
103
104
[r.revno for r in self.get_captured_revisions()])
105
106
def assertLogRevnosAndDepths(self, args, expected_revnos_and_depths,
107
108
self.run_bzr(['log'] + args, working_dir=working_dir)
108
109
self.assertEqual(expected_revnos_and_depths,
109
110
[(r.revno, r.merge_depth)
110
for r in self.get_captured_revisions()])
111
for r in self.get_captured_revisions()])
113
114
class TestLogRevSpecs(TestLogWithLogCatcher):
368
369
self.make_minimal_branch()
369
370
self.run_bzr_error(["brz: ERROR: Requested revision: '123.123' "
370
371
"does not exist in branch:"],
371
['log', '-r123.123'])
372
['log', '-r123.123'])
373
374
def test_log_change_nonexistent_revno(self):
374
375
self.make_minimal_branch()
375
376
self.run_bzr_error(["brz: ERROR: Requested revision: '1234' "
376
377
"does not exist in branch:"],
379
380
def test_log_change_nonexistent_dotted_revno(self):
380
381
self.make_minimal_branch()
465
467
branch1_tree = self.make_linear_branch('branch1',
466
468
format='dirstate-tags')
467
469
branch1 = branch1_tree.branch
468
branch2_tree = branch1_tree.controldir.sprout('branch2').open_workingtree()
470
branch2_tree = branch1_tree.controldir.sprout(
471
'branch2').open_workingtree()
469
472
branch1_tree.commit(message='foobar', allow_pointless=True)
470
473
branch1.tags.set_tag('tag1', branch1.last_revision())
471
474
# tags don't propagate if we don't merge
559
562
self.assertEqual([('2', 0), ('1.1.2', 1), ('1.2.1', 2), ('1.1.1', 1),
561
564
[(r.revno, r.merge_depth)
562
for r in self.get_captured_revisions()])
565
for r in self.get_captured_revisions()])
564
567
def test_force_merge_revisions_off(self):
565
568
self.assertLogRevnos(['-n1'], ['2', '1'], working_dir='level0')
589
592
def test_merges_partial_range(self):
590
593
self.assertLogRevnosAndDepths(
591
['-n0', '-r1.1.1..1.1.2'],
592
[('1.1.2', 0), ('1.2.1', 1), ('1.1.1', 0)],
593
working_dir='level0')
594
['-n0', '-r1.1.1..1.1.2'],
595
[('1.1.2', 0), ('1.2.1', 1), ('1.1.1', 0)],
596
working_dir='level0')
595
598
def test_merges_partial_range_ignore_before_lower_bound(self):
596
599
"""Dont show revisions before the lower bound's merged revs"""
597
600
self.assertLogRevnosAndDepths(
598
['-n0', '-r1.1.2..2'],
599
[('2', 0), ('1.1.2', 1), ('1.2.1', 2)],
600
working_dir='level0')
601
['-n0', '-r1.1.2..2'],
602
[('2', 0), ('1.1.2', 1), ('1.2.1', 2)],
603
working_dir='level0')
602
605
def test_omit_merges_with_sidelines(self):
603
606
self.assertLogRevnos(['--omit-merges', '-n0'], ['1.2.1', '1.1.1', '1'],
672
675
def assertLogRevnosAndDiff(self, args, expected,
674
677
self.run_bzr(['log', '-p'] + args, working_dir=working_dir)
675
678
expected_revnos_and_depths = [
676
679
(revno, depth) for revno, depth, diff in expected]
677
680
# Check the revnos and depths first to make debugging easier
678
681
self.assertEqual(expected_revnos_and_depths,
679
682
[(r.revno, r.merge_depth)
680
for r in self.get_captured_revisions()])
683
for r in self.get_captured_revisions()])
681
684
# Now check the diffs, adding the revno in case of failure
682
685
fmt = 'In revno %s\n%s'
683
686
for expected_rev, actual_rev in zip(expected,
693
696
[('2', 0, self._diff_file2_revno2()),
694
697
('1.1.1', 1, self._diff_file2_revno1_1_1()),
695
('1', 0, self._diff_file1_revno1()
696
+ self._diff_file2_revno1())],
698
('1', 0, self._diff_file1_revno1() +
699
self._diff_file2_revno1())],
697
700
working_dir='level0')
700
702
def test_log_diff_file1(self):
701
703
self.assertLogRevnosAndDiff(['-n0', 'file1'],
702
704
[('1', 0, self._diff_file1_revno1())],
745
'cp437', # Common windows encoding
746
'cp1251', # Russian windows encoding
747
'cp1258', # Common windows encoding
747
'cp437', # Common windows encoding
748
'cp1251', # Russian windows encoding
749
'cp1258', # Common windows encoding
749
751
# Encodings which cannot encode mu
750
752
bad_encodings = [
768
770
brz = self.run_bzr
770
772
self.assertRaises(UnicodeEncodeError,
771
self._mu.encode, encoding)
773
self._mu.encode, encoding)
772
774
encoded_msg = self._message.encode(encoding, 'replace')
774
776
encoded_msg = self._message.encode(encoding)
1008
1010
self.assertEqual(["2", "1"],
1009
1011
[r.revno for r in self.get_captured_revisions()])
1010
1012
self.assertEqual("brz: ERROR: Further revision history missing.\n",
1013
1015
def test_log_range_open_end(self):
1014
1016
self.assertLogRevnos(["-r1.."], ["2", "1"])
1021
1023
self.build_tree(
1022
1024
['/hello.txt', '/goodbye.txt'])
1023
1025
tree.add('hello.txt')
1024
tree.commit(message='message1', committer='committer1', authors=['author1'])
1026
tree.commit(message='message1', committer='committer1',
1027
authors=['author1'])
1025
1028
tree.add('goodbye.txt')
1026
tree.commit(message='message2', committer='committer2', authors=['author2'])
1029
tree.commit(message='message2', committer='committer2',
1030
authors=['author2'])
1028
1032
def test_message(self):
1029
1033
self.prepare_tree()
1034
1038
self.assertLogRevnos(["--match-message", "message1"], ["1"])
1035
1039
self.assertLogRevnos(["--match-message", "message2"], ["2"])
1036
1040
self.assertLogRevnos(["--match-message", "message"], ["2", "1"])
1037
self.assertLogRevnos(["--match-message", "message1",
1041
self.assertLogRevnos(["--match-message", "message1",
1038
1042
"--match-message", "message2"], ["2", "1"])
1039
1043
self.assertLogRevnos(["--message", "message1"], ["1"])
1040
1044
self.assertLogRevnos(["--message", "message2"], ["2"])
1041
1045
self.assertLogRevnos(["--message", "message"], ["2", "1"])
1042
self.assertLogRevnos(["--match-message", "message1",
1046
self.assertLogRevnos(["--match-message", "message1",
1043
1047
"--message", "message2"], ["2", "1"])
1044
self.assertLogRevnos(["--message", "message1",
1048
self.assertLogRevnos(["--message", "message1",
1045
1049
"--match-message", "message2"], ["2", "1"])
1047
1051
def test_committer(self):
1049
1053
self.assertLogRevnos(["-m", "committer1"], ["1"])
1050
1054
self.assertLogRevnos(["-m", "committer2"], ["2"])
1051
1055
self.assertLogRevnos(["-m", "committer"], ["2", "1"])
1052
self.assertLogRevnos(["-m", "committer1", "-m", "committer2"],
1056
self.assertLogRevnos(["-m", "committer1", "-m", "committer2"],
1054
1058
self.assertLogRevnos(["--match-committer", "committer1"], ["1"])
1055
1059
self.assertLogRevnos(["--match-committer", "committer2"], ["2"])
1056
1060
self.assertLogRevnos(["--match-committer", "committer"], ["2", "1"])
1057
self.assertLogRevnos(["--match-committer", "committer1",
1061
self.assertLogRevnos(["--match-committer", "committer1",
1058
1062
"--match-committer", "committer2"], ["2", "1"])
1060
1064
def test_author(self):
1062
1066
self.assertLogRevnos(["-m", "author1"], ["1"])
1063
1067
self.assertLogRevnos(["-m", "author2"], ["2"])
1064
1068
self.assertLogRevnos(["-m", "author"], ["2", "1"])
1065
self.assertLogRevnos(["-m", "author1", "-m", "author2"],
1069
self.assertLogRevnos(["-m", "author1", "-m", "author2"],
1067
1071
self.assertLogRevnos(["--match-author", "author1"], ["1"])
1068
1072
self.assertLogRevnos(["--match-author", "author2"], ["2"])
1069
1073
self.assertLogRevnos(["--match-author", "author"], ["2", "1"])
1070
self.assertLogRevnos(["--match-author", "author1",
1074
self.assertLogRevnos(["--match-author", "author1",
1071
1075
"--match-author", "author2"], ["2", "1"])