~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revisionspec.py

  • Committer: Lalo Martins
  • Date: 2005-09-08 00:40:15 UTC
  • mto: (1185.1.22)
  • mto: This revision was merged to the branch mainline in revision 1390.
  • Revision ID: lalo@exoweb.net-20050908004014-bb63b3378ac8ff58
turned get_revision_info into a RevisionSpec class

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
# This should match a prefix with a function which accepts it
25
25
REVISION_NAMESPACES = {}
26
26
 
27
 
def get_revision_info(branch, spec):
28
 
    """Return (revno, revision id) for revision specifier.
29
 
 
30
 
    spec can be an integer, in which case it is assumed to be revno
31
 
    (though this will translate negative values into positive ones)
32
 
    spec can also be a string, in which case it is parsed for something
33
 
    like 'date:' or 'revid:' etc.
34
 
 
35
 
    A revid is always returned.  If it is None, the specifier referred to
36
 
    the null revision.  If the revid does not occur in the revision
37
 
    history, revno will be None.
 
27
class RevisionSpec(object):
 
28
    """Equivalent to the old get_revision_info().
 
29
    An instance has two useful attributes: revno, and rev_id.
 
30
 
 
31
    They can also be accessed as spec[0] and spec[1] respectively,
 
32
    so that you can write code like:
 
33
    revno, rev_id = RevisionSpec(branch, spec)
 
34
    although this is probably going to be deprecated later.
 
35
 
 
36
    Revision specs are an UI element, and they have been moved out
 
37
    of the branch class to leave "back-end" classes unaware of such
 
38
    details.  Code that gets a revno or rev_id from other code should
 
39
    not be using revision specs - revnos and revision ids are the
 
40
    accepted ways to refer to revisions internally.
38
41
    """
39
 
 
40
 
    if spec is None:
41
 
        return 0, None
42
 
    revno = None
43
 
    try:# Convert to int if possible
44
 
        spec = int(spec)
45
 
    except ValueError:
46
 
        pass
47
 
    revs = branch.revision_history()
48
 
    if isinstance(spec, int):
49
 
        if spec < 0:
50
 
            revno = len(revs) + spec + 1
51
 
        else:
52
 
            revno = spec
53
 
        rev_id = branch.get_rev_id(revno, revs)
54
 
    elif isinstance(spec, basestring):
55
 
        for prefix, func in REVISION_NAMESPACES.iteritems():
56
 
            if spec.startswith(prefix):
57
 
                result = func(branch, revs, spec)
58
 
                if len(result) > 1:
59
 
                    revno, rev_id = result
60
 
                else:
61
 
                    revno = result[0]
62
 
                    rev_id = branch.get_rev_id(revno, revs)
63
 
                break
64
 
        else:
65
 
            raise BzrError('No namespace registered for string: %r' %
66
 
                           spec)
67
 
    else:
68
 
        raise TypeError('Unhandled revision type %s' % spec)
69
 
 
70
 
    if revno is None or rev_id is None:
71
 
        raise NoSuchRevision(branch, spec)
72
 
    return revno, rev_id
 
42
    def __init__(self, branch, spec):
 
43
        """Parse a revision specifier.
 
44
 
 
45
        spec can be an integer, in which case it is assumed to be revno
 
46
        (though this will translate negative values into positive ones)
 
47
        spec can also be a string, in which case it is parsed for something
 
48
        like 'date:' or 'revid:' etc.
 
49
        """
 
50
        self.branch = branch
 
51
 
 
52
        if spec is None:
 
53
            self.revno = 0
 
54
            self.rev_id = None
 
55
            return
 
56
        self.revno = None
 
57
        try:# Convert to int if possible
 
58
            spec = int(spec)
 
59
        except ValueError:
 
60
            pass
 
61
        revs = branch.revision_history()
 
62
        if isinstance(spec, int):
 
63
            if spec < 0:
 
64
                self.revno = len(revs) + spec + 1
 
65
            else:
 
66
                self.revno = spec
 
67
            self.rev_id = branch.get_rev_id(self.revno, revs)
 
68
        elif isinstance(spec, basestring):
 
69
            for prefix, func in REVISION_NAMESPACES.iteritems():
 
70
                if spec.startswith(prefix):
 
71
                    result = func(branch, revs, spec)
 
72
                    if len(result) > 1:
 
73
                        self.revno, self.rev_id = result
 
74
                    else:
 
75
                        self.revno = result[0]
 
76
                        self.rev_id = branch.get_rev_id(self.revno, revs)
 
77
                    break
 
78
            else:
 
79
                raise BzrError('No namespace registered for string: %r' %
 
80
                               spec)
 
81
        else:
 
82
            raise TypeError('Unhandled revision type %s' % spec)
 
83
 
 
84
        if self.revno is None or self.rev_id is None:
 
85
            raise NoSuchRevision(branch, spec)
 
86
 
 
87
    def __len__(self):
 
88
        return 2
 
89
 
 
90
    def __getitem__(self, index):
 
91
        if index == 0: return self.revno
 
92
        if index == 1: return self.rev_id
 
93
        raise IndexError(index)
 
94
 
 
95
    def get(self):
 
96
        return self.branch.get_revision(self.rev_id)
 
97
 
 
98
    def __eq__(self, other):
 
99
        if type(other) not in (tuple, list, type(self)):
 
100
            return False
 
101
        if type(other) is type(self) and self.branch is not other.branch:
 
102
            return False
 
103
        print 'comparing', tuple(self), tuple(other)
 
104
        return tuple(self) == tuple(other)
 
105
 
 
106
    def __repr__(self):
 
107
        return '<bzrlib.revisionspec.RevisionSpec object %s, %s for %r>' % (
 
108
            self.revno, self.rev_id, self.branch)
73
109
 
74
110
 
75
111
# private API