diff options
-rwxr-xr-x | bin/repoman | 59 | ||||
-rw-r--r-- | pym/_emerge/__init__.py | 5 | ||||
-rw-r--r-- | pym/portage/dbapi/porttree.py | 12 |
3 files changed, 48 insertions, 28 deletions
diff --git a/bin/repoman b/bin/repoman index 27d65e9f9..86573bdb9 100755 --- a/bin/repoman +++ b/bin/repoman @@ -479,31 +479,35 @@ if options.mode == 'commit' and not options.pretend and not vcs: logging.info("Not in a version controlled repository; enabling pretend mode.") options.pretend = True -os.environ["PORTDIR"] = portdir -if portdir_overlay != portdir: - os.environ["PORTDIR_OVERLAY"] = portdir_overlay -else: - os.environ["PORTDIR_OVERLAY"] = "" +# Ensure that PORTDIR_OVERLAY contains the repository corresponding to $PWD. +repoman_settings = portage.config(local_config=False) +repoman_settings['PORTDIR_OVERLAY'] = "%s %s" % \ + (repoman_settings.get('PORTDIR_OVERLAY', ''), portdir_overlay) +repoman_settings.backup_changes('PORTDIR_OVERLAY') + +root = '/' +trees = { + root : {'porttree' : portage.portagetree(root, settings=repoman_settings)} +} +portdb = trees[root]['porttree'].dbapi + +# Constrain dependency resolution to the master(s) +# that are specified in layout.conf. +portdir_overlay = os.path.realpath(portdir_overlay) +repo_info = portdb._repo_info[portdir_overlay] +portdb.porttrees = list(repo_info.eclass_db.porttrees) +portdir = portdb.porttrees[0] logging.info('Setting paths:') -logging.info('PORTDIR = "' + os.environ['PORTDIR'] + '"') -logging.info('PORTDIR_OVERLAY = "' + os.environ['PORTDIR_OVERLAY']+'"') +logging.info('PORTDIR = "' + portdir + '"') +logging.info('PORTDIR_OVERLAY = "%s"' % ' '.join(portdb.porttrees[1:])) -# Now that PORTDIR_OVERLAY is properly overridden, create the portdb. -repoman_settings = portage.config(local_config=False, - config_incrementals=portage.const.INCREMENTALS) -trees = portage.create_trees() -trees["/"]["porttree"].settings = repoman_settings -portdb = trees["/"]["porttree"].dbapi portdb.mysettings = repoman_settings -setconfig = load_default_config(repoman_settings, trees["/"]) -root_config = RootConfig(repoman_settings, trees["/"], setconfig) +root_config = RootConfig(repoman_settings, trees[root], None) # We really only need to cache the metadata that's necessary for visibility # filtering. Anything else can be discarded to reduce memory consumption. portdb._aux_cache_keys.clear() portdb._aux_cache_keys.update(["EAPI", "KEYWORDS", "SLOT"]) -# dep_zapdeps looks at the vardbapi, but it shouldn't for repoman. -del trees["/"]["vartree"] myreporoot = os.path.basename(portdir_overlay) myreporoot += mydir[len(portdir_overlay):] @@ -543,24 +547,27 @@ except (IOError, OSError, ParseError), e: logging.exception("Couldn't read USE flags from use.desc") sys.exit(1) -# retrieve a list of current licenses in portage +# get lists of valid keywords and licenses +kwlist = set(portage.grabfile(os.path.join(portdir, "profiles", "arch.list"))) liclist = set(portage.listdir(os.path.join(portdir, "licenses"))) + +if portdir_overlay != portdir: + for porttree in portdb.porttrees[1:]: + try: + liclist.update(os.listdir(os.path.join(porttree, "licenses"))) + except OSError: + pass + kwlist.update(portage.grabfile(os.path.join(porttree, + "profiles", "arch.list"))) + if not liclist: logging.fatal("Couldn't find licenses?") sys.exit(1) -if portdir_overlay != portdir: - liclist.update(portage.listdir(os.path.join(portdir_overlay, "licenses"))) -# retrieve list of offical keywords -kwlist = set(portage.grabfile(os.path.join(portdir, "profiles", "arch.list"))) if not kwlist: logging.fatal("Couldn't read KEYWORDS from arch.list") sys.exit(1) -if portdir_overlay != portdir: - kwlist.update(portage.grabfile( - os.path.join(portdir_overlay, "profiles", "arch.list"))) - scanlist=[] if repolevel==2: #we are inside a category directory diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 772a97de4..5ac88b11d 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -770,7 +770,10 @@ class RootConfig(object): self.iuse_implicit = tuple(sorted(settings._get_implicit_iuse())) self.root = self.settings["ROOT"] self.setconfig = setconfig - self.sets = self.setconfig.getSets() + if setconfig is None: + self.sets = {} + else: + self.sets = self.setconfig.getSets() self.visible_pkgs = PackageVirtualDbapi(self.settings) def create_world_atom(pkg, args_set, root_config): diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 29f1fe996..3cd8b2acb 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -190,8 +190,14 @@ class portdbapi(dbapi): level=logging.ERROR, noiselevel=-1) else: porttrees.append(master_path) + if not porttrees: - porttrees.append(porttree_root) + # Make PORTDIR the default master, but only if this + # repo doesn't provide profiles.desc itself. + profiles_desc = os.path.join(path, 'profiles', 'profiles.desc') + if not os.path.exists(profiles_desc): + porttrees.append(porttree_root) + porttrees.append(path) eclass_db = None @@ -227,11 +233,15 @@ class portdbapi(dbapi): db_ro=db_ro) else: for x in self.porttrees: + if x in self.auxdb: + continue # location, label, auxdbkeys self.auxdb[x] = self.auxdbmodule( self.depcachedir, x, filtered_auxdbkeys, gid=portage_gid) if "metadata-transfer" not in self.mysettings.features: for x in self.porttrees: + if x in self._pregen_auxdb: + continue if os.path.isdir(os.path.join(x, "metadata", "cache")): self._pregen_auxdb[x] = self.metadbmodule( x, "metadata/cache", filtered_auxdbkeys, readonly=True) |