256
256
def assertUseShortDeltaFormat(self, cmd):
257
257
log = self.run_bzr(cmd)[0]
258
258
# Check that we use the short status format
259
self.assertContainsRe(log, '(?m)^\s*A hello.txt$')
260
self.assertNotContainsRe(log, '(?m)^\s*added:$')
259
self.assertContainsRe(log, '(?m)^A hello.txt$')
260
self.assertNotContainsRe(log, '(?m)^added:$')
262
262
def assertUseLongDeltaFormat(self, cmd):
263
263
log = self.run_bzr(cmd)[0]
264
264
# Check that we use the long status format
265
self.assertNotContainsRe(log, '(?m)^\s*A hello.txt$')
266
self.assertContainsRe(log, '(?m)^\s*added:$')
265
self.assertNotContainsRe(log, '(?m)^A hello.txt$')
266
self.assertContainsRe(log, '(?m)^added:$')
268
268
def test_log_short_verbose(self):
269
269
self.assertUseShortDeltaFormat(['log', '--short', '-v'])
298
298
parent_tree.commit(message='merge branch 1')
299
299
os.chdir('parent')
301
def _prepare_short(self):
302
parent_tree = self.make_branch_and_tree('parent')
303
parent_tree.commit(message='first post',
304
timestamp=1132586700, timezone=36000,
305
committer='Joe Foo <joe@foo.com>')
306
child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
307
child_tree.commit(message='branch 1',
308
timestamp=1132586800, timezone=36000,
309
committer='Joe Foo <joe@foo.com>')
311
child_tree.bzrdir.sprout('smallerchild').open_workingtree()
312
smaller_tree.commit(message='branch 2',
313
timestamp=1132586900, timezone=36000,
314
committer='Joe Foo <joe@foo.com>')
315
child_tree.merge_from_branch(smaller_tree.branch)
316
child_tree.commit(message='merge branch 2',
317
timestamp=1132587000, timezone=36000,
318
committer='Joe Foo <joe@foo.com>')
319
parent_tree.merge_from_branch(child_tree.branch)
320
parent_tree.commit(message='merge branch 1',
321
timestamp=1132587100, timezone=36000,
322
committer='Joe Foo <joe@foo.com>')
325
301
def test_merges_are_indented_by_level(self):
327
303
out,err = self.run_bzr('log')
368
def test_force_merge_revisions_off(self):
370
out,err = self.run_bzr('log --long -n1')
371
self.assertEqual('', err)
372
log = normalize_log(out)
373
self.assertEqualDiff(log, """\
374
------------------------------------------------------------
376
committer: Lorem Ipsum <test@example.com>
381
------------------------------------------------------------
383
committer: Lorem Ipsum <test@example.com>
390
def test_force_merge_revisions_on(self):
391
self._prepare_short()
392
out,err = self.run_bzr('log --short -n0')
393
self.assertEqual('', err)
394
log = normalize_log(out)
395
self.assertEqualDiff(log, """\
396
2 Joe Foo\t2005-11-22 [merge]
399
1.1.2 Joe Foo\t2005-11-22 [merge]
402
1.2.1 Joe Foo\t2005-11-22
405
1.1.1 Joe Foo\t2005-11-22
408
1 Joe Foo\t2005-11-22
413
def test_force_merge_revisions_N(self):
414
self._prepare_short()
415
out,err = self.run_bzr('log --short -n2')
416
self.assertEqual('', err)
417
log = normalize_log(out)
418
self.assertEqualDiff(log, """\
419
2 Joe Foo\t2005-11-22 [merge]
422
1.1.2 Joe Foo\t2005-11-22 [merge]
425
1.1.1 Joe Foo\t2005-11-22
428
1 Joe Foo\t2005-11-22
433
344
def test_merges_single_merge_rev(self):
435
346
out,err = self.run_bzr('log -r1.1.2')
492
403
self.assertContainsRe(err, err_msg)
495
def subst_dates(string):
496
"""Replace date strings with constant values."""
497
return re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-\+]\d{4}',
498
'YYYY-MM-DD HH:MM:SS +ZZZZ', string)
501
class TestLogDiff(TestCaseWithoutPropsHandler):
504
parent_tree = self.make_branch_and_tree('parent')
505
self.build_tree(['parent/file1', 'parent/file2'])
506
parent_tree.add('file1')
507
parent_tree.add('file2')
508
parent_tree.commit(message='first post',
509
timestamp=1132586655, timezone=36000,
510
committer='Lorem Ipsum <test@example.com>')
511
child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
512
self.build_tree_contents([('child/file2', 'hello\n')])
513
child_tree.commit(message='branch 1',
514
timestamp=1132586700, timezone=36000,
515
committer='Lorem Ipsum <test@example.com>')
516
parent_tree.merge_from_branch(child_tree.branch)
517
parent_tree.commit(message='merge branch 1',
518
timestamp=1132586800, timezone=36000,
519
committer='Lorem Ipsum <test@example.com>')
522
def test_log_show_diff_long(self):
524
out,err = self.run_bzr('log -p')
525
self.assertEqual('', err)
526
log = normalize_log(out)
527
self.assertEqualDiff(subst_dates(log), """\
528
------------------------------------------------------------
530
committer: Lorem Ipsum <test@example.com>
536
=== modified file 'file2'
537
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
538
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
540
-contents of parent/file2
542
------------------------------------------------------------
544
committer: Lorem Ipsum <test@example.com>
550
=== modified file 'file2'
551
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
552
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
554
-contents of parent/file2
556
------------------------------------------------------------
558
committer: Lorem Ipsum <test@example.com>
564
=== added file 'file1'
565
--- file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
566
+++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
568
+contents of parent/file1
570
=== added file 'file2'
571
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
572
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
574
+contents of parent/file2
577
def test_log_show_diff_short(self):
579
out,err = self.run_bzr('log -p --short')
580
self.assertEqual('', err)
581
log = normalize_log(out)
582
self.assertEqualDiff(subst_dates(log), """\
583
2 Lorem Ipsum\t2005-11-22 [merge]
585
=== modified file 'file2'
586
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
587
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
589
-contents of parent/file2
592
1 Lorem Ipsum\t2005-11-22
594
=== added file 'file1'
595
--- file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
596
+++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
598
+contents of parent/file1
600
=== added file 'file2'
601
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
602
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
604
+contents of parent/file2
608
def test_log_show_diff_line(self):
610
out,err = self.run_bzr('log -p --line')
611
self.assertEqual('', err)
612
log = normalize_log(out)
613
# Not supported by this formatter so expect plain output
614
self.assertEqualDiff(subst_dates(log), """\
615
2: Lorem Ipsum 2005-11-22 merge branch 1
616
1: Lorem Ipsum 2005-11-22 first post
619
def test_log_show_diff_file(self):
620
"""Only the diffs for the given file are to be shown"""
622
out,err = self.run_bzr('log -p --short file2')
623
self.assertEqual('', err)
624
log = normalize_log(out)
625
self.assertEqualDiff(subst_dates(log), """\
626
2 Lorem Ipsum\t2005-11-22 [merge]
628
=== modified file 'file2'
629
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
630
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
632
-contents of parent/file2
635
1 Lorem Ipsum\t2005-11-22
637
=== added file 'file2'
638
--- file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
639
+++ file2\tYYYY-MM-DD HH:MM:SS +ZZZZ
641
+contents of parent/file2
644
out,err = self.run_bzr('log -p --short file1')
645
self.assertEqual('', err)
646
log = normalize_log(out)
647
self.assertEqualDiff(subst_dates(log), """\
648
1 Lorem Ipsum\t2005-11-22
650
=== added file 'file1'
651
--- file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
652
+++ file1\tYYYY-MM-DD HH:MM:SS +ZZZZ
654
+contents of parent/file1
659
406
class TestLogEncodings(TestCaseInTempDir):
838
577
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
839
578
self.assertNotContainsRe(log, 'revno: 4\n')
841
def test_log_file_historical_missing(self):
842
# Check logging a deleted file gives an error if the
843
# file isn't found at the end or start of the revision range
844
self.prepare_tree(complex=True)
845
err_msg = "Path unknown at end or start of revision range: file2"
846
err = self.run_bzr('log file2', retcode=3)[1]
847
self.assertContainsRe(err, err_msg)
849
def test_log_file_historical_end(self):
850
# Check logging a deleted file is ok if the file existed
851
# at the end the revision range
852
self.prepare_tree(complex=True)
853
log, err = self.run_bzr('log -r..4 file2')
854
self.assertEquals('', err)
855
self.assertNotContainsRe(log, 'revno: 1\n')
856
self.assertContainsRe(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\n')
861
def test_log_file_historical_start(self):
862
# Check logging a deleted file is ok if the file existed
863
# at the start of the revision range
864
self.prepare_tree(complex=True)
865
log, err = self.run_bzr('log file1')
866
self.assertEquals('', err)
867
self.assertContainsRe(log, 'revno: 1\n')
868
self.assertNotContainsRe(log, 'revno: 2\n')
869
self.assertNotContainsRe(log, 'revno: 3\n')
870
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
871
self.assertNotContainsRe(log, 'revno: 4\n')
873
def test_log_file_renamed(self):
874
"""File matched against revision range, not current tree."""
875
self.prepare_tree(complex=True)
877
# Check logging a renamed file gives an error by default
878
err_msg = "Path unknown at end or start of revision range: file3"
879
err = self.run_bzr('log file3', retcode=3)[1]
880
self.assertContainsRe(err, err_msg)
882
# Check we can see a renamed file if we give the right end revision
883
log, err = self.run_bzr('log -r..4 file3')
884
self.assertEquals('', err)
885
self.assertNotContainsRe(log, 'revno: 1\n')
886
self.assertNotContainsRe(log, 'revno: 2\n')
887
self.assertContainsRe(log, 'revno: 3\n')
888
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
889
self.assertNotContainsRe(log, 'revno: 4\n')
891
580
def test_line_log_file(self):
892
581
"""The line log for a file should only list relevant mainline revs"""
893
582
# Note: this also implicitly covers the short logging case.