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')
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)
499
499
def subst_dates(string):
500
500
"""Replace date strings with constant values."""
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)])
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)
663
685
class TestLogEncodings(TestCaseInTempDir):
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 ')
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 ')
865
887
def test_log_file_historical_start(self):
866
888
# Check logging a deleted file is ok if the file existed
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)
981
class TestLogMultiple(TestCaseWithTransport):
983
def prepare_tree(self):
984
tree = self.make_branch_and_tree('parent')
991
'parent/dir1/dir2/file3',
994
tree.commit('add file1')
996
tree.commit('add file2')
997
tree.add(['dir1', 'dir1/dir2', 'dir1/dir2/file3'])
998
tree.commit('add file3')
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')
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)
1017
def test_log_files(self):
1018
"""The log for multiple file should only list revs for those files"""
1020
self.assertRevnos('file1 file2 dir1/dir2/file3',
1021
['6', '5.1.1', '3', '2', '1'])
1023
def test_log_directory(self):
1024
"""The log for a directory should show all nested files."""
1026
self.assertRevnos('dir1', ['5', '3'])
1028
def test_log_nested_directory(self):
1029
"""The log for a directory should show all nested files."""
1031
self.assertRevnos('dir1/dir2', ['3'])
1033
def test_log_in_nested_directory(self):
1034
"""The log for a directory should show all nested files."""
1037
self.assertRevnos('.', ['5', '3'])
1039
def test_log_files_and_directories(self):
1040
"""Logging files and directories together should be fine."""
1042
self.assertRevnos('file4 dir1/dir2', ['4', '3'])
1044
def test_log_files_and_dirs_in_nested_directory(self):
1045
"""The log for a directory should show all nested files."""
1048
self.assertRevnos('dir2 file5', ['5', '3'])