uninstall : added user confirmation

This commit is contained in:
Massimiliano Culpo 2016-03-29 00:28:02 +02:00
parent e0f463c4f9
commit 1141f11955

View file

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