From 475592e20e43ebdb7f29e9fd23e5ccda98ded5d4 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Tue, 29 Sep 2009 06:04:42 +0000 Subject: Handle encoding/decoding of unicode when using the xpak api. 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 | 3 ++- pym/portage/__init__.py | 5 ++++- pym/portage/dbapi/bintree.py | 30 ++++++++++++++++++++++-------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/pym/_emerge/Binpkg.py b/pym/_emerge/Binpkg.py index 712c5c3f3..1e39d4861 100644 --- a/pym/_emerge/Binpkg.py +++ b/pym/_emerge/Binpkg.py @@ -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) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index d486227dc..42a141c5c 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -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. diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index e6ea40347..4df2020b5 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -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 -- cgit v1.2.3-1-g7c22