27
27
from errors import BzrError
30
class RevisionReference:
32
Reference to a stored revision.
34
Includes the revision_id and revision_sha1.
38
def __init__(self, revision_id, revision_sha1):
39
if revision_id == None \
40
or isinstance(revision_id, basestring):
41
self.revision_id = revision_id
43
raise ValueError('bad revision_id %r' % revision_id)
45
if revision_sha1 != None:
46
if isinstance(revision_sha1, basestring) \
47
and len(revision_sha1) == 40:
48
self.revision_sha1 = revision_sha1
50
raise ValueError('bad revision_sha1 %r' % revision_sha1)
54
30
class Revision(XMLMixin):
55
31
"""Single revision on a branch.
58
34
written out. This is not stored because you cannot write the hash
59
35
into the file it describes.
61
After bzr 0.0.5 revisions are allowed to have multiple parents.
62
To support old clients this is written out in a slightly redundant
63
form: the first parent as the predecessor. This will eventually
67
List of parent revisions, each is a RevisionReference.
37
TODO: Perhaps make predecessor be a child element, not an attribute?
77
39
def __init__(self, **args):
40
self.inventory_id = None
41
self.revision_id = None
78
47
self.__dict__.update(args)
81
def _get_precursor(self):
82
##from warnings import warn
83
##warn("Revision.precursor is deprecated")
85
return self.parents[0].revision_id
90
def _get_precursor_sha1(self):
91
##from warnings import warn
92
##warn("Revision.precursor_sha1 is deprecated")
94
return self.parents[0].revision_sha1
100
raise Exception("can't assign to precursor anymore")
103
precursor = property(_get_precursor, _fail, _fail)
104
precursor_sha1 = property(_get_precursor_sha1, _fail, _fail)
108
50
def __repr__(self):
115
57
timestamp = '%.9f' % self.timestamp,
116
58
revision_id = self.revision_id,
117
59
inventory_id = self.inventory_id,
118
inventory_sha1 = self.inventory_sha1,
121
root.set('timezone', str(self.timezone))
60
timezone = str(self.timezone))
122
61
if self.precursor:
123
62
root.set('precursor', self.precursor)
124
if self.precursor_sha1:
125
root.set('precursor_sha1', self.precursor_sha1)
128
65
msg = SubElement(root, 'message')
129
66
msg.text = self.message
133
pelts = SubElement(root, 'parents')
134
pelts.tail = pelts.text = '\n'
135
for rr in self.parents:
136
assert isinstance(rr, RevisionReference)
137
p = SubElement(pelts, 'revision_ref')
139
p.set('revision_id', rr.revision_id)
141
p.set('revision_sha1', rr.revision_sha1)
146
72
def from_element(cls, elt):
147
return unpack_revision(elt)
73
# <changeset> is deprecated...
74
if elt.tag not in ('revision', 'changeset'):
75
raise BzrError("unexpected tag in revision file: %r" % elt)
77
cs = cls(committer = elt.get('committer'),
78
timestamp = float(elt.get('timestamp')),
79
precursor = elt.get('precursor'),
80
revision_id = elt.get('revision_id'),
81
inventory_id = elt.get('inventory_id'))
83
v = elt.get('timezone')
84
cs.timezone = v and int(v)
86
cs.message = elt.findtext('message') # text of <message>
149
89
from_element = classmethod(from_element)
153
def unpack_revision(elt):
154
"""Convert XML element into Revision object."""
155
# <changeset> is deprecated...
156
if elt.tag not in ('revision', 'changeset'):
157
raise BzrError("unexpected tag in revision file: %r" % elt)
159
rev = Revision(committer = elt.get('committer'),
160
timestamp = float(elt.get('timestamp')),
161
revision_id = elt.get('revision_id'),
162
inventory_id = elt.get('inventory_id'),
163
inventory_sha1 = elt.get('inventory_sha1')
166
precursor = elt.get('precursor')
167
precursor_sha1 = elt.get('precursor_sha1')
169
pelts = elt.find('parents')
172
# revisions written prior to 0.0.5 have a single precursor
173
# give as an attribute
174
rev_ref = RevisionReference(precursor, precursor_sha1)
175
rev.parents.append(rev_ref)
178
assert p.tag == 'revision_ref', \
179
"bad parent node tag %r" % p.tag
180
rev_ref = RevisionReference(p.get('revision_id'),
181
p.get('revision_sha1'))
182
rev.parents.append(rev_ref)
184
v = elt.get('timezone')
185
rev.timezone = v and int(v)
187
rev.message = elt.findtext('message') # text of <message>