~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml_serializer.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-12 11:41:41 UTC
  • mto: This revision was merged to the branch mainline in revision 6361.
  • Revision ID: jelmer@samba.org-20111212114141-k0bkxqaz28lb1b0y
Move core inventory code to xml_serializer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
237
237
    _to_escaped_map.clear()
238
238
 
239
239
 
240
 
def unpack_xml_inventory_entry(elt, entry_cache=None, return_from_cache=False):
 
240
def unpack_inventory_entry(elt, entry_cache=None, return_from_cache=False):
241
241
    elt_get = elt.get
242
242
    file_id = elt_get('file_id')
243
243
    revision = elt_get('revision')
327
327
        entry_cache[key] = ie.copy()
328
328
 
329
329
    return ie
 
330
 
 
331
 
 
332
def unpack_inventory_flat(elt, format_num, unpack_entry):
 
333
    """Unpack a flat XML inventory.
 
334
 
 
335
    :param elt: XML element for the inventory
 
336
    :param format_num: Expected format number
 
337
    :param unpack_entry: Function for unpacking inventory entries
 
338
    :return: An inventory
 
339
    :raise UnexpectedInventoryFormat: When unexpected elements or data is
 
340
        encountered
 
341
    """
 
342
    if elt.tag != 'inventory':
 
343
        raise errors.UnexpectedInventoryFormat('Root tag is %r' % elt.tag)
 
344
    format = elt.get('format')
 
345
    if format != format_num:
 
346
        raise errors.UnexpectedInventoryFormat('Invalid format version %r'
 
347
                                               % format)
 
348
    revision_id = elt.get('revision_id')
 
349
    if revision_id is not None:
 
350
        revision_id = cache_utf8.encode(revision_id)
 
351
    inv = inventory.Inventory(root_id=None, revision_id=revision_id)
 
352
    for e in elt:
 
353
        ie = unpack_entry(e)
 
354
        inv.add(ie)
 
355
    return inv
 
356
 
 
357
 
 
358
def serialize_inventory_flat(inv, append_inventory_root, root_id,
 
359
        supported_kinds, working):
 
360
    """Serialize an inventory to a flat XML file.
 
361
 
 
362
    :param inv: Inventory to serialize
 
363
    :param working: If True skip history data - text_sha1, text_size,
 
364
        reference_revision, symlink_target.    self._check_revisions(inv)
 
365
    """
 
366
    output = []
 
367
    append = output.append
 
368
    append_inventory_root(append, inv)
 
369
    entries = inv.iter_entries()
 
370
    # Skip the root
 
371
    root_path, root_ie = entries.next()
 
372
    for path, ie in entries:
 
373
        if ie.parent_id != root_id:
 
374
            parent_str = ' parent_id="'
 
375
            parent_id  = encode_and_escape(ie.parent_id)
 
376
        else:
 
377
            parent_str = ''
 
378
            parent_id  = ''
 
379
        if ie.kind == 'file':
 
380
            if ie.executable:
 
381
                executable = ' executable="yes"'
 
382
            else:
 
383
                executable = ''
 
384
            if not working:
 
385
                append('<file%s file_id="%s name="%s%s%s revision="%s '
 
386
                    'text_sha1="%s" text_size="%d" />\n' % (
 
387
                    executable, encode_and_escape(ie.file_id),
 
388
                    encode_and_escape(ie.name), parent_str, parent_id,
 
389
                    encode_and_escape(ie.revision), ie.text_sha1,
 
390
                    ie.text_size))
 
391
            else:
 
392
                append('<file%s file_id="%s name="%s%s%s />\n' % (
 
393
                    executable, encode_and_escape(ie.file_id),
 
394
                    encode_and_escape(ie.name), parent_str, parent_id))
 
395
        elif ie.kind == 'directory':
 
396
            if not working:
 
397
                append('<directory file_id="%s name="%s%s%s revision="%s '
 
398
                    '/>\n' % (
 
399
                    encode_and_escape(ie.file_id),
 
400
                    encode_and_escape(ie.name),
 
401
                    parent_str, parent_id,
 
402
                    encode_and_escape(ie.revision)))
 
403
            else:
 
404
                append('<directory file_id="%s name="%s%s%s />\n' % (
 
405
                    encode_and_escape(ie.file_id),
 
406
                    encode_and_escape(ie.name),
 
407
                    parent_str, parent_id))
 
408
        elif ie.kind == 'symlink':
 
409
            if not working:
 
410
                append('<symlink file_id="%s name="%s%s%s revision="%s '
 
411
                    'symlink_target="%s />\n' % (
 
412
                    encode_and_escape(ie.file_id),
 
413
                    encode_and_escape(ie.name),
 
414
                    parent_str, parent_id,
 
415
                    encode_and_escape(ie.revision),
 
416
                    encode_and_escape(ie.symlink_target)))
 
417
            else:
 
418
                append('<symlink file_id="%s name="%s%s%s />\n' % (
 
419
                    encode_and_escape(ie.file_id),
 
420
                    encode_and_escape(ie.name),
 
421
                    parent_str, parent_id))
 
422
        elif ie.kind == 'tree-reference':
 
423
            if ie.kind not in supported_kinds:
 
424
                raise errors.UnsupportedInventoryKind(ie.kind)
 
425
            if not working:
 
426
                append('<tree-reference file_id="%s name="%s%s%s '
 
427
                    'revision="%s reference_revision="%s />\n' % (
 
428
                    encode_and_escape(ie.file_id),
 
429
                    encode_and_escape(ie.name),
 
430
                    parent_str, parent_id,
 
431
                    encode_and_escape(ie.revision),
 
432
                    encode_and_escape(ie.reference_revision)))
 
433
            else:
 
434
                append('<tree-reference file_id="%s name="%s%s%s />\n' % (
 
435
                    encode_and_escape(ie.file_id),
 
436
                    encode_and_escape(ie.name),
 
437
                    parent_str, parent_id))
 
438
        else:
 
439
            raise errors.UnsupportedInventoryKind(ie.kind)
 
440
    append('</inventory>\n')
 
441
    return output