40
40
log.properties_handler_registry = self.properties_handler_registry
41
41
self.addCleanup(restore)
43
def assertFormatterResult(self, result, branch, formatter_class,
44
formatter_kwargs=None, show_log_kwargs=None,
46
logfile = self.make_utf8_encoded_stringio()
47
if formatter_kwargs is None:
49
formatter = formatter_class(to_file=logfile, **formatter_kwargs)
50
if show_log_kwargs is None:
52
log.show_log(branch, formatter, **show_log_kwargs)
53
log_content = logfile.getvalue()
55
log_content = normalize_log(log_content)
56
self.assertEqualDiff(result, log_content)
58
def make_standard_commit(self, branch_nick, **kwargs):
59
wt = self.make_branch_and_tree('.')
61
self.addCleanup(wt.unlock)
62
self.build_tree(['a'])
64
wt.branch.nick = branch_nick
66
kwargs.setdefault('message', 'add a')
67
kwargs.setdefault('timestamp', 1132711707)
68
kwargs.setdefault('timezone', 36000)
69
kwargs.setdefault('committer', 'Lorem Ipsum <test@example.com>')
70
kwargs.setdefault('authors', ['John Doe <jdoe@example.com>'])
74
def _prepare_tree_with_merges(self, with_tags=False):
75
wt = self.make_branch_and_memory_tree('.')
77
self.addCleanup(wt.unlock)
79
wt.commit('rev-1', rev_id='rev-1',
80
timestamp=1132586655, timezone=36000,
81
committer='Joe Foo <joe@foo.com>')
82
wt.commit('rev-merged', rev_id='rev-2a',
83
timestamp=1132586700, timezone=36000,
84
committer='Joe Foo <joe@foo.com>')
85
wt.set_parent_ids(['rev-1', 'rev-2a'])
86
wt.branch.set_last_revision_info(1, 'rev-1')
87
wt.commit('rev-2', rev_id='rev-2b',
88
timestamp=1132586800, timezone=36000,
89
committer='Joe Foo <joe@foo.com>')
92
branch.tags.set_tag('v0.2', 'rev-2b')
93
wt.commit('rev-3', rev_id='rev-3',
94
timestamp=1132586900, timezone=36000,
95
committer='Jane Foo <jane@foo.com>')
96
branch.tags.set_tag('v1.0rc1', 'rev-3')
97
branch.tags.set_tag('v1.0', 'rev-3')
44
103
class LogCatcher(log.LogFormatter):
45
104
"""Pull log messages into a list rather than displaying them.
260
319
simple log message
265
def _prepare_tree_with_merges(self, with_tags=False):
266
wt = self.make_branch_and_memory_tree('.')
268
self.addCleanup(wt.unlock)
270
wt.commit('rev-1', rev_id='rev-1',
271
timestamp=1132586655, timezone=36000,
272
committer='Joe Foo <joe@foo.com>')
273
wt.commit('rev-merged', rev_id='rev-2a',
274
timestamp=1132586700, timezone=36000,
275
committer='Joe Foo <joe@foo.com>')
276
wt.set_parent_ids(['rev-1', 'rev-2a'])
277
wt.branch.set_last_revision_info(1, 'rev-1')
278
wt.commit('rev-2', rev_id='rev-2b',
279
timestamp=1132586800, timezone=36000,
280
committer='Joe Foo <joe@foo.com>')
283
branch.tags.set_tag('v0.2', 'rev-2b')
284
wt.commit('rev-3', rev_id='rev-3',
285
timestamp=1132586900, timezone=36000,
286
committer='Jane Foo <jane@foo.com>')
287
branch.tags.set_tag('v1.0rc1', 'rev-3')
288
branch.tags.set_tag('v1.0', 'rev-3')
322
b, log.ShortLogFormatter)
291
324
def test_short_log_with_merges(self):
292
325
wt = self._prepare_tree_with_merges()
293
logfile = self.make_utf8_encoded_stringio()
294
formatter = log.ShortLogFormatter(to_file=logfile)
295
log.show_log(wt.branch, formatter)
296
self.assertEqualDiff("""\
326
self.assertFormatterResult("""\
297
327
2 Joe Foo\t2005-11-22 [merge]
459
475
wt.commit('rev-2', rev_id='rev-2b',
460
476
timestamp=1132586800, timezone=36000,
461
477
committer='Joe Foo <joe@foo.com>')
462
logfile = self.make_utf8_encoded_stringio()
463
formatter = log.ShortLogFormatter(to_file=logfile, levels=0)
464
478
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
466
rev = revspec.in_history(wtb)
467
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
468
self.assertEqualDiff("""\
479
rev = revspec.in_history(wt.branch)
480
self.assertFormatterResult("""\
469
481
1.1.1 Joe Foo\t2005-11-22
476
class TestLongLogFormatter(TestCaseWithoutPropsHandler):
485
wt.branch, log.ShortLogFormatter,
486
formatter_kwargs=dict(levels=0),
487
show_log_kwargs=dict(start_revision=rev, end_revision=rev))
490
class TestLongLogFormatter(TestCaseForLogFormatter):
478
492
def test_verbose_log(self):
479
493
"""Verbose log includes changed files
483
wt = self.make_branch_and_tree('.')
485
self.build_tree(['a'])
487
# XXX: why does a longer nick show up?
488
b.nick = 'test_verbose_log'
489
wt.commit(message='add a',
490
timestamp=1132711707,
492
committer='Lorem Ipsum <test@example.com>')
493
logfile = file('out.tmp', 'w+')
494
formatter = log.LongLogFormatter(to_file=logfile)
495
log.show_log(b, formatter, verbose=True)
498
log_contents = logfile.read()
499
self.assertEqualDiff('''\
497
wt = self.make_standard_commit('test_verbose_log', authors=[])
498
self.assertFormatterResult('''\
500
499
------------------------------------------------------------
502
501
committer: Lorem Ipsum <test@example.com>
682
664
timestamp: Wed 2005-11-23 12:08:27 +1000
668
wt.branch, log.LongLogFormatter)
688
670
def test_properties_in_log(self):
689
671
"""Log includes the custom properties returned by the registered
692
wt = self.make_branch_and_tree('.')
694
self.build_tree(['a'])
696
b.nick = 'test_properties_in_log'
697
wt.commit(message='add a',
698
timestamp=1132711707,
700
committer='Lorem Ipsum <test@example.com>',
701
authors=['John Doe <jdoe@example.com>'])
703
formatter = log.LongLogFormatter(to_file=sio)
705
def trivial_custom_prop_handler(revision):
706
return {'test_prop':'test_value'}
674
wt = self.make_standard_commit('test_properties_in_log')
675
def trivial_custom_prop_handler(revision):
676
return {'test_prop':'test_value'}
708
log.properties_handler_registry.register(
709
'trivial_custom_prop_handler',
710
trivial_custom_prop_handler)
711
log.show_log(b, formatter)
713
log.properties_handler_registry.remove(
714
'trivial_custom_prop_handler')
715
self.assertEqualDiff('''\
678
# Cleaned up in setUp()
679
log.properties_handler_registry.register(
680
'trivial_custom_prop_handler',
681
trivial_custom_prop_handler)
682
self.assertFormatterResult("""\
716
683
------------------------------------------------------------
718
685
test_prop: test_value
722
689
timestamp: Wed 2005-11-23 12:08:27 +1000
693
wt.branch, log.LongLogFormatter)
728
695
def test_properties_in_short_log(self):
729
696
"""Log includes the custom properties returned by the registered
732
wt = self.make_branch_and_tree('.')
734
self.build_tree(['a'])
736
b.nick = 'test_properties_in_short_log'
737
wt.commit(message='add a',
738
timestamp=1132711707,
740
committer='Lorem Ipsum <test@example.com>',
741
authors=['John Doe <jdoe@example.com>'])
743
formatter = log.ShortLogFormatter(to_file=sio)
745
def trivial_custom_prop_handler(revision):
746
return {'test_prop':'test_value'}
699
wt = self.make_standard_commit('test_properties_in_short_log')
700
def trivial_custom_prop_handler(revision):
701
return {'test_prop':'test_value'}
748
log.properties_handler_registry.register(
749
'trivial_custom_prop_handler',
750
trivial_custom_prop_handler)
751
log.show_log(b, formatter)
753
log.properties_handler_registry.remove(
754
'trivial_custom_prop_handler')
755
self.assertEqualDiff('''\
703
log.properties_handler_registry.register(
704
'trivial_custom_prop_handler',
705
trivial_custom_prop_handler)
706
self.assertFormatterResult("""\
756
707
1 John Doe\t2005-11-23
757
708
test_prop: test_value
712
wt.branch, log.ShortLogFormatter)
763
714
def test_error_in_properties_handler(self):
764
715
"""Log includes the custom properties returned by the registered
767
wt = self.make_branch_and_tree('.')
769
self.build_tree(['a'])
771
b.nick = 'test_author_log'
772
wt.commit(message='add a',
773
timestamp=1132711707,
775
committer='Lorem Ipsum <test@example.com>',
776
authors=['John Doe <jdoe@example.com>'],
777
revprops={'first_prop':'first_value'})
718
wt = self.make_standard_commit('error_in_properties_handler',
719
revprops={'first_prop':'first_value'})
720
sio = self.make_utf8_encoded_stringio()
779
721
formatter = log.LongLogFormatter(to_file=sio)
781
def trivial_custom_prop_handler(revision):
782
raise StandardError("a test error")
722
def trivial_custom_prop_handler(revision):
723
raise StandardError("a test error")
784
log.properties_handler_registry.register(
785
'trivial_custom_prop_handler',
786
trivial_custom_prop_handler)
787
self.assertRaises(StandardError, log.show_log, b, formatter,)
789
log.properties_handler_registry.remove(
790
'trivial_custom_prop_handler')
725
log.properties_handler_registry.register(
726
'trivial_custom_prop_handler',
727
trivial_custom_prop_handler)
728
self.assertRaises(StandardError, log.show_log, wt.branch, formatter,)
792
730
def test_properties_handler_bad_argument(self):
793
wt = self.make_branch_and_tree('.')
795
self.build_tree(['a'])
797
b.nick = 'test_author_log'
798
wt.commit(message='add a',
799
timestamp=1132711707,
801
committer='Lorem Ipsum <test@example.com>',
802
authors=['John Doe <jdoe@example.com>'],
803
revprops={'a_prop':'test_value'})
731
wt = self.make_standard_commit('bad_argument',
732
revprops={'a_prop':'test_value'})
733
sio = self.make_utf8_encoded_stringio()
805
734
formatter = log.LongLogFormatter(to_file=sio)
807
def bad_argument_prop_handler(revision):
808
return {'custom_prop_name':revision.properties['a_prop']}
810
log.properties_handler_registry.register(
811
'bad_argument_prop_handler',
812
bad_argument_prop_handler)
814
self.assertRaises(AttributeError, formatter.show_properties,
817
revision = b.repository.get_revision(b.last_revision())
818
formatter.show_properties(revision, '')
819
self.assertEqualDiff('''custom_prop_name: test_value\n''',
822
log.properties_handler_registry.remove(
823
'bad_argument_prop_handler')
826
class TestLongLogFormatterWithoutMergeRevisions(TestCaseWithoutPropsHandler):
735
def bad_argument_prop_handler(revision):
736
return {'custom_prop_name':revision.properties['a_prop']}
738
log.properties_handler_registry.register(
739
'bad_argument_prop_handler',
740
bad_argument_prop_handler)
742
self.assertRaises(AttributeError, formatter.show_properties,
745
revision = wt.branch.repository.get_revision(wt.branch.last_revision())
746
formatter.show_properties(revision, '')
747
self.assertEqualDiff('''custom_prop_name: test_value\n''',
751
class TestLongLogFormatterWithoutMergeRevisions(TestCaseForLogFormatter):
828
753
def test_long_verbose_log(self):
829
754
"""Verbose log includes changed files
833
wt = self.make_branch_and_tree('.')
835
self.build_tree(['a'])
837
# XXX: why does a longer nick show up?
838
b.nick = 'test_verbose_log'
839
wt.commit(message='add a',
840
timestamp=1132711707,
842
committer='Lorem Ipsum <test@example.com>')
843
logfile = file('out.tmp', 'w+')
844
formatter = log.LongLogFormatter(to_file=logfile, levels=1)
845
log.show_log(b, formatter, verbose=True)
848
log_contents = logfile.read()
849
self.assertEqualDiff('''\
758
wt = self.make_standard_commit('test_long_verbose_log', authors=[])
759
self.assertFormatterResult("""\
850
760
------------------------------------------------------------
852
762
committer: Lorem Ipsum <test@example.com>
853
branch nick: test_verbose_log
763
branch nick: test_long_verbose_log
854
764
timestamp: Wed 2005-11-23 12:08:27 +1000
770
wt.branch, log.LongLogFormatter,
771
formatter_kwargs=dict(levels=1),
772
show_log_kwargs=dict(verbose=True))
862
774
def test_long_verbose_contain_deltas(self):
863
775
wt = self.make_branch_and_tree('parent')
864
776
self.build_tree(['parent/f1', 'parent/f2'])
865
777
wt.add(['f1','f2'])
866
778
wt.commit('first post')
867
self.run_bzr('branch parent child')
779
child_wt = wt.bzrdir.sprout('child').open_workingtree()
868
780
os.unlink('child/f1')
869
file('child/f2', 'wb').write('hello\n')
870
self.run_bzr(['commit', '-m', 'removed f1 and modified f2',
873
self.run_bzr('merge ../child')
781
self.build_tree_contents([('child/f2', 'hello\n')])
782
child_wt.commit('removed f1 and modified f2')
783
wt.merge_from_branch(child_wt.branch)
874
784
wt.commit('merge branch 1')
876
sio = self.make_utf8_encoded_stringio()
877
lf = log.LongLogFormatter(to_file=sio, levels=1)
878
log.show_log(b, lf, verbose=True)
879
the_log = normalize_log(sio.getvalue())
880
self.assertEqualDiff("""\
785
self.assertFormatterResult("""\
881
786
------------------------------------------------------------
883
788
committer: Lorem Ipsum <test@example.com>
962
856
timestamp: Wed 2005-11-23 12:08:27 +1000
860
wt.branch, log.LongLogFormatter,
861
formatter_kwargs=dict(levels=1))
968
863
def test_long_properties_in_log(self):
969
864
"""Log includes the custom properties returned by the registered
972
wt = self.make_branch_and_tree('.')
974
self.build_tree(['a'])
976
b.nick = 'test_properties_in_log'
977
wt.commit(message='add a',
978
timestamp=1132711707,
980
committer='Lorem Ipsum <test@example.com>',
981
authors=['John Doe <jdoe@example.com>'])
983
formatter = log.LongLogFormatter(to_file=sio, levels=1)
985
def trivial_custom_prop_handler(revision):
986
return {'test_prop':'test_value'}
867
wt = self.make_standard_commit('test_properties_in_log')
868
def trivial_custom_prop_handler(revision):
869
return {'test_prop':'test_value'}
988
log.properties_handler_registry.register(
989
'trivial_custom_prop_handler',
990
trivial_custom_prop_handler)
991
log.show_log(b, formatter)
993
log.properties_handler_registry.remove(
994
'trivial_custom_prop_handler')
995
self.assertEqualDiff('''\
871
log.properties_handler_registry.register(
872
'trivial_custom_prop_handler',
873
trivial_custom_prop_handler)
874
self.assertFormatterResult("""\
996
875
------------------------------------------------------------
998
877
test_prop: test_value
1002
881
timestamp: Wed 2005-11-23 12:08:27 +1000
1009
class TestLineLogFormatter(tests.TestCaseWithTransport):
885
wt.branch, log.LongLogFormatter,
886
formatter_kwargs=dict(levels=1))
889
class TestLineLogFormatter(TestCaseForLogFormatter):
1011
891
def test_line_log(self):
1012
892
"""Line log should show revno
1016
wt = self.make_branch_and_tree('.')
1018
self.build_tree(['a'])
1020
b.nick = 'test-line-log'
1021
wt.commit(message='add a',
1022
timestamp=1132711707,
1024
committer='Line-Log-Formatter Tester <test@line.log>')
1025
logfile = file('out.tmp', 'w+')
1026
formatter = log.LineLogFormatter(to_file=logfile)
1027
log.show_log(b, formatter)
1030
log_contents = logfile.read()
1031
self.assertEqualDiff('1: Line-Log-Formatte... 2005-11-23 add a\n',
896
wt = self.make_standard_commit('test-line-log',
897
committer='Line-Log-Formatter Tester <test@line.log>',
899
self.assertFormatterResult("""\
900
1: Line-Log-Formatte... 2005-11-23 add a
902
wt.branch, log.LineLogFormatter)
1034
904
def test_trailing_newlines(self):
1035
905
wt = self.make_branch_and_tree('.')
1036
906
b = make_commits_with_trailing_newlines(wt)
1037
sio = self.make_utf8_encoded_stringio()
1038
lf = log.LineLogFormatter(to_file=sio)
1040
self.assertEqualDiff("""\
907
self.assertFormatterResult("""\
1041
908
3: Joe Foo 2005-11-21 single line with trailing newline
1042
909
2: Joe Bar 2005-11-21 multiline
1043
910
1: Joe Foo 2005-11-21 simple log message
1047
def _prepare_tree_with_merges(self, with_tags=False):
1048
wt = self.make_branch_and_memory_tree('.')
1050
self.addCleanup(wt.unlock)
1052
wt.commit('rev-1', rev_id='rev-1',
1053
timestamp=1132586655, timezone=36000,
1054
committer='Joe Foo <joe@foo.com>')
1055
wt.commit('rev-merged', rev_id='rev-2a',
1056
timestamp=1132586700, timezone=36000,
1057
committer='Joe Foo <joe@foo.com>')
1058
wt.set_parent_ids(['rev-1', 'rev-2a'])
1059
wt.branch.set_last_revision_info(1, 'rev-1')
1060
wt.commit('rev-2', rev_id='rev-2b',
1061
timestamp=1132586800, timezone=36000,
1062
committer='Joe Foo <joe@foo.com>')
1065
branch.tags.set_tag('v0.2', 'rev-2b')
1066
wt.commit('rev-3', rev_id='rev-3',
1067
timestamp=1132586900, timezone=36000,
1068
committer='Jane Foo <jane@foo.com>')
1069
branch.tags.set_tag('v1.0rc1', 'rev-3')
1070
branch.tags.set_tag('v1.0', 'rev-3')
912
b, log.LineLogFormatter)
1073
914
def test_line_log_single_merge_revision(self):
1074
915
wt = self._prepare_tree_with_merges()
1075
logfile = self.make_utf8_encoded_stringio()
1076
formatter = log.LineLogFormatter(to_file=logfile)
1077
916
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
1079
rev = revspec.in_history(wtb)
1080
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
1081
self.assertEqualDiff("""\
917
rev = revspec.in_history(wt.branch)
918
self.assertFormatterResult("""\
1082
919
1.1.1: Joe Foo 2005-11-22 rev-merged
921
wt.branch, log.LineLogFormatter,
922
show_log_kwargs=dict(start_revision=rev, end_revision=rev))
1086
924
def test_line_log_with_tags(self):
1087
925
wt = self._prepare_tree_with_merges(with_tags=True)
1088
logfile = self.make_utf8_encoded_stringio()
1089
formatter = log.LineLogFormatter(to_file=logfile)
1090
log.show_log(wt.branch, formatter)
1091
self.assertEqualDiff("""\
926
self.assertFormatterResult("""\
1092
927
3: Jane Foo 2005-11-22 {v1.0, v1.0rc1} rev-3
1093
928
2: Joe Foo 2005-11-22 [merge] {v0.2} rev-2
1094
929
1: Joe Foo 2005-11-22 rev-1
1098
class TestLineLogFormatterWithMergeRevisions(tests.TestCaseWithTransport):
931
wt.branch, log.LineLogFormatter)
934
class TestLineLogFormatterWithMergeRevisions(TestCaseForLogFormatter):
1100
936
def test_line_merge_revs_log(self):
1101
937
"""Line log should show revno
1105
wt = self.make_branch_and_tree('.')
1107
self.build_tree(['a'])
1109
b.nick = 'test-line-log'
1110
wt.commit(message='add a',
1111
timestamp=1132711707,
1113
committer='Line-Log-Formatter Tester <test@line.log>')
1114
logfile = file('out.tmp', 'w+')
1115
formatter = log.LineLogFormatter(to_file=logfile, levels=0)
1116
log.show_log(b, formatter)
1119
log_contents = logfile.read()
1120
self.assertEqualDiff('1: Line-Log-Formatte... 2005-11-23 add a\n',
941
wt = self.make_standard_commit('test-line-log',
942
committer='Line-Log-Formatter Tester <test@line.log>',
944
self.assertFormatterResult("""\
945
1: Line-Log-Formatte... 2005-11-23 add a
947
wt.branch, log.LineLogFormatter)
1123
949
def test_line_merge_revs_log_single_merge_revision(self):
1124
950
wt = self.make_branch_and_memory_tree('.')
1198
1021
return mainline_revs, rev_nos, wt
1200
def make_tree_with_many_merges(self):
1023
def make_branch_with_many_merges(self):
1201
1024
"""Create a tree with well-known revision ids"""
1202
wt = self.make_branch_and_tree('tree1')
1203
self.build_tree_contents([('tree1/f', '1\n')])
1204
wt.add(['f'], ['f-id'])
1205
wt.commit('commit one', rev_id='1')
1206
wt.commit('commit two', rev_id='2')
1208
tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
1209
self.build_tree_contents([('tree3/f', '1\n2\n3a\n')])
1210
tree3.commit('commit three a', rev_id='3a')
1212
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
1213
tree2.merge_from_branch(tree3.branch)
1214
tree2.commit('commit three b', rev_id='3b')
1216
wt.merge_from_branch(tree2.branch)
1217
wt.commit('commit three c', rev_id='3c')
1218
tree2.commit('four-a', rev_id='4a')
1220
wt.merge_from_branch(tree2.branch)
1221
wt.commit('four-b', rev_id='4b')
1025
builder = self.make_branch_builder('tree1')
1026
builder.start_series()
1027
builder.build_snapshot('1', None, [
1028
('add', ('', 'TREE_ROOT', 'directory', '')),
1029
('add', ('f', 'f-id', 'file', '1\n'))])
1030
builder.build_snapshot('2', ['1'], [])
1031
builder.build_snapshot('3a', ['2'], [
1032
('modify', ('f-id', '1\n2\n3a\n'))])
1033
builder.build_snapshot('3b', ['2', '3a'], [
1034
('modify', ('f-id', '1\n2\n3a\n'))])
1035
builder.build_snapshot('3c', ['2', '3b'], [
1036
('modify', ('f-id', '1\n2\n3a\n'))])
1037
builder.build_snapshot('4a', ['3b'], [])
1038
builder.build_snapshot('4b', ['3c', '4a'], [])
1039
builder.finish_series()
1223
1053
mainline_revs = [None, '1', '2', '3c', '4b']
1224
1054
rev_nos = {'1':1, '2':2, '3c': 3, '4b':4}
1298
1128
def test_get_view_revisions_merge2(self):
1299
1129
"""Test get_view_revisions when there are merges"""
1300
mainline_revs, rev_nos, wt = self.make_tree_with_many_merges()
1302
self.addCleanup(wt.unlock)
1130
mainline_revs, rev_nos, b = self.make_branch_with_many_merges()
1132
self.addCleanup(b.unlock)
1303
1133
revisions = list(log.get_view_revisions(
1304
mainline_revs, rev_nos, wt.branch, 'forward'))
1134
mainline_revs, rev_nos, b, 'forward'))
1305
1135
expected = [('1', '1', 0), ('2', '2', 0), ('3c', '3', 0),
1306
('3a', '2.1.1', 1), ('3b', '2.2.1', 1), ('4b', '4', 0),
1136
('3b', '2.2.1', 1), ('3a', '2.1.1', 2), ('4b', '4', 0),
1307
1137
('4a', '2.2.2', 1)]
1308
1138
self.assertEqual(expected, revisions)
1309
1139
revisions = list(log.get_view_revisions(
1310
mainline_revs, rev_nos, wt.branch, 'forward',
1140
mainline_revs, rev_nos, b, 'forward',
1311
1141
include_merges=False))
1312
1142
self.assertEqual([('1', '1', 0), ('2', '2', 0), ('3c', '3', 0),
1313
1143
('4b', '4', 0)],
1337
rev_3a = rev_from_rev_id('3a', wt.branch)
1338
rev_4b = rev_from_rev_id('4b', wt.branch)
1339
self.assertEqual([('3c', '3', 0), ('3a', '2.1.1', 1)],
1167
rev_3a = rev_from_rev_id('3a', b)
1168
rev_4b = rev_from_rev_id('4b', b)
1169
self.assertEqual([('3c', '3', 0), ('3b', '2.2.1', 1), ('3a', '2.1.1', 2)],
1340
1170
view_revs(rev_3a, rev_4b, 'f-id', 'reverse'))
1341
1171
# Note: 3c still appears before 3a here because of depth-based sorting
1342
self.assertEqual([('3c', '3', 0), ('3a', '2.1.1', 1)],
1172
self.assertEqual([('3c', '3', 0), ('3b', '2.2.1', 1), ('3a', '2.1.1', 2)],
1343
1173
view_revs(rev_3a, rev_4b, 'f-id', 'forward'))
1697
1527
log.show_branch_change(tree.branch, s, 3, '3b')
1698
1528
self.assertContainsRe(s.getvalue(), 'Removed Revisions:')
1699
1529
self.assertNotContainsRe(s.getvalue(), 'Added Revisions:')
1533
class TestLogWithBugs(TestCaseForLogFormatter):
1536
TestCaseForLogFormatter.setUp(self)
1537
log.properties_handler_registry.register(
1538
'bugs_properties_handler',
1539
log._bugs_properties_handler)
1541
def make_commits_with_bugs(self):
1542
"""Helper method for LogFormatter tests"""
1543
tree = self.make_branch_and_tree(u'.')
1544
self.build_tree(['a', 'b'])
1546
tree.commit('simple log message', rev_id='a1',
1547
timestamp=1132586655.459960938, timezone=-6*3600,
1548
committer='Joe Foo <joe@foo.com>',
1549
revprops={'bugs': 'test://bug/id fixed'})
1551
tree.commit('multiline\nlog\nmessage\n', rev_id='a2',
1552
timestamp=1132586842.411175966, timezone=-6*3600,
1553
committer='Joe Foo <joe@foo.com>',
1554
authors=['Joe Bar <joe@bar.com>'],
1555
revprops={'bugs': 'test://bug/id fixed\n'
1556
'test://bug/2 fixed'})
1560
def test_long_bugs(self):
1561
tree = self.make_commits_with_bugs()
1562
self.assertFormatterResult("""\
1563
------------------------------------------------------------
1565
fixes bug(s): test://bug/id test://bug/2
1566
author: Joe Bar <joe@bar.com>
1567
committer: Joe Foo <joe@foo.com>
1569
timestamp: Mon 2005-11-21 09:27:22 -0600
1574
------------------------------------------------------------
1576
fixes bug(s): test://bug/id
1577
committer: Joe Foo <joe@foo.com>
1579
timestamp: Mon 2005-11-21 09:24:15 -0600
1583
tree.branch, log.LongLogFormatter)
1585
def test_short_bugs(self):
1586
tree = self.make_commits_with_bugs()
1587
self.assertFormatterResult("""\
1588
2 Joe Bar\t2005-11-21
1589
fixes bug(s): test://bug/id test://bug/2
1594
1 Joe Foo\t2005-11-21
1595
fixes bug(s): test://bug/id
1599
tree.branch, log.ShortLogFormatter)
1601
def test_wrong_bugs_property(self):
1602
tree = self.make_branch_and_tree(u'.')
1603
self.build_tree(['foo'])
1604
tree.commit('simple log message', rev_id='a1',
1605
timestamp=1132586655.459960938, timezone=-6*3600,
1606
committer='Joe Foo <joe@foo.com>',
1607
revprops={'bugs': 'test://bug/id invalid_value'})
1608
self.assertFormatterResult("""\
1609
1 Joe Foo\t2005-11-21
1613
tree.branch, log.ShortLogFormatter)
1615
def test_bugs_handler_present(self):
1616
self.properties_handler_registry.get('bugs_properties_handler')