~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revision.py

  • Committer: Martin Pool
  • Date: 2005-05-11 06:20:05 UTC
  • Revision ID: mbp@sourcefrog.net-20050511062005-297af3451635dae0
- Don't lose first line of command help!

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
from errors import BzrError
28
28
 
29
29
 
30
 
class RevisionReference:
31
 
    """
32
 
    Reference to a stored revision.
33
 
 
34
 
    Includes the revision_id and revision_sha1.
35
 
    """
36
 
    revision_id = None
37
 
    revision_sha1 = None
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
42
 
        else:
43
 
            raise ValueError('bad revision_id %r' % revision_id)
44
 
 
45
 
        if revision_sha1 != None:
46
 
            if isinstance(revision_sha1, basestring) \
47
 
               and len(revision_sha1) == 40:
48
 
                self.revision_sha1 = revision_sha1
49
 
            else:
50
 
                raise ValueError('bad revision_sha1 %r' % revision_sha1)
51
 
                
52
 
 
53
 
 
54
30
class Revision(XMLMixin):
55
31
    """Single revision on a branch.
56
32
 
58
34
    written out.  This is not stored because you cannot write the hash
59
35
    into the file it describes.
60
36
 
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
64
 
    be dropped.
65
 
 
66
 
    parents
67
 
        List of parent revisions, each is a RevisionReference.
 
37
    TODO: Perhaps make predecessor be a child element, not an attribute?
68
38
    """
69
 
    inventory_id = None
70
 
    inventory_sha1 = None
71
 
    revision_id = None
72
 
    timestamp = None
73
 
    message = None
74
 
    timezone = None
75
 
    committer = None
76
 
    
77
39
    def __init__(self, **args):
 
40
        self.inventory_id = None
 
41
        self.revision_id = None
 
42
        self.timestamp = None
 
43
        self.message = None
 
44
        self.timezone = None
 
45
        self.committer = None
 
46
        self.precursor = None
78
47
        self.__dict__.update(args)
79
 
        self.parents = []
80
 
 
81
 
    def _get_precursor(self):
82
 
        ##from warnings import warn
83
 
        ##warn("Revision.precursor is deprecated")
84
 
        if self.parents:
85
 
            return self.parents[0].revision_id
86
 
        else:
87
 
            return None
88
 
 
89
 
 
90
 
    def _get_precursor_sha1(self):
91
 
        ##from warnings import warn
92
 
        ##warn("Revision.precursor_sha1 is deprecated")
93
 
        if self.parents:
94
 
            return self.parents[0].revision_sha1
95
 
        else:
96
 
            return None    
97
 
 
98
 
 
99
 
    def _fail(self):
100
 
        raise Exception("can't assign to precursor anymore")
101
 
 
102
 
 
103
 
    precursor = property(_get_precursor, _fail, _fail)
104
 
    precursor_sha1 = property(_get_precursor_sha1, _fail, _fail)
105
 
 
106
48
 
107
49
 
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,
119
 
                       )
120
 
        if self.timezone:
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)
126
63
        root.text = '\n'
127
64
        
128
65
        msg = SubElement(root, 'message')
129
66
        msg.text = self.message
130
67
        msg.tail = '\n'
131
68
 
132
 
        if self.parents:
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')
138
 
                p.tail = '\n'
139
 
                p.set('revision_id', rr.revision_id)
140
 
                if rr.revision_sha1:
141
 
                    p.set('revision_sha1', rr.revision_sha1)
142
 
 
143
69
        return root
144
70
 
145
71
 
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)
 
76
 
 
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'))
 
82
 
 
83
        v = elt.get('timezone')
 
84
        cs.timezone = v and int(v)
 
85
 
 
86
        cs.message = elt.findtext('message') # text of <message>
 
87
        return cs
148
88
 
149
89
    from_element = classmethod(from_element)
150
90
 
151
 
 
152
 
 
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)
158
 
 
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')
164
 
                   )
165
 
 
166
 
    precursor = elt.get('precursor')
167
 
    precursor_sha1 = elt.get('precursor_sha1')
168
 
 
169
 
    pelts = elt.find('parents')
170
 
 
171
 
    if precursor:
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)
176
 
    elif pelts:
177
 
        for p in pelts:
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)
183
 
 
184
 
    v = elt.get('timezone')
185
 
    rev.timezone = v and int(v)
186
 
 
187
 
    rev.message = elt.findtext('message') # text of <message>
188
 
    return rev