~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_log.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-01-25 10:54:10 UTC
  • mfrom: (4981.2.4 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100125105410-8l7842imp6z7jcs4
(jam) Update to win32_setup

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
19
19
 
20
20
from itertools import izip
21
21
import os
 
22
import re
22
23
 
23
24
from bzrlib import (
24
25
    branchbuilder,
25
 
    errors,
26
26
    log,
27
27
    osutils,
28
28
    tests,
29
29
    )
30
30
from bzrlib.tests import (
 
31
    script,
31
32
    test_log,
32
 
    features,
33
33
    )
34
34
 
35
35
 
76
76
                self.log_catcher = test_log.LogCatcher(*args, **kwargs)
77
77
                # Always return our own log formatter
78
78
                return self.log_catcher
79
 
        # Break cycle with closure over self on cleanup by removing method
80
 
        self.addCleanup(setattr, MyLogFormatter, "__new__", None)
 
79
 
 
80
        orig = log.log_formatter_registry.get_default
 
81
        def restore():
 
82
            log.log_formatter_registry.get_default = orig
 
83
        self.addCleanup(restore)
81
84
 
82
85
        def getme(branch):
83
86
                # Always return our own log formatter class hijacking the
84
87
                # default behavior (which requires setting up a config
85
88
                # variable)
86
89
            return MyLogFormatter
87
 
        self.overrideAttr(log.log_formatter_registry, 'get_default', getme)
 
90
        log.log_formatter_registry.get_default = getme
88
91
 
89
92
    def get_captured_revisions(self):
90
93
        return self.log_catcher.revisions
159
162
        self.make_linear_branch()
160
163
        self.assertLogRevnos(['-c1'], ['1'])
161
164
 
162
 
    def test_branch_revspec(self):
163
 
        foo = self.make_branch_and_tree('foo')
164
 
        bar = self.make_branch_and_tree('bar')
165
 
        self.build_tree(['foo/foo.txt', 'bar/bar.txt'])
166
 
        foo.add('foo.txt')
167
 
        bar.add('bar.txt')
168
 
        foo.commit(message='foo')
169
 
        bar.commit(message='bar')
170
 
        self.run_bzr('log -r branch:../bar', working_dir='foo')
171
 
        self.assertEqual([bar.branch.get_rev_id(1)],
172
 
                         [r.rev.revision_id
173
 
                          for r in self.get_captured_revisions()])
174
 
 
175
 
 
176
 
class TestLogExcludeCommonAncestry(TestLogWithLogCatcher):
177
 
 
178
 
    def test_exclude_common_ancestry_simple_revnos(self):
179
 
        self.make_linear_branch()
180
 
        self.assertLogRevnos(['-r1..3', '--exclude-common-ancestry'],
181
 
                             ['3', '2'])
182
 
 
183
 
 
184
 
class TestLogMergedLinearAncestry(TestLogWithLogCatcher):
 
165
 
 
166
class TestBug474807(TestLogWithLogCatcher):
185
167
 
186
168
    def setUp(self):
187
 
        super(TestLogMergedLinearAncestry, self).setUp()
 
169
        super(TestBug474807, self).setUp()
188
170
        # FIXME: Using a MemoryTree would be even better here (but until we
189
171
        # stop calling run_bzr, there is no point) --vila 100118.
190
172
        builder = branchbuilder.BranchBuilder(self.get_transport())
191
173
        builder.start_series()
192
 
        # 1
193
 
        # | \
194
 
        # 2  1.1.1
195
 
        # | / |
196
 
        # 3  1.1.2
197
 
        # |   |
198
 
        # |  1.1.3
199
 
        # | / |
200
 
        # 4  1.1.4
201
 
        # | /
202
 
        # 5
203
 
 
204
174
        # mainline
205
175
        builder.build_snapshot('1', None, [
206
176
            ('add', ('', 'root-id', 'directory', ''))])
237
207
                             ['1.1.1', '1.1.2', '1.1.3', '1.1.4'])
238
208
 
239
209
 
240
 
class Test_GenerateAllRevisions(TestLogWithLogCatcher):
241
 
 
242
 
    def setUp(self):
243
 
        super(Test_GenerateAllRevisions, self).setUp()
244
 
        builder = self.make_branch_with_many_merges()
245
 
        b = builder.get_branch()
246
 
        b.lock_read()
247
 
        self.addCleanup(b.unlock)
248
 
        self.branch = b
249
 
 
250
 
    def make_branch_with_many_merges(self, path='.', format=None):
251
 
        builder = branchbuilder.BranchBuilder(self.get_transport())
252
 
        builder.start_series()
253
 
        # The graph below may look a bit complicated (and it may be but I've
254
 
        # banged my head enough on it) but the bug requires at least dotted
255
 
        # revnos *and* merged revisions below that.
256
 
        builder.build_snapshot('1', None, [
257
 
            ('add', ('', 'root-id', 'directory', ''))])
258
 
        builder.build_snapshot('2', ['1'], [])
259
 
        builder.build_snapshot('1.1.1', ['1'], [])
260
 
        builder.build_snapshot('2.1.1', ['2'], [])
261
 
        builder.build_snapshot('3', ['2', '1.1.1'], [])
262
 
        builder.build_snapshot('2.1.2', ['2.1.1'], [])
263
 
        builder.build_snapshot('2.2.1', ['2.1.1'], [])
264
 
        builder.build_snapshot('2.1.3', ['2.1.2', '2.2.1'], [])
265
 
        builder.build_snapshot('4', ['3', '2.1.3'], [])
266
 
        builder.build_snapshot('5', ['4', '2.1.2'], [])
267
 
        builder.finish_series()
268
 
        return builder
269
 
 
270
 
    def test_not_an_ancestor(self):
271
 
        self.assertRaises(errors.BzrCommandError,
272
 
                          log._generate_all_revisions,
273
 
                          self.branch, '1.1.1', '2.1.3', 'reverse',
274
 
                          delayed_graph_generation=True)
275
 
 
276
 
    def test_wrong_order(self):
277
 
        self.assertRaises(errors.BzrCommandError,
278
 
                          log._generate_all_revisions,
279
 
                          self.branch, '5', '2.1.3', 'reverse',
280
 
                          delayed_graph_generation=True)
281
 
 
282
 
    def test_no_start_rev_id_with_end_rev_id_being_a_merge(self):
283
 
        revs = log._generate_all_revisions(
284
 
            self.branch, None, '2.1.3',
285
 
            'reverse', delayed_graph_generation=True)
286
 
 
287
 
 
288
210
class TestLogRevSpecsWithPaths(TestLogWithLogCatcher):
289
211
 
290
212
    def test_log_revno_n_path_wrong_namespace(self):
293
215
        # There is no guarantee that a path exist between two arbitrary
294
216
        # revisions.
295
217
        self.run_bzr("log -r revno:2:branch1..revno:3:branch2", retcode=3)
 
218
        # But may be it's worth trying though ? -- vila 100115
296
219
 
297
220
    def test_log_revno_n_path_correct_order(self):
298
221
        self.make_linear_branch('branch2')
382
305
 
383
306
    def test_log_bad_message_re(self):
384
307
        """Bad --message argument gives a sensible message
385
 
 
 
308
        
386
309
        See https://bugs.launchpad.net/bzr/+bug/251352
387
310
        """
388
311
        self.make_minimal_branch()
389
312
        out, err = self.run_bzr(['log', '-m', '*'], retcode=3)
390
 
        self.assertContainsRe(err, "ERROR.*Invalid pattern.*nothing to repeat")
391
 
        self.assertNotContainsRe(err, "Unprintable exception")
392
 
        self.assertEqual(out, '')
 
313
        self.assertEqual("bzr: ERROR: Invalid regular expression"
 
314
            " in log message filter"
 
315
            ": '*'"
 
316
            ": nothing to repeat\n", err)
 
317
        self.assertEqual('', out)
393
318
 
394
319
    def test_log_unsupported_timezone(self):
395
320
        self.make_linear_branch()
397
322
                            'options are "utc", "original", "local".'],
398
323
                           ['log', '--timezone', 'foo'])
399
324
 
400
 
    def test_log_exclude_ancestry_no_range(self):
401
 
        self.make_linear_branch()
402
 
        self.run_bzr_error(['bzr: ERROR: --exclude-common-ancestry'
403
 
                            ' requires -r with two revisions'],
404
 
                           ['log', '--exclude-common-ancestry'])
405
 
 
406
 
    def test_log_exclude_ancestry_single_revision(self):
407
 
        self.make_merged_branch()
408
 
        self.run_bzr_error(['bzr: ERROR: --exclude-common-ancestry'
409
 
                            ' requires two different revisions'],
410
 
                           ['log', '--exclude-common-ancestry',
411
 
                            '-r1.1.1..1.1.1'])
412
325
 
413
326
class TestLogTags(TestLog):
414
327
 
443
356
        self.assertContainsRe(log, r'tags: tag1')
444
357
 
445
358
 
446
 
class TestLogSignatures(TestLog):
447
 
 
448
 
    def test_log_with_signatures(self):
449
 
        self.requireFeature(features.gpgme)
450
 
 
451
 
        tree = self.make_linear_branch(format='dirstate-tags')
452
 
 
453
 
        log = self.run_bzr("log --signatures")[0]
454
 
        self.assertTrue('signature: no signature' in log)
455
 
 
456
 
    def test_log_without_signatures(self):
457
 
        self.requireFeature(features.gpgme)
458
 
 
459
 
        tree = self.make_linear_branch(format='dirstate-tags')
460
 
 
461
 
        log = self.run_bzr("log")[0]
462
 
        self.assertFalse('signature: no signature' in log)
463
 
 
464
 
 
465
359
class TestLogVerbose(TestLog):
466
360
 
467
361
    def setUp(self):
483
377
    def test_log_short_verbose(self):
484
378
        self.assertUseShortDeltaFormat(['log', '--short', '-v'])
485
379
 
486
 
    def test_log_s_verbose(self):
487
 
        self.assertUseShortDeltaFormat(['log', '-S', '-v'])
488
 
 
489
380
    def test_log_short_verbose_verbose(self):
490
381
        self.assertUseLongDeltaFormat(['log', '--short', '-vv'])
491
382
 
720
611
 
721
612
    def setUp(self):
722
613
        super(TestLogEncodings, self).setUp()
723
 
        self.overrideAttr(osutils, '_cached_user_encoding')
 
614
        self.user_encoding = osutils._cached_user_encoding
 
615
        def restore():
 
616
            osutils._cached_user_encoding = self.user_encoding
 
617
        self.addCleanup(restore)
724
618
 
725
619
    def create_branch(self):
726
620
        bzr = self.run_bzr
947
841
        self.prepare_tree()
948
842
        os.chdir("dir1")
949
843
        self.assertLogRevnos(['dir2', 'file5'], ['5', '3'])
950
 
 
951
 
 
952
 
class MainlineGhostTests(TestLogWithLogCatcher):
953
 
 
954
 
    def setUp(self):
955
 
        super(MainlineGhostTests, self).setUp()
956
 
        tree = self.make_branch_and_tree('')
957
 
        tree.set_parent_ids(["spooky"], allow_leftmost_as_ghost=True)
958
 
        tree.add('')
959
 
        tree.commit('msg1', rev_id='rev1')
960
 
        tree.commit('msg2', rev_id='rev2')
961
 
 
962
 
    def test_log_range(self):
963
 
        self.assertLogRevnos(["-r1..2"], ["2", "1"])
964
 
 
965
 
    def test_log_norange(self):
966
 
        self.assertLogRevnos([], ["2", "1"])
967
 
 
968
 
    def test_log_range_open_begin(self):
969
 
        self.knownFailure("log with ghosts fails. bug #726466")
970
 
        (stdout, stderr) = self.run_bzr(['log', '-r..2'], retcode=3)
971
 
        self.assertEqual(["2", "1"],
972
 
                         [r.revno for r in self.get_captured_revisions()])
973
 
        self.assertEquals("bzr: ERROR: Further revision history missing.", stderr)
974
 
 
975
 
    def test_log_range_open_end(self):
976
 
        self.assertLogRevnos(["-r1.."], ["2", "1"])
977
 
 
978
 
class TestLogMatch(TestLogWithLogCatcher):
979
 
    def prepare_tree(self):
980
 
        tree = self.make_branch_and_tree('')
981
 
        self.build_tree(
982
 
            ['/hello.txt', '/goodbye.txt'])
983
 
        tree.add('hello.txt')
984
 
        tree.commit(message='message1', committer='committer1', authors=['author1'])
985
 
        tree.add('goodbye.txt')
986
 
        tree.commit(message='message2', committer='committer2', authors=['author2'])
987
 
    
988
 
    def test_message(self):
989
 
        self.prepare_tree()
990
 
        self.assertLogRevnos(["-m", "message1"], ["1"])
991
 
        self.assertLogRevnos(["-m", "message2"], ["2"])
992
 
        self.assertLogRevnos(["-m", "message"], ["2", "1"])
993
 
        self.assertLogRevnos(["-m", "message1", "-m", "message2"], ["2", "1"])
994
 
        self.assertLogRevnos(["--match-message", "message1"], ["1"])
995
 
        self.assertLogRevnos(["--match-message", "message2"], ["2"])
996
 
        self.assertLogRevnos(["--match-message", "message"], ["2", "1"])
997
 
        self.assertLogRevnos(["--match-message", "message1", 
998
 
                              "--match-message", "message2"], ["2", "1"])
999
 
        self.assertLogRevnos(["--message", "message1"], ["1"])
1000
 
        self.assertLogRevnos(["--message", "message2"], ["2"])
1001
 
        self.assertLogRevnos(["--message", "message"], ["2", "1"])
1002
 
        self.assertLogRevnos(["--match-message", "message1", 
1003
 
                              "--message", "message2"], ["2", "1"])
1004
 
        self.assertLogRevnos(["--message", "message1", 
1005
 
                              "--match-message", "message2"], ["2", "1"])
1006
 
 
1007
 
    def test_committer(self):
1008
 
        self.prepare_tree()
1009
 
        self.assertLogRevnos(["-m", "committer1"], ["1"])
1010
 
        self.assertLogRevnos(["-m", "committer2"], ["2"])
1011
 
        self.assertLogRevnos(["-m", "committer"], ["2", "1"])
1012
 
        self.assertLogRevnos(["-m", "committer1", "-m", "committer2"], 
1013
 
                             ["2", "1"])
1014
 
        self.assertLogRevnos(["--match-committer", "committer1"], ["1"])
1015
 
        self.assertLogRevnos(["--match-committer", "committer2"], ["2"])
1016
 
        self.assertLogRevnos(["--match-committer", "committer"], ["2", "1"])
1017
 
        self.assertLogRevnos(["--match-committer", "committer1", 
1018
 
                              "--match-committer", "committer2"], ["2", "1"])
1019
 
 
1020
 
    def test_author(self):
1021
 
        self.prepare_tree()
1022
 
        self.assertLogRevnos(["-m", "author1"], ["1"])
1023
 
        self.assertLogRevnos(["-m", "author2"], ["2"])
1024
 
        self.assertLogRevnos(["-m", "author"], ["2", "1"])
1025
 
        self.assertLogRevnos(["-m", "author1", "-m", "author2"], 
1026
 
                             ["2", "1"])
1027
 
        self.assertLogRevnos(["--match-author", "author1"], ["1"])
1028
 
        self.assertLogRevnos(["--match-author", "author2"], ["2"])
1029
 
        self.assertLogRevnos(["--match-author", "author"], ["2", "1"])
1030
 
        self.assertLogRevnos(["--match-author", "author1", 
1031
 
                              "--match-author", "author2"], ["2", "1"])