Property definitions

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