~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml8.py

  • Committer: Aaron Bentley
  • Date: 2008-04-24 04:58:42 UTC
  • mfrom: (3377 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3380.
  • Revision ID: aaron@aaronbentley.com-20080424045842-0cajl9v6s4u52kaw
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
138
138
    _to_escaped_map.clear()
139
139
 
140
140
 
141
 
class Serializer_v5(Serializer):
142
 
    """Version 5 serializer
 
141
class Serializer_v8(Serializer):
 
142
    """This serialiser adds rich roots.
143
143
 
144
 
    Packs objects into XML and vice versa.
 
144
    Its revision format number matches its inventory number.
145
145
    """
146
 
    
 
146
 
147
147
    __slots__ = []
148
148
 
149
 
    root_id = ROOT_ID
 
149
    root_id = None
150
150
    support_altered_by_hack = True
151
151
    # This format supports the altered-by hack that reads file ids directly out
152
152
    # of the versionedfile, without doing XML parsing.
153
153
 
154
154
    supported_kinds = set(['file', 'directory', 'symlink'])
155
 
    format_num = '5'
 
155
    format_num = '8'
 
156
    revision_format_num = None
156
157
 
157
158
    def _check_revisions(self, inv):
158
159
        """Extension point for subclasses to check during serialisation.
159
160
 
160
 
        By default no checking is done.
161
 
 
162
161
        :param inv: An inventory about to be serialised, to be checked.
163
162
        :raises: AssertionError if an error has occured.
164
163
        """
 
164
        assert inv.revision_id is not None
 
165
        assert inv.root.revision is not None
165
166
 
166
167
    def write_inventory_to_lines(self, inv):
167
168
        """Return a list of lines with the encoded inventory."""
273
274
 
274
275
    def _append_inventory_root(self, append, inv):
275
276
        """Append the inventory root to output."""
276
 
        if inv.root.file_id not in (None, ROOT_ID):
277
 
            fileid1 = ' file_id="'
278
 
            fileid2 = _encode_and_escape(inv.root.file_id)
279
 
        else:
280
 
            fileid1 = ""
281
 
            fileid2 = ""
282
277
        if inv.revision_id is not None:
283
278
            revid1 = ' revision_id="'
284
279
            revid2 = _encode_and_escape(inv.revision_id)
285
280
        else:
286
281
            revid1 = ""
287
282
            revid2 = ""
288
 
        append('<inventory%s%s format="5"%s%s>\n' % (
289
 
            fileid1, fileid2, revid1, revid2))
290
 
        
 
283
        append('<inventory format="%s"%s%s>\n' % (
 
284
            self.format_num, revid1, revid2))
 
285
        append('<directory file_id="%s name="%s revision="%s />\n' % (
 
286
            _encode_and_escape(inv.root.file_id),
 
287
            _encode_and_escape(inv.root.name),
 
288
            _encode_and_escape(inv.root.revision)))
 
289
 
291
290
    def _pack_revision(self, rev):
292
291
        """Revision object -> xml tree"""
293
292
        # For the XML format, we need to write them as Unicode rather than as
297
296
        revision_id = rev.revision_id
298
297
        if isinstance(revision_id, str):
299
298
            revision_id = decode_utf8(revision_id)
 
299
        format_num = self.format_num
 
300
        if self.revision_format_num is not None:
 
301
            format_num = self.revision_format_num
300
302
        root = Element('revision',
301
303
                       committer = rev.committer,
302
304
                       timestamp = '%.3f' % rev.timestamp,
303
305
                       revision_id = revision_id,
304
306
                       inventory_sha1 = rev.inventory_sha1,
305
 
                       format='5',
 
307
                       format=format_num,
306
308
                       )
307
309
        if rev.timezone is not None:
308
310
            root.set('timezone', str(rev.timezone))
336
338
            prop_elt.tail = '\n'
337
339
        top_elt.tail = '\n'
338
340
 
339
 
    def _unpack_inventory(self, elt, revision_id):
340
 
        """Construct from XML Element
341
 
        """
342
 
        assert elt.tag == 'inventory'
343
 
        root_id = elt.get('file_id') or ROOT_ID
344
 
        root_id = _get_utf8_or_ascii(root_id)
345
 
 
 
341
    def _unpack_inventory(self, elt, revision_id=None):
 
342
        """Construct from XML Element"""
 
343
        if elt.tag != 'inventory':
 
344
            raise errors.UnexpectedInventoryFormat('Root tag is %r' % elt.tag)
346
345
        format = elt.get('format')
347
 
        if format is not None:
348
 
            if format != '5':
349
 
                raise BzrError("invalid format version %r on inventory"
350
 
                                % format)
351
 
        data_revision_id = elt.get('revision_id')
352
 
        if data_revision_id is not None:
353
 
            revision_id = cache_utf8.encode(data_revision_id)
354
 
        inv = Inventory(root_id, revision_id=revision_id)
 
346
        if format != self.format_num:
 
347
            raise errors.UnexpectedInventoryFormat('Invalid format version %r'
 
348
                                                   % format)
 
349
        revision_id = elt.get('revision_id')
 
350
        if revision_id is not None:
 
351
            revision_id = cache_utf8.encode(revision_id)
 
352
        inv = inventory.Inventory(root_id=None, revision_id=revision_id)
355
353
        for e in elt:
356
354
            ie = self._unpack_entry(e)
357
 
            if ie.parent_id is None:
358
 
                ie.parent_id = root_id
359
355
            inv.add(ie)
360
 
        if revision_id is not None:
361
 
            inv.root.revision = revision_id
 
356
        assert inv.root.revision is not None
362
357
        return inv
363
358
 
364
359
    def _unpack_entry(self, elt):
404
399
        """XML Element -> Revision object"""
405
400
        assert elt.tag == 'revision'
406
401
        format = elt.get('format')
 
402
        format_num = self.format_num
 
403
        if self.revision_format_num is not None:
 
404
            format_num = self.revision_format_num
407
405
        if format is not None:
408
 
            if format != '5':
409
 
                raise BzrError("invalid format version %r on inventory"
 
406
            if format != format_num:
 
407
                raise BzrError("invalid format version %r on revision"
410
408
                                % format)
411
409
        get_cached = _get_utf8_or_ascii
412
410
        rev = Revision(committer = elt.get('committer'),
449
447
            rev.properties[name] = value
450
448
 
451
449
 
452
 
serializer_v5 = Serializer_v5()
 
450
serializer_v8 = Serializer_v8()