For bug #166785, check for invalid categories in the world file. (trunk r5985:5986)
authorZac Medico <zmedico@gentoo.org>
Sun, 18 Feb 2007 07:50:48 +0000 (07:50 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 18 Feb 2007 07:50:48 +0000 (07:50 -0000)
svn path=/main/branches/2.1.2/; revision=5987

bin/emaint

index bff6856f807e73ee5a3967a552564fd411437e0b..187ff773affbd232f73d0cf161e1b1cf3a536d80 100755 (executable)
@@ -2,7 +2,8 @@
 
 import sys, os
 from optparse import OptionParser, OptionValueError
-
+if not hasattr(__builtins__, "set"):
+       from sets import Set as set
 import re
 try:
        import portage
@@ -20,16 +21,27 @@ class WorldHandler(object):
        def __init__(self):
                self.invalid = []
                self.not_installed = []
+               self.invalid_category = []
                self.okay = []
                self.world_file = os.path.join("/", portage_const.WORLD_FILE)
                self.found = os.access(self.world_file, os.R_OK)
 
+               categories = set(portage.settings.categories)
+               myroot = portage.settings["ROOT"]
+               vardb = portage.db[myroot]["vartree"].dbapi
+
                for atom in open(self.world_file).read().split():
                        if not portage.isvalidatom(atom):
                                self.invalid.append(atom)
-                       elif not portage.db["/"]["vartree"].dbapi.match(atom):
+                               continue
+                       okay = True
+                       if not vardb.match(atom):
                                self.not_installed.append(atom)
-                       else:
+                               okay = False
+                       if portage.catsplit(atom)[0] not in categories:
+                               self.invalid_category.append(atom)
+                               okay = False
+                       if okay:
                                self.okay.append(atom)
 
        def check(self):
@@ -37,6 +49,7 @@ class WorldHandler(object):
                if self.found:
                        errors += map(lambda x: "'%s' is not a valid atom" % x, self.invalid)
                        errors += map(lambda x: "'%s' is not installed" % x, self.not_installed)
+                       errors += map(lambda x: "'%s' has a category that is not listed in /etc/portage/categories" % x, self.invalid_category)
                else:
                        errors.append(self.world_file + " could not be opened for reading")
                return errors