/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: 2018-02-18 21:42:57 UTC
  • mto: This revision was merged to the branch mainline in revision 6859.
  • Revision ID: jelmer@jelmer.uk-20180218214257-jpevutp1wa30tz3v
Update TODO to reference Breezy, not Bazaar.

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