From f16aee82cefa95e9903fa46f448d30f6d4350f64 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Tue, 7 Apr 2009 01:27:54 +0000 Subject: [PATCH] Add support to repoman for using layout.conf to control which repositories are used to satisfy dependencies. Thanks to Alistair Bush for the initial patch. See the "QA Overlay Layout support" thread on the gentoo-dev mailing list for more information: http://archives.gentoo.org/gentoo-dev/msg_33c61550b4ed2b7b25dd5a4110e1ec81.xml svn path=/main/trunk/; revision=13295 --- bin/repoman | 59 ++++++++++++++++++++--------------- pym/_emerge/__init__.py | 5 ++- 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) -- 2.26.2