~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", stacklevel=2)
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", stacklevel=2)
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))
 
61
        if self.precursor:
 
62
            root.set('precursor', self.precursor)
122
63
        root.text = '\n'
123
64
        
124
65
        msg = SubElement(root, 'message')
125
66
        msg.text = self.message
126
67
        msg.tail = '\n'
127
68
 
128
 
        if self.parents:
129
 
            # first parent stored as precursor for compatability with 0.0.5 and
130
 
            # earlier
131
 
            pr = self.parents[0]
132
 
            assert pr.revision_id
133
 
            root.set('precursor', pr.revision_id)
134
 
            if pr.revision_sha1:
135
 
                root.set('precursor_sha1', pr.revision_sha1)
136
 
                
137
 
        if self.parents:
138
 
            pelts = SubElement(root, 'parents')
139
 
            pelts.tail = pelts.text = '\n'
140
 
            for rr in self.parents:
141
 
                assert isinstance(rr, RevisionReference)
142
 
                p = SubElement(pelts, 'revision_ref')
143
 
                p.tail = '\n'
144
 
                assert rr.revision_id
145
 
                p.set('revision_id', rr.revision_id)
146
 
                if rr.revision_sha1:
147
 
                    p.set('revision_sha1', rr.revision_sha1)
148
 
 
149
69
        return root
150
70
 
151
71
 
152
72
    def from_element(cls, elt):
153
 
        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
154
88
 
155
89
    from_element = classmethod(from_element)
156
90
 
157
 
 
158
 
 
159
 
def unpack_revision(elt):
160
 
    """Convert XML element into Revision object."""
161
 
    # <changeset> is deprecated...
162
 
    if elt.tag not in ('revision', 'changeset'):
163
 
        raise BzrError("unexpected tag in revision file: %r" % elt)
164
 
 
165
 
    rev = Revision(committer = elt.get('committer'),
166
 
                   timestamp = float(elt.get('timestamp')),
167
 
                   revision_id = elt.get('revision_id'),
168
 
                   inventory_id = elt.get('inventory_id'),
169
 
                   inventory_sha1 = elt.get('inventory_sha1')
170
 
                   )
171
 
 
172
 
    precursor = elt.get('precursor')
173
 
    precursor_sha1 = elt.get('precursor_sha1')
174
 
 
175
 
    pelts = elt.find('parents')
176
 
 
177
 
    if precursor:
178
 
        # revisions written prior to 0.0.5 have a single precursor
179
 
        # give as an attribute
180
 
        rev_ref = RevisionReference(precursor, precursor_sha1)
181
 
        rev.parents.append(rev_ref)
182
 
    elif pelts:
183
 
        for p in pelts:
184
 
            assert p.tag == 'revision_ref', \
185
 
                   "bad parent node tag %r" % p.tag
186
 
            rev_ref = RevisionReference(p.get('revision_id'),
187
 
                                        p.get('revision_sha1'))
188
 
            rev.parents.append(rev_ref)
189
 
 
190
 
    v = elt.get('timezone')
191
 
    rev.timezone = v and int(v)
192
 
 
193
 
    rev.message = elt.findtext('message') # text of <message>
194
 
    return rev