Add --binpkg-exclude option
authorSebastian Luther <SebastianLuther@gmx.de>
Sun, 16 Oct 2011 18:43:17 +0000 (20:43 +0200)
committerZac Medico <zmedico@gentoo.org>
Sun, 16 Oct 2011 18:58:12 +0000 (11:58 -0700)
This options disables creation of binary packages, no matter
what enabled it in the first place. See bug 386903.

man/emerge.1
pym/_emerge/EbuildBuild.py
pym/_emerge/Scheduler.py
pym/_emerge/main.py

index 1eab6e50a860e4121a78f5e0b8939b9ea346e952..0a1ec03713234c309787632bfea02e7c92b12c92 100644 (file)
@@ -344,6 +344,11 @@ An alternative for already\-merged
 packages is to use \fBquickpkg\fR(1) which creates a tbz2 from the
 live filesystem.
 .TP
+.BR "\-\-buildpkg\-exclude " ATOMS
+A space separated list of package atoms for which
+no binary packages should be built. This option overrides all
+possible ways to enable building of binary packages.
+.TP
 .BR "\-\-buildpkgonly " (\fB\-B\fR)
 Creates binary packages for all ebuilds processed without actually
 merging the packages.  This comes with the caveat that all build-time 
index 012a1efc67bd5a1994cd195bd3484f515fdece58..d44dcf357a58476768fd337ef5e984dd876827f9 100644 (file)
@@ -226,7 +226,8 @@ class EbuildBuild(CompositeTask):
                                system_set.findAtomForPackage(pkg) and \
                                not opts.buildpkg
 
-               if opts.buildpkg or "buildpkg" in features or self._issyspkg:
+               if (opts.buildpkg or "buildpkg" in features or self._issyspkg) \
+                       and not self.opts.buildpkg_exclude.findAtomForPackage(pkg):
 
                        self._buildpkg = True
 
index 95cc104e07a9167e4171c61480cb55d99de44c44..3221b86204bc2778690b2ec57d9fd61b959d57b9 100644 (file)
@@ -96,7 +96,7 @@ class Scheduler(PollScheduler):
                ("merge", "jobs", "ebuild_locks", "fetch", "unpack"), prefix="")
 
        class _build_opts_class(SlotObject):
-               __slots__ = ("buildpkg", "buildpkgonly",
+               __slots__ = ("buildpkg", "buildpkg_exclude", "buildpkgonly",
                        "fetch_all_uri", "fetchonly", "pretend")
 
        class _binpkg_opts_class(SlotObject):
@@ -159,8 +159,13 @@ class Scheduler(PollScheduler):
                self._favorites = favorites
                self._args_set = InternalPackageSet(favorites, allow_repo=True)
                self._build_opts = self._build_opts_class()
+
                for k in self._build_opts.__slots__:
                        setattr(self._build_opts, k, "--" + k.replace("_", "-") in myopts)
+               self._build_opts.buildpkg_exclude = InternalPackageSet( \
+                       initial_atoms=" ".join(myopts.get("--buildpkg-exclude", [])).split(), \
+                       allow_wildcard=True, allow_repo=True)
+
                self._binpkg_opts = self._binpkg_opts_class()
                for k in self._binpkg_opts.__slots__:
                        setattr(self._binpkg_opts, k, "--" + k.replace("_", "-") in myopts)
index ed07c092dbd6c3f178928413b49fccf7b5c173e2..26f37667a3ade05509d91c3cb2ea2f78d492877a 100644 (file)
@@ -556,19 +556,25 @@ def insert_optional_args(args):
 
        return new_args
 
-def _find_bad_atoms(atoms):
+def _find_bad_atoms(atoms, less_strict=False):
+       """
+       Declares all atoms as invalid that have an operator,
+       a use dependency, a blocker or a repo spec.
+       It accepts atoms with wildcards.
+       In less_strict mode it accepts operators and repo specs.
+       """
        bad_atoms = []
        for x in ' '.join(atoms).split():
                bad_atom = False
                try:
-                       atom = portage.dep.Atom(x, allow_wildcard=True)
+                       atom = portage.dep.Atom(x, allow_wildcard=True, allow_repo=less_strict)
                except portage.exception.InvalidAtom:
                        try:
-                               atom = portage.dep.Atom("*/"+x, allow_wildcard=True)
+                               atom = portage.dep.Atom("*/"+x, allow_wildcard=True, allow_repo=less_strict)
                        except portage.exception.InvalidAtom:
                                bad_atom = True
 
-               if bad_atom or atom.operator or atom.blocker or atom.use:
+               if bad_atom or (atom.operator and not less_strict) or atom.blocker or atom.use:
                        bad_atoms.append(x)
        return bad_atoms
 
@@ -644,6 +650,14 @@ def parse_opts(tmpcmdline, silent=False):
                        "choices"  : true_y_or_n
                },
 
+               "--buildpkg-exclude": {
+                       "help"   :"A space separated list of package atoms for which " + \
+                               "no binary packages should be built. This option overrides all " + \
+                               "possible ways to enable building of binary packages.",
+
+                       "action" : "append"
+               },
+
                "--config-root": {
                        "help":"specify the location for portage configuration files",
                        "action":"store"
@@ -967,6 +981,12 @@ def parse_opts(tmpcmdline, silent=False):
        else:
                myoptions.buildpkg = None
 
+       if myoptions.buildpkg_exclude:
+               bad_atoms = _find_bad_atoms(myoptions.buildpkg_exclude, less_strict=True)
+               if bad_atoms and not silent:
+                       parser.error("Invalid Atom(s) in --buildpkg-exclude parameter: '%s'\n" % \
+                               (",".join(bad_atoms),))
+
        if myoptions.changed_use is not False:
                myoptions.reinstall = "changed-use"
                myoptions.changed_use = False