nitc :: CommandUninstall :: defaultinit
# Uninstall a package
class CommandUninstall
super Command
redef fun name do return "uninstall"
redef fun usage do return "nitpm uninstall [-f] <package0>[=version] [package1 ...]"
redef fun description do return "Uninstall packages"
redef fun apply(args)
do
var opt_force = "-f"
var force = args.has(opt_force)
if force then args.remove(opt_force)
if args.is_empty then
print_local_help
exit 1
end
for name in args do
var clean_nitpm_lib_dir = nitpm_lib_dir.simplify_path
var target_dir = clean_nitpm_lib_dir / name
# Check validity of the package to delete
target_dir = target_dir.simplify_path
var within_dir = target_dir.has_prefix(clean_nitpm_lib_dir + "/") and
target_dir.length > clean_nitpm_lib_dir.length + 1
var valid_name = name.length > 0 and name.chars.first.is_lower
if not valid_name or not within_dir then
print_error "Package name '{name}' is invalid"
continue
end
if not target_dir.file_exists or not target_dir.to_path.is_dir then
print_error "Package not found"
exit 1
end
# Ask confirmation
if not force then
var response = prompt("Delete {target_dir.escape_to_sh}? [Y/n] ")
var accept = response != null and
(response.to_lower == "y" or response.to_lower == "yes" or response == "")
if not accept then return
end
var cmd = "rm -rf {target_dir.escape_to_sh}"
if verbose then print "+ {cmd}"
var proc = new Process("sh", "-c", cmd)
proc.wait
if proc.status != 0 then
print_error "Uninstall failed"
exit 1
end
end
end
end
src/nitpm.nit:244,1--303,3