commit: 1f4cfaff9b6b6d340d3a8e495043b540a6d40e8d
Author: Alexander Berntsen <bernalex <AT> gentoo <DOT> org>
AuthorDate: Wed Oct 22 08:13:52 2014 +0000
Commit: Alexander Berntsen <bernalex <AT> gentoo <DOT> org>
CommitDate: Wed Oct 22 12:41:00 2014 +0000
URL:
http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=1f4cfaff
Implement --rage-clean
Implement --rage-clean which lets you --unmerge really furiously. Works
like --unmerge but without a delay.
Signed-off-by: Alexander Berntsen <bernalex <AT> gentoo.org>
Acked-by: Zac Medico <zmedico <AT> gentoo.org>
---
RELEASE-NOTES | 4 ++++
man/emerge.1 | 15 ++++++++++-----
pym/_emerge/actions.py | 14 +++++++-------
pym/_emerge/main.py | 2 +-
pym/_emerge/unmerge.py | 35 +++++++++++++++++++++--------------
5 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 899b48a..7912398 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,6 +1,10 @@
Release Notes; upgrade information mainly.
Features/major bugfixes are listed in NEWS
+portage-2.2.15
+==================================
+* New option --rage-clean that does --unmerge without delay.
+
portage-2.2.14
==================================
* Bug Fixes:
diff --git a/man/emerge.1 b/man/emerge.1
index 12e8b45..bbe71ac 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -258,11 +258,12 @@ portage tree as a tarball, which is much faster than
emerge
.TP
.BR "\-\-unmerge " (\fB\-C\fR)
\fBWARNING: This action can remove important packages!\fR Removes
-all matching packages. This does no checking of dependencies, so
-it may remove packages necessary for the proper operation of your
-system. Its arguments can be \fIatoms\fR or
-\fIebuilds\fR. For a dependency aware version of \fB\-\-unmerge\fR,
-use \fB\-\-depclean\fR or \fB\-\-prune\fR.
+all matching packages following a counter governed by \fBCLEAN_DELAY\fR.
+This does no checking of dependencies, so it may remove packages necessary
+for the proper operation of your system. Its arguments can be \fIatoms\fR
+or \fIebuilds\fR. For a dependency aware version of \fB\-\-unmerge\fR, use
+\fB\-\-depclean\fR or \fB\-\-prune\fR. For a version with
+\fBCLEAN_DELAY=0\fR, use \fB\-\-rage\-clean\fR.
.TP
.BR "\-\-version " (\fB\-V\fR)
Displays the version number of \fBemerge\fR.
@@ -716,6 +717,10 @@ Disable the warning message that's shown prior to
to be set in the \fBmake.conf\fR(5)
\fBEMERGE_DEFAULT_OPTS\fR variable.
.TP
+.BR "\-\-rage\-clean"
+\fBWARNING: This action can remove important packages!\fR
+\fB\-\-rage\-clean\fR does \fB\-\-unmerge\fR with \fBCLEAN_DELAY=0\fR.
+.TP
.BR "\-\-read\-news [ y | n ]"
Offer to read news via eselect if there are unread news. This option
has no effect unless \fB\-\-ask\fR is enabled.
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
index ee57cec..48b0826 100644
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@ -2701,7 +2701,7 @@ def _sync_repo(emerge_config, repo):
def action_uninstall(settings, trees, ldpath_mtimes,
opts, action, files, spinner):
# For backward compat, some actions do not require leading '='.
- ignore_missing_eq = action in ('clean', 'unmerge')
+ ignore_missing_eq = action in ('clean', 'rage-clean', 'unmerge')
root = settings['ROOT']
eroot = settings['EROOT']
vardb = trees[settings['EROOT']]['vartree'].dbapi
@@ -2857,10 +2857,10 @@ def action_uninstall(settings, trees, ldpath_mtimes,
settings.backup_changes("PORTAGE_BACKGROUND")
settings.lock()
- if action in ('clean', 'unmerge') or \
+ if action in ('clean', 'rage-clean', 'unmerge') or \
(action == 'prune' and "--nodeps" in opts):
# When given a list of atoms, unmerge them in the order given.
- ordered = action == 'unmerge'
+ ordered = action in ('rage-clean', 'unmerge')
rval = unmerge(trees[settings['EROOT']]['root_config'], opts,
action,
valid_atoms, ldpath_mtimes, ordered=ordered,
scheduler=sched_iface)
@@ -3490,7 +3490,7 @@ def expand_set_arguments(myfiles, myaction, root_config):
for e in setconfig.errors:
print(colorize("BAD", "Error during set creation: %s" % e))
- unmerge_actions = ("unmerge", "prune", "clean", "depclean")
+ unmerge_actions = ("unmerge", "prune", "clean", "depclean",
"rage-clean")
for a in myfiles:
if a.startswith(SETPREFIX):
@@ -3750,7 +3750,7 @@ def run_action(emerge_config):
# only expand sets for actions taking package arguments
oldargs = emerge_config.args[:]
if emerge_config.action in ("clean", "config", "depclean",
- "info", "prune", "unmerge", None):
+ "info", "prune", "unmerge", "rage-clean", None):
newargs, retval = expand_set_arguments(
emerge_config.args, emerge_config.action,
emerge_config.target_config)
@@ -3831,7 +3831,7 @@ def run_action(emerge_config):
if "--pretend" not in emerge_config.opts and \
emerge_config.action not in ("search", "info"):
need_superuser = emerge_config.action in ('clean',
'depclean',
- 'deselect', 'prune', 'unmerge') or not \
+ 'deselect', 'prune', 'unmerge', "rage-clean")
or not \
(fetchonly or \
(buildpkgonly and portage.data.secpass >= 1) or
\
emerge_config.action in ("metadata", "regen",
"sync"))
@@ -3977,7 +3977,7 @@ def run_action(emerge_config):
emerge_config.opts, emerge_config.args, spinner)
elif emerge_config.action in \
- ('clean', 'depclean', 'deselect', 'prune', 'unmerge'):
+ ('clean', 'depclean', 'deselect', 'prune', 'unmerge',
'rage-clean'):
validate_ebuild_environment(emerge_config.trees)
rval = action_uninstall(emerge_config.target_config.settings,
emerge_config.trees,
emerge_config.target_config.mtimedb["ldpath"],
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index f5f2ec4..cf7966c 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -293,7 +293,7 @@ def parse_opts(tmpcmdline, silent=False):
actions = frozenset([
"clean", "check-news", "config", "depclean", "help",
"info", "list-sets", "metadata", "moo",
- "prune", "regen", "search",
+ "prune", "rage-clean", "regen", "search",
"sync", "unmerge", "version",
])
diff --git a/pym/_emerge/unmerge.py b/pym/_emerge/unmerge.py
index 30b1930..df29000 100644
--- a/pym/_emerge/unmerge.py
+++ b/pym/_emerge/unmerge.py
@@ -89,16 +89,18 @@ def _unmerge_display(root_config, myopts, unmerge_action,
else:
syslist.append(mycp)
syslist = frozenset(syslist)
-
+
if not unmerge_files:
- if unmerge_action == "unmerge":
+ if unmerge_action in ["rage-clean", "unmerge"]:
print()
- print(bold("emerge unmerge") + " can only be
used with specific package names")
+ print(bold("emerge %s") +
+ " can only be used with
specific package names" %
+ unmerge_action)
print()
return 1, {}
else:
global_unmerge = 1
-
+
localtree = vartree
# process all arguments and add all
# valid db entries to candidate_catpkgs
@@ -108,7 +110,8 @@ def _unmerge_display(root_config, myopts, unmerge_action,
else:
#we've got command-line arguments
if not unmerge_files:
- print("\nNo packages to unmerge have been
provided.\n")
+ print("\nNo packages to %s have been
provided.\n" %
+ unmerge_action)
return 1, {}
for x in unmerge_files:
arg_parts = x.split('/')
@@ -208,7 +211,7 @@ def _unmerge_display(root_config, myopts, unmerge_action,
pkgmap.append(
{"protected": set(), "selected": set(),
"omitted": set()})
mykey = len(pkgmap) - 1
- if unmerge_action=="unmerge":
+ if unmerge_action in ["rage-clean", "unmerge"]:
for y in mymatch:
if y not in all_selected:
pkgmap[mykey]["selected"].add(y)
@@ -330,13 +333,17 @@ def _unmerge_display(root_config, myopts, unmerge_action,
if unmerge_action != "clean" and root_config.root ==
"/":
skip_pkg = False
- if
portage.match_from_list(portage.const.PORTAGE_PACKAGE_ATOM, [pkg]):
- msg = ("Not unmerging package %s since
there is no valid reason "
- "for Portage to unmerge
itself.") % (pkg.cpv,)
+ if
portage.match_from_list(portage.const.PORTAGE_PACKAGE_ATOM,
+ [pkg]):
+ msg = ("Not unmerging package %s "
+ "since there is no
valid reason for Portage to "
+ "%s itself.") %
(pkg.cpv, unmerge_action)
skip_pkg = True
- elif
vartree.dbapi._dblink(cpv).isowner(portage._python_interpreter):
- msg = ("Not unmerging package %s since
there is no valid reason "
- "for Portage to unmerge
currently used Python interpreter.") % (pkg.cpv,)
+ elif vartree.dbapi._dblink(cpv).isowner(
+ portage._python_interpreter):
+ msg = ("Not unmerging package %s since
there is no valid "
+ "reason for Portage to
%s currently used Python "
+ "interpreter.") %
(pkg.cpv, unmerge_action)
skip_pkg = True
if skip_pkg:
for line in textwrap.wrap(msg, 75):
@@ -539,8 +546,8 @@ def unmerge(root_config, myopts, unmerge_action,
print("Quitting.")
print()
return 128 + signal.SIGINT
- #the real unmerging begins, after a short delay....
- if clean_delay and not autoclean:
+ #the real unmerging begins, after a short delay unless we're raging....
+ if not unmerge_action == "rage-clean" and clean_delay and not autoclean:
countdown(int(settings["CLEAN_DELAY"]), ">>> Unmerging")
all_selected = set()