This should contain a list of file paths, relative to the image directory, of
files that contain .hash sections. The paths may contain regular expressions
with escape\-quoted special characters.
+.br
+This variable is intended to be used on files of binary packages which ignore
+LDFLAGS variable.
.TP
\fBQA_PRESTRIPPED\fR
This should contain a list of file paths, relative to the image directory, of
from _emerge.countdown import countdown
from _emerge.create_depgraph_params import create_depgraph_params
from _emerge.Dependency import Dependency
-from _emerge.depgraph import depgraph, resume_depgraph, _frozen_depgraph_config
+from _emerge.depgraph import backtrack_depgraph, depgraph, resume_depgraph
from _emerge.DepPrioritySatisfiedRange import DepPrioritySatisfiedRange
from _emerge.emergelog import emergelog
from _emerge.is_valid_package_atom import is_valid_package_atom
print "Calculating dependencies ",
sys.stdout.flush()
- runtime_pkg_mask = None
- allow_backtracking = True
- backtracked = False
- frozen_config = _frozen_depgraph_config(settings, trees,
- myopts, spinner)
myparams = create_depgraph_params(myopts, myaction)
- while True:
- mydepgraph = depgraph(settings, trees, myopts, myparams, spinner,
- frozen_config=frozen_config,
- allow_backtracking=allow_backtracking,
- runtime_pkg_mask=runtime_pkg_mask)
- try:
- retval, favorites = mydepgraph.select_files(myfiles)
- except portage.exception.PackageNotFound, e:
- portage.writemsg("\n!!! %s\n" % str(e), noiselevel=-1)
- return 1
- except portage.exception.PackageSetNotFound, e:
- root_config = trees[settings["ROOT"]]["root_config"]
- display_missing_pkg_set(root_config, e.value)
- return 1
- if not retval:
- if mydepgraph.need_restart():
- runtime_pkg_mask = mydepgraph.get_runtime_pkg_mask()
- backtracked = True
- elif backtracked and allow_backtracking:
- # Backtracking failed, so disable it and do
- # a plain dep calculation + error message.
- allow_backtracking = False
- runtime_pkg_mask = None
- else:
- if show_spinner:
- print "\b\b... done!"
- mydepgraph.display_problems()
- return 1
- else:
- break
-
- del frozen_config, runtime_pkg_mask
+ try:
+ success, mydepgraph, favorites = backtrack_depgraph(
+ settings, trees, myopts, myparams, myaction, myfiles, spinner)
+ except portage.exception.PackageSetNotFound, e:
+ if show_spinner:
+ print "\b\b... done!"
+ root_config = trees[settings["ROOT"]]["root_config"]
+ display_missing_pkg_set(root_config, e.value)
+ return 1
if show_spinner:
print "\b\b... done!"
+ if not success:
+ mydepgraph.display_problems()
+ return 1
+
if "--pretend" not in myopts and \
("--ask" in myopts or "--tree" in myopts or \
"--verbose" in myopts) and \
chk_updated_cfg_files("/", settings.get("CONFIG_PROTECT","").split())
if myaction != "metadata":
- if os.access(portage.USER_CONFIG_PATH + "/bin/post_sync", os.X_OK):
+ postsync = os.path.join(settings["PORTAGE_CONFIGROOT"],
+ portage.USER_CONFIG_PATH, "bin", "post_sync")
+ if os.access(postsync, os.X_OK):
retval = portage.process.spawn(
- [os.path.join(portage.USER_CONFIG_PATH, "bin", "post_sync"),
- dosyncuri], env=settings.environ())
+ [postsync, dosyncuri], env=settings.environ())
if retval != os.EX_OK:
- print red(" * ")+bold("spawn failed of "+ portage.USER_CONFIG_PATH + "/bin/post_sync")
+ print red(" * ") + bold("spawn failed of " + postsync)
if(mybestpv != mypvs) and not "--quiet" in myopts:
print
from _emerge.BlockerDepPriority import BlockerDepPriority
from _emerge.changelog import calc_changelog
from _emerge.countdown import countdown
+from _emerge.create_depgraph_params import create_depgraph_params
from _emerge.create_world_atom import create_world_atom
from _emerge.Dependency import Dependency
from _emerge.DependencyArg import DependencyArg
fakedb = PackageVirtualDbapi(vardb.settings)
if preload_installed_pkgs:
for pkg in vardb:
- depgraph._frozen_config.spinner.update()
+ depgraph._spinner_update()
# This triggers metadata updates via FakeVartree.
vardb.aux_get(pkg.cpv, [])
fakedb.cpv_inject(pkg)
self._select_atoms = self._select_atoms_highest_available
self._select_package = self._select_pkg_highest_available
+ def _spinner_update(self):
+ if self._frozen_config.spinner:
+ self._frozen_config.spinner.update()
+
def _show_missed_update(self):
if '--quiet' in self._frozen_config.myopts and \
missed_updates = {}
for pkg, mask_reasons in \
self._dynamic_config._runtime_pkg_mask.iteritems():
- if mask_reasons.get("slot conflict"):
- if pkg.slot_atom in missed_updates:
- other_pkg, parent_atoms = missed_updates[pkg.slot_atom]
- if other_pkg > pkg:
- continue
- missed_updates[pkg.slot_atom] = \
- (pkg, mask_reasons["slot conflict"])
+ if pkg.installed:
+ # Exclude installed here since we only
+ # want to show available updates.
+ continue
+ if pkg.slot_atom in missed_updates:
+ other_pkg, parent_atoms = missed_updates[pkg.slot_atom]
+ if other_pkg > pkg:
+ continue
+ for mask_type, parent_atoms in mask_reasons.iteritems():
+ if not parent_atoms:
+ continue
+ missed_updates[pkg.slot_atom] = (pkg, parent_atoms)
+ break
if not missed_updates:
return
dep_stack = self._dynamic_config._dep_stack
dep_disjunctive_stack = self._dynamic_config._dep_disjunctive_stack
while dep_stack or dep_disjunctive_stack:
- self._frozen_config.spinner.update()
+ self._spinner_update()
while dep_stack:
dep = dep_stack.pop()
if isinstance(dep, Package):
return 1
self._dynamic_config._unsatisfied_deps_for_display.append(
((dep.root, dep.atom), {"myparent":dep.parent}))
+
+ # The parent node should not already be in
+ # runtime_pkg_mask, since that would trigger an
+ # infinite backtracking loop.
+ if self._dynamic_config._allow_backtracking:
+ if dep.parent in self._dynamic_config._runtime_pkg_mask:
+ if "--debug" in self._frozen_config.myopts:
+ writemsg(
+ "!!! backtracking loop detected: %s %s\n" % \
+ (dep.parent,
+ self._dynamic_config._runtime_pkg_mask[
+ dep.parent]), noiselevel=-1)
+ else:
+ self._dynamic_config._runtime_pkg_mask.setdefault(
+ dep.parent, {})["missing dependency"] = \
+ set([(dep.parent, dep.atom)])
+ self._dynamic_config._need_restart = True
+
return 0
# In some cases, dep_check will return deps that shouldn't
# be proccessed any further, so they are identified and
elif pkg.installed and not recurse:
dep_stack = self._dynamic_config._ignored_deps
- self._frozen_config.spinner.update()
+ self._spinner_update()
if not previously_added:
dep_stack.append(pkg)
virtuals = pkgsettings.getvirtuals()
for arg in self._dynamic_config._initial_arg_list:
for atom in arg.set:
- self._frozen_config.spinner.update()
+ self._spinner_update()
dep = Dependency(atom=atom, onlydeps=onlydeps,
root=myroot, parent=arg)
atom_cp = portage.dep_getkey(atom)
# If this node has any blockers, create a "nomerge"
# node for it so that they can be enforced.
- self._frozen_config.spinner.update()
+ self._spinner_update()
blocker_data = blocker_cache.get(cpv)
if blocker_data is not None and \
blocker_data.counter != long(pkg.metadata["COUNTER"]):
self._dynamic_config.digraph.difference_update(previous_uninstall_tasks)
for blocker in self._dynamic_config._blocker_parents.leaf_nodes():
- self._frozen_config.spinner.update()
+ self._spinner_update()
root_config = self._frozen_config.roots[blocker.root]
virtuals = root_config.settings.getvirtuals()
myroot = blocker.root
node.installed or node.onlydeps:
removed_nodes.add(node)
if removed_nodes:
- self._frozen_config.spinner.update()
+ self._spinner_update()
mygraph.difference_update(removed_nodes)
if not removed_nodes:
break
# unresolved blockers or circular dependencies.
while not mygraph.empty():
- self._frozen_config.spinner.update()
+ self._spinner_update()
selected_nodes = None
ignore_priority = None
if drop_satisfied or (prefer_asap and asap_nodes):
fakedb[myroot].cpv_inject(pkg)
serialized_tasks.append(pkg)
- self._frozen_config.spinner.update()
+ self._spinner_update()
if self._dynamic_config._unsatisfied_deps_for_display:
return False
ret = None
return ret
+def backtrack_depgraph(settings, trees, myopts, myparams,
+ myaction, myfiles, spinner):
+ """
+ Raises PackageSetNotFound if myfiles contains a missing package set.
+ """
+ runtime_pkg_mask = None
+ allow_backtracking = True
+ backtracked = False
+ frozen_config = _frozen_depgraph_config(settings, trees,
+ myopts, spinner)
+ while True:
+ mydepgraph = depgraph(settings, trees, myopts, myparams, spinner,
+ frozen_config=frozen_config,
+ allow_backtracking=allow_backtracking,
+ runtime_pkg_mask=runtime_pkg_mask)
+ success, favorites = mydepgraph.select_files(myfiles)
+ if not success:
+ if mydepgraph.need_restart():
+ runtime_pkg_mask = mydepgraph.get_runtime_pkg_mask()
+ backtracked = True
+ elif backtracked and allow_backtracking:
+ # Backtracking failed, so disable it and do
+ # a plain dep calculation + error message.
+ allow_backtracking = False
+ runtime_pkg_mask = None
+ else:
+ break
+ else:
+ break
+ return (success, mydepgraph, favorites)
+
def resume_depgraph(settings, trees, mtimedb, myopts, myparams, spinner):
"""
Construct a depgraph for the given resume list. This will raise
self._dbs.append(vardb)
self._portdb = portdb
+ def _spinner_update(self):
+ if self.spinner:
+ self.spinner.update()
+
def _cp_all(self):
cp_all = set()
for db in self._dbs:
else:
self.searchre=re.compile(re.escape(self.searchkey), re.I)
for package in self.portdb.cp_all():
- self.spinner.update()
+ self._spinner_update()
if match_category:
match_string = package[:]
self.sdict = self.setconfig.getSets()
for setname in self.sdict:
- self.spinner.update()
+ self._spinner_update()
if match_category:
match_string = setname
else:
if not config_profile_path:
config_profile_path = \
- os.path.join(config_root, PROFILE_PATH.lstrip(os.path.sep))
+ os.path.join(config_root, PROFILE_PATH)
if os.path.isdir(config_profile_path):
self.profile_path = config_profile_path
else:
self.module_priority = ["user","default"]
self.modules = {}
self.modules["user"] = getconfig(
- os.path.join(config_root, MODULES_FILE_PATH.lstrip(os.path.sep)))
+ os.path.join(config_root, MODULES_FILE_PATH))
if self.modules["user"] is None:
self.modules["user"] = {}
self.modules["default"] = {
self.profiles = []
if local_config and self.profiles:
custom_prof = os.path.join(
- config_root, CUSTOM_PROFILE_PATH.lstrip(os.path.sep))
+ config_root, CUSTOM_PROFILE_PATH)
if os.path.exists(custom_prof):
self.user_profile_dir = custom_prof
self.profiles.append(custom_prof)
del rawpuseforce
make_conf = getconfig(
- os.path.join(config_root, MAKE_CONF_FILE.lstrip(os.path.sep)),
+ os.path.join(config_root, MAKE_CONF_FILE),
tolerant=tolerant, allow_sourcing=True)
if make_conf is None:
make_conf = {}
self.configdict["defaults"]=self.configlist[-1]
self.mygcfg = getconfig(
- os.path.join(config_root, MAKE_CONF_FILE.lstrip(os.path.sep)),
+ os.path.join(config_root, MAKE_CONF_FILE),
tolerant=tolerant, allow_sourcing=True, expand=expand_map)
if self.mygcfg is None:
self.mygcfg = {}
self.pkeywordsdict = {}
self._plicensedict = {}
self.punmaskdict = {}
- abs_user_config = os.path.join(config_root,
- USER_CONFIG_PATH.lstrip(os.path.sep))
+ abs_user_config = os.path.join(config_root, USER_CONFIG_PATH)
# locations for "categories" and "arch.list" files
locations = [os.path.join(self["PORTDIR"], "profiles")]
("sandbox" in self.features or "usersandbox" in self.features):
if self.profile_path is not None and \
os.path.realpath(self.profile_path) == \
- os.path.realpath(PROFILE_PATH):
+ os.path.realpath(os.path.join(config_root, PROFILE_PATH)):
""" Don't show this warning when running repoman and the
sandbox feature came from a profile that doesn't belong to
the user."""
noiselevel=-1)
abs_profile_path = os.path.join(self["PORTAGE_CONFIGROOT"],
- PROFILE_PATH.lstrip(os.path.sep))
+ PROFILE_PATH)
if not self.profile_path or (not os.path.islink(abs_profile_path) and \
not os.path.exists(os.path.join(abs_profile_path, "parent")) and \
os.path.exists(os.path.join(self["PORTDIR"], "profiles"))):
writemsg("!!! (You can safely ignore this message when syncing. It's harmless.)\n\n\n")
abs_user_virtuals = os.path.join(self["PORTAGE_CONFIGROOT"],
- USER_VIRTUALS_FILE.lstrip(os.path.sep))
+ USER_VIRTUALS_FILE)
if os.path.exists(abs_user_virtuals):
writemsg("\n!!! /etc/portage/virtuals is deprecated in favor of\n")
writemsg("!!! /etc/portage/profile/virtuals. Please move it to\n")
# Use the calculated USE flags to regenerate the USE_EXPAND flags so
# that they are consistent. For optimal performance, use slice
# comparison instead of startswith().
- use_expand_split = self.get("USE_EXPAND", "").split()
+ use_expand_split = set(x.lower() for \
+ x in self.get('USE_EXPAND', '').split())
lazy_use_expand = self._lazy_use_expand(use, self.usemask,
iuse_implicit, use_expand_split, self._use_expand_dict)
- use_expand_iuse = set()
- for key in use_expand_split:
- prefix = key.lower() + '_'
- prefix_len = len(prefix)
- expand_flags = set( x[prefix_len:] for x in use \
- if x[:prefix_len] == prefix )
- use_expand_iuse.clear()
- for x in iuse_implicit:
- if x[:prefix_len] == prefix:
- use_expand_iuse.add(x)
- # * means to enable everything in IUSE that's not masked
- if use_expand_iuse and '*' in expand_flags:
- for x in use_expand_iuse:
- if x not in usemask:
- use.add(x)
- if use_expand_iuse:
- self.configdict['env'].addLazySingleton(
- key, lazy_use_expand.__getitem__, key)
- else:
- # It's not in IUSE, so just allow the variable content
- # to pass through if it is defined somewhere. This
- # allows packages that support LINGUAS but don't
- # declare it in IUSE to use the variable outside of the
- # USE_EXPAND context.
- pass
+
+ use_expand_iuses = {}
+ for x in iuse_implicit:
+ x_split = x.split('_')
+ if len(x_split) == 1:
+ continue
+ for i in xrange(len(x_split) - 1):
+ k = '_'.join(x_split[:i+1])
+ if k in use_expand_split:
+ v = use_expand_iuses.get(k)
+ if v is None:
+ v = set()
+ use_expand_iuses[k] = v
+ v.add(x)
+ break
+
+ # If it's not in IUSE, variable content is allowed
+ # to pass through if it is defined somewhere. This
+ # allows packages that support LINGUAS but don't
+ # declare it in IUSE to use the variable outside of the
+ # USE_EXPAND context.
+ for k, use_expand_iuse in use_expand_iuses.iteritems():
+ if k + '_*' in use:
+ use.update( x for x in use_expand_iuse if x not in usemask )
+ k = k.upper()
+ self.configdict['env'].addLazySingleton(k,
+ lazy_use_expand.__getitem__, k)
# Filtered for the ebuild environment. Store this in a separate
# attribute since we still want to be able to see global USE
check_config_instance(mysettings)
custommirrors = grabdict(os.path.join(mysettings["PORTAGE_CONFIGROOT"],
- CUSTOM_MIRRORS_FILE.lstrip(os.path.sep)), recursive=1)
+ CUSTOM_MIRRORS_FILE), recursive=1)
mymirrors=[]
mysettings["T"] = os.path.join(mysettings["PORTAGE_BUILDDIR"], "temp")
mysettings["PORTAGE_BASHRC"] = os.path.join(
- mysettings["PORTAGE_CONFIGROOT"], EBUILD_SH_ENV_FILE.lstrip(os.path.sep))
+ mysettings["PORTAGE_CONFIGROOT"], EBUILD_SH_ENV_FILE)
mysettings["EBUILD_EXIT_STATUS_FILE"] = os.path.join(
mysettings["PORTAGE_BUILDDIR"], ".exit_status")
if os.path.isdir(profdir):
locations.append(profdir)
locations.append(os.path.join(settings["PORTAGE_CONFIGROOT"],
- USER_CONFIG_PATH.lstrip(os.path.sep)))
+ USER_CONFIG_PATH))
locations.reverse()
pmasklists = [(x, grablines(os.path.join(x, "package.mask"), recursive=1)) for x in locations]
selinux_enabled = settings.selinux_enabled()
thirdpartymirrors = settings.thirdpartymirrors()
usedefaults = settings.use_defs
- profiledir = None
- if os.path.isdir(PROFILE_PATH):
- profiledir = PROFILE_PATH
+ profiledir = os.path.join(settings["PORTAGE_CONFIGROOT"], PROFILE_PATH)
+ if not os.path.isdir(profiledir):
+ profiledir = None
def flushmtimedb(record):
writemsg("portage.flushmtimedb() is DEPRECATED\n")
# ========================================================================
# portage: Constants
-# Copyright 1998-2004 Gentoo Foundation
+# Copyright 1998-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
import os
# constants (like VDB_PATH) DO have EPREFIX.
# Unfortunately this file is ordered quite horrible in this respect.
-VDB_PATH = EPREFIX_LSTRIP+os.path.sep+"var/db/pkg"
-PRIVATE_PATH = "var/lib/portage"
-CACHE_PATH = EPREFIX+"/var/cache/edb"
-DEPCACHE_PATH = CACHE_PATH+"/dep"
-
-USER_CONFIG_PATH = "/etc/portage"
-MODULES_FILE_PATH = USER_CONFIG_PATH+"/modules"
-CUSTOM_PROFILE_PATH = USER_CONFIG_PATH+"/profile"
-GLOBAL_CONFIG_PATH = DATADIR+"/portage/config"
-
-#PORTAGE_BASE_PATH = "/usr/lib/portage"
-PORTAGE_BASE_PATH = PORTAGE_BASE
-PORTAGE_BIN_PATH = PORTAGE_BASE_PATH+"/bin"
-PORTAGE_PYM_PATH = PORTAGE_BASE_PATH+"/pym"
-PORTAGE_PACKAGE_ATOM = "sys-apps/portage"
-NEWS_LIB_PATH = EPREFIX+"/var/lib/gentoo"
-PROFILE_PATH = "/etc/make.profile"
-LOCALE_DATA_PATH = PORTAGE_BASE_PATH+"/locale"
-
-EBUILD_SH_BINARY = PORTAGE_BIN_PATH+"/ebuild.sh"
-MISC_SH_BINARY = PORTAGE_BIN_PATH+"/misc-functions.sh"
-SANDBOX_BINARY = BPREFIX+"/usr/bin/sandbox"
-FAKEROOT_BINARY = BPREFIX+"/usr/bin/fakeroot"
-BASH_BINARY = PORTAGE_BASH
-MOVE_BINARY = PORTAGE_MV
-PRELINK_BINARY = EPREFIX+"/usr/sbin/prelink"
-
-WORLD_FILE = PRIVATE_PATH + "/world"
-MAKE_CONF_FILE = "/etc/make.conf"
-MAKE_DEFAULTS_FILE = PROFILE_PATH + "/make.defaults"
-DEPRECATED_PROFILE_FILE = PROFILE_PATH+"/deprecated"
-USER_VIRTUALS_FILE = USER_CONFIG_PATH+"/virtuals"
-EBUILD_SH_ENV_FILE = USER_CONFIG_PATH+"/bashrc"
-INVALID_ENV_FILE = "/etc/spork/is/not/valid/profile.env"
-CUSTOM_MIRRORS_FILE = USER_CONFIG_PATH+"/mirrors"
-CONFIG_MEMORY_FILE = PRIVATE_PATH + "/config"
-COLOR_MAP_FILE = USER_CONFIG_PATH + "/color.map"
-
-REPO_NAME_FILE = "repo_name"
-REPO_NAME_LOC = "profiles" + "/" + REPO_NAME_FILE
-
-INCREMENTALS = ["USE", "USE_EXPAND", "USE_EXPAND_HIDDEN", "FEATURES",
- "ACCEPT_KEYWORDS",
- "CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
- "PRELINK_PATH", "PRELINK_PATH_MASK", "PROFILE_ONLY_VARIABLES"]
-EBUILD_PHASES = ["setup", "unpack", "prepare", "configure",
- "compile", "test", "install",
- "package", "preinst", "postinst","prerm", "postrm",
- "nofetch", "config", "info", "other"]
-
-EAPI = 2
+VDB_PATH = EPREFIX_LSTRIP+os.path.sep+"var/db/pkg"
+PRIVATE_PATH = "var/lib/portage"
+CACHE_PATH = EPREFIX+"/var/cache/edb"
+DEPCACHE_PATH = CACHE_PATH+"/dep"
+
+USER_CONFIG_PATH = "etc/portage"
+MODULES_FILE_PATH = USER_CONFIG_PATH+"/modules"
+CUSTOM_PROFILE_PATH = USER_CONFIG_PATH+"/profile"
+GLOBAL_CONFIG_PATH = DATADIR+"/portage/config"
+
+PORTAGE_BASE_PATH = PORTAGE_BASE
+PORTAGE_BIN_PATH = PORTAGE_BASE_PATH+"/bin"
+PORTAGE_PYM_PATH = PORTAGE_BASE_PATH+"/pym"
+PORTAGE_PACKAGE_ATOM = "sys-apps/portage"
+NEWS_LIB_PATH = EPREFIX+"/var/lib/gentoo"
+PROFILE_PATH = "etc/make.profile"
+LOCALE_DATA_PATH = PORTAGE_BASE_PATH+"/locale"
+
+EBUILD_SH_BINARY = PORTAGE_BIN_PATH+"/ebuild.sh"
+MISC_SH_BINARY = PORTAGE_BIN_PATH + "/misc-functions.sh"
+SANDBOX_BINARY = BPREFIX+"/usr/bin/sandbox"
+FAKEROOT_BINARY = BPREFIX+"/usr/bin/fakeroot"
+BASH_BINARY = PORTAGE_BASH
+MOVE_BINARY = PORTAGE_MV
+PRELINK_BINARY = EPREFIX+"/usr/sbin/prelink"
+
+WORLD_FILE = PRIVATE_PATH + "/world"
+MAKE_CONF_FILE = "etc/make.conf"
+MAKE_DEFAULTS_FILE = PROFILE_PATH + "/make.defaults"
+DEPRECATED_PROFILE_FILE = PROFILE_PATH+"/deprecated"
+USER_VIRTUALS_FILE = USER_CONFIG_PATH+"/virtuals"
+EBUILD_SH_ENV_FILE = USER_CONFIG_PATH+"/bashrc"
+INVALID_ENV_FILE = "/etc/spork/is/not/valid/profile.env"
+CUSTOM_MIRRORS_FILE = USER_CONFIG_PATH+"/mirrors"
+CONFIG_MEMORY_FILE = PRIVATE_PATH + "/config"
+COLOR_MAP_FILE = USER_CONFIG_PATH + "/color.map"
+
+REPO_NAME_FILE = "repo_name"
+REPO_NAME_LOC = "profiles" + "/" + REPO_NAME_FILE
+
+INCREMENTALS = ["USE", "USE_EXPAND", "USE_EXPAND_HIDDEN",
+ "FEATURES", "ACCEPT_KEYWORDS",
+ "CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
+ "PRELINK_PATH", "PRELINK_PATH_MASK",
+ "PROFILE_ONLY_VARIABLES"]
+EBUILD_PHASES = ["setup", "unpack", "prepare", "configure",
+ "compile", "test", "install",
+ "package", "preinst", "postinst","prerm", "postrm",
+ "nofetch", "config", "info", "other"]
+
+EAPI = 2
HASHING_BLOCKSIZE = 32768
MANIFEST1_HASH_FUNCTIONS = ["MD5","SHA256","RMD160"]
MANIFEST2_HASH_FUNCTIONS = ["SHA1","SHA256","RMD160"]
-MANIFEST1_REQUIRED_HASH = "MD5"
-MANIFEST2_REQUIRED_HASH = "SHA1"
+MANIFEST1_REQUIRED_HASH = "MD5"
+MANIFEST2_REQUIRED_HASH = "SHA1"
-MANIFEST2_IDENTIFIERS = ["AUX","MISC","DIST","EBUILD"]
+MANIFEST2_IDENTIFIERS = ["AUX","MISC","DIST","EBUILD"]
# ===========================================================================
# END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANT
# ===========================================================================
protected = self.isprotected(mydest)
if mydmode != None:
# destination file exists
+ cfgprot = 0
if stat.S_ISDIR(mydmode):
# install of destination is blocked by an existing directory with the same name
cfgprot = 1
showMessage("!!! %s\n" % mydest,
level=logging.ERROR, noiselevel=-1)
elif stat.S_ISREG(mydmode) or (stat.S_ISLNK(mydmode) and os.path.exists(mydest) and stat.S_ISREG(os.stat(mydest)[stat.ST_MODE])):
- cfgprot = 0
# install of destination is blocked by an existing regular file,
# or by a symlink to an existing regular file;
# now, config file management may come into play.
@rtype: dict
@return: a dictionary mapping color classes to color codes
"""
- myfile = EPREFIX + COLOR_MAP_FILE
+ # FIXME: use config_root iso / (breaks Prefix)
+ # We can use ObjectProxy to implement lazy initialization of
+ # codes and _styles, and add an init(config_root="/") function
+ # that can be called in order adjust the location that color.map
+ # is read from.
+ global codes, _styles
+ myfile = os.path.join(EPREFIX, COLOR_MAP_FILE)
ansi_code_pattern = re.compile("^[0-9;]*m$")
quotes = '\'"'
def strip_quotes(token):
setconfigpaths.append(os.path.join(settings["PORTDIR"], "sets.conf"))
setconfigpaths += [os.path.join(x, "sets.conf") for x in settings["PORTDIR_OVERLAY"].split()]
setconfigpaths.append(os.path.join(settings["PORTAGE_CONFIGROOT"],
- USER_CONFIG_PATH.lstrip(os.path.sep), "sets.conf"))
+ USER_CONFIG_PATH, "sets.conf"))
return SetConfig(setconfigpaths, settings, trees)
# adhoc test code
def multiBuilder(self, options, settings, trees):
rValue = {}
- directory = options.get("directory", os.path.join(settings["PORTAGE_CONFIGROOT"], USER_CONFIG_PATH.lstrip(os.sep), "sets"))
+ directory = options.get("directory",
+ os.path.join(settings["PORTAGE_CONFIGROOT"],
+ USER_CONFIG_PATH, "sets"))
name_pattern = options.get("name_pattern", "${name}")
if not "$name" in name_pattern and not "${name}" in name_pattern:
raise SetConfigError(_("name_pattern doesn't include ${name} placeholder"))
def multiBuilder(self, options, settings, trees):
rValue = {}
- directory = options.get("directory", os.path.join(settings["PORTAGE_CONFIGROOT"], USER_CONFIG_PATH.lstrip(os.sep)))
+ directory = options.get("directory",
+ os.path.join(settings["PORTAGE_CONFIGROOT"], USER_CONFIG_PATH))
name_pattern = options.get("name_pattern", "sets/package_$suffix")
if not "$suffix" in name_pattern and not "${suffix}" in name_pattern:
raise SetConfigError(_("name_pattern doesn't include $suffix placeholder"))
myxfiles = ["package.mask", "package.unmask", \
"package.keywords", "package.use"]
myxfiles += [os.path.join("profile", x) for x in myxfiles]
- abs_user_config = os.path.join(config_root,
- USER_CONFIG_PATH.lstrip(os.path.sep))
+ abs_user_config = os.path.join(config_root, USER_CONFIG_PATH)
recursivefiles = []
for x in myxfiles:
config_file = os.path.join(abs_user_config, x)