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()