/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 bzrlib/tests/test_revisionnamespaces.py

  • Committer: Martin Pool
  • Date: 2007-10-03 08:06:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2901.
  • Revision ID: mbp@sourcefrog.net-20071003080644-oivy0gkg98sex0ed
Avoid internal error tracebacks on failure to lock on readonly transport (#129701).

Add new LockFailed, which doesn't imply that we failed to get it because of
contention.  Raise this if we fail to create the pending or lock directories
because of Transport errors.

UnlockableTransport is not an internal error.

ReadOnlyLockError has a message which didn't match its name or usage; it's now
deprecated and callers are updated to use LockFailed which is more appropriate.

Add zero_ninetytwo deprecation symbol.

Unify assertMatchesRe with TestCase.assertContainsRe.

When the constructor is deprecated, just say that the class is deprecated, not
the __init__ method - this works better with applyDeprecated in tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2004, 2005, 2006, 2007 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
import datetime
18
18
import os
23
23
    bzrdir,
24
24
    errors,
25
25
    repository,
26
 
    revision as _mod_revision,
27
26
    )
28
27
from bzrlib.tests import TestCase, TestCaseWithTransport
29
28
from bzrlib.revisionspec import (
50
49
 
51
50
        self.tree = self.make_branch_and_tree('tree')
52
51
        self.build_tree(['tree/a'])
53
 
        self.tree.lock_write()
54
 
        self.addCleanup(self.tree.unlock)
55
52
        self.tree.add(['a'])
56
53
        self.tree.commit('a', rev_id='r1')
57
54
 
58
55
        self.tree2 = self.tree.bzrdir.sprout('tree2').open_workingtree()
59
56
        self.tree2.commit('alt', rev_id='alt_r2')
60
57
 
61
 
        self.tree.merge_from_branch(self.tree2.branch)
 
58
        self.tree.branch.repository.fetch(self.tree2.branch.repository,
 
59
                                          revision_id='alt_r2')
 
60
        self.tree.set_pending_merges(['alt_r2'])
62
61
        self.tree.commit('second', rev_id='r2')
63
62
 
64
63
    def get_in_history(self, revision_spec):
74
73
                         ' %r != %r'
75
74
                         % (revision_spec, exp_revision_id, rev_info.rev_id))
76
75
 
77
 
    def assertInvalid(self, revision_spec, extra='',
78
 
                      invalid_as_revision_id=True):
 
76
    def assertInvalid(self, revision_spec, extra=''):
79
77
        try:
80
78
            self.get_in_history(revision_spec)
81
79
        except errors.InvalidRevisionSpec, e:
82
80
            self.assertEqual(revision_spec, e.spec)
83
81
            self.assertEqual(extra, e.extra)
84
82
        else:
85
 
            self.fail('Expected InvalidRevisionSpec to be raised for'
86
 
                      ' %r.in_history' % (revision_spec,))
87
 
        if invalid_as_revision_id:
88
 
            try:
89
 
                spec = RevisionSpec.from_string(revision_spec)
90
 
                spec.as_revision_id(self.tree.branch)
91
 
            except errors.InvalidRevisionSpec, e:
92
 
                self.assertEqual(revision_spec, e.spec)
93
 
                self.assertEqual(extra, e.extra)
94
 
            else:
95
 
                self.fail('Expected InvalidRevisionSpec to be raised for'
96
 
                          ' %r.as_revision_id' % (revision_spec,))
97
 
 
98
 
    def assertAsRevisionId(self, revision_id, revision_spec):
99
 
        """Calling as_revision_id() should return the specified id."""
100
 
        spec = RevisionSpec.from_string(revision_spec)
101
 
        self.assertEqual(revision_id,
102
 
                         spec.as_revision_id(self.tree.branch))
103
 
 
104
 
    def get_as_tree(self, revision_spec, tree=None):
105
 
        if tree is None:
106
 
            tree = self.tree
107
 
        spec = RevisionSpec.from_string(revision_spec)
108
 
        return spec.as_tree(tree.branch)
109
 
 
110
 
 
111
 
class RevisionSpecMatchOnTrap(RevisionSpec):
112
 
 
113
 
    def _match_on(self, branch, revs):
114
 
        self.last_call = (branch, revs)
115
 
        return super(RevisionSpecMatchOnTrap, self)._match_on(branch, revs)
116
 
 
117
 
 
118
 
class TestRevisionSpecBase(TestRevisionSpec):
119
 
 
120
 
    def test_wants_revision_history(self):
121
 
        # If wants_revision_history = True, then _match_on should get the
122
 
        # branch revision history
123
 
        spec = RevisionSpecMatchOnTrap('foo', _internal=True)
124
 
        spec.in_history(self.tree.branch)
125
 
 
126
 
        self.assertEqual((self.tree.branch, ['r1' ,'r2']),
127
 
                         spec.last_call)
128
 
 
129
 
    def test_wants_no_revision_history(self):
130
 
        # If wants_revision_history = False, then _match_on should get None for
131
 
        # the branch revision history
132
 
        spec = RevisionSpecMatchOnTrap('foo', _internal=True)
133
 
        spec.wants_revision_history = False
134
 
        spec.in_history(self.tree.branch)
135
 
 
136
 
        self.assertEqual((self.tree.branch, None), spec.last_call)
137
 
 
 
83
            self.fail('Expected InvalidRevisionSpec to be raised for %s'
 
84
                      % (revision_spec,))
138
85
 
139
86
 
140
87
class TestOddRevisionSpec(TestRevisionSpec):
141
88
    """Test things that aren't normally thought of as revision specs"""
142
89
 
143
90
    def test_none(self):
144
 
        self.assertInHistoryIs(None, None, None)
 
91
        self.assertInHistoryIs(0, None, None)
145
92
 
146
93
    def test_object(self):
147
94
        self.assertRaises(TypeError, RevisionSpec.from_string, object())
148
95
 
149
 
 
150
 
class TestRevisionSpec_dwim(TestRevisionSpec):
151
 
 
152
 
    # Don't need to test revno's explicitly since TRS_revno already
153
 
    # covers that well for us
154
 
    def test_dwim_spec_revno(self):
155
 
        self.assertInHistoryIs(2, 'r2', '2')
156
 
        self.assertAsRevisionId('alt_r2', '1.1.1')
157
 
 
158
 
    def test_dwim_spec_revid(self):
159
 
        self.assertInHistoryIs(2, 'r2', 'r2')
160
 
 
161
 
    def test_dwim_spec_tag(self):
162
 
        self.tree.branch.tags.set_tag('footag', 'r1')
163
 
        self.assertAsRevisionId('r1', 'footag')
164
 
        self.tree.branch.tags.delete_tag('footag')
165
 
        self.assertRaises(errors.InvalidRevisionSpec,
166
 
                          self.get_in_history, 'footag')
167
 
 
168
 
    def test_dwim_spec_tag_that_looks_like_revno(self):
169
 
        # Test that we slip past revno with things that look like revnos,
170
 
        # but aren't.  Tags are convenient for testing this since we can
171
 
        # make them look however we want.
172
 
        self.tree.branch.tags.set_tag('3', 'r2')
173
 
        self.assertAsRevisionId('r2', '3')
174
 
        self.build_tree(['tree/b'])
175
 
        self.tree.add(['b'])
176
 
        self.tree.commit('b', rev_id='r3')
177
 
        self.assertAsRevisionId('r3', '3')
178
 
 
179
 
    def test_dwim_spec_date(self):
180
 
        self.assertAsRevisionId('r1', 'today')
181
 
 
182
 
    def test_dwim_spec_branch(self):
183
 
        self.assertInHistoryIs(None, 'alt_r2', 'tree2')
184
 
 
185
 
    def test_dwim_spec_nonexistent(self):
186
 
        self.assertInvalid('somethingrandom', invalid_as_revision_id=False)
187
 
        self.assertInvalid('-1.1', invalid_as_revision_id=False)
188
 
        self.assertInvalid('.1', invalid_as_revision_id=False)
189
 
        self.assertInvalid('1..1', invalid_as_revision_id=False)
190
 
        self.assertInvalid('1.2..1', invalid_as_revision_id=False)
191
 
        self.assertInvalid('1.', invalid_as_revision_id=False)
 
96
    def test_unregistered_spec(self):
 
97
        self.assertRaises(errors.NoSuchRevisionSpec,
 
98
                          RevisionSpec.from_string, 'foo')
 
99
        self.assertRaises(errors.NoSuchRevisionSpec,
 
100
                          RevisionSpec.from_string, '123a')
 
101
 
 
102
 
 
103
 
 
104
class TestRevnoFromString(TestCase):
 
105
 
 
106
    def test_from_string_dotted_decimal(self):
 
107
        self.assertRaises(errors.NoSuchRevisionSpec, RevisionSpec.from_string, '-1.1')
 
108
        self.assertRaises(errors.NoSuchRevisionSpec, RevisionSpec.from_string, '.1')
 
109
        self.assertRaises(errors.NoSuchRevisionSpec, RevisionSpec.from_string, '1..1')
 
110
        self.assertRaises(errors.NoSuchRevisionSpec, RevisionSpec.from_string, '1.2..1')
 
111
        self.assertRaises(errors.NoSuchRevisionSpec, RevisionSpec.from_string, '1.')
 
112
        self.assertIsInstance(RevisionSpec.from_string('1.1'), RevisionSpec_revno)
 
113
        self.assertIsInstance(RevisionSpec.from_string('1.1.3'), RevisionSpec_revno)
192
114
 
193
115
 
194
116
class TestRevisionSpec_revno(TestRevisionSpec):
201
123
 
202
124
    def test_dotted_decimal(self):
203
125
        self.assertInHistoryIs(None, 'alt_r2', '1.1.1')
204
 
        self.assertInvalid('1.1.123')
205
126
 
206
127
    def test_negative_int(self):
207
128
        self.assertInHistoryIs(2, 'r2', '-1')
301
222
        """Old revno:N:path tests"""
302
223
        wta = self.make_branch_and_tree('a')
303
224
        ba = wta.branch
304
 
 
 
225
        
305
226
        wta.commit('Commit one', rev_id='a@r-0-1')
306
227
        wta.commit('Commit two', rev_id='a@r-0-2')
307
228
        wta.commit('Commit three', rev_id='a@r-0-3')
325
246
        self.assertEqual((2, 'b@r-0-2'),
326
247
                         spec_in_history('revno:2:b/', None))
327
248
 
328
 
    def test_as_revision_id(self):
329
 
        self.assertAsRevisionId('null:', '0')
330
 
        self.assertAsRevisionId('r1', '1')
331
 
        self.assertAsRevisionId('r2', '2')
332
 
        self.assertAsRevisionId('r1', '-2')
333
 
        self.assertAsRevisionId('r2', '-1')
334
 
        self.assertAsRevisionId('alt_r2', '1.1.1')
335
 
 
336
 
    def test_as_tree(self):
337
 
        tree = self.get_as_tree('0')
338
 
        self.assertEquals(_mod_revision.NULL_REVISION, tree.get_revision_id())
339
 
        tree = self.get_as_tree('1')
340
 
        self.assertEquals('r1', tree.get_revision_id())
341
 
        tree = self.get_as_tree('2')
342
 
        self.assertEquals('r2', tree.get_revision_id())
343
 
        tree = self.get_as_tree('-2')
344
 
        self.assertEquals('r1', tree.get_revision_id())
345
 
        tree = self.get_as_tree('-1')
346
 
        self.assertEquals('r2', tree.get_revision_id())
347
 
        tree = self.get_as_tree('1.1.1')
348
 
        self.assertEquals('alt_r2', tree.get_revision_id())
349
249
 
350
250
 
351
251
class TestRevisionSpec_revid(TestRevisionSpec):
352
 
 
 
252
    
353
253
    def test_in_history(self):
354
254
        # We should be able to access revisions that are directly
355
255
        # in the history.
356
256
        self.assertInHistoryIs(1, 'r1', 'revid:r1')
357
257
        self.assertInHistoryIs(2, 'r2', 'revid:r2')
358
 
 
 
258
        
359
259
    def test_missing(self):
360
 
        self.assertInvalid('revid:r3', invalid_as_revision_id=False)
 
260
        self.assertInvalid('revid:r3')
361
261
 
362
262
    def test_merged(self):
363
263
        """We can reach revisions in the ancestry"""
366
266
    def test_not_here(self):
367
267
        self.tree2.commit('alt third', rev_id='alt_r3')
368
268
        # It exists in tree2, but not in tree
369
 
        self.assertInvalid('revid:alt_r3', invalid_as_revision_id=False)
 
269
        self.assertInvalid('revid:alt_r3')
370
270
 
371
271
    def test_in_repository(self):
372
272
        """We can get any revision id in the repository"""
383
283
        self.assertInHistoryIs(3, revision_id, u'revid:\N{SNOWMAN}')
384
284
        self.assertInHistoryIs(3, revision_id, 'revid:' + revision_id)
385
285
 
386
 
    def test_as_revision_id(self):
387
 
        self.assertAsRevisionId('r1', 'revid:r1')
388
 
        self.assertAsRevisionId('r2', 'revid:r2')
389
 
        self.assertAsRevisionId('alt_r2', 'revid:alt_r2')
390
 
 
391
286
 
392
287
class TestRevisionSpec_last(TestRevisionSpec):
393
288
 
419
314
            pass
420
315
        self.assertInvalid('last:Y', extra='\n' + str(e))
421
316
 
422
 
    def test_as_revision_id(self):
423
 
        self.assertAsRevisionId('r2', 'last:1')
424
 
        self.assertAsRevisionId('r1', 'last:2')
425
 
 
426
317
 
427
318
class TestRevisionSpec_before(TestRevisionSpec):
428
319
 
454
345
                                          revision_id='new_r1')
455
346
        self.assertInHistoryIs(0, 'null:', 'before:revid:new_r1')
456
347
 
457
 
    def test_as_revision_id(self):
458
 
        self.assertAsRevisionId('r1', 'before:revid:r2')
459
 
        self.assertAsRevisionId('r1', 'before:2')
460
 
        self.assertAsRevisionId('r1', 'before:1.1.1')
461
 
        self.assertAsRevisionId('r1', 'before:revid:alt_r2')
462
 
 
463
348
 
464
349
class TestRevisionSpec_tag(TestRevisionSpec):
465
 
 
 
350
    
466
351
    def make_branch_and_tree(self, relpath):
467
352
        # override format as the default one may not support tags
468
 
        return TestRevisionSpec.make_branch_and_tree(
469
 
            self, relpath, format='dirstate-tags')
 
353
        control = bzrdir.BzrDir.create(relpath)
 
354
        control.create_repository()
 
355
        branch.BzrBranchExperimental.initialize(control)
 
356
        return control.create_workingtree()
470
357
 
471
358
    def test_from_string_tag(self):
472
359
        spec = RevisionSpec.from_string('tag:bzr-0.14')
476
363
    def test_lookup_tag(self):
477
364
        self.tree.branch.tags.set_tag('bzr-0.14', 'r1')
478
365
        self.assertInHistoryIs(1, 'r1', 'tag:bzr-0.14')
479
 
        self.tree.branch.tags.set_tag('null_rev', 'null:')
480
 
        self.assertInHistoryIs(0, 'null:', 'tag:null_rev')
481
366
 
482
367
    def test_failed_lookup(self):
483
368
        # tags that don't exist give a specific message: arguably we should
486
371
            self.get_in_history,
487
372
            'tag:some-random-tag')
488
373
 
489
 
    def test_as_revision_id(self):
490
 
        self.tree.branch.tags.set_tag('my-tag', 'r2')
491
 
        self.tree.branch.tags.set_tag('null_rev', 'null:')
492
 
        self.assertAsRevisionId('r2', 'tag:my-tag')
493
 
        self.assertAsRevisionId('null:', 'tag:null_rev')
494
 
        self.assertAsRevisionId('r1', 'before:tag:my-tag')
495
 
 
496
374
 
497
375
class TestRevisionSpec_date(TestRevisionSpec):
498
376
 
529
407
        self.assertInHistoryIs(2, 'new_r2',
530
408
            'date:%04d-%02d-%02d' % (now.year, now.month, now.day))
531
409
 
532
 
    def test_as_revision_id(self):
533
 
        self.assertAsRevisionId('new_r2', 'date:today')
534
 
 
535
410
 
536
411
class TestRevisionSpec_ancestor(TestRevisionSpec):
537
 
 
 
412
    
538
413
    def test_non_exact_branch(self):
539
414
        # It seems better to require an exact path to the branch
540
415
        # Branch.open() rather than using Branch.open_containing()
570
445
        self.assertRaises(errors.NoCommits,
571
446
                          spec_in_history, 'ancestor:new_tree',
572
447
                                           self.tree.branch)
573
 
 
 
448
                        
574
449
        self.assertRaises(errors.NoCommits,
575
450
                          spec_in_history, 'ancestor:tree',
576
451
                                           new_tree.branch)
577
452
 
578
 
    def test_as_revision_id(self):
579
 
        self.assertAsRevisionId('alt_r2', 'ancestor:tree2')
580
 
 
581
 
    def test_default(self):
582
 
        # We don't have a parent to default to
583
 
        self.assertRaises(errors.NotBranchError, self.get_in_history,
584
 
                          'ancestor:')
585
 
 
586
 
        # Create a branch with a parent to default to
587
 
        tree3 = self.tree.bzrdir.sprout('tree3').open_workingtree()
588
 
        tree3.commit('foo', rev_id='r3')
589
 
        self.tree = tree3
590
 
        self.assertInHistoryIs(2, 'r2', 'ancestor:')
591
 
 
592
453
 
593
454
class TestRevisionSpec_branch(TestRevisionSpec):
594
 
 
 
455
    
595
456
    def test_non_exact_branch(self):
596
457
        # It seems better to require an exact path to the branch
597
458
        # Branch.open() rather than using Branch.open_containing()
622
483
        new_tree = self.make_branch_and_tree('new_tree')
623
484
        self.assertRaises(errors.NoCommits,
624
485
                          self.get_in_history, 'branch:new_tree')
625
 
        self.assertRaises(errors.NoCommits,
626
 
                          self.get_as_tree, 'branch:new_tree')
627
 
 
628
 
    def test_as_revision_id(self):
629
 
        self.assertAsRevisionId('alt_r2', 'branch:tree2')
630
 
 
631
 
    def test_as_tree(self):
632
 
        tree = self.get_as_tree('branch:tree', self.tree2)
633
 
        self.assertEquals('r2', tree.get_revision_id())
634
 
        self.assertFalse(self.tree2.branch.repository.has_revision('r2'))
635
486
 
636
487
 
637
488
class TestRevisionSpec_submit(TestRevisionSpec):
648
499
        # submit branch overrides parent branch
649
500
        self.tree.branch.set_submit_branch('tree2')
650
501
        self.assertInHistoryIs(None, 'alt_r2', 'submit:')
651
 
 
652
 
    def test_as_revision_id(self):
653
 
        self.tree.branch.set_submit_branch('tree2')
654
 
        self.assertAsRevisionId('alt_r2', 'branch:tree2')