import sys, os
from optparse import OptionParser, OptionValueError
-
+if not hasattr(__builtins__, "set"):
+ from sets import Set as set
import re
try:
import portage
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):
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
import emerge.help
import portage.xpak, commands, errno, re, socket, time, types
-import portage.output
from portage.output import blue, bold, colorize, darkblue, darkgreen, darkred, green, \
havecolor, nc_len, nocolor, red, teal, turquoise, white, xtermTitle, \
xtermTitleReset, yellow
#processing dependencies
""" Call portage.dep_check to evaluate the use? conditionals and make sure all
dependencies are satisfiable. """
- try:
- if myparent and p_status == "nomerge":
- portage.dep._dep_check_strict = False
- mycheck = portage.dep_check(depstring, None,
- pkgsettings, myuse=myuse,
- use_binaries=("--usepkgonly" in self.myopts),
- myroot=myroot, trees=self.trees)
- finally:
- portage.dep._dep_check_strict = True
-
- if not mycheck[0]:
- if myparent:
- show_invalid_depstring_notice(myparent, depstring, mycheck[1])
- else:
- sys.stderr.write("\n%s\n%s\n" % (depstring, mycheck[1]))
- return 0
- mymerge = mycheck[1]
+ if arg:
+ mymerge = [depstring]
+ pprovided = pkgsettings.pprovideddict.get(
+ portage.dep_getkey(depstring))
+ if pprovided and portage.match_from_list(depstring, pprovided):
+ mymerge = []
+ else:
+ try:
+ if myparent and p_status == "nomerge":
+ portage.dep._dep_check_strict = False
+ mycheck = portage.dep_check(depstring, None,
+ pkgsettings, myuse=myuse,
+ use_binaries=("--usepkgonly" in self.myopts),
+ myroot=myroot, trees=self.trees)
+ finally:
+ portage.dep._dep_check_strict = True
+
+ if not mycheck[0]:
+ if myparent:
+ show_invalid_depstring_notice(
+ myparent, depstring, mycheck[1])
+ else:
+ sys.stderr.write("\n%s\n%s\n" % (depstring, mycheck[1]))
+ return 0
+ mymerge = mycheck[1]
if not mymerge and arg and \
portage.best_match_to_list(depstring, self.args_keys):
if (not os.path.isdir(self.pkgdir+"/All") and not getbinpkgs):
return 0
+ categories = set(self.settings.categories)
+
if not getbinpkgsonly:
pkg_paths = {}
dirs = listdir(self.pkgdir, dirsonly=True, EmptyOnError=True)
if mycpv in pkg_paths:
# All is first, so it's preferred.
continue
+ if mycat not in categories:
+ writemsg(("!!! Binary package has an " + \
+ "unrecognized category: '%s'\n") % full_path,
+ noiselevel=-1)
+ writemsg(("!!! '%s' has a category that is not" + \
+ " listed in /etc/portage/categories\n") % mycpv,
+ noiselevel=-1)
+ continue
pkg_paths[mycpv] = mypath
self.dbapi.cpv_inject(mycpv)
self._pkg_paths = pkg_paths
continue
mycat = self.remotepkgs[mypkg]["CATEGORY"].strip()
fullpkg = mycat+"/"+mypkg[:-5]
+ if mycat not in categories:
+ writemsg(("!!! Remote binary package has an " + \
+ "unrecognized category: '%s'\n") % fullpkg,
+ noiselevel=-1)
+ writemsg(("!!! '%s' has a category that is not" + \
+ " listed in /etc/portage/categories\n") % fullpkg,
+ noiselevel=-1)
+ continue
mykey = dep_getkey(fullpkg)
try:
# invalid tbz2's can hurt things.
else:
from portage import settings
self.mysettings = config(clone=settings)
-
+ self._categories = set(self.mysettings.categories)
# This is strictly for use in aux_get() doebuild calls when metadata
# is generated by the depend phase. It's safest to use a clone for
# this purpose because doebuild makes many changes to the config
def cp_list(self, mycp, use_cache=1, mytree=None):
mysplit = mycp.split("/")
+ invalid_category = mysplit[0] not in self._categories
d={}
if mytree:
mytrees = [mytree]
os.path.join(oroot, mycp, x), noiselevel=-1)
continue
d[mysplit[0]+"/"+pf] = None
+ if invalid_category and d:
+ writemsg(("\n!!! '%s' has a category that is not listed in " + \
+ "/etc/portage/categories\n") % mycp, noiselevel=-1)
+ return []
return d.keys()
def freeze(self):