From 235c08369327c4eabec99cc7f0263ced973d337d Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Mon, 24 Aug 2009 09:36:42 +0000 Subject: [PATCH] Merged from trunk -r14097:14107 | 14098 | Use _encodings['repo.content'] for decoding profiles.desc, | | zmedico | ChangeLog, metadata.xml, and ebuilds. | | 14099 | Use _encodings where appropriate. | | zmedico | | | 14100 | Use _encodings where appropriate. | | zmedico | | | 14101 | Use _encodings where appropriate. | | zmedico | | | 14102 | If sys.getdefaultencoding() returns None (this can happen | | zmedico | if python is built with USE=build, in stage 1), fall back | | | to _encodings['merge'] = 'ascii'. | | 14103 | Fix typo from previous commit. | | zmedico | | | 14104 | Fix portage.5 man page to document the fact that some files | | arfrever | in profiles directory can be directories. | | 14105 | Use _encodings where appropriate. | | zmedico | | | 14106 | Use _encodings where appropriate. | | zmedico | | | 14107 | Use _encodings where appropriate. | | zmedico | | svn path=/main/branches/prefix/; revision=14142 --- bin/repoman | 16 +++++++++++----- man/portage.5 | 12 ++++++++++++ pym/_emerge/Binpkg.py | 16 +++++++++++----- pym/_emerge/BinpkgVerifier.py | 7 +++++-- pym/_emerge/EbuildBuild.py | 8 ++++++-- pym/_emerge/EbuildFetcher.py | 7 +++++-- pym/_emerge/EbuildMetadataPhase.py | 15 ++++++++++----- pym/_emerge/EbuildPhase.py | 12 ++++++++---- pym/_emerge/PackageUninstall.py | 7 +++++-- pym/_emerge/Scheduler.py | 24 +++++++++++++++++------- pym/_emerge/changelog.py | 8 ++++++-- pym/_emerge/emergelog.py | 8 ++++++-- pym/portage/__init__.py | 7 ++++++- pym/portage/cache/flat_hash.py | 19 +++++++++++++------ pym/portage/cache/flat_list.py | 19 +++++++++++++------ pym/portage/cache/metadata.py | 21 +++++++++++++-------- 16 files changed, 147 insertions(+), 59 deletions(-) diff --git a/bin/repoman b/bin/repoman index 7abcc80f1..7f1ba3b8f 100755 --- a/bin/repoman +++ b/bin/repoman @@ -44,6 +44,8 @@ import portage portage._disable_legacy_globals() from portage import os +from portage import _encodings +from portage import _unicode_encode from repoman.checks import run_checks from repoman import utilities @@ -600,8 +602,9 @@ for path in portdb.porttrees: desc_path = os.path.join(path, 'profiles', 'profiles.desc') try: - desc_file = codecs.open(desc_path, mode='r', - encoding='utf_8', errors='replace') + desc_file = codecs.open(_unicode_encode(desc_path, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], errors='replace') except EnvironmentError: pass else: @@ -971,8 +974,9 @@ for x in scanlist: continue try: line = 1 - for l in codecs.open(os.path.join(checkdir, y), mode='r', - encoding='utf_8'): + for l in codecs.open(_unicode_encode(os.path.join(checkdir, y), + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content']): line +=1 except UnicodeDecodeError, ue: stats["file.UTF8"] += 1 @@ -1553,7 +1557,9 @@ for x in scanlist: full_path = os.path.join(repodir, relative_path) try: # All ebuilds should have utf_8 encoding. - f = codecs.open(full_path, mode='r', encoding='utf_8') + f = codecs.open(_unicode_encode(full_path, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content']) try: for check_name, e in run_checks(f, pkg): stats[check_name] += 1 diff --git a/man/portage.5 b/man/portage.5 index 37bf93148..6cc46706a 100644 --- a/man/portage.5 +++ b/man/portage.5 @@ -143,6 +143,18 @@ settings, use \fB/etc/portage/profile/\fR (it supports all of the same file types that \fB/etc/make.profile/\fR does, except parent). Do NOT edit the settings in \fB/etc/make.profile/\fR because they WILL be lost with the next `emerge \-\-sync`. + +Any file in this directory, directories of other profiles or top-level +"profiles" directory that begins with "package." or "use." can be more than +just a flat file. If it is a directory, then all the files in that directory +will be sorted in ascending alphabetical order by file name and summed together +as if it were a single file. + +.I Example: +.nf +/usr/portage/profiles/package.mask/removals +/usr/portage/profiles/package.mask/testing +.fi .RS .TP .BR deprecated diff --git a/pym/_emerge/Binpkg.py b/pym/_emerge/Binpkg.py index 74227e456..35c38599e 100644 --- a/pym/_emerge/Binpkg.py +++ b/pym/_emerge/Binpkg.py @@ -12,6 +12,8 @@ from _emerge.EbuildBuildDir import EbuildBuildDir from portage.util import writemsg import portage from portage import os +from portage import _encodings +from portage import _unicode_encode import codecs import sys if os.environ.__contains__("PORTAGE_PYTHONPATH"): @@ -41,8 +43,9 @@ class Binpkg(CompositeTask): log_path = self.settings.get("PORTAGE_LOG_FILE") if log_path is not None: - f = codecs.open(log_path, mode='a', - encoding='utf_8', errors='replace') + f = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') try: f.write(msg) finally: @@ -235,15 +238,18 @@ class Binpkg(CompositeTask): else: continue - f = codecs.open(os.path.join(infloc, k), mode='w', - encoding='utf_8', errors='replace') + f = codecs.open(_unicode_encode(os.path.join(infloc, k), + encoding=_encodings['fs'], errors='strict'), + mode='w', encoding=_encodings['content'], errors='replace') try: f.write(v + "\n") finally: f.close() # Store the md5sum in the vdb. - f = open(os.path.join(infloc, "BINPKGMD5"), "w") + f = codecs.open(_unicode_encode(os.path.join(infloc, 'BINPKGMD5'), + encoding=_encodings['fs'], errors='strict'), + mode='w', encoding=_encodings['content'], errors='strict') try: f.write(str(portage.checksum.perform_md5(pkg_path)) + "\n") finally: diff --git a/pym/_emerge/BinpkgVerifier.py b/pym/_emerge/BinpkgVerifier.py index 31599e2e2..36e1bb8b6 100644 --- a/pym/_emerge/BinpkgVerifier.py +++ b/pym/_emerge/BinpkgVerifier.py @@ -7,6 +7,8 @@ from portage.util import writemsg import sys import portage from portage import os +from portage import _encodings +from portage import _unicode_encode import codecs class BinpkgVerifier(AsynchronousTask): @@ -27,8 +29,9 @@ class BinpkgVerifier(AsynchronousTask): stderr_orig = sys.stderr log_file = None if self.background and self.logfile is not None: - log_file = codecs.open(self.logfile, mode='a', - encoding='utf_8', errors='replace') + log_file = codecs.open(_unicode_encode(self.logfile, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') try: if log_file is not None: sys.stdout = log_file diff --git a/pym/_emerge/EbuildBuild.py b/pym/_emerge/EbuildBuild.py index 58bb7769d..3bf9b1b3d 100644 --- a/pym/_emerge/EbuildBuild.py +++ b/pym/_emerge/EbuildBuild.py @@ -13,6 +13,9 @@ from _emerge.EbuildBuildDir import EbuildBuildDir from portage.util import writemsg import portage from portage import os +from portage import _encodings +from portage import _unicode_encode +import codecs from portage.output import colorize from portage.const import EPREFIX class EbuildBuild(CompositeTask): @@ -182,8 +185,9 @@ class EbuildBuild(CompositeTask): log_path = self.settings.get("PORTAGE_LOG_FILE") if log_path is not None: - log_file = codecs.open(log_path, mode='a', - encoding='utf_8', errors='replace') + log_file = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') try: log_file.write(msg) finally: diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py index d7cf571b2..7b1893ad6 100644 --- a/pym/_emerge/EbuildFetcher.py +++ b/pym/_emerge/EbuildFetcher.py @@ -9,6 +9,8 @@ import os import sys import portage from portage import os +from portage import _encodings +from portage import _unicode_encode import codecs from portage.elog.messages import eerror @@ -90,8 +92,9 @@ class EbuildFetcher(SpawnProcess): elog_out = None if self.logfile is not None: if self.background: - elog_out = codecs.open(self.logfile, mode='a', - encoding='utf_8', errors='replace') + elog_out = codecs.open(_unicode_encode(self.logfile, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') msg = "Fetch failed for '%s'" % (self.pkg.cpv,) if self.logfile is not None: msg += ", Log file:" diff --git a/pym/_emerge/EbuildMetadataPhase.py b/pym/_emerge/EbuildMetadataPhase.py index a84d722be..60b91edb8 100644 --- a/pym/_emerge/EbuildMetadataPhase.py +++ b/pym/_emerge/EbuildMetadataPhase.py @@ -8,6 +8,8 @@ import sys from portage.cache.mappings import slot_dict_class import portage from portage import os +from portage import _encodings +from portage import _unicode_encode from itertools import izip import fcntl import codecs @@ -38,8 +40,11 @@ class EbuildMetadataPhase(SubProcess): os.path.basename(ebuild_path)) if eapi is None and \ 'parse-eapi-ebuild-head' in settings.features: - eapi = portage._parse_eapi_ebuild_head(codecs.open(ebuild_path, - mode='r', encoding='utf_8', errors='replace')) + eapi = portage._parse_eapi_ebuild_head( + codecs.open(_unicode_encode(ebuild_path, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], + errors='replace')) if eapi is not None: if not portage.eapi_is_supported(eapi): @@ -82,7 +87,7 @@ class EbuildMetadataPhase(SubProcess): fd_pipes[self._metadata_fd] = slave_fd self._raw_metadata = [] - files.ebuild = os.fdopen(master_fd, 'r') + files.ebuild = os.fdopen(master_fd, 'rb') self._reg_id = self.scheduler.register(files.ebuild.fileno(), self._registered_events, self._output_handler) self._registered = True @@ -118,8 +123,8 @@ class EbuildMetadataPhase(SubProcess): def _set_returncode(self, wait_retval): SubProcess._set_returncode(self, wait_retval) if self.returncode == os.EX_OK: - metadata_lines = u''.join(unicode(chunk, - encoding='utf_8', errors='replace') + metadata_lines = ''.join(unicode(chunk, + encoding=_encodings['repo.content'], errors='replace') for chunk in self._raw_metadata).splitlines() if len(portage.auxdbkeys) != len(metadata_lines): # Don't trust bash's returncode if the diff --git a/pym/_emerge/EbuildPhase.py b/pym/_emerge/EbuildPhase.py index 9d2ec632d..51f018cb1 100644 --- a/pym/_emerge/EbuildPhase.py +++ b/pym/_emerge/EbuildPhase.py @@ -8,6 +8,8 @@ from _emerge.CompositeTask import CompositeTask from portage.util import writemsg import portage from portage import os +from portage import _encodings +from portage import _unicode_encode import codecs class EbuildPhase(CompositeTask): @@ -32,8 +34,9 @@ class EbuildPhase(CompositeTask): log_path = self.settings.get("PORTAGE_LOG_FILE") log_file = None if self.background and log_path is not None: - log_file = codecs.open(log_path, mode='a', - encoding='utf_8', errors='replace') + log_file = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') out = log_file try: portage._check_build_log(self.settings, out=out) @@ -52,8 +55,9 @@ class EbuildPhase(CompositeTask): log_path = self.settings.get("PORTAGE_LOG_FILE") log_file = None if self.background and log_path is not None: - log_file = codecs.open(log_path, mode='a', - encoding='utf_8', errors='replace') + log_file = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') out = log_file portage._post_src_install_chost_fix(settings) portage._post_src_install_uid_fix(settings, out=out) diff --git a/pym/_emerge/PackageUninstall.py b/pym/_emerge/PackageUninstall.py index d86947c4a..fdd59e149 100644 --- a/pym/_emerge/PackageUninstall.py +++ b/pym/_emerge/PackageUninstall.py @@ -6,6 +6,8 @@ import codecs import logging import portage from portage import os +from portage import _encodings +from portage import _unicode_encode from _emerge.AsynchronousTask import AsynchronousTask from _emerge.unmerge import unmerge from _emerge.UninstallFailure import UninstallFailure @@ -45,8 +47,9 @@ class PackageUninstall(AsynchronousTask): portage.util.writemsg_level(msg, level=level, noiselevel=noiselevel) - f = codecs.open(log_path, mode='a', - encoding='utf_8', errors='replace') + f = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], errors='replace') try: f.write(msg) finally: diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 7e0c35f89..cbb52448a 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -11,10 +11,14 @@ import weakref from itertools import izip import portage from portage import os +from portage import _encodings +from portage import _unicode_decode +from portage import _unicode_encode from portage.cache.mappings import slot_dict_class from portage.elog.messages import eerror from portage.output import colorize, create_color_func, darkgreen, red bad = create_color_func("BAD") +from portage.sets import SETPREFIX from portage.sets.base import InternalPackageSet from portage.util import writemsg, writemsg_level @@ -471,10 +475,13 @@ class Scheduler(PollScheduler): def _append_to_log_path(self, log_path, msg): - f = codecs.open(portage._unicode_encode(log_path), mode='a', - encoding='utf_8', errors='replace') + f = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], + errors='backslashreplace') try: - f.write(portage._unicode_decode(msg)) + f.write(_unicode_decode(msg, + encoding=_encodings['content'], errors='replace')) finally: f.close() @@ -486,8 +493,10 @@ class Scheduler(PollScheduler): background = self._background if background and log_path is not None: - log_file = codecs.open(portage._unicode_encode(log_path), mode='a', - encoding='utf_8', errors='replace') + log_file = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], + errors='backslashreplace') out = log_file try: @@ -862,8 +871,9 @@ class Scheduler(PollScheduler): log_path = self._locate_failure_log(failed_pkg) if log_path is not None: try: - log_file = codecs.open(portage._unicode_encode(log_path), - mode='r', encoding='utf_8', errors='replace') + log_file = codecs.open(_unicode_encode(log_path, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['content'], errors='replace') except IOError: pass diff --git a/pym/_emerge/changelog.py b/pym/_emerge/changelog.py index 4adb8b25b..0fdf5880a 100644 --- a/pym/_emerge/changelog.py +++ b/pym/_emerge/changelog.py @@ -7,6 +7,8 @@ import re import portage from portage import os +from portage import _encodings +from portage import _unicode_encode def calc_changelog(ebuildpath,current,next): if ebuildpath == None or not os.path.exists(ebuildpath): @@ -19,8 +21,10 @@ def calc_changelog(ebuildpath,current,next): next = next[:-3] changelogpath = os.path.join(os.path.split(ebuildpath)[0],'ChangeLog') try: - changelog = codecs.open(portage._unicode_encode(changelogpath), - mode='r', encoding='utf_8', errors='replace').read() + changelog = codecs.open(_unicode_encode(changelogpath, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], errors='replace' + ).read() except SystemExit, e: raise # Needed else can't exit except: diff --git a/pym/_emerge/emergelog.py b/pym/_emerge/emergelog.py index 34601f772..bc7022280 100644 --- a/pym/_emerge/emergelog.py +++ b/pym/_emerge/emergelog.py @@ -7,6 +7,8 @@ import sys import time import portage from portage import os +from portage import _encodings +from portage import _unicode_encode from portage.data import secpass from portage.output import xtermTitle from portage.const import EPREFIX @@ -26,8 +28,10 @@ def emergelog(xterm_titles, mystr, short_msg=None): xtermTitle(short_msg) try: file_path = os.path.join(_emerge_log_dir, 'emerge.log') - mylogfile = codecs.open(portage._unicode_encode(file_path), mode='a', - encoding='utf_8', errors='replace') + mylogfile = codecs.open(_unicode_encode(file_path, + encoding=_encodings['fs'], errors='strict'), + mode='a', encoding=_encodings['content'], + errors='backslashreplace') portage.util.apply_secpass_permissions(file_path, uid=portage.portage_uid, gid=portage.portage_gid, mode=0660) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 07f4901e1..87cc5a194 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -125,8 +125,13 @@ _encodings = { 'content' : 'utf_8', 'fs' : 'utf_8', 'merge' : sys.getfilesystemencoding(), + 'repo.content' : 'utf_8', } +# This can happen if python is built with USE=build (stage 1). +if _encodings['merge'] is None: + _encodings['merge'] = 'ascii' + # Deprecated attributes. Instead use _encodings directly. _content_encoding = _encodings['content'] _fs_encoding = _encodings['fs'] @@ -352,7 +357,7 @@ def _ensure_default_encoding(): default_fallback = 'utf_8' default_encoding = sys.getdefaultencoding().lower().replace('-', '_') - filesystem_encoding = sys.getfilesystemencoding().lower().replace('-', '_') + filesystem_encoding = _encodings['merge'].lower().replace('-', '_') required_encodings = set(['ascii', 'utf_8']) required_encodings.add(default_encoding) required_encodings.add(filesystem_encoding) diff --git a/pym/portage/cache/flat_hash.py b/pym/portage/cache/flat_hash.py index 2467f6800..259be4108 100644 --- a/pym/portage/cache/flat_hash.py +++ b/pym/portage/cache/flat_hash.py @@ -9,6 +9,7 @@ from portage.cache import cache_errors import errno import stat from portage import os +from portage import _encodings from portage import _unicode_encode class database(fs_template.FsBased): @@ -29,8 +30,10 @@ class database(fs_template.FsBased): def _getitem(self, cpv): fp = os.path.join(self.location, cpv) try: - myf = codecs.open(_unicode_encode(fp), - mode='r', encoding='utf_8', errors='replace') + myf = codecs.open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], + errors='replace') try: d = self._parse_data(myf.readlines(), cpv) if '_mtime_' not in d: @@ -58,14 +61,18 @@ class database(fs_template.FsBased): s = cpv.rfind("/") fp = os.path.join(self.location,cpv[:s],".update.%i.%s" % (os.getpid(), cpv[s+1:])) try: - myf = codecs.open(_unicode_encode(fp), mode='w', - encoding='utf_8', errors='replace') + myf = codecs.open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), + mode='w', encoding=_encodings['repo.content'], + errors='backslashreplace') except (IOError, OSError), e: if errno.ENOENT == e.errno: try: self._ensure_dirs(cpv) - myf = codecs.open(_unicode_encode(fp), mode='w', - encoding='utf_8', errors='replace') + myf = codecs.open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), + mode='w', encoding=_encodings['repo.content'], + errors='backslashreplace') except (OSError, IOError),e: raise cache_errors.CacheCorruption(cpv, e) else: diff --git a/pym/portage/cache/flat_list.py b/pym/portage/cache/flat_list.py index 9906dd22d..1d4dbd28f 100644 --- a/pym/portage/cache/flat_list.py +++ b/pym/portage/cache/flat_list.py @@ -1,6 +1,7 @@ from portage.cache import fs_template from portage.cache import cache_errors from portage import os +from portage import _encodings from portage import _unicode_encode import codecs import errno @@ -31,8 +32,10 @@ class database(fs_template.FsBased): def _getitem(self, cpv): d = {} try: - myf = codecs.open(_unicode_encode(os.path.join(self._base, cpv)), - mode='r', encoding='utf_8', errors='replace') + myf = codecs.open(_unicode_encode(os.path.join(self._base, cpv), + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], + errors='replace') for k,v in zip(self.auxdbkey_order, myf): d[k] = v.rstrip("\n") except (OSError, IOError),e: @@ -53,14 +56,18 @@ class database(fs_template.FsBased): s = cpv.rfind("/") fp=os.path.join(self._base,cpv[:s],".update.%i.%s" % (os.getpid(), cpv[s+1:])) try: - myf = codecs.open(_unicode_encode(fp), mode='w', - encoding='utf_8', errors='replace') + myf = codecs.open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), + mode='w', encoding=_encodings['repo.content'], + errors='backslashreplace') except (OSError, IOError), e: if errno.ENOENT == e.errno: try: self._ensure_dirs(cpv) - myf = codecs.open(_unicode_encode(fp), mode='w', - encoding='utf_8', errors='replace') + myf = codecs.open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), + mode='w', encoding=_encodings['repo.content'], + errors='backslashreplace') except (OSError, IOError),e: raise cache_errors.CacheCorruption(cpv, e) else: diff --git a/pym/portage/cache/metadata.py b/pym/portage/cache/metadata.py index e91ed68d2..ff1227bdb 100644 --- a/pym/portage/cache/metadata.py +++ b/pym/portage/cache/metadata.py @@ -6,6 +6,7 @@ import errno import re from portage import os +from portage import _encodings from portage import _unicode_encode from portage.cache import cache_errors, flat_hash import portage.eclass_cache @@ -80,16 +81,18 @@ class database(flat_hash.database): new_content = [] for k in self.auxdbkey_order: - new_content.append(values.get(k, u'')) - new_content.append(u'\n') + new_content.append(values.get(k, '')) + new_content.append('\n') for i in xrange(magic_line_count - len(self.auxdbkey_order)): - new_content.append(u'\n') - new_content = u''.join(new_content) - new_content = _unicode_encode(new_content) + new_content.append('\n') + new_content = ''.join(new_content) + new_content = _unicode_encode(new_content, + _encodings['repo.content'], errors='backslashreplace') new_fp = os.path.join(self.location, cpv) try: - f = open(_unicode_encode(new_fp), 'rb') + f = open(_unicode_encode(new_fp, + encoding=_encodings['fs'], errors='strict'), 'rb') except EnvironmentError: pass else: @@ -117,12 +120,14 @@ class database(flat_hash.database): fp = os.path.join(self.location,cpv[:s], ".update.%i.%s" % (os.getpid(), cpv[s+1:])) try: - myf = open(_unicode_encode(fp), 'wb') + myf = open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), 'wb') except EnvironmentError, e: if errno.ENOENT == e.errno: try: self._ensure_dirs(cpv) - myf = open(_unicode_encode(fp), 'wb') + myf = open(_unicode_encode(fp, + encoding=_encodings['fs'], errors='strict'), 'wb') except EnvironmentError, e: raise cache_errors.CacheCorruption(cpv, e) else: -- 2.26.2