~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revisionspec.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-01-28 21:57:12 UTC
  • mfrom: (3966.2.3 bzr.dev)
  • Revision ID: pqm@pqm.ubuntu.com-20090128215712-i4lsbqdybozsp19x
(Jelmer) Use registry for revision specifiers.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
from bzrlib import (
27
27
    errors,
28
28
    osutils,
 
29
    registry,
29
30
    revision,
30
31
    symbol_versioning,
31
32
    trace,
114
115
 
115
116
# classes in this list should have a "prefix" attribute, against which
116
117
# string specs are matched
117
 
SPEC_TYPES = []
118
118
_revno_regex = None
119
119
 
120
120
 
153
153
 
154
154
        if spec is None:
155
155
            return RevisionSpec(None, _internal=True)
156
 
        for spectype in SPEC_TYPES:
157
 
            if spec.startswith(spectype.prefix):
 
156
        match = revspec_registry.get_prefix(spec)
 
157
        if match is not None:
 
158
            spectype, specsuffix = match
 
159
            trace.mutter('Returning RevisionSpec %s for %s',
 
160
                         spectype.__name__, spec)
 
161
            return spectype(spec, _internal=True)
 
162
        else:
 
163
            for spectype in SPEC_TYPES:
158
164
                trace.mutter('Returning RevisionSpec %s for %s',
159
165
                             spectype.__name__, spec)
160
 
                return spectype(spec, _internal=True)
161
 
        else:
 
166
                if spec.startswith(spectype.prefix):
 
167
                    return spectype(spec, _internal=True)
162
168
            # RevisionSpec_revno is special cased, because it is the only
163
169
            # one that directly handles plain integers
164
170
            # TODO: This should not be special cased rather it should be
393
399
# Old compatibility 
394
400
RevisionSpec_int = RevisionSpec_revno
395
401
 
396
 
SPEC_TYPES.append(RevisionSpec_revno)
397
402
 
398
403
 
399
404
class RevisionSpec_revid(RevisionSpec):
421
426
    def _as_revision_id(self, context_branch):
422
427
        return osutils.safe_revision_id(self.spec, warn=False)
423
428
 
424
 
SPEC_TYPES.append(RevisionSpec_revid)
425
429
 
426
430
 
427
431
class RevisionSpec_last(RevisionSpec):
473
477
        revno, revision_id = self._revno_and_revision_id(context_branch, None)
474
478
        return revision_id
475
479
 
476
 
SPEC_TYPES.append(RevisionSpec_last)
477
480
 
478
481
 
479
482
class RevisionSpec_before(RevisionSpec):
548
551
                'No parents for revision.')
549
552
        return parents[0]
550
553
 
551
 
SPEC_TYPES.append(RevisionSpec_before)
552
554
 
553
555
 
554
556
class RevisionSpec_tag(RevisionSpec):
570
572
    def _as_revision_id(self, context_branch):
571
573
        return context_branch.tags.lookup_tag(self.spec)
572
574
 
573
 
SPEC_TYPES.append(RevisionSpec_tag)
574
575
 
575
576
 
576
577
class _RevListToTimestamps(object):
677
678
        else:
678
679
            return RevisionInfo(branch, rev + 1)
679
680
 
680
 
SPEC_TYPES.append(RevisionSpec_date)
681
681
 
682
682
 
683
683
class RevisionSpec_ancestor(RevisionSpec):
745
745
            branch.unlock()
746
746
 
747
747
 
748
 
SPEC_TYPES.append(RevisionSpec_ancestor)
749
748
 
750
749
 
751
750
class RevisionSpec_branch(RevisionSpec):
794
793
            raise errors.NoCommits(other_branch)
795
794
        return other_branch.repository.revision_tree(last_revision)
796
795
 
797
 
SPEC_TYPES.append(RevisionSpec_branch)
798
796
 
799
797
 
800
798
class RevisionSpec_submit(RevisionSpec_ancestor):
839
837
            self._get_submit_location(context_branch))
840
838
 
841
839
 
842
 
SPEC_TYPES.append(RevisionSpec_submit)
 
840
revspec_registry = registry.Registry()
 
841
def _register_revspec(revspec):
 
842
    revspec_registry.register(revspec.prefix, revspec)
 
843
 
 
844
_register_revspec(RevisionSpec_revno)
 
845
_register_revspec(RevisionSpec_revid)
 
846
_register_revspec(RevisionSpec_last)
 
847
_register_revspec(RevisionSpec_before)
 
848
_register_revspec(RevisionSpec_tag)
 
849
_register_revspec(RevisionSpec_date)
 
850
_register_revspec(RevisionSpec_ancestor)
 
851
_register_revspec(RevisionSpec_branch)
 
852
_register_revspec(RevisionSpec_submit)
 
853
 
 
854
SPEC_TYPES = symbol_versioning.deprecated_list(
 
855
    symbol_versioning.deprecated_in((1, 12, 0)), "SPEC_TYPES", [])