From 20266b0053b2d860b16156a545f18d6e75ae7176 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 3 Dec 2007 19:58:16 +0000 Subject: [PATCH] Make config.load_infodir() more fault tolerant for cases like bug #201082. svn path=/main/trunk/; revision=8826 --- pym/portage/__init__.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 0fdc5a8fb..334736e5e 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -1770,6 +1770,7 @@ class config(object): def load_infodir(self,infodir): self.modifying() + backup_pkg_metadata = dict(self.configdict["pkg"].iteritems()) if "pkg" in self.configdict: self.configdict["pkg"].clear() else: @@ -1777,6 +1778,8 @@ class config(object): noiselevel=-1) sys.exit(17) + retval = 0 + category_corrupt = False if os.path.exists(infodir): if os.path.exists(infodir+"/environment"): self.configdict["pkg"]["PORT_ENV_FILE"] = infodir+"/environment" @@ -1809,17 +1812,25 @@ class config(object): # strange errors later on, so we'll validate it and # print a warning if necessary. if filename == "CATEGORY": - matchobj = re.match("[-a-zA-Z0-9_.+]+", mydata) - if not matchobj or matchobj.start() != 0 or \ - matchobj.end() != len(mydata): + matchobj = re.match(r'^[-\w_.+]+', mydata) + if not matchobj: writemsg("!!! CATEGORY file is corrupt: %s\n" % \ os.path.join(infodir, filename), noiselevel=-1) + self.configdict["pkg"].pop(filename, None) + self.configdict["env"].pop(filename, None) + category_corrupt = True except (OSError, IOError): writemsg("!!! Unable to read file: %s\n" % infodir+"/"+filename, noiselevel=-1) pass - return 1 - return 0 + retval = 1 + if "CATEGORY" not in self.configdict["pkg"]: + if not category_corrupt: + writemsg("!!! CATEGORY file is missing: %s\n" % \ + os.path.join(infodir, "CATEGORY"), noiselevel=-1) + self.configdict["pkg"].update(backup_pkg_metadata) + retval = 0 + return retval def setcpv(self, mycpv, use_cache=1, mydb=None): """ -- 2.26.2