Merged from trunk -r13813:13824
authorFabian Groffen <grobian@gentoo.org>
Mon, 13 Jul 2009 19:41:18 +0000 (19:41 -0000)
committerFabian Groffen <grobian@gentoo.org>
Mon, 13 Jul 2009 19:41:18 +0000 (19:41 -0000)
   | 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 <slonopotamusorama@gmail.com> for |
   |          | this patch from bug #276813.                                |

   | 13816    | Bug #137562 - Implement backtracking for missing            |
   | zmedico  | dependencies. Thanks to Sebastian Mingramm (few)            |
   |          | <s.mingramm@gmx.de> 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              |
   |          | <grobian@g.o> 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 <slonopotamusorama@gmail.com> 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
pym/_emerge/actions.py
pym/_emerge/depgraph.py
pym/_emerge/search.py
pym/portage/__init__.py
pym/portage/const.py
pym/portage/dbapi/vartree.py
pym/portage/output.py
pym/portage/sets/__init__.py
pym/portage/sets/files.py
pym/portage/update.py

index 621a51a43e13fb9dd96a0cb9ef809953cf2f2d70..90b94f0cca9251d5cc43c9bcda4764efe0d6cf64 100644 (file)
@@ -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
index 0ad504ae1c7584904d03775108f8179213efbf57..9a7cbeeca4d97d86c963699fb6ea5411ebfa2784 100644 (file)
@@ -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
index b53fd98b6b31bc1c4b60764597ce353087d87caf..b05cb46e56c4c24024ef6677cb50cddcd86bdd3a 100644 (file)
@@ -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
index 750564197894f35285dde138678533667a810d46..c58a0d51877ed638acee5377342728d0d8acaa85 100644 (file)
@@ -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:
index 1c0a706f11dd600871d89bc3593addf4d05ef4f0..307a278bb03db1640f59514b1958c6ee9d2910a1 100644 (file)
@@ -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")
        # ========================================================================
index 849ba604128b79f4c1ab549017c86694e42abe8c..7fd48af1c23a44a7dcc6bae631d6cd800fa7e2c1 100644 (file)
@@ -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
 # ===========================================================================
index 62fcd9b447e284b9fa5c8d5d6624477987b9d343..c96cf2acca1ca47960ab1b6dd753620194e1e430 100644 (file)
@@ -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.
index 771a28ea72fbc3ef21f97b4952be99cb7f5de5c6..5e3d3d5180924a8de5aef6d9da017945ca2fbd05 100644 (file)
@@ -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):
index 80aa608f68153a7557da9e9333060b378547b0f1..2d85007ec03a8c084b9813daa766fcf99f073429 100644 (file)
@@ -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
index 5e5f2bc1a529a1f877487ed8b932df1b72a76f2f..95613ac478f6532b15dda3f33de1b0d07e39949b 100644 (file)
@@ -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"))
index 70ff686643f57404e64bb39a3c765d483e86b28e..c7001803ac7995d35f4fdfb67c476d94963975a3 100644 (file)
@@ -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)