30
class TestCaseWithoutPropsHandler(tests.TestCaseWithTransport):
30
class TestCaseForLogFormatter(tests.TestCaseWithTransport):
33
super(TestCaseWithoutPropsHandler, self).setUp()
33
super(TestCaseForLogFormatter, self).setUp()
34
34
# keep a reference to the "current" custom prop. handler registry
35
35
self.properties_handler_registry = log.properties_handler_registry
36
# clean up the registry in log
36
# Use a clean registry for log
37
37
log.properties_handler_registry = registry.Registry()
40
super(TestCaseWithoutPropsHandler, self)._cleanup()
41
# restore the custom properties handler registry
42
log.properties_handler_registry = self.properties_handler_registry
40
log.properties_handler_registry = self.properties_handler_registry
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')
45
103
class LogCatcher(log.LogFormatter):
46
"""Pull log messages into list rather than displaying them.
48
For ease of testing we save log messages here rather than actually
49
formatting them, so that we can precisely check the result without
50
being too dependent on the exact formatting.
52
We should also test the LogFormatter.
104
"""Pull log messages into a list rather than displaying them.
106
To simplify testing we save logged revisions here rather than actually
107
formatting anything, so that we can precisely check the result without
108
being dependent on the formatting.
55
111
supports_delta = True
57
113
def __init__(self):
58
114
super(LogCatcher, self).__init__(to_file=None)
61
117
def log_revision(self, revision):
62
self.logs.append(revision)
118
self.revisions.append(revision)
65
121
class TestShowLog(tests.TestCaseWithTransport):
261
319
simple log message
266
def _prepare_tree_with_merges(self, with_tags=False):
267
wt = self.make_branch_and_memory_tree('.')
269
self.addCleanup(wt.unlock)
271
wt.commit('rev-1', rev_id='rev-1',
272
timestamp=1132586655, timezone=36000,
273
committer='Joe Foo <joe@foo.com>')
274
wt.commit('rev-merged', rev_id='rev-2a',
275
timestamp=1132586700, timezone=36000,
276
committer='Joe Foo <joe@foo.com>')
277
wt.set_parent_ids(['rev-1', 'rev-2a'])
278
wt.branch.set_last_revision_info(1, 'rev-1')
279
wt.commit('rev-2', rev_id='rev-2b',
280
timestamp=1132586800, timezone=36000,
281
committer='Joe Foo <joe@foo.com>')
284
branch.tags.set_tag('v0.2', 'rev-2b')
285
wt.commit('rev-3', rev_id='rev-3',
286
timestamp=1132586900, timezone=36000,
287
committer='Jane Foo <jane@foo.com>')
288
branch.tags.set_tag('v1.0rc1', 'rev-3')
289
branch.tags.set_tag('v1.0', 'rev-3')
322
b, log.ShortLogFormatter)
292
324
def test_short_log_with_merges(self):
293
325
wt = self._prepare_tree_with_merges()
294
logfile = self.make_utf8_encoded_stringio()
295
formatter = log.ShortLogFormatter(to_file=logfile)
296
log.show_log(wt.branch, formatter)
297
self.assertEqualDiff("""\
326
self.assertFormatterResult("""\
298
327
2 Joe Foo\t2005-11-22 [merge]
460
475
wt.commit('rev-2', rev_id='rev-2b',
461
476
timestamp=1132586800, timezone=36000,
462
477
committer='Joe Foo <joe@foo.com>')
463
logfile = self.make_utf8_encoded_stringio()
464
formatter = log.ShortLogFormatter(to_file=logfile, levels=0)
465
478
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
467
rev = revspec.in_history(wtb)
468
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
469
self.assertEqualDiff("""\
479
rev = revspec.in_history(wt.branch)
480
self.assertFormatterResult("""\
470
481
1.1.1 Joe Foo\t2005-11-22
477
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):
479
492
def test_verbose_log(self):
480
493
"""Verbose log includes changed files
484
wt = self.make_branch_and_tree('.')
486
self.build_tree(['a'])
488
# XXX: why does a longer nick show up?
489
b.nick = 'test_verbose_log'
490
wt.commit(message='add a',
491
timestamp=1132711707,
493
committer='Lorem Ipsum <test@example.com>')
494
logfile = file('out.tmp', 'w+')
495
formatter = log.LongLogFormatter(to_file=logfile)
496
log.show_log(b, formatter, verbose=True)
499
log_contents = logfile.read()
500
self.assertEqualDiff('''\
497
wt = self.make_standard_commit('test_verbose_log', authors=[])
498
self.assertFormatterResult('''\
501
499
------------------------------------------------------------
503
501
committer: Lorem Ipsum <test@example.com>
683
664
timestamp: Wed 2005-11-23 12:08:27 +1000
668
wt.branch, log.LongLogFormatter)
689
670
def test_properties_in_log(self):
690
671
"""Log includes the custom properties returned by the registered
693
wt = self.make_branch_and_tree('.')
695
self.build_tree(['a'])
697
b.nick = 'test_properties_in_log'
698
wt.commit(message='add a',
699
timestamp=1132711707,
701
committer='Lorem Ipsum <test@example.com>',
702
authors=['John Doe <jdoe@example.com>'])
704
formatter = log.LongLogFormatter(to_file=sio)
706
def trivial_custom_prop_handler(revision):
707
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'}
709
log.properties_handler_registry.register(
710
'trivial_custom_prop_handler',
711
trivial_custom_prop_handler)
712
log.show_log(b, formatter)
714
log.properties_handler_registry.remove(
715
'trivial_custom_prop_handler')
716
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("""\
717
683
------------------------------------------------------------
719
685
test_prop: test_value
723
689
timestamp: Wed 2005-11-23 12:08:27 +1000
693
wt.branch, log.LongLogFormatter)
729
695
def test_properties_in_short_log(self):
730
696
"""Log includes the custom properties returned by the registered
733
wt = self.make_branch_and_tree('.')
735
self.build_tree(['a'])
737
b.nick = 'test_properties_in_short_log'
738
wt.commit(message='add a',
739
timestamp=1132711707,
741
committer='Lorem Ipsum <test@example.com>',
742
authors=['John Doe <jdoe@example.com>'])
744
formatter = log.ShortLogFormatter(to_file=sio)
746
def trivial_custom_prop_handler(revision):
747
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'}
749
log.properties_handler_registry.register(
750
'trivial_custom_prop_handler',
751
trivial_custom_prop_handler)
752
log.show_log(b, formatter)
754
log.properties_handler_registry.remove(
755
'trivial_custom_prop_handler')
756
self.assertEqualDiff('''\
703
log.properties_handler_registry.register(
704
'trivial_custom_prop_handler',
705
trivial_custom_prop_handler)
706
self.assertFormatterResult("""\
757
707
1 John Doe\t2005-11-23
758
708
test_prop: test_value
712
wt.branch, log.ShortLogFormatter)
764
714
def test_error_in_properties_handler(self):
765
715
"""Log includes the custom properties returned by the registered
768
wt = self.make_branch_and_tree('.')
770
self.build_tree(['a'])
772
b.nick = 'test_author_log'
773
wt.commit(message='add a',
774
timestamp=1132711707,
776
committer='Lorem Ipsum <test@example.com>',
777
authors=['John Doe <jdoe@example.com>'],
778
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()
780
721
formatter = log.LongLogFormatter(to_file=sio)
782
def trivial_custom_prop_handler(revision):
783
raise StandardError("a test error")
722
def trivial_custom_prop_handler(revision):
723
raise StandardError("a test error")
785
log.properties_handler_registry.register(
786
'trivial_custom_prop_handler',
787
trivial_custom_prop_handler)
788
self.assertRaises(StandardError, log.show_log, b, formatter,)
790
log.properties_handler_registry.remove(
791
'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,)
793
730
def test_properties_handler_bad_argument(self):
794
wt = self.make_branch_and_tree('.')
796
self.build_tree(['a'])
798
b.nick = 'test_author_log'
799
wt.commit(message='add a',
800
timestamp=1132711707,
802
committer='Lorem Ipsum <test@example.com>',
803
authors=['John Doe <jdoe@example.com>'],
804
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()
806
734
formatter = log.LongLogFormatter(to_file=sio)
808
def bad_argument_prop_handler(revision):
809
return {'custom_prop_name':revision.properties['a_prop']}
811
log.properties_handler_registry.register(
812
'bad_argument_prop_handler',
813
bad_argument_prop_handler)
815
self.assertRaises(AttributeError, formatter.show_properties,
818
revision = b.repository.get_revision(b.last_revision())
819
formatter.show_properties(revision, '')
820
self.assertEqualDiff('''custom_prop_name: test_value\n''',
823
log.properties_handler_registry.remove(
824
'bad_argument_prop_handler')
827
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):
829
753
def test_long_verbose_log(self):
830
754
"""Verbose log includes changed files
834
wt = self.make_branch_and_tree('.')
836
self.build_tree(['a'])
838
# XXX: why does a longer nick show up?
839
b.nick = 'test_verbose_log'
840
wt.commit(message='add a',
841
timestamp=1132711707,
843
committer='Lorem Ipsum <test@example.com>')
844
logfile = file('out.tmp', 'w+')
845
formatter = log.LongLogFormatter(to_file=logfile, levels=1)
846
log.show_log(b, formatter, verbose=True)
849
log_contents = logfile.read()
850
self.assertEqualDiff('''\
758
wt = self.make_standard_commit('test_long_verbose_log', authors=[])
759
self.assertFormatterResult("""\
851
760
------------------------------------------------------------
853
762
committer: Lorem Ipsum <test@example.com>
854
branch nick: test_verbose_log
763
branch nick: test_long_verbose_log
855
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))
863
774
def test_long_verbose_contain_deltas(self):
864
775
wt = self.make_branch_and_tree('parent')
865
776
self.build_tree(['parent/f1', 'parent/f2'])
866
777
wt.add(['f1','f2'])
867
778
wt.commit('first post')
868
self.run_bzr('branch parent child')
779
child_wt = wt.bzrdir.sprout('child').open_workingtree()
869
780
os.unlink('child/f1')
870
file('child/f2', 'wb').write('hello\n')
871
self.run_bzr(['commit', '-m', 'removed f1 and modified f2',
874
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)
875
784
wt.commit('merge branch 1')
877
sio = self.make_utf8_encoded_stringio()
878
lf = log.LongLogFormatter(to_file=sio, levels=1)
879
log.show_log(b, lf, verbose=True)
880
the_log = normalize_log(sio.getvalue())
881
self.assertEqualDiff("""\
785
self.assertFormatterResult("""\
882
786
------------------------------------------------------------
884
788
committer: Lorem Ipsum <test@example.com>
963
856
timestamp: Wed 2005-11-23 12:08:27 +1000
860
wt.branch, log.LongLogFormatter,
861
formatter_kwargs=dict(levels=1))
969
863
def test_long_properties_in_log(self):
970
864
"""Log includes the custom properties returned by the registered
973
wt = self.make_branch_and_tree('.')
975
self.build_tree(['a'])
977
b.nick = 'test_properties_in_log'
978
wt.commit(message='add a',
979
timestamp=1132711707,
981
committer='Lorem Ipsum <test@example.com>',
982
authors=['John Doe <jdoe@example.com>'])
984
formatter = log.LongLogFormatter(to_file=sio, levels=1)
986
def trivial_custom_prop_handler(revision):
987
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'}
989
log.properties_handler_registry.register(
990
'trivial_custom_prop_handler',
991
trivial_custom_prop_handler)
992
log.show_log(b, formatter)
994
log.properties_handler_registry.remove(
995
'trivial_custom_prop_handler')
996
self.assertEqualDiff('''\
871
log.properties_handler_registry.register(
872
'trivial_custom_prop_handler',
873
trivial_custom_prop_handler)
874
self.assertFormatterResult("""\
997
875
------------------------------------------------------------
999
877
test_prop: test_value
1003
881
timestamp: Wed 2005-11-23 12:08:27 +1000
1010
class TestLineLogFormatter(tests.TestCaseWithTransport):
885
wt.branch, log.LongLogFormatter,
886
formatter_kwargs=dict(levels=1))
889
class TestLineLogFormatter(TestCaseForLogFormatter):
1012
891
def test_line_log(self):
1013
892
"""Line log should show revno
1017
wt = self.make_branch_and_tree('.')
1019
self.build_tree(['a'])
1021
b.nick = 'test-line-log'
1022
wt.commit(message='add a',
1023
timestamp=1132711707,
1025
committer='Line-Log-Formatter Tester <test@line.log>')
1026
logfile = file('out.tmp', 'w+')
1027
formatter = log.LineLogFormatter(to_file=logfile)
1028
log.show_log(b, formatter)
1031
log_contents = logfile.read()
1032
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)
1035
904
def test_trailing_newlines(self):
1036
905
wt = self.make_branch_and_tree('.')
1037
906
b = make_commits_with_trailing_newlines(wt)
1038
sio = self.make_utf8_encoded_stringio()
1039
lf = log.LineLogFormatter(to_file=sio)
1041
self.assertEqualDiff("""\
907
self.assertFormatterResult("""\
1042
908
3: Joe Foo 2005-11-21 single line with trailing newline
1043
909
2: Joe Bar 2005-11-21 multiline
1044
910
1: Joe Foo 2005-11-21 simple log message
1048
def _prepare_tree_with_merges(self, with_tags=False):
1049
wt = self.make_branch_and_memory_tree('.')
1051
self.addCleanup(wt.unlock)
1053
wt.commit('rev-1', rev_id='rev-1',
1054
timestamp=1132586655, timezone=36000,
1055
committer='Joe Foo <joe@foo.com>')
1056
wt.commit('rev-merged', rev_id='rev-2a',
1057
timestamp=1132586700, timezone=36000,
1058
committer='Joe Foo <joe@foo.com>')
1059
wt.set_parent_ids(['rev-1', 'rev-2a'])
1060
wt.branch.set_last_revision_info(1, 'rev-1')
1061
wt.commit('rev-2', rev_id='rev-2b',
1062
timestamp=1132586800, timezone=36000,
1063
committer='Joe Foo <joe@foo.com>')
1066
branch.tags.set_tag('v0.2', 'rev-2b')
1067
wt.commit('rev-3', rev_id='rev-3',
1068
timestamp=1132586900, timezone=36000,
1069
committer='Jane Foo <jane@foo.com>')
1070
branch.tags.set_tag('v1.0rc1', 'rev-3')
1071
branch.tags.set_tag('v1.0', 'rev-3')
912
b, log.LineLogFormatter)
1074
914
def test_line_log_single_merge_revision(self):
1075
915
wt = self._prepare_tree_with_merges()
1076
logfile = self.make_utf8_encoded_stringio()
1077
formatter = log.LineLogFormatter(to_file=logfile)
1078
916
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
1080
rev = revspec.in_history(wtb)
1081
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
1082
self.assertEqualDiff("""\
917
rev = revspec.in_history(wt.branch)
918
self.assertFormatterResult("""\
1083
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))
1087
924
def test_line_log_with_tags(self):
1088
925
wt = self._prepare_tree_with_merges(with_tags=True)
1089
logfile = self.make_utf8_encoded_stringio()
1090
formatter = log.LineLogFormatter(to_file=logfile)
1091
log.show_log(wt.branch, formatter)
1092
self.assertEqualDiff("""\
926
self.assertFormatterResult("""\
1093
927
3: Jane Foo 2005-11-22 {v1.0, v1.0rc1} rev-3
1094
928
2: Joe Foo 2005-11-22 [merge] {v0.2} rev-2
1095
929
1: Joe Foo 2005-11-22 rev-1
1099
class TestLineLogFormatterWithMergeRevisions(tests.TestCaseWithTransport):
931
wt.branch, log.LineLogFormatter)
934
class TestLineLogFormatterWithMergeRevisions(TestCaseForLogFormatter):
1101
936
def test_line_merge_revs_log(self):
1102
937
"""Line log should show revno
1106
wt = self.make_branch_and_tree('.')
1108
self.build_tree(['a'])
1110
b.nick = 'test-line-log'
1111
wt.commit(message='add a',
1112
timestamp=1132711707,
1114
committer='Line-Log-Formatter Tester <test@line.log>')
1115
logfile = file('out.tmp', 'w+')
1116
formatter = log.LineLogFormatter(to_file=logfile, levels=0)
1117
log.show_log(b, formatter)
1120
log_contents = logfile.read()
1121
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)
1124
949
def test_line_merge_revs_log_single_merge_revision(self):
1125
950
wt = self.make_branch_and_memory_tree('.')
1199
1021
return mainline_revs, rev_nos, wt
1201
def make_tree_with_many_merges(self):
1023
def make_branch_with_many_merges(self):
1202
1024
"""Create a tree with well-known revision ids"""
1203
wt = self.make_branch_and_tree('tree1')
1204
self.build_tree_contents([('tree1/f', '1\n')])
1205
wt.add(['f'], ['f-id'])
1206
wt.commit('commit one', rev_id='1')
1207
wt.commit('commit two', rev_id='2')
1209
tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
1210
self.build_tree_contents([('tree3/f', '1\n2\n3a\n')])
1211
tree3.commit('commit three a', rev_id='3a')
1213
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
1214
tree2.merge_from_branch(tree3.branch)
1215
tree2.commit('commit three b', rev_id='3b')
1217
wt.merge_from_branch(tree2.branch)
1218
wt.commit('commit three c', rev_id='3c')
1219
tree2.commit('four-a', rev_id='4a')
1221
wt.merge_from_branch(tree2.branch)
1222
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()
1224
1053
mainline_revs = [None, '1', '2', '3c', '4b']
1225
1054
rev_nos = {'1':1, '2':2, '3c': 3, '4b':4}
1299
1128
def test_get_view_revisions_merge2(self):
1300
1129
"""Test get_view_revisions when there are merges"""
1301
mainline_revs, rev_nos, wt = self.make_tree_with_many_merges()
1303
self.addCleanup(wt.unlock)
1130
mainline_revs, rev_nos, b = self.make_branch_with_many_merges()
1132
self.addCleanup(b.unlock)
1304
1133
revisions = list(log.get_view_revisions(
1305
mainline_revs, rev_nos, wt.branch, 'forward'))
1134
mainline_revs, rev_nos, b, 'forward'))
1306
1135
expected = [('1', '1', 0), ('2', '2', 0), ('3c', '3', 0),
1307
('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),
1308
1137
('4a', '2.2.2', 1)]
1309
1138
self.assertEqual(expected, revisions)
1310
1139
revisions = list(log.get_view_revisions(
1311
mainline_revs, rev_nos, wt.branch, 'forward',
1140
mainline_revs, rev_nos, b, 'forward',
1312
1141
include_merges=False))
1313
1142
self.assertEqual([('1', '1', 0), ('2', '2', 0), ('3c', '3', 0),
1314
1143
('4b', '4', 0)],
1338
rev_3a = rev_from_rev_id('3a', wt.branch)
1339
rev_4b = rev_from_rev_id('4b', wt.branch)
1340
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)],
1341
1170
view_revs(rev_3a, rev_4b, 'f-id', 'reverse'))
1342
1171
# Note: 3c still appears before 3a here because of depth-based sorting
1343
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)],
1344
1173
view_revs(rev_3a, rev_4b, 'f-id', 'forward'))
1698
1527
log.show_branch_change(tree.branch, s, 3, '3b')
1699
1528
self.assertContainsRe(s.getvalue(), 'Removed Revisions:')
1700
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')