Handle encoding/decoding of unicode when using the xpak api.
authorZac Medico <zmedico@gentoo.org>
Tue, 29 Sep 2009 06:04:42 +0000 (06:04 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 29 Sep 2009 06:04:42 +0000 (06:04 -0000)
Use tbz2.get_data() instead of tbz2.getfile() when reading multiple values,
in order to avoid multiple tbz2.scan() and searchindex() calls.

svn path=/main/trunk/; revision=14461

pym/_emerge/Binpkg.py
pym/portage/__init__.py
pym/portage/dbapi/bintree.py

index 712c5c3f3323911068f623449017e9ad43bf8b3f..1e39d486161fbb822b447f1d2ed0f63d5e4427b4 100644 (file)
@@ -215,7 +215,8 @@ class Binpkg(CompositeTask):
                check_missing_metadata = ("CATEGORY", "PF")
                missing_metadata = set()
                for k in check_missing_metadata:
-                       v = pkg_xpak.getfile(k)
+                       v = pkg_xpak.getfile(_unicode_encode(k,
+                               encoding=_encodings['repo.content']))
                        if not v:
                                missing_metadata.add(k)
 
index d486227dca503c21abda84b207bd4bd2c43ef5c3..42a141c5c26ce96fdc5cdb306ea9a8727f532aad 100644 (file)
@@ -8573,11 +8573,14 @@ def pkgmerge(mytbz2, myroot, mysettings, mydbapi=None,
 
                mypkg = os.path.basename(mytbz2)[:-5]
                xptbz2 = portage.xpak.tbz2(mytbz2)
-               mycat = xptbz2.getfile("CATEGORY")
+               mycat = xptbz2.getfile(_unicode_encode("CATEGORY",
+                       encoding=_encodings['repo.content']))
                if not mycat:
                        writemsg(_("!!! CATEGORY info missing from info chunk, aborting...\n"),
                                noiselevel=-1)
                        return 1
+               mycat = _unicode_decode(mycat,
+                       encoding=_encodings['repo.content'], errors='replace')
                mycat = mycat.strip()
 
                # These are the same directories that would be used at build time.
index e6ea4034782f99dee7e7d91f3344061d39f6ae55..4df2020b5d3a5cdb33f06304199f83fb4e896fa0 100644 (file)
@@ -78,9 +78,11 @@ class bindbapi(fakedbapi):
                        tbz2_path = self.bintree.getname(mycpv)
                        if not os.path.exists(tbz2_path):
                                raise KeyError(mycpv)
-                       tbz2 = portage.xpak.tbz2(tbz2_path)
+                       metadata_bytes = portage.xpak.tbz2(tbz2_path).get_data()
                        def getitem(k):
-                               v = tbz2.getfile(k)
+                               v = metadata_bytes.get(_unicode_encode(k,
+                                       encoding=_encodings['repo.content'],
+                                       errors='backslashreplace'))
                                if v is not None:
                                        v = _unicode_decode(v,
                                                encoding=_encodings['repo.content'], errors='replace')
@@ -377,8 +379,12 @@ class binarytree(object):
 
                if st is not None:
                        # For invalid packages, other_cat could be None.
-                       other_cat = portage.xpak.tbz2(dest_path).getfile("CATEGORY")
+                       other_cat = portage.xpak.tbz2(dest_path).getfile(
+                               _unicode_encode("CATEGORY",
+                               encoding=_encodings['repo.content']))
                        if other_cat:
+                               other_cat = _unicode_decode(other_cat,
+                                       encoding=_encodings['repo.content'], errors='replace')
                                other_cat = other_cat.strip()
                                other_cpv = other_cat + "/" + mypkg
                                self._move_from_all(other_cpv)
@@ -546,11 +552,19 @@ class binarytree(object):
                                                        noiselevel=-1)
                                                self.invalids.append(myfile[:-5])
                                                continue
-                                       mytbz2 = portage.xpak.tbz2(full_path)
-                                       # For invalid packages, mycat could be None.
-                                       mycat = mytbz2.getfile("CATEGORY")
-                                       mypf = mytbz2.getfile("PF")
-                                       slot = mytbz2.getfile("SLOT")
+                                       metadata_bytes = portage.xpak.tbz2(full_path).get_data()
+                                       mycat = _unicode_decode(metadata_bytes.get(
+                                               _unicode_encode("CATEGORY",
+                                               encoding=_encodings['repo.content']), ""),
+                                               encoding=_encodings['repo.content'], errors='replace')
+                                       mypf = _unicode_decode(metadata_bytes.get(
+                                               _unicode_encode("PF",
+                                               encoding=_encodings['repo.content']), ""),
+                                               encoding=_encodings['repo.content'], errors='replace')
+                                       slot = _unicode_decode(metadata_bytes.get(
+                                               _unicode_encode("SLOT",
+                                               encoding=_encodings['repo.content']), ""),
+                                               encoding=_encodings['repo.content'], errors='replace')
                                        mypkg = myfile[:-5]
                                        if not mycat or not mypf or not slot:
                                                #old-style or corrupt package