293
def _prepare_tree_with_merges(self, with_tags=False):
294
wt = self.make_branch_and_memory_tree('.')
296
self.addCleanup(wt.unlock)
298
wt.commit('rev-1', rev_id='rev-1',
299
timestamp=1132586655, timezone=36000,
300
committer='Joe Foo <joe@foo.com>')
301
wt.commit('rev-merged', rev_id='rev-2a',
302
timestamp=1132586700, timezone=36000,
303
committer='Joe Foo <joe@foo.com>')
304
wt.set_parent_ids(['rev-1', 'rev-2a'])
305
wt.branch.set_last_revision_info(1, 'rev-1')
306
wt.commit('rev-2', rev_id='rev-2b',
307
timestamp=1132586800, timezone=36000,
308
committer='Joe Foo <joe@foo.com>')
311
branch.tags.set_tag('v0.2', 'rev-2b')
312
wt.commit('rev-3', rev_id='rev-3',
313
timestamp=1132586900, timezone=36000,
314
committer='Jane Foo <jane@foo.com>')
315
branch.tags.set_tag('v1.0rc1', 'rev-3')
316
branch.tags.set_tag('v1.0', 'rev-3')
293
319
def test_short_log_with_merges(self):
320
wt = self._prepare_tree_with_merges()
321
logfile = self.make_utf8_encoded_stringio()
322
formatter = log.ShortLogFormatter(to_file=logfile)
323
log.show_log(wt.branch, formatter)
324
self.assertEqualDiff("""\
325
2 Joe Foo\t2005-11-22 [merge]
328
1 Joe Foo\t2005-11-22
334
def test_short_log_with_merges_and_range(self):
294
335
wt = self.make_branch_and_memory_tree('.')
296
337
self.addCleanup(wt.unlock)
301
342
wt.commit('rev-merged', rev_id='rev-2a',
302
343
timestamp=1132586700, timezone=36000,
303
344
committer='Joe Foo <joe@foo.com>')
345
wt.branch.set_last_revision_info(1, 'rev-1')
304
346
wt.set_parent_ids(['rev-1', 'rev-2a'])
305
wt.branch.set_last_revision_info(1, 'rev-1')
306
wt.commit('rev-2', rev_id='rev-2b',
307
timestamp=1132586800, timezone=36000,
308
committer='Joe Foo <joe@foo.com>')
347
wt.commit('rev-2b', rev_id='rev-2b',
348
timestamp=1132586800, timezone=36000,
349
committer='Joe Foo <joe@foo.com>')
350
wt.commit('rev-3a', rev_id='rev-3a',
351
timestamp=1132586800, timezone=36000,
352
committer='Joe Foo <joe@foo.com>')
353
wt.branch.set_last_revision_info(2, 'rev-2b')
354
wt.set_parent_ids(['rev-2b', 'rev-3a'])
355
wt.commit('rev-3b', rev_id='rev-3b',
356
timestamp=1132586800, timezone=36000,
357
committer='Joe Foo <joe@foo.com>')
358
logfile = self.make_utf8_encoded_stringio()
359
formatter = log.ShortLogFormatter(to_file=logfile)
360
log.show_log(wt.branch, formatter,
361
start_revision=2, end_revision=3)
362
self.assertEqualDiff("""\
363
3 Joe Foo\t2005-11-22 [merge]
366
2 Joe Foo\t2005-11-22 [merge]
372
def test_short_log_with_tags(self):
373
wt = self._prepare_tree_with_merges(with_tags=True)
309
374
logfile = self.make_utf8_encoded_stringio()
310
375
formatter = log.ShortLogFormatter(to_file=logfile)
311
376
log.show_log(wt.branch, formatter)
312
377
self.assertEqualDiff("""\
313
2 Joe Foo\t2005-11-22 [merge]
378
3 Jane Foo\t2005-11-22 {v1.0, v1.0rc1}
381
2 Joe Foo\t2005-11-22 {v0.2} [merge]
316
384
1 Joe Foo\t2005-11-22
342
410
rev = revspec.in_history(wtb)
343
411
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
344
412
self.assertEqualDiff("""\
345
1.1.1 Joe Foo\t2005-11-22
413
1.1.1 Joe Foo\t2005-11-22
420
class TestShortLogFormatterWithMergeRevisions(tests.TestCaseWithTransport):
422
def test_short_merge_revs_log_with_merges(self):
423
wt = self.make_branch_and_memory_tree('.')
425
self.addCleanup(wt.unlock)
427
wt.commit('rev-1', rev_id='rev-1',
428
timestamp=1132586655, timezone=36000,
429
committer='Joe Foo <joe@foo.com>')
430
wt.commit('rev-merged', rev_id='rev-2a',
431
timestamp=1132586700, timezone=36000,
432
committer='Joe Foo <joe@foo.com>')
433
wt.set_parent_ids(['rev-1', 'rev-2a'])
434
wt.branch.set_last_revision_info(1, 'rev-1')
435
wt.commit('rev-2', rev_id='rev-2b',
436
timestamp=1132586800, timezone=36000,
437
committer='Joe Foo <joe@foo.com>')
438
logfile = self.make_utf8_encoded_stringio()
439
formatter = log.ShortLogFormatter(to_file=logfile, levels=0)
440
log.show_log(wt.branch, formatter)
441
# Note that the 1.1.1 indenting is in fact correct given that
442
# the revision numbers are right justified within 5 characters
443
# for mainline revnos and 9 characters for dotted revnos.
444
self.assertEqualDiff("""\
445
2 Joe Foo\t2005-11-22 [merge]
448
1.1.1 Joe Foo\t2005-11-22
451
1 Joe Foo\t2005-11-22
457
def test_short_merge_revs_log_single_merge_revision(self):
458
wt = self.make_branch_and_memory_tree('.')
460
self.addCleanup(wt.unlock)
462
wt.commit('rev-1', rev_id='rev-1',
463
timestamp=1132586655, timezone=36000,
464
committer='Joe Foo <joe@foo.com>')
465
wt.commit('rev-merged', rev_id='rev-2a',
466
timestamp=1132586700, timezone=36000,
467
committer='Joe Foo <joe@foo.com>')
468
wt.set_parent_ids(['rev-1', 'rev-2a'])
469
wt.branch.set_last_revision_info(1, 'rev-1')
470
wt.commit('rev-2', rev_id='rev-2b',
471
timestamp=1132586800, timezone=36000,
472
committer='Joe Foo <joe@foo.com>')
473
logfile = self.make_utf8_encoded_stringio()
474
formatter = log.ShortLogFormatter(to_file=logfile, levels=0)
475
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
477
rev = revspec.in_history(wtb)
478
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
479
self.assertEqualDiff("""\
480
1.1.1 Joe Foo\t2005-11-22
349
484
logfile.getvalue())
663
833
'bad_argument_prop_handler')
836
class TestLongLogFormatterWithoutMergeRevisions(TestCaseWithoutPropsHandler):
838
def test_long_verbose_log(self):
839
"""Verbose log includes changed files
843
wt = self.make_branch_and_tree('.')
845
self.build_tree(['a'])
847
# XXX: why does a longer nick show up?
848
b.nick = 'test_verbose_log'
849
wt.commit(message='add a',
850
timestamp=1132711707,
852
committer='Lorem Ipsum <test@example.com>')
853
logfile = file('out.tmp', 'w+')
854
formatter = log.LongLogFormatter(to_file=logfile, levels=1)
855
log.show_log(b, formatter, verbose=True)
858
log_contents = logfile.read()
859
self.assertEqualDiff('''\
860
------------------------------------------------------------
862
committer: Lorem Ipsum <test@example.com>
863
branch nick: test_verbose_log
864
timestamp: Wed 2005-11-23 12:08:27 +1000
872
def test_long_verbose_contain_deltas(self):
873
wt = self.make_branch_and_tree('parent')
874
self.build_tree(['parent/f1', 'parent/f2'])
876
wt.commit('first post')
877
self.run_bzr('branch parent child')
878
os.unlink('child/f1')
879
file('child/f2', 'wb').write('hello\n')
880
self.run_bzr(['commit', '-m', 'removed f1 and modified f2',
883
self.run_bzr('merge ../child')
884
wt.commit('merge branch 1')
886
sio = self.make_utf8_encoded_stringio()
887
lf = log.LongLogFormatter(to_file=sio, levels=1)
888
log.show_log(b, lf, verbose=True)
889
the_log = normalize_log(sio.getvalue())
890
self.assertEqualDiff("""\
891
------------------------------------------------------------
893
committer: Lorem Ipsum <test@example.com>
902
------------------------------------------------------------
904
committer: Lorem Ipsum <test@example.com>
915
def test_long_trailing_newlines(self):
916
wt = self.make_branch_and_tree('.')
917
b = make_commits_with_trailing_newlines(wt)
918
sio = self.make_utf8_encoded_stringio()
919
lf = log.LongLogFormatter(to_file=sio, levels=1)
921
self.assertEqualDiff("""\
922
------------------------------------------------------------
924
committer: Joe Foo <joe@foo.com>
926
timestamp: Mon 2005-11-21 09:32:56 -0600
928
single line with trailing newline
929
------------------------------------------------------------
931
author: Joe Bar <joe@bar.com>
932
committer: Joe Foo <joe@foo.com>
934
timestamp: Mon 2005-11-21 09:27:22 -0600
939
------------------------------------------------------------
941
committer: Joe Foo <joe@foo.com>
943
timestamp: Mon 2005-11-21 09:24:15 -0600
949
def test_long_author_in_log(self):
950
"""Log includes the author name if it's set in
951
the revision properties
953
wt = self.make_branch_and_tree('.')
955
self.build_tree(['a'])
957
b.nick = 'test_author_log'
958
wt.commit(message='add a',
959
timestamp=1132711707,
961
committer='Lorem Ipsum <test@example.com>',
962
author='John Doe <jdoe@example.com>')
964
formatter = log.LongLogFormatter(to_file=sio, levels=1)
965
log.show_log(b, formatter)
966
self.assertEqualDiff('''\
967
------------------------------------------------------------
969
author: John Doe <jdoe@example.com>
970
committer: Lorem Ipsum <test@example.com>
971
branch nick: test_author_log
972
timestamp: Wed 2005-11-23 12:08:27 +1000
978
def test_long_properties_in_log(self):
979
"""Log includes the custom properties returned by the registered
982
wt = self.make_branch_and_tree('.')
984
self.build_tree(['a'])
986
b.nick = 'test_properties_in_log'
987
wt.commit(message='add a',
988
timestamp=1132711707,
990
committer='Lorem Ipsum <test@example.com>',
991
author='John Doe <jdoe@example.com>')
993
formatter = log.LongLogFormatter(to_file=sio, levels=1)
995
def trivial_custom_prop_handler(revision):
996
return {'test_prop':'test_value'}
998
log.properties_handler_registry.register(
999
'trivial_custom_prop_handler',
1000
trivial_custom_prop_handler)
1001
log.show_log(b, formatter)
1003
log.properties_handler_registry.remove(
1004
'trivial_custom_prop_handler')
1005
self.assertEqualDiff('''\
1006
------------------------------------------------------------
1008
test_prop: test_value
1009
author: John Doe <jdoe@example.com>
1010
committer: Lorem Ipsum <test@example.com>
1011
branch nick: test_properties_in_log
1012
timestamp: Wed 2005-11-23 12:08:27 +1000
666
1019
class TestLineLogFormatter(tests.TestCaseWithTransport):
668
1021
def test_line_log(self):
669
1022
"""Line log should show revno
673
1026
wt = self.make_branch_and_tree('.')
1057
def _prepare_tree_with_merges(self, with_tags=False):
1058
wt = self.make_branch_and_memory_tree('.')
1060
self.addCleanup(wt.unlock)
1062
wt.commit('rev-1', rev_id='rev-1',
1063
timestamp=1132586655, timezone=36000,
1064
committer='Joe Foo <joe@foo.com>')
1065
wt.commit('rev-merged', rev_id='rev-2a',
1066
timestamp=1132586700, timezone=36000,
1067
committer='Joe Foo <joe@foo.com>')
1068
wt.set_parent_ids(['rev-1', 'rev-2a'])
1069
wt.branch.set_last_revision_info(1, 'rev-1')
1070
wt.commit('rev-2', rev_id='rev-2b',
1071
timestamp=1132586800, timezone=36000,
1072
committer='Joe Foo <joe@foo.com>')
1075
branch.tags.set_tag('v0.2', 'rev-2b')
1076
wt.commit('rev-3', rev_id='rev-3',
1077
timestamp=1132586900, timezone=36000,
1078
committer='Jane Foo <jane@foo.com>')
1079
branch.tags.set_tag('v1.0rc1', 'rev-3')
1080
branch.tags.set_tag('v1.0', 'rev-3')
704
1083
def test_line_log_single_merge_revision(self):
705
wt = self.make_branch_and_memory_tree('.')
707
self.addCleanup(wt.unlock)
709
wt.commit('rev-1', rev_id='rev-1',
710
timestamp=1132586655, timezone=36000,
711
committer='Joe Foo <joe@foo.com>')
712
wt.commit('rev-merged', rev_id='rev-2a',
713
timestamp=1132586700, timezone=36000,
714
committer='Joe Foo <joe@foo.com>')
715
wt.set_parent_ids(['rev-1', 'rev-2a'])
716
wt.branch.set_last_revision_info(1, 'rev-1')
717
wt.commit('rev-2', rev_id='rev-2b',
718
timestamp=1132586800, timezone=36000,
719
committer='Joe Foo <joe@foo.com>')
720
logfile = self.make_utf8_encoded_stringio()
721
formatter = log.LineLogFormatter(to_file=logfile)
722
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
724
rev = revspec.in_history(wtb)
725
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
726
self.assertEqualDiff("""\
727
1.1.1: Joe Foo 2005-11-22 rev-merged
1084
wt = self._prepare_tree_with_merges()
1085
logfile = self.make_utf8_encoded_stringio()
1086
formatter = log.LineLogFormatter(to_file=logfile)
1087
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
1089
rev = revspec.in_history(wtb)
1090
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
1091
self.assertEqualDiff("""\
1092
1.1.1: Joe Foo 2005-11-22 rev-merged
1096
def test_line_log_with_tags(self):
1097
wt = self._prepare_tree_with_merges(with_tags=True)
1098
logfile = self.make_utf8_encoded_stringio()
1099
formatter = log.LineLogFormatter(to_file=logfile)
1100
log.show_log(wt.branch, formatter)
1101
self.assertEqualDiff("""\
1102
3: Jane Foo 2005-11-22 {v1.0, v1.0rc1} rev-3
1103
2: Joe Foo 2005-11-22 [merge] {v0.2} rev-2
1104
1: Joe Foo 2005-11-22 rev-1
1108
class TestLineLogFormatterWithMergeRevisions(tests.TestCaseWithTransport):
1110
def test_line_merge_revs_log(self):
1111
"""Line log should show revno
1115
wt = self.make_branch_and_tree('.')
1117
self.build_tree(['a'])
1119
b.nick = 'test-line-log'
1120
wt.commit(message='add a',
1121
timestamp=1132711707,
1123
committer='Line-Log-Formatter Tester <test@line.log>')
1124
logfile = file('out.tmp', 'w+')
1125
formatter = log.LineLogFormatter(to_file=logfile, levels=0)
1126
log.show_log(b, formatter)
1129
log_contents = logfile.read()
1130
self.assertEqualDiff('1: Line-Log-Formatte... 2005-11-23 add a\n',
1133
def test_line_merge_revs_log_single_merge_revision(self):
1134
wt = self.make_branch_and_memory_tree('.')
1136
self.addCleanup(wt.unlock)
1138
wt.commit('rev-1', rev_id='rev-1',
1139
timestamp=1132586655, timezone=36000,
1140
committer='Joe Foo <joe@foo.com>')
1141
wt.commit('rev-merged', rev_id='rev-2a',
1142
timestamp=1132586700, timezone=36000,
1143
committer='Joe Foo <joe@foo.com>')
1144
wt.set_parent_ids(['rev-1', 'rev-2a'])
1145
wt.branch.set_last_revision_info(1, 'rev-1')
1146
wt.commit('rev-2', rev_id='rev-2b',
1147
timestamp=1132586800, timezone=36000,
1148
committer='Joe Foo <joe@foo.com>')
1149
logfile = self.make_utf8_encoded_stringio()
1150
formatter = log.LineLogFormatter(to_file=logfile, levels=0)
1151
revspec = revisionspec.RevisionSpec.from_string('1.1.1')
1153
rev = revspec.in_history(wtb)
1154
log.show_log(wtb, formatter, start_revision=rev, end_revision=rev)
1155
self.assertEqualDiff("""\
1156
1.1.1: Joe Foo 2005-11-22 rev-merged
1160
def test_line_merge_revs_log_with_merges(self):
1161
wt = self.make_branch_and_memory_tree('.')
1163
self.addCleanup(wt.unlock)
1165
wt.commit('rev-1', rev_id='rev-1',
1166
timestamp=1132586655, timezone=36000,
1167
committer='Joe Foo <joe@foo.com>')
1168
wt.commit('rev-merged', rev_id='rev-2a',
1169
timestamp=1132586700, timezone=36000,
1170
committer='Joe Foo <joe@foo.com>')
1171
wt.set_parent_ids(['rev-1', 'rev-2a'])
1172
wt.branch.set_last_revision_info(1, 'rev-1')
1173
wt.commit('rev-2', rev_id='rev-2b',
1174
timestamp=1132586800, timezone=36000,
1175
committer='Joe Foo <joe@foo.com>')
1176
logfile = self.make_utf8_encoded_stringio()
1177
formatter = log.LineLogFormatter(to_file=logfile, levels=0)
1178
log.show_log(wt.branch, formatter)
1179
self.assertEqualDiff("""\
1180
2: Joe Foo 2005-11-22 [merge] rev-2
1181
1.1.1: Joe Foo 2005-11-22 rev-merged
1182
1: Joe Foo 2005-11-22 rev-1
733
1186
class TestGetViewRevisions(tests.TestCaseWithTransport):
1149
1599
# revisions are not in the same order.
1150
1600
self.assertReversed([('1', 2), ('2', 2), ('3', 3), ('4', 4)],
1151
1601
[('3', 3), ('4', 4), ('2', 2), ('1', 2),])
1604
class TestHistoryChange(tests.TestCaseWithTransport):
1606
def setup_a_tree(self):
1607
tree = self.make_branch_and_tree('tree')
1609
self.addCleanup(tree.unlock)
1610
tree.commit('1a', rev_id='1a')
1611
tree.commit('2a', rev_id='2a')
1612
tree.commit('3a', rev_id='3a')
1615
def setup_ab_tree(self):
1616
tree = self.setup_a_tree()
1617
tree.set_last_revision('1a')
1618
tree.branch.set_last_revision_info(1, '1a')
1619
tree.commit('2b', rev_id='2b')
1620
tree.commit('3b', rev_id='3b')
1623
def setup_ac_tree(self):
1624
tree = self.setup_a_tree()
1625
tree.set_last_revision(revision.NULL_REVISION)
1626
tree.branch.set_last_revision_info(0, revision.NULL_REVISION)
1627
tree.commit('1c', rev_id='1c')
1628
tree.commit('2c', rev_id='2c')
1629
tree.commit('3c', rev_id='3c')
1632
def test_all_new(self):
1633
tree = self.setup_ab_tree()
1634
old, new = log.get_history_change('1a', '3a', tree.branch.repository)
1635
self.assertEqual([], old)
1636
self.assertEqual(['2a', '3a'], new)
1638
def test_all_old(self):
1639
tree = self.setup_ab_tree()
1640
old, new = log.get_history_change('3a', '1a', tree.branch.repository)
1641
self.assertEqual([], new)
1642
self.assertEqual(['2a', '3a'], old)
1644
def test_null_old(self):
1645
tree = self.setup_ab_tree()
1646
old, new = log.get_history_change(revision.NULL_REVISION,
1647
'3a', tree.branch.repository)
1648
self.assertEqual([], old)
1649
self.assertEqual(['1a', '2a', '3a'], new)
1651
def test_null_new(self):
1652
tree = self.setup_ab_tree()
1653
old, new = log.get_history_change('3a', revision.NULL_REVISION,
1654
tree.branch.repository)
1655
self.assertEqual([], new)
1656
self.assertEqual(['1a', '2a', '3a'], old)
1658
def test_diverged(self):
1659
tree = self.setup_ab_tree()
1660
old, new = log.get_history_change('3a', '3b', tree.branch.repository)
1661
self.assertEqual(old, ['2a', '3a'])
1662
self.assertEqual(new, ['2b', '3b'])
1664
def test_unrelated(self):
1665
tree = self.setup_ac_tree()
1666
old, new = log.get_history_change('3a', '3c', tree.branch.repository)
1667
self.assertEqual(old, ['1a', '2a', '3a'])
1668
self.assertEqual(new, ['1c', '2c', '3c'])
1670
def test_show_branch_change(self):
1671
tree = self.setup_ab_tree()
1673
log.show_branch_change(tree.branch, s, 3, '3a')
1674
self.assertContainsRe(s.getvalue(),
1675
'[*]{60}\nRemoved Revisions:\n(.|\n)*2a(.|\n)*3a(.|\n)*'
1676
'[*]{60}\n\nAdded Revisions:\n(.|\n)*2b(.|\n)*3b')
1678
def test_show_branch_change_no_change(self):
1679
tree = self.setup_ab_tree()
1681
log.show_branch_change(tree.branch, s, 3, '3b')
1682
self.assertEqual(s.getvalue(),
1683
'Nothing seems to have changed\n')
1685
def test_show_branch_change_no_old(self):
1686
tree = self.setup_ab_tree()
1688
log.show_branch_change(tree.branch, s, 2, '2b')
1689
self.assertContainsRe(s.getvalue(), 'Added Revisions:')
1690
self.assertNotContainsRe(s.getvalue(), 'Removed Revisions:')
1692
def test_show_branch_change_no_new(self):
1693
tree = self.setup_ab_tree()
1694
tree.branch.set_last_revision_info(2, '2b')
1696
log.show_branch_change(tree.branch, s, 3, '3b')
1697
self.assertContainsRe(s.getvalue(), 'Removed Revisions:')
1698
self.assertNotContainsRe(s.getvalue(), 'Added Revisions:')