/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-07-23 22:06:41 UTC
  • mfrom: (6738 trunk)
  • mto: This revision was merged to the branch mainline in revision 6739.
  • Revision ID: jelmer@jelmer.uk-20170723220641-69eczax9bmv8d6kk
Merge trunk, address review comments.

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