From d13123dca95671cc6469b6cd76016cf94f048d51 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Mon, 13 Jul 2009 19:41:18 +0000 Subject: [PATCH] Merged from trunk -r13813:13824 | 13814 | Assign 'cfgprot' before referencing it. Reported by Thomas | | arfrever | Sachau. | | 13815 | Optimize USE_EXPAND -> USE code inside config.setcpv(). | | zmedico | Thanks to Marat Radchenko for | | | this patch from bug #276813. | | 13816 | Bug #137562 - Implement backtracking for missing | | zmedico | dependencies. Thanks to Sebastian Mingramm (few) | | | for the initial patch which only needed | | | minor changes. | | 13817 | Eliminate duplicate code inside | | zmedico | depgraph._show_missed_update(). | | 13818 | Move the backtracking code from action_build() to a new | | zmedico | backtrack_depgraph() function. | | 13819 | In depgraph._show_missed_update(), don't show installed | | zmedico | packages since we only want to show available updates. | | 13820 | Improve description of QA_DT_HASH. | | arfrever | | | 13821 | Remove leading slash from appropriate paths inside | | zmedico | portage.const, so that lstrip(os.sep) is not needed for | | | os.path.join() calls. Thanks to Fabian Groffen | | | for this patch. | | 13822 | Allow search and depgraph to avoid spinner by using | | volkmar | spinner=None | | 13823 | Optimize USE_EXPAND -> USE code inside config.setcpv(). | | zmedico | Thanks to Marat Radchenko for | | | the initial patch from bug #276813. | | 13824 | fix up spacing, remove commented out code, fix copyright | | grobian | (sort of see-if-I-can-commit test) | svn path=/main/branches/prefix/; revision=13825 --- man/ebuild.5 | 3 + pym/_emerge/actions.py | 61 ++++++------------- pym/_emerge/depgraph.py | 92 ++++++++++++++++++++++++----- pym/_emerge/search.py | 8 ++- pym/portage/__init__.py | 86 ++++++++++++++------------- pym/portage/const.py | 110 +++++++++++++++++------------------ pym/portage/dbapi/vartree.py | 2 +- pym/portage/output.py | 8 ++- pym/portage/sets/__init__.py | 2 +- pym/portage/sets/files.py | 7 ++- pym/portage/update.py | 3 +- 11 files changed, 218 insertions(+), 164 deletions(-) diff --git a/man/ebuild.5 b/man/ebuild.5 index 621a51a43..90b94f0cc 100644 --- a/man/ebuild.5 +++ b/man/ebuild.5 @@ -502,6 +502,9 @@ The paths may contain regular expressions. 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 diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 0ad504ae1..9a7cbeeca 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -42,7 +42,7 @@ from _emerge.clear_caches import clear_caches 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 @@ -303,48 +303,24 @@ def action_build(settings, trees, mtimedb, 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 \ @@ -2277,12 +2253,13 @@ def action_sync(settings, trees, mtimedb, myopts, myaction): 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 diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index b53fd98b6..b05cb46e5 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -32,6 +32,7 @@ from _emerge.BlockerCache import BlockerCache 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 @@ -178,7 +179,7 @@ class _dynamic_depgraph_config(object): 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) @@ -267,6 +268,10 @@ class depgraph(object): 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 \ @@ -276,13 +281,19 @@ class depgraph(object): 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 @@ -593,7 +604,7 @@ class depgraph(object): 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): @@ -642,6 +653,24 @@ class depgraph(object): 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 @@ -871,7 +900,7 @@ class depgraph(object): 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) @@ -1469,7 +1498,7 @@ class depgraph(object): 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) @@ -2453,7 +2482,7 @@ class depgraph(object): # 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"]): @@ -2549,7 +2578,7 @@ class depgraph(object): 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 @@ -2823,7 +2852,7 @@ class depgraph(object): 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 @@ -2971,7 +3000,7 @@ class depgraph(object): # 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): @@ -4517,7 +4546,7 @@ class depgraph(object): 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 @@ -4869,6 +4898,37 @@ def insert_category_into_atom(atom, category): 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 diff --git a/pym/_emerge/search.py b/pym/_emerge/search.py index 750564197..c58a0d518 100644 --- a/pym/_emerge/search.py +++ b/pym/_emerge/search.py @@ -68,6 +68,10 @@ class search(object): 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: @@ -203,7 +207,7 @@ class search(object): 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[:] @@ -236,7 +240,7 @@ class search(object): self.sdict = self.setconfig.getSets() for setname in self.sdict: - self.spinner.update() + self._spinner_update() if match_category: match_string = setname else: diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 1c0a706f1..307a278bb 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -1316,7 +1316,7 @@ class config(object): 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: @@ -1332,7 +1332,7 @@ class config(object): 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"] = { @@ -1396,7 +1396,7 @@ class config(object): 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) @@ -1472,7 +1472,7 @@ class config(object): 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 = {} @@ -1568,7 +1568,7 @@ class config(object): 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 = {} @@ -1621,8 +1621,7 @@ class config(object): 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")] @@ -1849,7 +1848,7 @@ class config(object): ("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.""" @@ -1975,7 +1974,7 @@ class config(object): 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"))): @@ -1985,7 +1984,7 @@ class config(object): 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") @@ -2402,34 +2401,37 @@ class config(object): # 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 @@ -3810,7 +3812,7 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks", 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=[] @@ -5462,7 +5464,7 @@ def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, m 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") @@ -7559,7 +7561,7 @@ def getmaskingreason(mycpv, metadata=None, settings=None, portdb=None, return_lo 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] @@ -8473,9 +8475,9 @@ def init_legacy_globals(): 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") # ======================================================================== diff --git a/pym/portage/const.py b/pym/portage/const.py index 849ba6041..7fd48af1c 100644 --- a/pym/portage/const.py +++ b/pym/portage/const.py @@ -1,5 +1,5 @@ # 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 @@ -34,66 +34,66 @@ EPREFIX_LSTRIP = EPREFIX.lstrip(os.path.sep) # 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 # =========================================================================== diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 62fcd9b44..c96cf2acc 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -4366,13 +4366,13 @@ class dblink(object): 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. diff --git a/pym/portage/output.py b/pym/portage/output.py index 771a28ea7..5e3d3d518 100644 --- a/pym/portage/output.py +++ b/pym/portage/output.py @@ -150,7 +150,13 @@ def _parse_color_map(onerror=None): @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): diff --git a/pym/portage/sets/__init__.py b/pym/portage/sets/__init__.py index 80aa608f6..2d85007ec 100644 --- a/pym/portage/sets/__init__.py +++ b/pym/portage/sets/__init__.py @@ -192,7 +192,7 @@ def load_default_config(settings, trees): 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 diff --git a/pym/portage/sets/files.py b/pym/portage/sets/files.py index 5e5f2bc1a..95613ac47 100644 --- a/pym/portage/sets/files.py +++ b/pym/portage/sets/files.py @@ -110,7 +110,9 @@ class StaticFileSet(EditablePackageSet): 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")) @@ -162,7 +164,8 @@ class ConfigFileSet(PackageSet): 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")) diff --git a/pym/portage/update.py b/pym/portage/update.py index 70ff68664..c7001803a 100644 --- a/pym/portage/update.py +++ b/pym/portage/update.py @@ -152,8 +152,7 @@ def update_config_files(config_root, protect, protect_mask, update_iter): 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) -- 2.26.2