uninstall : added user confirmation
This commit is contained in:
		| @@ -24,15 +24,14 @@ | |||||||
| ############################################################################## | ############################################################################## | ||||||
| from __future__ import print_function | from __future__ import print_function | ||||||
|  |  | ||||||
| import argparse |  | ||||||
| import sys | import sys | ||||||
|  | import argparse | ||||||
|  |  | ||||||
| import llnl.util.tty as tty | import llnl.util.tty as tty | ||||||
| import spack | import spack | ||||||
| import spack.cmd | import spack.cmd | ||||||
| import spack.repository | import spack.repository | ||||||
| from spack.cmd.find import display_specs | from spack.cmd.find import display_specs | ||||||
| from spack.package import PackageStillNeededError |  | ||||||
|  |  | ||||||
| description = "Remove an installed package" | description = "Remove an installed package" | ||||||
|  |  | ||||||
| @@ -41,6 +40,16 @@ | |||||||
|     b) use spack uninstall -a to uninstall ALL matching specs. |     b) use spack uninstall -a to uninstall ALL matching specs. | ||||||
| """ | """ | ||||||
|  |  | ||||||
|  | def ask_for_confirmation(message): | ||||||
|  |     while True: | ||||||
|  |         tty.msg(message + '[y/n]') | ||||||
|  |         choice = raw_input().lower() | ||||||
|  |         if choice == 'y': | ||||||
|  |             break | ||||||
|  |         elif choice == 'n': | ||||||
|  |             sys.exit(1) | ||||||
|  |         tty.warning('Please reply either "y" or "n"') | ||||||
|  |  | ||||||
|  |  | ||||||
| def setup_parser(subparser): | def setup_parser(subparser): | ||||||
|     subparser.add_argument( |     subparser.add_argument( | ||||||
| @@ -53,7 +62,11 @@ def setup_parser(subparser): | |||||||
|              "libelf are uninstalled. This is both useful and dangerous, like rm -r.") |              "libelf are uninstalled. This is both useful and dangerous, like rm -r.") | ||||||
|     subparser.add_argument( |     subparser.add_argument( | ||||||
|         '-r', '--recursive', action='store_true', dest='recursive', |         '-r', '--recursive', action='store_true', dest='recursive', | ||||||
|         help='Uninstall all the packages that depends on the ones for which we required explicit removal.' |         help='Also uninstall any packages that depend on the ones given via command line.' | ||||||
|  |     ) | ||||||
|  |     subparser.add_argument( | ||||||
|  |         '-y', '--yes-to-all', action='store_true', dest='yes_to_all', | ||||||
|  |         help='Assume "yes" is the answer to every confirmation asked to the user.' | ||||||
|  |  | ||||||
|     ) |     ) | ||||||
|     subparser.add_argument('packages', nargs=argparse.REMAINDER, help="specs of packages to uninstall") |     subparser.add_argument('packages', nargs=argparse.REMAINDER, help="specs of packages to uninstall") | ||||||
| @@ -96,6 +109,15 @@ def concretize_specs(specs, allow_multiple_matches=False, force=False): | |||||||
|  |  | ||||||
|  |  | ||||||
| def installed_dependents(specs): | def installed_dependents(specs): | ||||||
|  |     """ | ||||||
|  |     Returns a dictionary that maps a spec with a list of its installed dependents | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         specs: list of specs to be checked for dependents | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         dictionary of installed dependents | ||||||
|  |     """ | ||||||
|     dependents = {} |     dependents = {} | ||||||
|     for item in specs: |     for item in specs: | ||||||
|         lst = [x for x in item.package.installed_dependents if x not in specs] |         lst = [x for x in item.package.installed_dependents if x not in specs] | ||||||
| @@ -105,7 +127,13 @@ def installed_dependents(specs): | |||||||
|  |  | ||||||
|  |  | ||||||
| def do_uninstall(specs, force): | def do_uninstall(specs, force): | ||||||
|     specs = list(set(specs))  # Make specs unique |     """ | ||||||
|  |     Uninstalls all the specs in a list. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         specs: list of specs to be uninstalled | ||||||
|  |         force: force uninstallation (boolean) | ||||||
|  |     """ | ||||||
|     packages = [] |     packages = [] | ||||||
|     for item in specs: |     for item in specs: | ||||||
|         try: |         try: | ||||||
| @@ -136,7 +164,7 @@ def uninstall(parser, args): | |||||||
|         uninstall_list = concretize_specs(specs, args.all, args.force)  # takes care of '-a' is given in the cli |         uninstall_list = concretize_specs(specs, args.all, args.force)  # takes care of '-a' is given in the cli | ||||||
|         dependent_list = installed_dependents(uninstall_list)  # takes care of '-r' |         dependent_list = installed_dependents(uninstall_list)  # takes care of '-r' | ||||||
|  |  | ||||||
|         # There are dependents but recursive uninstall wasn't a requirement |         # Process dependent_list and update uninstall_list | ||||||
|         has_error = False |         has_error = False | ||||||
|         if dependent_list and not args.recursive and not args.force: |         if dependent_list and not args.recursive and not args.force: | ||||||
|             for spec, lst in dependent_list.items(): |             for spec, lst in dependent_list.items(): | ||||||
| @@ -149,8 +177,17 @@ def uninstall(parser, args): | |||||||
|         elif args.recursive: |         elif args.recursive: | ||||||
|             for key, lst in dependent_list.items(): |             for key, lst in dependent_list.items(): | ||||||
|                 uninstall_list.extend(lst) |                 uninstall_list.extend(lst) | ||||||
|  |             uninstall_list = list(set(uninstall_list)) | ||||||
|  |  | ||||||
|         if has_error: |         if has_error: | ||||||
|             tty.die('You can use spack uninstall -f to force this action') |             tty.die('You can use spack uninstall -f to force this action') | ||||||
|  |  | ||||||
|  |         if not args.yes_to_all: | ||||||
|  |             tty.msg("The following packages will be uninstalled : ") | ||||||
|  |             print('') | ||||||
|  |             display_specs(uninstall_list, long=True) | ||||||
|  |             print('') | ||||||
|  |             ask_for_confirmation('Do you want to proceed ? ') | ||||||
|  |  | ||||||
|         # Uninstall everything on the list |         # Uninstall everything on the list | ||||||
|         do_uninstall(uninstall_list, args.force) |         do_uninstall(uninstall_list, args.force) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Massimiliano Culpo
					Massimiliano Culpo