~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_log.py

  • Committer: Matt Nordhoff
  • Date: 2009-04-04 02:50:01 UTC
  • mfrom: (4253 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4256.
  • Revision ID: mnordhoff@mattnordhoff.com-20090404025001-z1403k0tatmc8l91
Merge bzr.dev, fixing conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
2
 
# -*- coding: utf-8 -*-
 
1
# Copyright (C) 2005, 2006, 2007, 2009 Canonical Ltd
3
2
#
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
13
12
#
14
13
# You should have received a copy of the GNU General Public License
15
14
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
16
 
18
17
 
19
18
"""Black-box tests for bzr log."""
214
213
        os.chdir('branch2')
215
214
        self.run_bzr('merge ../branch1') # tags don't propagate otherwise
216
215
        branch2_tree.commit(message='merge branch 1')
217
 
        log = self.run_bzr("log -r-1")[0]
 
216
        log = self.run_bzr("log -n0 -r-1")[0]
218
217
        self.assertContainsRe(log, r'    tags: tag1')
219
 
        log = self.run_bzr("log -r3.1.1")[0]
 
218
        log = self.run_bzr("log -n0 -r3.1.1")[0]
220
219
        self.assertContainsRe(log, r'tags: tag1')
221
220
 
222
221
    def test_log_limit(self):
243
242
        self.assertContainsRe(log, r'revno: 2\n')
244
243
        self.assertContainsRe(log, r'revno: 3\n')
245
244
 
 
245
    def test_log_bad_message_re(self):
 
246
        """Bad --message argument gives a sensible message
 
247
        
 
248
        See https://bugs.launchpad.net/bzr/+bug/251352
 
249
        """
 
250
        self._prepare()
 
251
        out, err = self.run_bzr(['log', '-m', '*'], retcode=3)
 
252
        self.assertEqual("bzr: ERROR: Invalid regular expression"
 
253
            " in log message filter"
 
254
            ": '*'"
 
255
            ": nothing to repeat\n", err)
 
256
        self.assertEqual('', out)
 
257
 
246
258
 
247
259
class TestLogVerbose(TestCaseWithTransport):
248
260
 
324
336
 
325
337
    def test_merges_are_indented_by_level(self):
326
338
        self._prepare()
327
 
        out,err = self.run_bzr('log')
 
339
        out,err = self.run_bzr('log -n0')
328
340
        self.assertEqual('', err)
329
341
        log = normalize_log(out)
330
342
        self.assertEqualDiff(log, """\
331
343
------------------------------------------------------------
332
 
revno: 2
 
344
revno: 2 [merge]
333
345
committer: Lorem Ipsum <test@example.com>
334
346
branch nick: parent
335
347
timestamp: Just now
336
348
message:
337
349
  merge branch 1
338
350
    ------------------------------------------------------------
339
 
    revno: 1.1.2
 
351
    revno: 1.1.2 [merge]
340
352
    committer: Lorem Ipsum <test@example.com>
341
353
    branch nick: child
342
354
    timestamp: Just now
372
384
        log = normalize_log(out)
373
385
        self.assertEqualDiff(log, """\
374
386
------------------------------------------------------------
375
 
revno: 2
 
387
revno: 2 [merge]
376
388
committer: Lorem Ipsum <test@example.com>
377
389
branch nick: parent
378
390
timestamp: Just now
385
397
timestamp: Just now
386
398
message:
387
399
  first post
 
400
------------------------------------------------------------
 
401
Use --levels 0 (or -n0) to see merged revisions.
388
402
""")
389
403
 
390
404
    def test_force_merge_revisions_on(self):
432
446
 
433
447
    def test_merges_single_merge_rev(self):
434
448
        self._prepare()
435
 
        out,err = self.run_bzr('log -r1.1.2')
 
449
        out,err = self.run_bzr('log -n0 -r1.1.2')
436
450
        self.assertEqual('', err)
437
451
        log = normalize_log(out)
438
452
        self.assertEqualDiff(log, """\
439
453
------------------------------------------------------------
440
 
revno: 1.1.2
 
454
revno: 1.1.2 [merge]
441
455
committer: Lorem Ipsum <test@example.com>
442
456
branch nick: child
443
457
timestamp: Just now
454
468
 
455
469
    def test_merges_partial_range(self):
456
470
        self._prepare()
457
 
        out, err = self.run_bzr('log -r1.1.1..1.1.2')
 
471
        out, err = self.run_bzr('log -n0 -r1.1.1..1.1.2')
458
472
        self.assertEqual('', err)
459
473
        log = normalize_log(out)
460
474
        self.assertEqualDiff(log, """\
461
475
------------------------------------------------------------
462
 
revno: 1.1.2
 
476
revno: 1.1.2 [merge]
463
477
committer: Lorem Ipsum <test@example.com>
464
478
branch nick: child
465
479
timestamp: Just now
481
495
  branch 1
482
496
""")
483
497
 
484
 
    def test_merges_nonsupporting_formatter(self):
485
 
        # This "feature" of log formatters is madness. If a log
486
 
        # formatter cannot display a dotted-revno, it ought to ignore it.
487
 
        # Otherwise, a linear sequence is always expected to be handled now.
488
 
        raise KnownFailure('log formatters must support linear sequences now')
489
 
        self._prepare()
490
 
        err_msg = 'Selected log formatter only supports mainline revisions.'
491
 
        # The single revision case is tested in the core tests
492
 
        # since all standard formatters support single merge revisions.
493
 
        out,err = self.run_bzr('log --short -r1..1.1.2', retcode=3)
494
 
        self.assertContainsRe(err, err_msg)
495
 
        out,err = self.run_bzr('log --short -r1.1.1..1.1.2', retcode=3)
496
 
        self.assertContainsRe(err, err_msg)
497
 
 
498
498
 
499
499
def subst_dates(string):
500
500
    """Replace date strings with constant values."""
523
523
            committer='Lorem Ipsum <test@example.com>')
524
524
        os.chdir('parent')
525
525
 
526
 
    def test_log_show_diff_long(self):
 
526
    def test_log_show_diff_long_with_merges(self):
527
527
        self._prepare()
528
 
        out,err = self.run_bzr('log -p')
 
528
        out,err = self.run_bzr('log -p -n0')
529
529
        self.assertEqual('', err)
530
530
        log = normalize_log(out)
531
531
        self.assertEqualDiff(subst_dates(log), """\
532
532
------------------------------------------------------------
533
 
revno: 2
 
533
revno: 2 [merge]
534
534
committer: Lorem Ipsum <test@example.com>
535
535
branch nick: parent
536
536
timestamp: Just now
600
600
      +++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
601
601
      @@ -0,0 +1,1 @@
602
602
      +contents of parent/file1
603
 
      
 
603
\x20\x20\x20\x20\x20\x20
604
604
      === added file 'file2'
605
605
      --- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
606
606
      +++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
607
607
      @@ -0,0 +1,1 @@
608
608
      +contents of parent/file2
609
609
 
 
610
Use --levels 0 (or -n0) to see merged revisions.
610
611
""")
611
612
 
612
613
    def test_log_show_diff_line(self):
644
645
      @@ -0,0 +1,1 @@
645
646
      +contents of parent/file2
646
647
 
 
648
Use --levels 0 (or -n0) to see merged revisions.
647
649
""")
648
650
        out,err = self.run_bzr('log -p --short file1')
649
651
        self.assertEqual('', err)
659
661
 
660
662
""")
661
663
 
 
664
    def test_log_show_diff_non_ascii(self):
 
665
        # Smoke test for bug #328007 UnicodeDecodeError on 'log -p'
 
666
        message = u'Message with \xb5'
 
667
        body = 'Body with \xb5\n'
 
668
        wt = self.make_branch_and_tree('.')
 
669
        self.build_tree_contents([('foo', body)])
 
670
        wt.add('foo')
 
671
        wt.commit(message=message)
 
672
        # check that command won't fail with unicode error
 
673
        # don't care about exact output because we have other tests for this
 
674
        out,err = self.run_bzr('log -p --long')
 
675
        self.assertNotEqual('', out)
 
676
        self.assertEqual('', err)
 
677
        out,err = self.run_bzr('log -p --short')
 
678
        self.assertNotEqual('', out)
 
679
        self.assertEqual('', err)
 
680
        out,err = self.run_bzr('log -p --line')
 
681
        self.assertNotEqual('', out)
 
682
        self.assertEqual('', err)
 
683
 
662
684
 
663
685
class TestLogEncodings(TestCaseInTempDir):
664
686
 
671
693
        'latin-1',
672
694
        'iso-8859-1',
673
695
        'cp437', # Common windows encoding
674
 
        'cp1251', # Alexander Belchenko's windows encoding
 
696
        'cp1251', # Russian windows encoding
675
697
        'cp1258', # Common windows encoding
676
698
    ]
677
699
    # Encodings which cannot encode mu
799
821
    def test_log_file(self):
800
822
        """The log for a particular file should only list revs for that file"""
801
823
        self.prepare_tree()
802
 
        log = self.run_bzr('log file1')[0]
 
824
        log = self.run_bzr('log -n0 file1')[0]
803
825
        self.assertContainsRe(log, 'revno: 1\n')
804
826
        self.assertNotContainsRe(log, 'revno: 2\n')
805
827
        self.assertNotContainsRe(log, 'revno: 3\n')
806
828
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
807
 
        self.assertNotContainsRe(log, 'revno: 4\n')
808
 
        log = self.run_bzr('log file2')[0]
 
829
        self.assertNotContainsRe(log, 'revno: 4 ')
 
830
        log = self.run_bzr('log -n0 file2')[0]
809
831
        self.assertNotContainsRe(log, 'revno: 1\n')
810
832
        self.assertContainsRe(log, 'revno: 2\n')
811
833
        self.assertNotContainsRe(log, 'revno: 3\n')
812
834
        self.assertContainsRe(log, 'revno: 3.1.1\n')
813
 
        self.assertContainsRe(log, 'revno: 4\n')
814
 
        log = self.run_bzr('log file3')[0]
 
835
        self.assertContainsRe(log, 'revno: 4 ')
 
836
        log = self.run_bzr('log -n0 file3')[0]
815
837
        self.assertNotContainsRe(log, 'revno: 1\n')
816
838
        self.assertNotContainsRe(log, 'revno: 2\n')
817
839
        self.assertContainsRe(log, 'revno: 3\n')
818
840
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
819
 
        self.assertNotContainsRe(log, 'revno: 4\n')
820
 
        log = self.run_bzr('log -r3.1.1 file2')[0]
821
 
        self.assertNotContainsRe(log, 'revno: 1\n')
822
 
        self.assertNotContainsRe(log, 'revno: 2\n')
823
 
        self.assertNotContainsRe(log, 'revno: 3\n')
824
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
825
 
        self.assertNotContainsRe(log, 'revno: 4\n')
826
 
        log = self.run_bzr('log -r4 file2')[0]
827
 
        self.assertNotContainsRe(log, 'revno: 1\n')
828
 
        self.assertNotContainsRe(log, 'revno: 2\n')
829
 
        self.assertNotContainsRe(log, 'revno: 3\n')
830
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
831
 
        self.assertContainsRe(log, 'revno: 4\n')
832
 
        log = self.run_bzr('log -r3.. file2')[0]
833
 
        self.assertNotContainsRe(log, 'revno: 1\n')
834
 
        self.assertNotContainsRe(log, 'revno: 2\n')
835
 
        self.assertNotContainsRe(log, 'revno: 3\n')
836
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
837
 
        self.assertContainsRe(log, 'revno: 4\n')
838
 
        log = self.run_bzr('log -r..3 file2')[0]
 
841
        self.assertNotContainsRe(log, 'revno: 4 ')
 
842
        log = self.run_bzr('log -n0 -r3.1.1 file2')[0]
 
843
        self.assertNotContainsRe(log, 'revno: 1\n')
 
844
        self.assertNotContainsRe(log, 'revno: 2\n')
 
845
        self.assertNotContainsRe(log, 'revno: 3\n')
 
846
        self.assertContainsRe(log, 'revno: 3.1.1\n')
 
847
        self.assertNotContainsRe(log, 'revno: 4 ')
 
848
        log = self.run_bzr('log -n0 -r4 file2')[0]
 
849
        self.assertNotContainsRe(log, 'revno: 1\n')
 
850
        self.assertNotContainsRe(log, 'revno: 2\n')
 
851
        self.assertNotContainsRe(log, 'revno: 3\n')
 
852
        self.assertContainsRe(log, 'revno: 3.1.1\n')
 
853
        self.assertContainsRe(log, 'revno: 4 ')
 
854
        log = self.run_bzr('log -n0 -r3.. file2')[0]
 
855
        self.assertNotContainsRe(log, 'revno: 1\n')
 
856
        self.assertNotContainsRe(log, 'revno: 2\n')
 
857
        self.assertNotContainsRe(log, 'revno: 3\n')
 
858
        self.assertContainsRe(log, 'revno: 3.1.1\n')
 
859
        self.assertContainsRe(log, 'revno: 4 ')
 
860
        log = self.run_bzr('log -n0 -r..3 file2')[0]
839
861
        self.assertNotContainsRe(log, 'revno: 1\n')
840
862
        self.assertContainsRe(log, 'revno: 2\n')
841
863
        self.assertNotContainsRe(log, 'revno: 3\n')
842
864
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
843
 
        self.assertNotContainsRe(log, 'revno: 4\n')
 
865
        self.assertNotContainsRe(log, 'revno: 4 ')
844
866
 
845
867
    def test_log_file_historical_missing(self):
846
868
        # Check logging a deleted file gives an error if the
854
876
        # Check logging a deleted file is ok if the file existed
855
877
        # at the end the revision range
856
878
        self.prepare_tree(complex=True)
857
 
        log, err = self.run_bzr('log -r..4 file2')
 
879
        log, err = self.run_bzr('log -n0 -r..4 file2')
858
880
        self.assertEquals('', err)
859
881
        self.assertNotContainsRe(log, 'revno: 1\n')
860
882
        self.assertContainsRe(log, 'revno: 2\n')
861
883
        self.assertNotContainsRe(log, 'revno: 3\n')
862
884
        self.assertContainsRe(log, 'revno: 3.1.1\n')
863
 
        self.assertContainsRe(log, 'revno: 4\n')
 
885
        self.assertContainsRe(log, 'revno: 4 ')
864
886
 
865
887
    def test_log_file_historical_start(self):
866
888
        # Check logging a deleted file is ok if the file existed
872
894
        self.assertNotContainsRe(log, 'revno: 2\n')
873
895
        self.assertNotContainsRe(log, 'revno: 3\n')
874
896
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
875
 
        self.assertNotContainsRe(log, 'revno: 4\n')
 
897
        self.assertNotContainsRe(log, 'revno: 4 ')
876
898
 
877
899
    def test_log_file_renamed(self):
878
900
        """File matched against revision range, not current tree."""
890
912
        self.assertNotContainsRe(log, 'revno: 2\n')
891
913
        self.assertContainsRe(log, 'revno: 3\n')
892
914
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
893
 
        self.assertNotContainsRe(log, 'revno: 4\n')
 
915
        self.assertNotContainsRe(log, 'revno: 4 ')
894
916
 
895
917
    def test_line_log_file(self):
896
918
        """The line log for a file should only list relevant mainline revs"""
954
976
        self.assertNotContainsRe(log, '^3:', re.MULTILINE)
955
977
        self.assertNotContainsRe(log, '^3.1.1:', re.MULTILINE)
956
978
        self.assertNotContainsRe(log, '^4:', re.MULTILINE)
 
979
 
 
980
 
 
981
class TestLogMultiple(TestCaseWithTransport):
 
982
 
 
983
    def prepare_tree(self):
 
984
        tree = self.make_branch_and_tree('parent')
 
985
        self.build_tree([
 
986
            'parent/file1',
 
987
            'parent/file2',
 
988
            'parent/dir1/',
 
989
            'parent/dir1/file5',
 
990
            'parent/dir1/dir2/',
 
991
            'parent/dir1/dir2/file3',
 
992
            'parent/file4'])
 
993
        tree.add('file1')
 
994
        tree.commit('add file1')
 
995
        tree.add('file2')
 
996
        tree.commit('add file2')
 
997
        tree.add(['dir1', 'dir1/dir2', 'dir1/dir2/file3'])
 
998
        tree.commit('add file3')
 
999
        tree.add('file4')
 
1000
        tree.commit('add file4')
 
1001
        tree.add('dir1/file5')
 
1002
        tree.commit('add file5')
 
1003
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
 
1004
        self.build_tree_contents([('child/file2', 'hello')])
 
1005
        child_tree.commit(message='branch 1')
 
1006
        tree.merge_from_branch(child_tree.branch)
 
1007
        tree.commit(message='merge child branch')
 
1008
        os.chdir('parent')
 
1009
 
 
1010
    def assertRevnos(self, paths_str, expected_revnos):
 
1011
        # confirm the revision numbers in log --line output are those expected
 
1012
        out, err = self.run_bzr('log --line -n0 %s' % (paths_str,))
 
1013
        self.assertEqual('', err)
 
1014
        revnos = [s.split(':', 1)[0].lstrip() for s in out.splitlines()]
 
1015
        self.assertEqual(expected_revnos, revnos)
 
1016
 
 
1017
    def test_log_files(self):
 
1018
        """The log for multiple file should only list revs for those files"""
 
1019
        self.prepare_tree()
 
1020
        self.assertRevnos('file1 file2 dir1/dir2/file3',
 
1021
            ['6', '5.1.1', '3', '2', '1'])
 
1022
 
 
1023
    def test_log_directory(self):
 
1024
        """The log for a directory should show all nested files."""
 
1025
        self.prepare_tree()
 
1026
        self.assertRevnos('dir1', ['5', '3'])
 
1027
 
 
1028
    def test_log_nested_directory(self):
 
1029
        """The log for a directory should show all nested files."""
 
1030
        self.prepare_tree()
 
1031
        self.assertRevnos('dir1/dir2', ['3'])
 
1032
 
 
1033
    def test_log_in_nested_directory(self):
 
1034
        """The log for a directory should show all nested files."""
 
1035
        self.prepare_tree()
 
1036
        os.chdir("dir1")
 
1037
        self.assertRevnos('.', ['5', '3'])
 
1038
 
 
1039
    def test_log_files_and_directories(self):
 
1040
        """Logging files and directories together should be fine."""
 
1041
        self.prepare_tree()
 
1042
        self.assertRevnos('file4 dir1/dir2', ['4', '3'])
 
1043
 
 
1044
    def test_log_files_and_dirs_in_nested_directory(self):
 
1045
        """The log for a directory should show all nested files."""
 
1046
        self.prepare_tree()
 
1047
        os.chdir("dir1")
 
1048
        self.assertRevnos('dir2 file5', ['5', '3'])