Index: sys-apps/portage/files/portage-2.1.9.45-atoms.patch |
diff --git a/sys-apps/portage/files/portage-2.1.9.45-atoms.patch b/sys-apps/portage/files/portage-2.1.9.45-atoms.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a3e27451be82a13b33f20228e2979871bbd10347 |
--- /dev/null |
+++ b/sys-apps/portage/files/portage-2.1.9.45-atoms.patch |
@@ -0,0 +1,356 @@ |
+commit c273d6c6666bafe4a199ebd360d8ab64efa0c0f4 |
+Author: David James <davidjames@google.com> |
+Date: Wed Mar 16 10:39:45 2011 -0700 |
+ |
+ Add --nousepkg-atoms, --useoldpkg-atoms, and --reinstall-atoms flag to Portage |
+ |
+ reinstall-atoms accepts a space separated list of package names or slot atoms. Emerge will treat matching packages as if they are not installed, and reinstall them if necessary. |
+ |
+ useoldpkg-atoms accepts a space separated list of package names or slot atoms. Emerge will prefer matching binary packages over newer unbuilt packages. This is useful in case you want to request that a particular package won't be rebuilt from source. |
+ |
+ nousepkg-atoms accepts a space separated list of package names or slot atoms. Emerge will ignore matching binary packages. |
+ |
+ Change-Id: I0d73039c6a4cd63695b28ffc80215628e0e05c95 |
+ |
+ BUG=chromium-os:12507 |
+ TEST=Try out the flag |
+ |
+ Review URL: http://codereview.chromium.org/6577024 |
+ |
+diff --git a/man/emerge.1 b/man/emerge.1 |
+index 0be6e29..ae65c70 100644 |
+--- a/man/emerge.1 |
++++ b/man/emerge.1 |
+@@ -469,6 +469,10 @@ may have changed. |
+ Disables the spinner for the session. The spinner is active when the |
+ terminal device is determined to be a TTY. This flag disables it regardless. |
+ .TP |
++.BR "\-\-nousepkg\-atoms " ATOMS |
++A space separated list of package names or slot atoms. Emerge will ignore |
++matching binary packages. |
++.TP |
+ .BR "\-\-oneshot " (\fB\-1\fR) |
+ Emerge as normal, but do not add the packages to the world file |
+ for later updating. |
+@@ -539,6 +543,11 @@ changed since installation. Unlike \fB\-\-newuse\fR, this option does |
+ not trigger reinstallation when flags that the user has not |
+ enabled are added or removed. |
+ .TP |
++.BR "\-\-reinstall\-atoms " ATOMS |
++A space separated list of package names or slot atoms. Emerge will treat |
++matching packages as if they are not installed, and reinstall them if |
++necessary. |
++.TP |
+ .BR \-\-root=DIR |
+ Set the \fBROOT\fR environment variable. |
+ .TP |
+@@ -596,6 +605,10 @@ atoms may match multiple versions of slotted packages. |
+ Use unbuilt ebuild metadata for visibility |
+ checks on built packages. |
+ .TP |
++.BR "\-\-useoldpkg\-atoms " ATOMS |
++A space separated list of package names or slot atoms. Emerge will prefer |
++matching binary packages over newer unbuilt packages. |
++.TP |
+ .BR "\-\-usepkg [ y | n ] (\-k short option)" |
+ Tells emerge to use binary packages (from $PKGDIR) if they are available, thus |
+ possibly avoiding some time\-consuming compiles. This option is useful for CD |
+diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py |
+index 91ec759..a3eae01 100644 |
+--- a/pym/_emerge/depgraph.py |
++++ b/pym/_emerge/depgraph.py |
+@@ -69,6 +69,16 @@ class _scheduler_graph_config(object): |
+ self.graph = graph |
+ self.mergelist = mergelist |
+ |
++def _wildcard_set(atoms): |
++ pkgs = InternalPackageSet(allow_wildcard=True) |
++ for x in atoms: |
++ try: |
++ x = Atom(x, allow_wildcard=True) |
++ except portage.exception.InvalidAtom: |
++ x = Atom("*/" + x, allow_wildcard=True) |
++ pkgs.add(x) |
++ return pkgs |
++ |
+ class _frozen_depgraph_config(object): |
+ |
+ def __init__(self, settings, trees, myopts, spinner): |
+@@ -108,13 +118,14 @@ class _frozen_depgraph_config(object): |
+ |
+ self._required_set_names = set(["world"]) |
+ |
+- self.excluded_pkgs = InternalPackageSet(allow_wildcard=True) |
+- for x in ' '.join(myopts.get("--exclude", [])).split(): |
+- try: |
+- x = Atom(x, allow_wildcard=True) |
+- except portage.exception.InvalidAtom: |
+- x = Atom("*/" + x, allow_wildcard=True) |
+- self.excluded_pkgs.add(x) |
++ atoms = ' '.join(myopts.get("--exclude", [])).split() |
++ self.excluded_pkgs = _wildcard_set(atoms) |
++ atoms = ' '.join(myopts.get("--reinstall-atoms", [])).split() |
++ self.reinstall_atoms = _wildcard_set(atoms) |
++ atoms = ' '.join(myopts.get("--nousepkg-atoms", [])).split() |
++ self.nousepkg_atoms = _wildcard_set(atoms) |
++ atoms = ' '.join(myopts.get("--useoldpkg-atoms", [])).split() |
++ self.useoldpkg_atoms = _wildcard_set(atoms) |
+ |
+ class _depgraph_sets(object): |
+ def __init__(self): |
+@@ -1256,6 +1267,7 @@ class depgraph(object): |
+ vardb = root_config.trees["vartree"].dbapi |
+ traversed_virt_pkgs = set() |
+ |
++ reinstall_atoms = self._frozen_config.reinstall_atoms |
+ for atom, child in self._minimize_children( |
+ pkg, dep_priority, root_config, selected_atoms[pkg]): |
+ |
+@@ -1273,7 +1285,9 @@ class depgraph(object): |
+ |
+ mypriority = dep_priority.copy() |
+ if not atom.blocker: |
+- inst_pkgs = vardb.match_pkgs(atom) |
++ inst_pkgs = [inst_pkg for inst_pkg in vardb.match_pkgs(atom) |
++ if not reinstall_atoms.findAtomForPackage(inst_pkg, |
++ modified_use=self._pkg_use_enabled(inst_pkg))] |
+ if inst_pkgs: |
+ for inst_pkg in inst_pkgs: |
+ if self._pkg_visibility_check(inst_pkg): |
+@@ -1363,7 +1377,9 @@ class depgraph(object): |
+ # This is a GLEP 37 virtual, so its deps are all runtime. |
+ mypriority = self._priority(runtime=True) |
+ if not atom.blocker: |
+- inst_pkgs = vardb.match_pkgs(atom) |
++ inst_pkgs = [inst_pkg for inst_pkg in vardb.match_pkgs(atom) |
++ if not reinstall_atoms.findAtomForPackage(inst_pkg, |
++ modified_use=self._pkg_use_enabled(inst_pkg))] |
+ if inst_pkgs: |
+ for inst_pkg in inst_pkgs: |
+ if self._pkg_visibility_check(inst_pkg): |
+@@ -3128,6 +3144,10 @@ class depgraph(object): |
+ dont_miss_updates = "--update" in self._frozen_config.myopts |
+ use_ebuild_visibility = self._frozen_config.myopts.get( |
+ '--use-ebuild-visibility', 'n') != 'n' |
++ reinstall_atoms = self._frozen_config.reinstall_atoms |
++ nousepkg_atoms = self._frozen_config.nousepkg_atoms |
++ useoldpkg_atoms = self._frozen_config.useoldpkg_atoms |
++ matched_oldpkg = [] |
+ # Behavior of the "selective" parameter depends on |
+ # whether or not a package matches an argument atom. |
+ # If an installed package provides an old-style |
+@@ -3167,7 +3187,14 @@ class depgraph(object): |
+ modified_use=self._pkg_use_enabled(pkg)): |
+ continue |
+ |
+- if packages_with_invalid_use_config and \ |
++ if built and not installed and nousepkg_atoms.findAtomForPackage(pkg, \ |
++ modified_use=self._pkg_use_enabled(pkg)): |
++ break |
++ |
++ useoldpkg = useoldpkg_atoms.findAtomForPackage(pkg, \ |
++ modified_use=self._pkg_use_enabled(pkg)) |
++ |
++ if packages_with_invalid_use_config and (not built or not useoldpkg) and \ |
+ (not pkg.installed or dont_miss_updates): |
+ # Check if a higher version was rejected due to user |
+ # USE configuration. The packages_with_invalid_use_config |
+@@ -3239,7 +3266,7 @@ class depgraph(object): |
+ # instances (installed or binary). |
+ # If --usepkgonly is enabled, assume that |
+ # the ebuild status should be ignored. |
+- if not use_ebuild_visibility and usepkgonly: |
++ if not use_ebuild_visibility and (usepkgonly or useoldpkg): |
+ if pkg.installed and pkg.masks: |
+ continue |
+ else: |
+@@ -3367,7 +3394,7 @@ class depgraph(object): |
+ break |
+ # Compare built package to current config and |
+ # reject the built package if necessary. |
+- if built and (not installed or matched_pkgs_ignore_use) and \ |
++ if built and not useoldpkg and (not installed or matched_pkgs_ignore_use) and \ |
+ ("--newuse" in self._frozen_config.myopts or \ |
+ "--reinstall" in self._frozen_config.myopts or \ |
+ "--binpkg-respect-use" in self._frozen_config.myopts): |
+@@ -3382,7 +3409,7 @@ class depgraph(object): |
+ forced_flags.update(pkgsettings.useforce) |
+ forced_flags.update(pkgsettings.usemask) |
+ cur_iuse = iuses |
+- if myeb and not usepkgonly: |
++ if myeb and not usepkgonly and not useoldpkg: |
+ cur_iuse = myeb.iuse.all |
+ if self._reinstall_for_flags(forced_flags, |
+ old_use, iuses, |
+@@ -3390,7 +3417,7 @@ class depgraph(object): |
+ break |
+ # Compare current config to installed package |
+ # and do not reinstall if possible. |
+- if not installed and \ |
++ if not installed and not useoldpkg and \ |
+ ("--newuse" in self._frozen_config.myopts or \ |
+ "--reinstall" in self._frozen_config.myopts) and \ |
+ cpv in vardb.match(atom): |
+@@ -3408,8 +3435,13 @@ class depgraph(object): |
+ cur_use, cur_iuse) |
+ if reinstall_for_flags: |
+ reinstall = True |
++ if reinstall_atoms.findAtomForPackage(pkg, \ |
++ modified_use=self._pkg_use_enabled(pkg)): |
++ reinstall = True |
+ if not built: |
+ myeb = pkg |
++ elif useoldpkg: |
++ matched_oldpkg.append(pkg) |
+ matched_packages.append(pkg) |
+ if reinstall_for_flags: |
+ self._dynamic_config._reinstall_nodes[pkg] = \ |
+@@ -3493,14 +3525,20 @@ class depgraph(object): |
+ allow_license_changes=allow_license_changes): |
+ return pkg, existing_node |
+ |
+- bestmatch = portage.best( |
+- [pkg.cpv for pkg in matched_packages \ |
++ visible_matches = [] |
++ if matched_oldpkg: |
++ visible_matches = [pkg.cpv for pkg in matched_oldpkg \ |
+ if self._pkg_visibility_check(pkg, allow_unstable_keywords=allow_unstable_keywords, |
+- allow_license_changes=allow_license_changes)]) |
+- if not bestmatch: |
++ allow_license_changes=allow_license_changes)] |
++ if not visible_matches: |
++ visible_matches = [pkg.cpv for pkg in matched_packages \ |
++ if self._pkg_visibility_check(pkg, allow_unstable_keywords=allow_unstable_keywords, |
++ allow_license_changes=allow_license_changes)] |
++ if visible_matches: |
++ bestmatch = portage.best(visible_matches) |
++ else: |
+ # all are masked, so ignore visibility |
+- bestmatch = portage.best( |
+- [pkg.cpv for pkg in matched_packages]) |
++ bestmatch = portage.best([pkg.cpv for pkg in matched_packages]) |
+ matched_packages = [pkg for pkg in matched_packages \ |
+ if portage.dep.cpvequal(pkg.cpv, bestmatch)] |
+ |
+diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py |
+index cc46e6d..f609f80 100644 |
+--- a/pym/_emerge/main.py |
++++ b/pym/_emerge/main.py |
+@@ -542,6 +542,23 @@ def insert_optional_args(args): |
+ |
+ return new_args |
+ |
++def _find_bad_atoms(atoms): |
++ bad_atoms = [] |
++ for x in ' '.join(atoms).split(): |
++ bad_atom = False |
++ try: |
++ atom = portage.dep.Atom(x, allow_wildcard=True) |
++ except portage.exception.InvalidAtom: |
++ try: |
++ atom = portage.dep.Atom("*/"+x, allow_wildcard=True) |
++ except portage.exception.InvalidAtom: |
++ bad_atom = True |
++ |
++ if bad_atom or atom.operator or atom.blocker or atom.use: |
++ bad_atoms.append(x) |
++ return bad_atoms |
++ |
++ |
+ def parse_opts(tmpcmdline, silent=False): |
+ myaction=None |
+ myopts = {} |
+@@ -678,6 +695,14 @@ def parse_opts(tmpcmdline, silent=False): |
+ "choices":["changed-use"] |
+ }, |
+ |
++ "--reinstall-atoms": { |
++ "help" :"A space separated list of package names or slot atoms. " + \ |
++ "Emerge will treat matching packages as if they are not " + \ |
++ "installed, and reinstall them if necessary. Implies --deep.", |
++ |
++ "action" : "append", |
++ }, |
++ |
+ "--binpkg-respect-use": { |
+ "help" : "discard binary packages if their use flags \ |
+ don't match the current configuration", |
+@@ -699,6 +724,13 @@ def parse_opts(tmpcmdline, silent=False): |
+ "choices" : true_y_or_n |
+ }, |
+ |
++ "--nousepkg-atoms": { |
++ "help" :"A space separated list of package names or slot atoms. " + \ |
++ "Emerge will ignore matching binary packages. ", |
++ |
++ "action" : "append", |
++ }, |
++ |
+ "--package-moves": { |
+ "help" : "perform package moves when necessary", |
+ "type" : "choice", |
+@@ -762,6 +794,13 @@ def parse_opts(tmpcmdline, silent=False): |
+ "choices" : true_y_or_n |
+ }, |
+ |
++ "--useoldpkg-atoms": { |
++ "help" :"A space separated list of package names or slot atoms. " + \ |
++ "Emerge will prefer matching binary packages over newer unbuilt packages. ", |
++ |
++ "action" : "append", |
++ }, |
++ |
+ "--usepkg": { |
+ "shortopt" : "-k", |
+ "help" : "use binary packages", |
+@@ -850,32 +889,28 @@ def parse_opts(tmpcmdline, silent=False): |
+ myoptions.depclean_lib_check = True |
+ |
+ if myoptions.exclude: |
+- exclude = [] |
+- bad_atoms = [] |
+- for x in ' '.join(myoptions.exclude).split(): |
+- bad_atom = False |
+- try: |
+- atom = portage.dep.Atom(x, allow_wildcard=True) |
+- except portage.exception.InvalidAtom: |
+- try: |
+- atom = portage.dep.Atom("*/"+x, allow_wildcard=True) |
+- except portage.exception.InvalidAtom: |
+- bad_atom = True |
+- |
+- if bad_atom: |
+- bad_atoms.append(x) |
+- else: |
+- if atom.operator or atom.blocker or atom.use: |
+- bad_atoms.append(x) |
+- else: |
+- exclude.append(atom) |
+- |
++ bad_atoms = _find_bad_atoms(myoptions.exclude) |
+ if bad_atoms and not silent: |
+ parser.error("Invalid Atom(s) in --exclude parameter: '%s' (only package names and slot atoms (with wildcards) allowed)\n" % \ |
+ (",".join(bad_atoms),)) |
+ |
+- if myoptions.fail_clean in true_y: |
+- myoptions.fail_clean = True |
++ if myoptions.reinstall_atoms: |
++ bad_atoms = _find_bad_atoms(myoptions.reinstall_atoms) |
++ if bad_atoms and not silent: |
++ parser.error("Invalid Atom(s) in --reinstall-atoms parameter: '%s' (only package names and slot atoms (with wildcards) allowed)\n" % \ |
++ (",".join(bad_atoms),)) |
++ |
++ if myoptions.nousepkg_atoms: |
++ bad_atoms = _find_bad_atoms(myoptions.nousepkg_atoms) |
++ if bad_atoms and not silent: |
++ parser.error("Invalid Atom(s) in --nousepkg-atoms parameter: '%s' (only package names and slot atoms (with wildcards) allowed)\n" % \ |
++ (",".join(bad_atoms),)) |
++ |
++ if myoptions.useoldpkg_atoms: |
++ bad_atoms = _find_bad_atoms(myoptions.useoldpkg_atoms) |
++ if bad_atoms and not silent: |
++ parser.error("Invalid Atom(s) in --useoldpkg-atoms parameter: '%s' (only package names and slot atoms (with wildcards) allowed)\n" % \ |
++ (",".join(bad_atoms),)) |
+ |
+ if myoptions.getbinpkg in true_y: |
+ myoptions.getbinpkg = True |