/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 breezy/tests/blackbox/test_log.py

  • Committer: Jelmer Vernooij
  • Date: 2017-06-08 23:30:31 UTC
  • mto: This revision was merged to the branch mainline in revision 6690.
  • Revision ID: jelmer@jelmer.uk-20170608233031-3qavls2o7a1pqllj
Update imports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
"""Black-box tests for brz log."""
19
19
 
20
 
 
21
20
import os
22
21
 
23
22
from breezy import (
31
30
    test_log,
32
31
    features,
33
32
    )
 
33
from breezy.tests.matchers import ContainsNoVfsCalls
34
34
 
35
35
 
36
36
class TestLog(tests.TestCaseWithTransport, test_log.TestLogMixin):
56
56
 
57
57
    def make_merged_branch(self, path='.', format=None):
58
58
        tree = self.make_linear_branch(path, format)
59
 
        tree2 = tree.controldir.sprout('tree2',
60
 
                                       revision_id=tree.branch.get_rev_id(1)).open_workingtree()
 
59
        tree2 = tree.bzrdir.sprout('tree2',
 
60
            revision_id=tree.branch.get_rev_id(1)).open_workingtree()
61
61
        tree2.commit(message='tree2 message2')
62
62
        tree2.commit(message='tree2 message3')
63
63
        tree.merge_from_branch(tree2.branch)
70
70
    def setUp(self):
71
71
        super(TestLogWithLogCatcher, self).setUp()
72
72
        # Capture log formatter creations
73
 
 
74
73
        class MyLogFormatter(test_log.LogCatcher):
75
74
 
76
75
            def __new__(klass, *args, **kwargs):
81
80
        self.addCleanup(setattr, MyLogFormatter, "__new__", None)
82
81
 
83
82
        def getme(branch):
84
 
            # Always return our own log formatter class hijacking the
85
 
            # default behavior (which requires setting up a config
86
 
            # variable)
 
83
                # Always return our own log formatter class hijacking the
 
84
                # default behavior (which requires setting up a config
 
85
                # variable)
87
86
            return MyLogFormatter
88
87
        self.overrideAttr(log.log_formatter_registry, 'get_default', getme)
89
88
 
100
99
                         [r.revno for r in self.get_captured_revisions()])
101
100
 
102
101
    def assertLogRevnosAndDepths(self, args, expected_revnos_and_depths,
103
 
                                 working_dir='.'):
 
102
                                working_dir='.'):
104
103
        self.run_bzr(['log'] + args, working_dir=working_dir)
105
104
        self.assertEqual(expected_revnos_and_depths,
106
105
                         [(r.revno, r.merge_depth)
107
 
                          for r in self.get_captured_revisions()])
 
106
                           for r in self.get_captured_revisions()])
108
107
 
109
108
 
110
109
class TestLogRevSpecs(TestLogWithLogCatcher):
211
210
        # 6
212
211
 
213
212
        # mainline
214
 
        builder.build_snapshot(None, [
215
 
            ('add', ('', b'root-id', 'directory', ''))],
216
 
            revision_id=b'1')
217
 
        builder.build_snapshot([b'1'], [], revision_id=b'2')
 
213
        builder.build_snapshot('1', None, [
 
214
            ('add', ('', 'root-id', 'directory', ''))])
 
215
        builder.build_snapshot('2', ['1'], [])
218
216
        # branch
219
 
        builder.build_snapshot([b'1'], [], revision_id=b'1.1.1')
 
217
        builder.build_snapshot('1.1.1', ['1'], [])
220
218
        # merge branch into mainline
221
 
        builder.build_snapshot([b'2', b'1.1.1'], [], revision_id=b'3')
 
219
        builder.build_snapshot('3', ['2', '1.1.1'], [])
222
220
        # new commits in branch
223
 
        builder.build_snapshot([b'1.1.1'], [], revision_id=b'1.1.2')
224
 
        builder.build_snapshot([b'1.1.2'], [], revision_id=b'1.1.3')
 
221
        builder.build_snapshot('1.1.2', ['1.1.1'], [])
 
222
        builder.build_snapshot('1.1.3', ['1.1.2'], [])
225
223
        # merge branch into mainline
226
 
        builder.build_snapshot([b'3', b'1.1.3'], [], revision_id=b'4')
 
224
        builder.build_snapshot('4', ['3', '1.1.3'], [])
227
225
        # merge mainline into branch
228
 
        builder.build_snapshot([b'1.1.3', b'4'], [], revision_id=b'1.1.4')
 
226
        builder.build_snapshot('1.1.4', ['1.1.3', '4'], [])
229
227
        # merge branch into mainline
230
 
        builder.build_snapshot([b'4', b'1.1.4'], [], revision_id=b'5')
231
 
        builder.build_snapshot([b'5'], [], revision_id=b'5.1.1')
232
 
        builder.build_snapshot([b'5', b'5.1.1'], [], revision_id=b'6')
 
228
        builder.build_snapshot('5', ['4', '1.1.4'], [])
 
229
        builder.build_snapshot('5.1.1', ['5'], [])
 
230
        builder.build_snapshot('6', ['5', '5.1.1'], [])
233
231
        builder.finish_series()
234
232
 
235
233
    def test_n0(self):
236
234
        self.assertLogRevnos(['-n0', '-r1.1.1..1.1.4'],
237
235
                             ['1.1.4', '4', '1.1.3', '1.1.2', '3', '1.1.1'])
238
 
 
239
236
    def test_n0_forward(self):
240
237
        self.assertLogRevnos(['-n0', '-r1.1.1..1.1.4', '--forward'],
241
238
                             ['3', '1.1.1', '4', '1.1.2', '1.1.3', '1.1.4'])
284
281
        # 4        /
285
282
        # |       /
286
283
        # 5 -----/
287
 
        builder.build_snapshot(None, [
288
 
            ('add', ('', b'root-id', 'directory', ''))], revision_id=b'1')
289
 
        builder.build_snapshot([b'1'], [], revision_id=b'2')
290
 
        builder.build_snapshot([b'1'], [], revision_id=b'1.1.1')
291
 
        builder.build_snapshot([b'2'], [], revision_id=b'2.1.1')
292
 
        builder.build_snapshot([b'2', b'1.1.1'], [], revision_id=b'3')
293
 
        builder.build_snapshot([b'2.1.1'], [], revision_id=b'2.1.2')
294
 
        builder.build_snapshot([b'2.1.1'], [], revision_id=b'2.2.1')
295
 
        builder.build_snapshot([b'2.1.2', b'2.2.1'], [], revision_id=b'2.1.3')
296
 
        builder.build_snapshot([b'3', b'2.1.3'], [], revision_id=b'4')
297
 
        builder.build_snapshot([b'4', b'2.1.2'], [], revision_id=b'5')
 
284
        builder.build_snapshot('1', None, [
 
285
            ('add', ('', 'root-id', 'directory', ''))])
 
286
        builder.build_snapshot('2', ['1'], [])
 
287
        builder.build_snapshot('1.1.1', ['1'], [])
 
288
        builder.build_snapshot('2.1.1', ['2'], [])
 
289
        builder.build_snapshot('3', ['2', '1.1.1'], [])
 
290
        builder.build_snapshot('2.1.2', ['2.1.1'], [])
 
291
        builder.build_snapshot('2.2.1', ['2.1.1'], [])
 
292
        builder.build_snapshot('2.1.3', ['2.1.2', '2.2.1'], [])
 
293
        builder.build_snapshot('4', ['3', '2.1.3'], [])
 
294
        builder.build_snapshot('5', ['4', '2.1.2'], [])
298
295
        builder.finish_series()
299
296
        return builder
300
297
 
301
298
    def test_not_an_ancestor(self):
302
 
        self.assertRaises(errors.CommandError,
 
299
        self.assertRaises(errors.BzrCommandError,
303
300
                          log._generate_all_revisions,
304
301
                          self.branch, '1.1.1', '2.1.3', 'reverse',
305
302
                          delayed_graph_generation=True)
306
303
 
307
304
    def test_wrong_order(self):
308
 
        self.assertRaises(errors.CommandError,
 
305
        self.assertRaises(errors.BzrCommandError,
309
306
                          log._generate_all_revisions,
310
307
                          self.branch, '5', '2.1.3', 'reverse',
311
308
                          delayed_graph_generation=True)
328
325
    def test_log_revno_n_path_correct_order(self):
329
326
        self.make_linear_branch('branch2')
330
327
        self.assertLogRevnos(['-rrevno:1:branch2..revno:3:branch2'],
331
 
                             ['3', '2', '1'])
 
328
                             ['3', '2','1'])
332
329
 
333
330
    def test_log_revno_n_path(self):
334
331
        self.make_linear_branch('branch2')
335
332
        self.assertLogRevnos(['-rrevno:1:branch2'],
336
333
                             ['1'])
337
334
        rev_props = self.log_catcher.revisions[0].rev.properties
338
 
        self.assertEqual('branch2', rev_props[u'branch-nick'])
 
335
        self.assertEqual('branch2', rev_props['branch-nick'])
339
336
 
340
337
 
341
338
class TestLogErrors(TestLog):
365
362
        self.make_minimal_branch()
366
363
        self.run_bzr_error(["brz: ERROR: Requested revision: '123.123' "
367
364
                            "does not exist in branch:"],
368
 
                           ['log', '-r123.123'])
 
365
                           ['log',  '-r123.123'])
369
366
 
370
367
    def test_log_change_nonexistent_revno(self):
371
368
        self.make_minimal_branch()
372
369
        self.run_bzr_error(["brz: ERROR: Requested revision: '1234' "
373
370
                            "does not exist in branch:"],
374
 
                           ['log', '-c1234'])
 
371
                           ['log',  '-c1234'])
375
372
 
376
373
    def test_log_change_nonexistent_dotted_revno(self):
377
374
        self.make_minimal_branch()
382
379
    def test_log_change_single_revno_only(self):
383
380
        self.make_minimal_branch()
384
381
        self.run_bzr_error(['brz: ERROR: Option --change does not'
385
 
                            ' accept revision ranges'],
 
382
                           ' accept revision ranges'],
386
383
                           ['log', '--change', '2..3'])
387
384
 
388
385
    def test_log_change_incompatible_with_revision(self):
389
386
        self.run_bzr_error(['brz: ERROR: --revision and --change'
390
 
                            ' are mutually exclusive'],
 
387
                           ' are mutually exclusive'],
391
388
                           ['log', '--change', '2', '--revision', '3'])
392
389
 
393
390
    def test_log_nonexistent_file(self):
441
438
                           ['log', '--exclude-common-ancestry',
442
439
                            '-r1.1.1..1.1.1'])
443
440
 
444
 
 
445
441
class TestLogTags(TestLog):
446
442
 
447
443
    def test_log_with_tags(self):
463
459
        branch1_tree = self.make_linear_branch('branch1',
464
460
                                               format='dirstate-tags')
465
461
        branch1 = branch1_tree.branch
466
 
        branch2_tree = branch1_tree.controldir.sprout(
467
 
            'branch2').open_workingtree()
 
462
        branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
468
463
        branch1_tree.commit(message='foobar', allow_pointless=True)
469
464
        branch1.tags.set_tag('tag1', branch1.last_revision())
470
465
        # tags don't propagate if we don't merge
479
474
class TestLogSignatures(TestLog):
480
475
 
481
476
    def test_log_with_signatures(self):
482
 
        self.requireFeature(features.gpg)
 
477
        self.requireFeature(features.gpgme)
483
478
 
484
479
        tree = self.make_linear_branch(format='dirstate-tags')
485
480
 
487
482
        self.assertTrue('signature: no signature' in log)
488
483
 
489
484
    def test_log_without_signatures(self):
490
 
        self.requireFeature(features.gpg)
 
485
        self.requireFeature(features.gpgme)
491
486
 
492
487
        tree = self.make_linear_branch(format='dirstate-tags')
493
488
 
504
499
    def assertUseShortDeltaFormat(self, cmd):
505
500
        log = self.run_bzr(cmd)[0]
506
501
        # Check that we use the short status format
507
 
        self.assertContainsRe(log, '(?m)^\\s*A  hello.txt$')
508
 
        self.assertNotContainsRe(log, '(?m)^\\s*added:$')
 
502
        self.assertContainsRe(log, '(?m)^\s*A  hello.txt$')
 
503
        self.assertNotContainsRe(log, '(?m)^\s*added:$')
509
504
 
510
505
    def assertUseLongDeltaFormat(self, cmd):
511
506
        log = self.run_bzr(cmd)[0]
512
507
        # Check that we use the long status format
513
 
        self.assertNotContainsRe(log, '(?m)^\\s*A  hello.txt$')
514
 
        self.assertContainsRe(log, '(?m)^\\s*added:$')
 
508
        self.assertNotContainsRe(log, '(?m)^\s*A  hello.txt$')
 
509
        self.assertContainsRe(log, '(?m)^\s*added:$')
515
510
 
516
511
    def test_log_short_verbose(self):
517
512
        self.assertUseShortDeltaFormat(['log', '--short', '-v'])
542
537
    def make_branches_with_merges(self):
543
538
        level0 = self.make_branch_and_tree('level0')
544
539
        self.wt_commit(level0, 'in branch level0')
545
 
        level1 = level0.controldir.sprout('level1').open_workingtree()
 
540
        level1 = level0.bzrdir.sprout('level1').open_workingtree()
546
541
        self.wt_commit(level1, 'in branch level1')
547
 
        level2 = level1.controldir.sprout('level2').open_workingtree()
 
542
        level2 = level1.bzrdir.sprout('level2').open_workingtree()
548
543
        self.wt_commit(level2, 'in branch level2')
549
544
        level1.merge_from_branch(level2.branch)
550
545
        self.wt_commit(level1, 'merge branch level2')
558
553
        self.assertEqual([('2', 0), ('1.1.2', 1), ('1.2.1', 2), ('1.1.1', 1),
559
554
                          ('1', 0)],
560
555
                         [(r.revno, r.merge_depth)
561
 
                          for r in self.get_captured_revisions()])
 
556
                            for r in self.get_captured_revisions()])
562
557
 
563
558
    def test_force_merge_revisions_off(self):
564
559
        self.assertLogRevnos(['-n1'], ['2', '1'], working_dir='level0')
587
582
 
588
583
    def test_merges_partial_range(self):
589
584
        self.assertLogRevnosAndDepths(
590
 
            ['-n0', '-r1.1.1..1.1.2'],
591
 
            [('1.1.2', 0), ('1.2.1', 1), ('1.1.1', 0)],
592
 
            working_dir='level0')
 
585
                ['-n0', '-r1.1.1..1.1.2'],
 
586
                [('1.1.2', 0), ('1.2.1', 1), ('1.1.1', 0)],
 
587
                working_dir='level0')
593
588
 
594
589
    def test_merges_partial_range_ignore_before_lower_bound(self):
595
590
        """Dont show revisions before the lower bound's merged revs"""
596
591
        self.assertLogRevnosAndDepths(
597
 
            ['-n0', '-r1.1.2..2'],
598
 
            [('2', 0), ('1.1.2', 1), ('1.2.1', 2)],
599
 
            working_dir='level0')
 
592
                ['-n0', '-r1.1.2..2'],
 
593
                [('2', 0), ('1.1.2', 1), ('1.2.1', 2)],
 
594
                working_dir='level0')
600
595
 
601
596
    def test_omit_merges_with_sidelines(self):
602
597
        self.assertLogRevnos(['--omit-merges', '-n0'], ['1.2.1', '1.1.1', '1'],
624
619
        level0.add('file2')
625
620
        self.wt_commit(level0, 'in branch level0')
626
621
 
627
 
        level1 = level0.controldir.sprout('level1').open_workingtree()
628
 
        self.build_tree_contents([('level1/file2', b'hello\n')])
 
622
        level1 = level0.bzrdir.sprout('level1').open_workingtree()
 
623
        self.build_tree_contents([('level1/file2', 'hello\n')])
629
624
        self.wt_commit(level1, 'in branch level1')
630
625
        level0.merge_from_branch(level1.branch)
631
626
        self.wt_commit(level0, 'merge branch level1')
632
627
 
633
628
    def _diff_file1_revno1(self):
634
 
        return b"""=== added file 'file1'
 
629
        return """=== added file 'file1'
635
630
--- file1\t1970-01-01 00:00:00 +0000
636
631
+++ file1\t2005-11-22 00:00:00 +0000
637
632
@@ -0,0 +1,1 @@
640
635
"""
641
636
 
642
637
    def _diff_file2_revno2(self):
643
 
        return b"""=== modified file 'file2'
 
638
        return """=== modified file 'file2'
644
639
--- file2\t2005-11-22 00:00:00 +0000
645
640
+++ file2\t2005-11-22 00:00:01 +0000
646
641
@@ -1,1 +1,1 @@
650
645
"""
651
646
 
652
647
    def _diff_file2_revno1_1_1(self):
653
 
        return b"""=== modified file 'file2'
 
648
        return """=== modified file 'file2'
654
649
--- file2\t2005-11-22 00:00:00 +0000
655
650
+++ file2\t2005-11-22 00:00:01 +0000
656
651
@@ -1,1 +1,1 @@
660
655
"""
661
656
 
662
657
    def _diff_file2_revno1(self):
663
 
        return b"""=== added file 'file2'
 
658
        return """=== added file 'file2'
664
659
--- file2\t1970-01-01 00:00:00 +0000
665
660
+++ file2\t2005-11-22 00:00:00 +0000
666
661
@@ -0,0 +1,1 @@
669
664
"""
670
665
 
671
666
    def assertLogRevnosAndDiff(self, args, expected,
672
 
                               working_dir='.'):
 
667
                            working_dir='.'):
673
668
        self.run_bzr(['log', '-p'] + args, working_dir=working_dir)
674
669
        expected_revnos_and_depths = [
675
670
            (revno, depth) for revno, depth, diff in expected]
676
671
        # Check the revnos and depths first to make debugging easier
677
672
        self.assertEqual(expected_revnos_and_depths,
678
673
                         [(r.revno, r.merge_depth)
679
 
                          for r in self.get_captured_revisions()])
 
674
                           for r in self.get_captured_revisions()])
680
675
        # Now check the diffs, adding the revno  in case of failure
681
676
        fmt = 'In revno %s\n%s'
682
677
        for expected_rev, actual_rev in zip(expected,
691
686
            ['-n0'],
692
687
            [('2', 0, self._diff_file2_revno2()),
693
688
             ('1.1.1', 1, self._diff_file2_revno1_1_1()),
694
 
             ('1', 0, self._diff_file1_revno1() +
695
 
              self._diff_file2_revno1())],
 
689
             ('1', 0, self._diff_file1_revno1()
 
690
              + self._diff_file2_revno1())],
696
691
            working_dir='level0')
697
692
 
 
693
 
698
694
    def test_log_diff_file1(self):
699
695
        self.assertLogRevnosAndDiff(['-n0', 'file1'],
700
696
                                    [('1', 0, self._diff_file1_revno1())],
712
708
    def test_log_show_diff_non_ascii(self):
713
709
        # Smoke test for bug #328007 UnicodeDecodeError on 'log -p'
714
710
        message = u'Message with \xb5'
715
 
        body = b'Body with \xb5\n'
 
711
        body = 'Body with \xb5\n'
716
712
        wt = self.make_branch_and_tree('.')
717
713
        self.build_tree_contents([('foo', body)])
718
714
        wt.add('foo')
719
715
        wt.commit(message=message)
720
716
        # check that command won't fail with unicode error
721
717
        # don't care about exact output because we have other tests for this
722
 
        out, err = self.run_bzr('log -p --long')
723
 
        self.assertNotEqual('', out)
724
 
        self.assertEqual('', err)
725
 
        out, err = self.run_bzr('log -p --short')
726
 
        self.assertNotEqual('', out)
727
 
        self.assertEqual('', err)
728
 
        out, err = self.run_bzr('log -p --line')
 
718
        out,err = self.run_bzr('log -p --long')
 
719
        self.assertNotEqual('', out)
 
720
        self.assertEqual('', err)
 
721
        out,err = self.run_bzr('log -p --short')
 
722
        self.assertNotEqual('', out)
 
723
        self.assertEqual('', err)
 
724
        out,err = self.run_bzr('log -p --line')
729
725
        self.assertNotEqual('', out)
730
726
        self.assertEqual('', err)
731
727
 
740
736
        'utf-8',
741
737
        'latin-1',
742
738
        'iso-8859-1',
743
 
        'cp437',  # Common windows encoding
744
 
        'cp1251',  # Russian windows encoding
745
 
        'cp1258',  # Common windows encoding
 
739
        'cp437', # Common windows encoding
 
740
        'cp1251', # Russian windows encoding
 
741
        'cp1258', # Common windows encoding
746
742
    ]
747
743
    # Encodings which cannot encode mu
748
744
    bad_encodings = [
758
754
    def create_branch(self):
759
755
        brz = self.run_bzr
760
756
        brz('init')
761
 
        self.build_tree_contents([('a', b'some stuff\n')])
 
757
        self.build_tree_contents([('a', 'some stuff\n')])
762
758
        brz('add a')
763
759
        brz(['commit', '-m', self._message])
764
760
 
766
762
        brz = self.run_bzr
767
763
        if fail:
768
764
            self.assertRaises(UnicodeEncodeError,
769
 
                              self._mu.encode, encoding)
 
765
                self._mu.encode, encoding)
770
766
            encoded_msg = self._message.encode(encoding, 'replace')
771
767
        else:
772
768
            encoded_msg = self._message.encode(encoding)
781
777
            out, err = brz('log', encoding=encoding)
782
778
            if not fail:
783
779
                # Make sure we wrote mu as we expected it to exist
784
 
                self.assertNotEqual(-1, out.find(self._message))
 
780
                self.assertNotEqual(-1, out.find(encoded_msg))
 
781
                out_unicode = out.decode(encoding)
 
782
                self.assertNotEqual(-1, out_unicode.find(self._message))
785
783
            else:
786
784
                self.assertNotEqual(-1, out.find('Message with ?'))
787
785
        finally:
807
805
        self.build_tree(['a'])
808
806
        brz('add a')
809
807
        brz(['commit', '-m', u'\u0422\u0435\u0441\u0442'])
810
 
        stdout, stderr = self.run_bzr_raw('log', encoding='cp866')
 
808
        stdout, stderr = self.run_bzr('log', encoding='cp866')
811
809
 
812
810
        message = stdout.splitlines()[-1]
813
811
 
817
815
        # in cp1251 encoding this is string '\xd2\xe5\xf1\xf2'
818
816
        # This test should check that output of log command
819
817
        # encoded to sys.stdout.encoding
820
 
        test_in_cp866 = b'\x92\xa5\xe1\xe2'
821
 
        test_in_cp1251 = b'\xd2\xe5\xf1\xf2'
 
818
        test_in_cp866 = '\x92\xa5\xe1\xe2'
 
819
        test_in_cp1251 = '\xd2\xe5\xf1\xf2'
822
820
        # Make sure the log string is encoded in cp866
823
821
        self.assertEqual(test_in_cp866, message[2:])
824
822
        # Make sure the cp1251 string is not found anywhere
833
831
        self.build_tree(['tree/file'])
834
832
        tree.add('file')
835
833
        tree.commit('revision 1')
836
 
        tree.controldir.destroy_workingtree()
 
834
        tree.bzrdir.destroy_workingtree()
837
835
        self.run_bzr('log tree/file')
838
836
 
839
837
    def prepare_tree(self, complex=False):
846
844
        tree.commit('add file2')
847
845
        tree.add('file3')
848
846
        tree.commit('add file3')
849
 
        child_tree = tree.controldir.sprout('child').open_workingtree()
850
 
        self.build_tree_contents([('child/file2', b'hello')])
 
847
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
 
848
        self.build_tree_contents([('child/file2', 'hello')])
851
849
        child_tree.commit(message='branch 1')
852
850
        tree.merge_from_branch(child_tree.branch)
853
851
        tree.commit(message='merge child branch')
902
900
        # Check logging a deleted file is ok if the file existed
903
901
        # at the start of the revision range
904
902
        self.prepare_tree(complex=True)
905
 
        self.assertLogRevnos(['file1'], [])
 
903
        self.assertLogRevnos(['file1'], ['1'])
906
904
 
907
905
    def test_log_file_renamed(self):
908
906
        """File matched against revision range, not current tree."""
939
937
        tree.commit('add file4')
940
938
        tree.add('dir1/file5')
941
939
        tree.commit('add file5')
942
 
        child_tree = tree.controldir.sprout('child').open_workingtree()
943
 
        self.build_tree_contents([('child/file2', b'hello')])
 
940
        child_tree = tree.bzrdir.sprout('child').open_workingtree()
 
941
        self.build_tree_contents([('child/file2', 'hello')])
944
942
        child_tree.commit(message='branch 1')
945
943
        tree.merge_from_branch(child_tree.branch)
946
944
        tree.commit(message='merge child branch')
985
983
    def setUp(self):
986
984
        super(MainlineGhostTests, self).setUp()
987
985
        tree = self.make_branch_and_tree('')
988
 
        tree.set_parent_ids([b"spooky"], allow_leftmost_as_ghost=True)
 
986
        tree.set_parent_ids(["spooky"], allow_leftmost_as_ghost=True)
989
987
        tree.add('')
990
 
        tree.commit('msg1', rev_id=b'rev1')
991
 
        tree.commit('msg2', rev_id=b'rev2')
 
988
        tree.commit('msg1', rev_id='rev1')
 
989
        tree.commit('msg2', rev_id='rev2')
992
990
 
993
991
    def test_log_range(self):
994
992
        self.assertLogRevnos(["-r1..2"], ["2", "1"])
997
995
        self.assertLogRevnos([], ["2", "1"])
998
996
 
999
997
    def test_log_range_open_begin(self):
 
998
        self.knownFailure("log with ghosts fails. bug #726466")
1000
999
        (stdout, stderr) = self.run_bzr(['log', '-r..2'], retcode=3)
1001
1000
        self.assertEqual(["2", "1"],
1002
1001
                         [r.revno for r in self.get_captured_revisions()])
1003
 
        self.assertEqual("brz: ERROR: Further revision history missing.\n",
1004
 
                         stderr)
 
1002
        self.assertEqual("brz: ERROR: Further revision history missing.", stderr)
1005
1003
 
1006
1004
    def test_log_range_open_end(self):
1007
1005
        self.assertLogRevnos(["-r1.."], ["2", "1"])
1008
1006
 
1009
 
 
1010
1007
class TestLogMatch(TestLogWithLogCatcher):
1011
 
 
1012
1008
    def prepare_tree(self):
1013
1009
        tree = self.make_branch_and_tree('')
1014
1010
        self.build_tree(
1015
1011
            ['/hello.txt', '/goodbye.txt'])
1016
1012
        tree.add('hello.txt')
1017
 
        tree.commit(message='message1', committer='committer1',
1018
 
                    authors=['author1'])
 
1013
        tree.commit(message='message1', committer='committer1', authors=['author1'])
1019
1014
        tree.add('goodbye.txt')
1020
 
        tree.commit(message='message2', committer='committer2',
1021
 
                    authors=['author2'])
1022
 
 
 
1015
        tree.commit(message='message2', committer='committer2', authors=['author2'])
 
1016
    
1023
1017
    def test_message(self):
1024
1018
        self.prepare_tree()
1025
1019
        self.assertLogRevnos(["-m", "message1"], ["1"])
1029
1023
        self.assertLogRevnos(["--match-message", "message1"], ["1"])
1030
1024
        self.assertLogRevnos(["--match-message", "message2"], ["2"])
1031
1025
        self.assertLogRevnos(["--match-message", "message"], ["2", "1"])
1032
 
        self.assertLogRevnos(["--match-message", "message1",
 
1026
        self.assertLogRevnos(["--match-message", "message1", 
1033
1027
                              "--match-message", "message2"], ["2", "1"])
1034
1028
        self.assertLogRevnos(["--message", "message1"], ["1"])
1035
1029
        self.assertLogRevnos(["--message", "message2"], ["2"])
1036
1030
        self.assertLogRevnos(["--message", "message"], ["2", "1"])
1037
 
        self.assertLogRevnos(["--match-message", "message1",
 
1031
        self.assertLogRevnos(["--match-message", "message1", 
1038
1032
                              "--message", "message2"], ["2", "1"])
1039
 
        self.assertLogRevnos(["--message", "message1",
 
1033
        self.assertLogRevnos(["--message", "message1", 
1040
1034
                              "--match-message", "message2"], ["2", "1"])
1041
1035
 
1042
1036
    def test_committer(self):
1044
1038
        self.assertLogRevnos(["-m", "committer1"], ["1"])
1045
1039
        self.assertLogRevnos(["-m", "committer2"], ["2"])
1046
1040
        self.assertLogRevnos(["-m", "committer"], ["2", "1"])
1047
 
        self.assertLogRevnos(["-m", "committer1", "-m", "committer2"],
 
1041
        self.assertLogRevnos(["-m", "committer1", "-m", "committer2"], 
1048
1042
                             ["2", "1"])
1049
1043
        self.assertLogRevnos(["--match-committer", "committer1"], ["1"])
1050
1044
        self.assertLogRevnos(["--match-committer", "committer2"], ["2"])
1051
1045
        self.assertLogRevnos(["--match-committer", "committer"], ["2", "1"])
1052
 
        self.assertLogRevnos(["--match-committer", "committer1",
 
1046
        self.assertLogRevnos(["--match-committer", "committer1", 
1053
1047
                              "--match-committer", "committer2"], ["2", "1"])
1054
1048
 
1055
1049
    def test_author(self):
1057
1051
        self.assertLogRevnos(["-m", "author1"], ["1"])
1058
1052
        self.assertLogRevnos(["-m", "author2"], ["2"])
1059
1053
        self.assertLogRevnos(["-m", "author"], ["2", "1"])
1060
 
        self.assertLogRevnos(["-m", "author1", "-m", "author2"],
 
1054
        self.assertLogRevnos(["-m", "author1", "-m", "author2"], 
1061
1055
                             ["2", "1"])
1062
1056
        self.assertLogRevnos(["--match-author", "author1"], ["1"])
1063
1057
        self.assertLogRevnos(["--match-author", "author2"], ["2"])
1064
1058
        self.assertLogRevnos(["--match-author", "author"], ["2", "1"])
1065
 
        self.assertLogRevnos(["--match-author", "author1",
 
1059
        self.assertLogRevnos(["--match-author", "author1", 
1066
1060
                              "--match-author", "author2"], ["2", "1"])
 
1061
 
 
1062
 
 
1063
class TestSmartServerLog(tests.TestCaseWithTransport):
 
1064
 
 
1065
    def test_standard_log(self):
 
1066
        self.setup_smart_server_with_call_log()
 
1067
        t = self.make_branch_and_tree('branch')
 
1068
        self.build_tree_contents([('branch/foo', 'thecontents')])
 
1069
        t.add("foo")
 
1070
        t.commit("message")
 
1071
        self.reset_smart_call_log()
 
1072
        out, err = self.run_bzr(['log', self.get_url('branch')])
 
1073
        # This figure represent the amount of work to perform this use case. It
 
1074
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
1075
        # being too low. If rpc_count increases, more network roundtrips have
 
1076
        # become necessary for this use case. Please do not adjust this number
 
1077
        # upwards without agreement from bzr's network support maintainers.
 
1078
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
 
1079
        self.assertLength(1, self.hpss_connections)
 
1080
        self.assertLength(9, self.hpss_calls)
 
1081
 
 
1082
    def test_verbose_log(self):
 
1083
        self.setup_smart_server_with_call_log()
 
1084
        t = self.make_branch_and_tree('branch')
 
1085
        self.build_tree_contents([('branch/foo', 'thecontents')])
 
1086
        t.add("foo")
 
1087
        t.commit("message")
 
1088
        self.reset_smart_call_log()
 
1089
        out, err = self.run_bzr(['log', '-v', self.get_url('branch')])
 
1090
        # This figure represent the amount of work to perform this use case. It
 
1091
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
1092
        # being too low. If rpc_count increases, more network roundtrips have
 
1093
        # become necessary for this use case. Please do not adjust this number
 
1094
        # upwards without agreement from bzr's network support maintainers.
 
1095
        self.assertLength(10, self.hpss_calls)
 
1096
        self.assertLength(1, self.hpss_connections)
 
1097
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
 
1098
 
 
1099
    def test_per_file(self):
 
1100
        self.setup_smart_server_with_call_log()
 
1101
        t = self.make_branch_and_tree('branch')
 
1102
        self.build_tree_contents([('branch/foo', 'thecontents')])
 
1103
        t.add("foo")
 
1104
        t.commit("message")
 
1105
        self.reset_smart_call_log()
 
1106
        out, err = self.run_bzr(['log', '-v', self.get_url('branch') + "/foo"])
 
1107
        # This figure represent the amount of work to perform this use case. It
 
1108
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
1109
        # being too low. If rpc_count increases, more network roundtrips have
 
1110
        # become necessary for this use case. Please do not adjust this number
 
1111
        # upwards without agreement from bzr's network support maintainers.
 
1112
        self.assertLength(14, self.hpss_calls)
 
1113
        self.assertLength(1, self.hpss_connections)
 
1114
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)