def unpack_inventory_flat(elt, format_num, unpack_entry, entry_cache=None, return_from_cache=False): """Unpack a flat XML inventory. :param elt: XML element for the inventory :param format_num: Expected format number :param unpack_entry: Function for unpacking inventory entries :return: An inventory :raise UnexpectedInventoryFormat: When unexpected elements or data is encountered """ if elt.tag != 'inventory': raise errors.UnexpectedInventoryFormat('Root tag is %r' % elt.tag) format = elt.get('format') if format != format_num: raise errors.UnexpectedInventoryFormat('Invalid format version %r' % format) revision_id = elt.get('revision_id') if revision_id is not None: revision_id = cache_utf8.encode(revision_id) inv = inventory.Inventory(root_id=None, revision_id=revision_id) for e in elt: ie = unpack_entry(e, entry_cache, return_from_cache) inv.add(ie) return inv
def _unpack_inventory(self, elt, revision_id=None): """Construct from XML Element""" if elt.tag != 'inventory': raise errors.UnexpectedInventoryFormat('Root tag is %r' % elt.tag) format = elt.get('format') if format != self.format_num: raise errors.UnexpectedInventoryFormat('Invalid format version %r' % format) revision_id = elt.get('revision_id') if revision_id is not None: revision_id = cache_utf8.encode(revision_id) inv = inventory.Inventory(root_id=None, revision_id=revision_id) for e in elt: ie = self._unpack_entry(e) inv.add(ie) return inv
def _unpack_inventory(self, elt, revision_id=None): """Construct from XML Element""" if elt.tag != 'inventory': raise errors.UnexpectedInventoryFormat('Root tag is %r' % elt.tag) format = elt.get('format') if format != self.format_num: raise errors.UnexpectedInventoryFormat( 'Invalid format version %r' % format) revision_id = elt.get('revision_id') if revision_id is not None: revision_id = cache_utf8.encode(revision_id) inv = inventory.Inventory(root_id=None, revision_id=revision_id) for e in elt: ie = self._unpack_entry(e) inv.add(ie) return inv
def check_decode(self, rev_id): rev_id_utf8 = rev_id.encode('utf-8') self.assertFalse(rev_id in cache_utf8._unicode_to_utf8_map) self.assertFalse(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) # After a single decode, the mapping should exist for # both directions self.assertEqual(rev_id, cache_utf8.decode(rev_id_utf8)) self.assertTrue(rev_id in cache_utf8._unicode_to_utf8_map) self.assertTrue(rev_id_utf8 in cache_utf8._utf8_to_unicode_map) self.assertEqual(rev_id_utf8, cache_utf8.encode(rev_id)) cache_utf8.clear_encoding_cache() self.assertFalse(rev_id in cache_utf8._unicode_to_utf8_map) self.assertFalse(rev_id_utf8 in cache_utf8._utf8_to_unicode_map)
def _unpack_inventory(self, elt, revision_id, entry_cache=None, return_from_cache=False): """Construct from XML Element """ root_id = elt.get('file_id') or inventory.ROOT_ID root_id = get_utf8_or_ascii(root_id) format = elt.get('format') if format is not None: if format != '5': raise errors.BzrError("invalid format version %r on inventory" % format) data_revision_id = elt.get('revision_id') if data_revision_id is not None: revision_id = cache_utf8.encode(data_revision_id) inv = inventory.Inventory(root_id, revision_id=revision_id) # Optimizations tested # baseline w/entry cache 2.85s # using inv._byid 2.55s # avoiding attributes 2.46s # adding assertions 2.50s # last_parent cache 2.52s (worse, removed) byid = inv._byid for e in elt: ie = unpack_inventory_entry(e, entry_cache=entry_cache, return_from_cache=return_from_cache) parent_id = ie.parent_id if parent_id is None: ie.parent_id = parent_id = root_id try: parent = byid[parent_id] except KeyError: raise errors.BzrError("parent_id {%s} not in inventory" % (parent_id,)) if ie.file_id in byid: raise errors.DuplicateFileId(ie.file_id, byid[ie.file_id]) if ie.name in parent.children: raise errors.BzrError("%s is already versioned" % (osutils.pathjoin(inv.id2path(parent_id), ie.name).encode('utf-8'),)) parent.children[ie.name] = ie byid[ie.file_id] = ie if revision_id is not None: inv.root.revision = revision_id self._check_cache_size(len(inv), entry_cache) return inv
def test_cached_ascii(self): x = '%s %s' % ('simple', 'text') y = '%s %s' % ('simple', 'text') self.assertFalse(x is y) xp = cache_utf8.get_cached_ascii(x) yp = cache_utf8.get_cached_ascii(y) self.assertIs(xp, x) self.assertIs(xp, yp) # after caching, encode and decode should also return the right # objects. uni_x = cache_utf8.decode(x) self.assertEqual(u'simple text', uni_x) self.assertIsInstance(uni_x, unicode) utf8_x = cache_utf8.encode(uni_x) self.assertIs(utf8_x, x)
def _unpack_inventory(self, elt, revision_id): """Construct from XML Element """ root_id = elt.get('file_id') or inventory.ROOT_ID root_id = xml8._get_utf8_or_ascii(root_id) format = elt.get('format') if format is not None: if format != '5': raise BzrError("invalid format version %r on inventory" % format) data_revision_id = elt.get('revision_id') if data_revision_id is not None: revision_id = cache_utf8.encode(data_revision_id) inv = inventory.Inventory(root_id, revision_id=revision_id) for e in elt: ie = self._unpack_entry(e) if ie.parent_id is None: ie.parent_id = root_id inv.add(ie) if revision_id is not None: inv.root.revision = revision_id return inv