~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml8.py

  • Committer: John Arbash Meinel
  • Date: 2008-12-08 18:27:57 UTC
  • mto: This revision was merged to the branch mainline in revision 3912.
  • Revision ID: john@arbash-meinel.com-20081208182757-2rls8q1ri36ub6e9
Add an InventoryEntry cache to the xml deserializer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
    cache_utf8,
22
22
    errors,
23
23
    inventory,
 
24
    lru_cache,
24
25
    revision as _mod_revision,
25
26
    )
26
27
from bzrlib.xml_serializer import SubElement, Element, Serializer
38
39
    "<":"&lt;",
39
40
    ">":"&gt;",
40
41
    }
 
42
# A cache of InventoryEntry objects
 
43
_entry_cache = lru_cache.LRUCache(10*1024)
41
44
 
42
45
 
43
46
def _ensure_utf8_re():
361
364
 
362
365
        get_cached = _get_utf8_or_ascii
363
366
 
 
367
        file_id = elt.get('file_id')
 
368
        revision = elt.get('revision')
 
369
        # Check and see if we have already unpacked this exact entry
 
370
        key = (file_id, revision)
 
371
        cached_ie = _entry_cache.get(key, None)
 
372
        if cached_ie is not None:
 
373
            # We copy it, because some operatations may mutate it
 
374
            return cached_ie.copy()
 
375
 
 
376
        file_id = get_cached(file_id)
 
377
        if revision is not None:
 
378
            revision = get_cached(revision)
364
379
        parent_id = elt.get('parent_id')
365
380
        if parent_id is not None:
366
381
            parent_id = get_cached(parent_id)
367
 
        file_id = get_cached(elt.get('file_id'))
368
382
 
369
383
        if kind == 'directory':
370
384
            ie = inventory.InventoryDirectory(file_id,
386
400
            ie.symlink_target = elt.get('symlink_target')
387
401
        else:
388
402
            raise errors.UnsupportedInventoryKind(kind)
389
 
        revision = elt.get('revision')
390
 
        if revision is not None:
391
 
            revision = get_cached(revision)
392
403
        ie.revision = revision
 
404
        _entry_cache[key] = ie
393
405
 
394
406
        return ie
395
407