~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml.py

  • Committer: Martin Pool
  • Date: 2005-09-07 04:00:21 UTC
  • Revision ID: mbp@sourcefrog.net-20050907040020-2c7a5e0176888d95
- BROKEN: partial support for commit into weave

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#! /usr/bin/env python
2
 
# -*- coding: UTF-8 -*-
3
2
 
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
128
127
            parent_id = ROOT_ID
129
128
 
130
129
        ie = InventoryEntry(elt.get('file_id'),
131
 
                              elt.get('name'),
132
 
                              elt.get('kind'),
133
 
                              parent_id)
 
130
                            elt.get('name'),
 
131
                            elt.get('kind'),
 
132
                            parent_id)
134
133
        ie.text_id = elt.get('text_id')
135
134
        ie.text_sha1 = elt.get('text_sha1')
136
135
 
219
218
 
220
219
 
221
220
 
222
 
class _Serializer_v5(Serializer):
223
 
    """Version 5 serializer
224
 
 
225
 
    Packs objects into XML and vice versa.
226
 
 
227
 
    You should use the serialzer_v5 singleton."""
228
 
    
229
 
    __slots__ = []
230
 
    
231
 
    def _pack_inventory(self, inv):
232
 
        """Convert to XML Element"""
233
 
        e = Element('inventory')
234
 
        e.text = '\n'
235
 
        if inv.root.file_id not in (None, ROOT_ID):
236
 
            e.set('file_id', inv.root.file_id)
237
 
        for path, ie in inv.iter_entries():
238
 
            e.append(self._pack_entry(ie))
239
 
        return e
240
 
 
241
 
 
242
 
    def _pack_entry(self, ie):
243
 
        """Convert InventoryEntry to XML element"""
244
 
        assert ie.kind == 'directory' or ie.kind == 'file'
245
 
        e = Element(ie.kind)
246
 
        e.set('name', ie.name)
247
 
        e.set('file_id', ie.file_id)
248
 
 
249
 
        if ie.text_size != None:
250
 
            e.set('text_size', '%d' % ie.text_size)
251
 
 
252
 
        for f in ['text_version', 'text_sha1', 'entry_version']:
253
 
            v = getattr(ie, f)
254
 
            if v != None:
255
 
                e.set(f, v)
256
 
 
257
 
        # to be conservative, we don't externalize the root pointers
258
 
        # for now, leaving them as null in the xml form.  in a future
259
 
        # version it will be implied by nested elements.
260
 
        if ie.parent_id != ROOT_ID:
261
 
            assert isinstance(ie.parent_id, basestring)
262
 
            e.set('parent_id', ie.parent_id)
263
 
 
264
 
        e.tail = '\n'
265
 
 
266
 
        return e
267
 
 
268
 
 
269
 
    def _pack_revision(self, rev):
270
 
        """Revision object -> xml tree"""
271
 
        root = Element('revision',
272
 
                       committer = rev.committer,
273
 
                       timestamp = '%.9f' % rev.timestamp,
274
 
                       revision_id = rev.revision_id,
275
 
                       inventory_id = rev.inventory_id,
276
 
                       inventory_sha1 = rev.inventory_sha1,
277
 
                       )
278
 
        if rev.timezone:
279
 
            root.set('timezone', str(rev.timezone))
280
 
        root.text = '\n'
281
 
 
282
 
        msg = SubElement(root, 'message')
283
 
        msg.text = rev.message
284
 
        msg.tail = '\n'
285
 
 
286
 
        if rev.parents:
287
 
            pelts = SubElement(root, 'parents')
288
 
            pelts.tail = pelts.text = '\n'
289
 
            for rr in rev.parents:
290
 
                assert isinstance(rr, RevisionReference)
291
 
                p = SubElement(pelts, 'revision_ref')
292
 
                p.tail = '\n'
293
 
                assert rr.revision_id
294
 
                p.set('revision_id', rr.revision_id)
295
 
 
296
 
        return root
297
 
 
298
 
    
299
 
 
300
 
    def _unpack_inventory(self, elt):
301
 
        """Construct from XML Element
302
 
        """
303
 
        assert elt.tag == 'inventory'
304
 
        root_id = elt.get('file_id') or ROOT_ID
305
 
        inv = Inventory(root_id)
306
 
        for e in elt:
307
 
            ie = self._unpack_entry(e)
308
 
            if ie.parent_id == ROOT_ID:
309
 
                ie.parent_id = root_id
310
 
            inv.add(ie)
311
 
        return inv
312
 
 
313
 
 
314
 
    def _unpack_entry(self, elt):
315
 
        kind = elt.tag
316
 
        assert kind == 'directory' or kind == 'file'
317
 
 
318
 
        parent_id = elt.get('parent_id')
319
 
        if parent_id == None:
320
 
            parent_id = ROOT_ID
321
 
 
322
 
        ie = InventoryEntry(elt.get('file_id'),
323
 
                            elt.get('name'),
324
 
                            kind,
325
 
                            parent_id)
326
 
        ie.text_version = elt.get('text_version')
327
 
        ie.entry_version = elt.get('entry_version')
328
 
        ie.text_sha1 = elt.get('text_sha1')
329
 
        v = elt.get('text_size')
330
 
        ie.text_size = v and int(v)
331
 
 
332
 
        return ie
333
 
 
334
 
 
335
 
    def _unpack_revision(self, elt):
336
 
        """XML Element -> Revision object"""
337
 
        assert elt.tag == 'revision'
338
 
        
339
 
        rev = Revision(committer = elt.get('committer'),
340
 
                       timestamp = float(elt.get('timestamp')),
341
 
                       revision_id = elt.get('revision_id'),
342
 
                       inventory_id = elt.get('inventory_id'),
343
 
                       inventory_sha1 = elt.get('inventory_sha1')
344
 
                       )
345
 
 
346
 
        for p in elt.find('parents'):
347
 
            assert p.tag == 'revision_ref', \
348
 
                   "bad parent node tag %r" % p.tag
349
 
            rev_ref = RevisionReference(p.get('revision_id'))
350
 
            rev.parents.append(rev_ref)
351
 
 
352
 
        v = elt.get('timezone')
353
 
        rev.timezone = v and int(v)
354
 
 
355
 
        rev.message = elt.findtext('message') # text of <message>
356
 
        return rev
357
 
 
358
 
 
359
221
 
360
222
"""singleton instance"""
361
223
serializer_v4 = _Serializer_v4()
362
224
 
363
 
serializer_v5 = _Serializer_v5()