/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_log.py

merge bzr.dev r4042

Show diffs side-by-side

added added

removed removed

Lines of Context:
290
290
""",
291
291
                             sio.getvalue())
292
292
 
 
293
    def _prepare_tree_with_merges(self, with_tags=False):
 
294
        wt = self.make_branch_and_memory_tree('.')
 
295
        wt.lock_write()
 
296
        self.addCleanup(wt.unlock)
 
297
        wt.add('')
 
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>')
 
309
        if with_tags:
 
310
            branch = wt.branch
 
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')
 
317
        return wt
 
318
 
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]
 
326
      rev-2
 
327
 
 
328
    1 Joe Foo\t2005-11-22
 
329
      rev-1
 
330
 
 
331
""",
 
332
                             logfile.getvalue())
 
333
 
 
334
    def test_short_log_with_merges_and_range(self):
294
335
        wt = self.make_branch_and_memory_tree('.')
295
336
        wt.lock_write()
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]
 
364
      rev-3b
 
365
 
 
366
    2 Joe Foo\t2005-11-22 [merge]
 
367
      rev-2b
 
368
 
 
369
""",
 
370
                             logfile.getvalue())
 
371
 
 
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}
 
379
      rev-3
 
380
 
 
381
    2 Joe Foo\t2005-11-22 {v0.2} [merge]
314
382
      rev-2
315
383
 
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
346
 
      rev-merged
 
413
      1.1.1 Joe Foo\t2005-11-22
 
414
            rev-merged
 
415
 
 
416
""",
 
417
                             logfile.getvalue())
 
418
 
 
419
 
 
420
class TestShortLogFormatterWithMergeRevisions(tests.TestCaseWithTransport):
 
421
 
 
422
    def test_short_merge_revs_log_with_merges(self):
 
423
        wt = self.make_branch_and_memory_tree('.')
 
424
        wt.lock_write()
 
425
        self.addCleanup(wt.unlock)
 
426
        wt.add('')
 
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]
 
446
      rev-2
 
447
 
 
448
          1.1.1 Joe Foo\t2005-11-22
 
449
                rev-merged
 
450
 
 
451
    1 Joe Foo\t2005-11-22
 
452
      rev-1
 
453
 
 
454
""",
 
455
                             logfile.getvalue())
 
456
 
 
457
    def test_short_merge_revs_log_single_merge_revision(self):
 
458
        wt = self.make_branch_and_memory_tree('.')
 
459
        wt.lock_write()
 
460
        self.addCleanup(wt.unlock)
 
461
        wt.add('')
 
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')
 
476
        wtb = wt.branch
 
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
 
481
            rev-merged
347
482
 
348
483
""",
349
484
                             logfile.getvalue())
353
488
 
354
489
    def test_verbose_log(self):
355
490
        """Verbose log includes changed files
356
 
        
 
491
 
357
492
        bug #4676
358
493
        """
359
494
        wt = self.make_branch_and_tree('.')
561
696
                             sio.getvalue())
562
697
 
563
698
    def test_properties_in_log(self):
564
 
        """Log includes the custom properties returned by the registered 
 
699
        """Log includes the custom properties returned by the registered
565
700
        handlers.
566
701
        """
567
702
        wt = self.make_branch_and_tree('.')
600
735
''',
601
736
                                 sio.getvalue())
602
737
 
 
738
    def test_properties_in_short_log(self):
 
739
        """Log includes the custom properties returned by the registered
 
740
        handlers.
 
741
        """
 
742
        wt = self.make_branch_and_tree('.')
 
743
        b = wt.branch
 
744
        self.build_tree(['a'])
 
745
        wt.add('a')
 
746
        b.nick = 'test_properties_in_short_log'
 
747
        wt.commit(message='add a',
 
748
                  timestamp=1132711707,
 
749
                  timezone=36000,
 
750
                  committer='Lorem Ipsum <test@example.com>',
 
751
                  author='John Doe <jdoe@example.com>')
 
752
        sio = StringIO()
 
753
        formatter = log.ShortLogFormatter(to_file=sio)
 
754
        try:
 
755
            def trivial_custom_prop_handler(revision):
 
756
                return {'test_prop':'test_value'}
 
757
 
 
758
            log.properties_handler_registry.register(
 
759
                'trivial_custom_prop_handler',
 
760
                trivial_custom_prop_handler)
 
761
            log.show_log(b, formatter)
 
762
        finally:
 
763
            log.properties_handler_registry.remove(
 
764
                'trivial_custom_prop_handler')
 
765
            self.assertEqualDiff('''\
 
766
    1 John Doe\t2005-11-23
 
767
      test_prop: test_value
 
768
      add a
 
769
 
 
770
''',
 
771
                                 sio.getvalue())
 
772
 
603
773
    def test_error_in_properties_handler(self):
604
 
        """Log includes the custom properties returned by the registered 
 
774
        """Log includes the custom properties returned by the registered
605
775
        handlers.
606
776
        """
607
777
        wt = self.make_branch_and_tree('.')
663
833
                'bad_argument_prop_handler')
664
834
 
665
835
 
 
836
class TestLongLogFormatterWithoutMergeRevisions(TestCaseWithoutPropsHandler):
 
837
 
 
838
    def test_long_verbose_log(self):
 
839
        """Verbose log includes changed files
 
840
 
 
841
        bug #4676
 
842
        """
 
843
        wt = self.make_branch_and_tree('.')
 
844
        b = wt.branch
 
845
        self.build_tree(['a'])
 
846
        wt.add('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,
 
851
                  timezone=36000,
 
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)
 
856
        logfile.flush()
 
857
        logfile.seek(0)
 
858
        log_contents = logfile.read()
 
859
        self.assertEqualDiff('''\
 
860
------------------------------------------------------------
 
861
revno: 1
 
862
committer: Lorem Ipsum <test@example.com>
 
863
branch nick: test_verbose_log
 
864
timestamp: Wed 2005-11-23 12:08:27 +1000
 
865
message:
 
866
  add a
 
867
added:
 
868
  a
 
869
''',
 
870
                             log_contents)
 
871
 
 
872
    def test_long_verbose_contain_deltas(self):
 
873
        wt = self.make_branch_and_tree('parent')
 
874
        self.build_tree(['parent/f1', 'parent/f2'])
 
875
        wt.add(['f1','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',
 
881
            'child'])
 
882
        os.chdir('parent')
 
883
        self.run_bzr('merge ../child')
 
884
        wt.commit('merge branch 1')
 
885
        b = wt.branch
 
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
------------------------------------------------------------
 
892
revno: 2
 
893
committer: Lorem Ipsum <test@example.com>
 
894
branch nick: parent
 
895
timestamp: Just now
 
896
message:
 
897
  merge branch 1
 
898
removed:
 
899
  f1
 
900
modified:
 
901
  f2
 
902
------------------------------------------------------------
 
903
revno: 1
 
904
committer: Lorem Ipsum <test@example.com>
 
905
branch nick: parent
 
906
timestamp: Just now
 
907
message:
 
908
  first post
 
909
added:
 
910
  f1
 
911
  f2
 
912
""",
 
913
                             the_log)
 
914
 
 
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)
 
920
        log.show_log(b, lf)
 
921
        self.assertEqualDiff("""\
 
922
------------------------------------------------------------
 
923
revno: 3
 
924
committer: Joe Foo <joe@foo.com>
 
925
branch nick: test
 
926
timestamp: Mon 2005-11-21 09:32:56 -0600
 
927
message:
 
928
  single line with trailing newline
 
929
------------------------------------------------------------
 
930
revno: 2
 
931
author: Joe Bar <joe@bar.com>
 
932
committer: Joe Foo <joe@foo.com>
 
933
branch nick: test
 
934
timestamp: Mon 2005-11-21 09:27:22 -0600
 
935
message:
 
936
  multiline
 
937
  log
 
938
  message
 
939
------------------------------------------------------------
 
940
revno: 1
 
941
committer: Joe Foo <joe@foo.com>
 
942
branch nick: test
 
943
timestamp: Mon 2005-11-21 09:24:15 -0600
 
944
message:
 
945
  simple log message
 
946
""",
 
947
                             sio.getvalue())
 
948
 
 
949
    def test_long_author_in_log(self):
 
950
        """Log includes the author name if it's set in
 
951
        the revision properties
 
952
        """
 
953
        wt = self.make_branch_and_tree('.')
 
954
        b = wt.branch
 
955
        self.build_tree(['a'])
 
956
        wt.add('a')
 
957
        b.nick = 'test_author_log'
 
958
        wt.commit(message='add a',
 
959
                  timestamp=1132711707,
 
960
                  timezone=36000,
 
961
                  committer='Lorem Ipsum <test@example.com>',
 
962
                  author='John Doe <jdoe@example.com>')
 
963
        sio = StringIO()
 
964
        formatter = log.LongLogFormatter(to_file=sio, levels=1)
 
965
        log.show_log(b, formatter)
 
966
        self.assertEqualDiff('''\
 
967
------------------------------------------------------------
 
968
revno: 1
 
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
 
973
message:
 
974
  add a
 
975
''',
 
976
                             sio.getvalue())
 
977
 
 
978
    def test_long_properties_in_log(self):
 
979
        """Log includes the custom properties returned by the registered
 
980
        handlers.
 
981
        """
 
982
        wt = self.make_branch_and_tree('.')
 
983
        b = wt.branch
 
984
        self.build_tree(['a'])
 
985
        wt.add('a')
 
986
        b.nick = 'test_properties_in_log'
 
987
        wt.commit(message='add a',
 
988
                  timestamp=1132711707,
 
989
                  timezone=36000,
 
990
                  committer='Lorem Ipsum <test@example.com>',
 
991
                  author='John Doe <jdoe@example.com>')
 
992
        sio = StringIO()
 
993
        formatter = log.LongLogFormatter(to_file=sio, levels=1)
 
994
        try:
 
995
            def trivial_custom_prop_handler(revision):
 
996
                return {'test_prop':'test_value'}
 
997
 
 
998
            log.properties_handler_registry.register(
 
999
                'trivial_custom_prop_handler',
 
1000
                trivial_custom_prop_handler)
 
1001
            log.show_log(b, formatter)
 
1002
        finally:
 
1003
            log.properties_handler_registry.remove(
 
1004
                'trivial_custom_prop_handler')
 
1005
            self.assertEqualDiff('''\
 
1006
------------------------------------------------------------
 
1007
revno: 1
 
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
 
1013
message:
 
1014
  add a
 
1015
''',
 
1016
                                 sio.getvalue())
 
1017
 
 
1018
 
666
1019
class TestLineLogFormatter(tests.TestCaseWithTransport):
667
1020
 
668
1021
    def test_line_log(self):
669
1022
        """Line log should show revno
670
 
        
 
1023
 
671
1024
        bug #5162
672
1025
        """
673
1026
        wt = self.make_branch_and_tree('.')
701
1054
""",
702
1055
                             sio.getvalue())
703
1056
 
 
1057
    def _prepare_tree_with_merges(self, with_tags=False):
 
1058
        wt = self.make_branch_and_memory_tree('.')
 
1059
        wt.lock_write()
 
1060
        self.addCleanup(wt.unlock)
 
1061
        wt.add('')
 
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>')
 
1073
        if with_tags:
 
1074
            branch = wt.branch
 
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')
 
1081
        return wt
 
1082
 
704
1083
    def test_line_log_single_merge_revision(self):
705
 
        wt = self.make_branch_and_memory_tree('.')
706
 
        wt.lock_write()
707
 
        self.addCleanup(wt.unlock)
708
 
        wt.add('')
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')
723
 
        wtb = wt.branch
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
728
 
""",
729
 
                             logfile.getvalue())
730
 
 
731
 
 
 
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')
 
1088
        wtb = wt.branch
 
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
 
1093
""",
 
1094
                             logfile.getvalue())
 
1095
 
 
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
 
1105
""",
 
1106
                             logfile.getvalue())
 
1107
 
 
1108
class TestLineLogFormatterWithMergeRevisions(tests.TestCaseWithTransport):
 
1109
 
 
1110
    def test_line_merge_revs_log(self):
 
1111
        """Line log should show revno
 
1112
 
 
1113
        bug #5162
 
1114
        """
 
1115
        wt = self.make_branch_and_tree('.')
 
1116
        b = wt.branch
 
1117
        self.build_tree(['a'])
 
1118
        wt.add('a')
 
1119
        b.nick = 'test-line-log'
 
1120
        wt.commit(message='add a',
 
1121
                  timestamp=1132711707,
 
1122
                  timezone=36000,
 
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)
 
1127
        logfile.flush()
 
1128
        logfile.seek(0)
 
1129
        log_contents = logfile.read()
 
1130
        self.assertEqualDiff('1: Line-Log-Formatte... 2005-11-23 add a\n',
 
1131
                             log_contents)
 
1132
 
 
1133
    def test_line_merge_revs_log_single_merge_revision(self):
 
1134
        wt = self.make_branch_and_memory_tree('.')
 
1135
        wt.lock_write()
 
1136
        self.addCleanup(wt.unlock)
 
1137
        wt.add('')
 
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')
 
1152
        wtb = wt.branch
 
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
 
1157
""",
 
1158
                             logfile.getvalue())
 
1159
 
 
1160
    def test_line_merge_revs_log_with_merges(self):
 
1161
        wt = self.make_branch_and_memory_tree('.')
 
1162
        wt.lock_write()
 
1163
        self.addCleanup(wt.unlock)
 
1164
        wt.add('')
 
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
 
1183
""",
 
1184
                             logfile.getvalue())
732
1185
 
733
1186
class TestGetViewRevisions(tests.TestCaseWithTransport):
734
1187
 
896
1349
        rev_4b = rev_from_rev_id('4b', wt.branch)
897
1350
        self.assertEqual([('3c', '3', 0), ('3a', '2.1.1', 1)],
898
1351
                          view_revs(rev_3a, rev_4b, 'f-id', 'reverse'))
899
 
        # Note that the depth is 0 for 3a because depths are normalized, but
900
 
        # there is still a bug somewhere... most probably in
901
 
        # _filter_revision_range and/or get_view_revisions still around a bad
902
 
        # use of reverse_by_depth
903
 
        self.assertEqual([('3a', '2.1.1', 0)],
 
1352
        # Note: 3c still appears before 3a here because of depth-based sorting
 
1353
        self.assertEqual([('3c', '3', 0), ('3a', '2.1.1', 1)],
904
1354
                          view_revs(rev_3a, rev_4b, 'f-id', 'forward'))
905
1355
 
906
1356
 
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),])
 
1602
 
 
1603
 
 
1604
class TestHistoryChange(tests.TestCaseWithTransport):
 
1605
 
 
1606
    def setup_a_tree(self):
 
1607
        tree = self.make_branch_and_tree('tree')
 
1608
        tree.lock_write()
 
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')
 
1613
        return tree
 
1614
 
 
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')
 
1621
        return tree
 
1622
 
 
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')
 
1630
        return tree
 
1631
 
 
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)
 
1637
 
 
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)
 
1643
 
 
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)
 
1650
 
 
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)
 
1657
 
 
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'])
 
1663
 
 
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'])
 
1669
 
 
1670
    def test_show_branch_change(self):
 
1671
        tree = self.setup_ab_tree()
 
1672
        s = StringIO()
 
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')
 
1677
 
 
1678
    def test_show_branch_change_no_change(self):
 
1679
        tree = self.setup_ab_tree()
 
1680
        s = StringIO()
 
1681
        log.show_branch_change(tree.branch, s, 3, '3b')
 
1682
        self.assertEqual(s.getvalue(),
 
1683
            'Nothing seems to have changed\n')
 
1684
 
 
1685
    def test_show_branch_change_no_old(self):
 
1686
        tree = self.setup_ab_tree()
 
1687
        s = StringIO()
 
1688
        log.show_branch_change(tree.branch, s, 2, '2b')
 
1689
        self.assertContainsRe(s.getvalue(), 'Added Revisions:')
 
1690
        self.assertNotContainsRe(s.getvalue(), 'Removed Revisions:')
 
1691
 
 
1692
    def test_show_branch_change_no_new(self):
 
1693
        tree = self.setup_ab_tree()
 
1694
        tree.branch.set_last_revision_info(2, '2b')
 
1695
        s = StringIO()
 
1696
        log.show_branch_change(tree.branch, s, 3, '3b')
 
1697
        self.assertContainsRe(s.getvalue(), 'Removed Revisions:')
 
1698
        self.assertNotContainsRe(s.getvalue(), 'Added Revisions:')