From 1fdeb78d08bac14f3f999f112499d179a87cf342 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 20 Jun 2011 18:08:59 -0700 Subject: config: repo-level make.defaults/package.use This completes the implementation of bug #370693. --- cnf/make.globals | 2 +- man/ebuild.5 | 5 +-- man/make.conf.5 | 5 ++- man/portage.5 | 2 ++ pym/portage/package/ebuild/_config/UseManager.py | 1 + pym/portage/package/ebuild/config.py | 45 +++++++++++++++++++++++- 6 files changed, 55 insertions(+), 5 deletions(-) diff --git a/cnf/make.globals b/cnf/make.globals index 2258fd2f2..2892d5089 100644 --- a/cnf/make.globals +++ b/cnf/make.globals @@ -106,7 +106,7 @@ CONFIG_PROTECT="/etc" CONFIG_PROTECT_MASK="/etc/env.d" # Disable auto-use -USE_ORDER="env:pkg:conf:defaults:pkginternal:env.d" +USE_ORDER="env:pkg:conf:defaults:pkginternal:repo:env.d" # Default ownership of installed files. PORTAGE_INST_UID="0" diff --git a/man/ebuild.5 b/man/ebuild.5 index bc5680fc9..20117e08d 100644 --- a/man/ebuild.5 +++ b/man/ebuild.5 @@ -246,8 +246,9 @@ is possible to prefix flags with + or - in order to create default settings that respectively enable or disable the corresponding \fBUSE\fR flags. For details about \fBUSE\fR flag stacking order, refer to the \fBUSE_ORDER\fR variable in \fBmake.conf\fR(5). Given the default \fBUSE_ORDER\fR setting, -negative IUSE default settings are ineffective since profile and user -configuration settings override them. +negative IUSE default settings are effective only for negation of +repo\-level USE settings, since profile and user configuration settings +override them. .TP \fBDEPEND\fR This should contain a list of all packages that are required for the diff --git a/man/make.conf.5 b/man/make.conf.5 index 86ac46231..fcb0954ea 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -838,7 +838,7 @@ in USE="foo_bar foo_bla". Names of \fBUSE_EXPAND\fR variables that should not be shown in the verbose merge list output of the \fBemerge\fR(1) command. .TP -\fBUSE_ORDER\fR = \fI"env:pkg:conf:defaults:pkginternal:env.d"\fR +\fBUSE_ORDER\fR = \fI"env:pkg:conf:defaults:pkginternal:repo:env.d"\fR Determines the precedence of layers in the incremental stacking of the USE variable. Precedence decreases from left to right such that env overrides pkg, pkg overrides conf, and so forth. @@ -866,6 +866,9 @@ USE from make.defaults and package.use in the profile (see \fBportage\fR(5)) .B pkginternal USE from \fBebuild\fR(5) IUSE defaults .TP +.B repo +USE from make.defaults and package.use in the repo (see \fBportage\fR(5)) +.TP .B env.d USE from the environment variables defined by files in \fI/etc/env.d/\fR .RE diff --git a/man/portage.5 b/man/portage.5 index 61f462309..b2b0eb12c 100644 --- a/man/portage.5 +++ b/man/portage.5 @@ -81,8 +81,10 @@ categories info_pkgs info_vars license_groups +make.defaults package.mask package.unmask +package.use package.use.force package.use.mask profiles.desc diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py index 3905f4fa1..de18500a9 100644 --- a/pym/portage/package/ebuild/_config/UseManager.py +++ b/pym/portage/package/ebuild/_config/UseManager.py @@ -53,6 +53,7 @@ class UseManager(object): self._repo_useforce_dict = self._parse_repository_files_to_dict_of_tuples("use.force", repositories) self._repo_pusemask_dict = self._parse_repository_files_to_dict_of_dicts("package.use.mask", repositories) self._repo_puseforce_dict = self._parse_repository_files_to_dict_of_dicts("package.use.force", repositories) + self._repo_puse_dict = self._parse_repository_files_to_dict_of_dicts("package.use", repositories) self._usemask_list = self._parse_profile_files_to_tuple_of_tuples("use.mask", profiles) self._useforce_list = self._parse_profile_files_to_tuple_of_tuples("use.force", profiles) diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py index b75a17716..6b7af51e9 100644 --- a/pym/portage/package/ebuild/config.py +++ b/pym/portage/package/ebuild/config.py @@ -206,6 +206,7 @@ class config(object): self.repositories = clone.repositories self._iuse_implicit_match = clone._iuse_implicit_match self._non_user_variables = clone._non_user_variables + self._repo_make_defaults = clone._repo_make_defaults self.usemask = clone.usemask self.useforce = clone.useforce self.puse = clone.puse @@ -229,6 +230,7 @@ class config(object): self.configdict = copy.deepcopy(clone.configdict) self.configlist = [ self.configdict['env.d'], + self.configdict['repo'], self.configdict['pkginternal'], self.configdict['globals'], self.configdict['defaults'], @@ -318,6 +320,9 @@ class config(object): self.configlist.append({}) self.configdict["env.d"] = self.configlist[-1] + self.configlist.append({}) + self.configdict["repo"] = self.configlist[-1] + self.configlist.append({}) self.configdict["pkginternal"] = self.configlist[-1] @@ -509,6 +514,14 @@ class config(object): locations_manager.set_port_dirs(self["PORTDIR"], self["PORTDIR_OVERLAY"]) + self._repo_make_defaults = {} + for repo in self.repositories.repos_with_profiles(): + d = getconfig(os.path.join(repo.location, "profiles", "make.defaults"), + expand=self.configdict["globals"].copy()) or {} + for blacklisted in self._env_blacklist: + d.pop(blacklisted, None) + self._repo_make_defaults[repo.name] = d + #Read package.keywords and package.accept_keywords. self._keywords_manager = KeywordsManager(self.profiles, abs_user_config, \ local_config, global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", "")) @@ -629,7 +642,7 @@ class config(object): # reasonable defaults; this is important as without USE_ORDER, # USE will always be "" (nothing set)! if "USE_ORDER" not in self: - self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:env.d" + self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:repo:env.d" self["PORTAGE_GID"] = str(portage_gid) self.backup_changes("PORTAGE_GID") @@ -890,6 +903,7 @@ class config(object): del self._penv[:] self.configdict["pkg"].clear() self.configdict["pkginternal"].clear() + self.configdict["repo"].clear() self.configdict["defaults"]["USE"] = \ " ".join(self.make_defaults_use) self.usemask = self._use_manager.getUseMask() @@ -1065,6 +1079,7 @@ class config(object): pkg_configdict["CATEGORY"] = cat pkg_configdict["PF"] = pf + repository = None if mydb: if not hasattr(mydb, "aux_get"): for k in aux_keys: @@ -1109,6 +1124,34 @@ class config(object): self.configdict["pkginternal"]["USE"] = pkginternaluse has_changed = True + repo_env = [] + repo_env_empty = True + if repository and repository != Package.UNKNOWN_REPO: + for repo in [repo.name for + repo in self.repositories[repository].masters] + [repository]: + d = self._repo_make_defaults.get(repo) + if d is None: + d = {} + else: + # make a copy, since we might modify it with + # package.use settings + d = d.copy() + repo_env.append(d) + cpdict = self._use_manager._repo_puse_dict.get(repo, {}).get(cp) + if cpdict: + repo_puse = ordered_by_atom_specificity(cpdict, pkg) + if repo_puse: + for x in repo_puse: + d["USE"] = d.get("USE", "") + " " + " ".join(x) + if d: + repo_env_empty = False + + if not repo_env_empty or self.configdict["repo"]: + self.configdict["repo"].clear() + self.configdict["repo"].update(stack_dicts(repo_env, + incrementals=self.incrementals)) + has_changed = True + defaults = [] for i, pkgprofileuse_dict in enumerate(self._use_manager._pkgprofileuse): if self.make_defaults_use[i]: -- cgit v1.2.3-1-g7c22