#!/usr/bin/env python import os import platform def doDie(msg, error_code=1): print() print(msg) print() print() exit(error_code) rem_cmd = "#" rm_cmd = "rm " rmdir_cmd = "rmdir " if platform.system() == "Windows": rm_cmd = "DEL " rmdir_cmd = "RD " rem_cmd = "REM " profile_path1 = os.environ.get('HOME') profile_path = profile_path1 profile_path2 = os.environ.get('USERPROFILE') if profile_path2 is not None: profile_path = profile_path2 if profile_path1 is not None: print(rem_cmd + "WARNING: HOME is present, but USERPROFILE '" + profile_path + "' is being used.") else: if profile_path1 is None: doDie(rem_cmd + "ERROR: There is nothing to do since neither" + " HOME nor USERPROFILE is present.") mnf_name = "install_manifest.txt" mnf_path = os.path.join(profile_path, mnf_name) unsorted_list = [] if not os.path.isfile(mnf_path): doDie(rem_cmd + "Uninstall cannot continue since '" + mnf_path + "' is missing.") with open(mnf_path) as fp: for cnt, line_original in enumerate(fp): # print("Line {}: {}".format(cnt, line)) line = line_original.strip() if len(line) > 0: unsorted_list.append(line) if len(unsorted_list) < 1: doDie(rem_cmd + "ERROR: There are no files in the manifest '" + mnf_path + "'") # See https://stackoverflow.com/questions/4659524/\ # how-to-sort-by-length-of-string-followed-by-alphabetical-order sorted_list = sorted(unsorted_list, key=len, reverse=True) # reverse: descending # or (also reverse): # the_list.sort(key=lambda item: (-len(item), item)) print(rem_cmd + "Uninstalling...") not_removed_files = [] not_removed_dirs = [] does_not_exist = [] file_count = 0 dir_count = 0 for path in sorted_list: if os.path.isfile(path): if path[0:1] == ".": print(rm_cmd + "\"" + path + "\"") not_removed_files.append(path) continue try: os.remove(path) file_count += 1 except PermissionError: not_removed_files.append(path) elif os.path.isdir(path): if path[0:1] == ".": print(rmdir_cmd + "\"" + path + "\"") not_removed_dirs.append(path) continue try: os.rmdir(path) dir_count += 1 except PermissionError: not_removed_dirs.append(path) else: does_not_exist.append(path) if len(does_not_exist) > 0: if len(does_not_exist) == len(sorted_list): doDie(" " + rem_cmd + " The program is not installed such as" + " at '" + sorted_list[-1] + "'.") show_dot_warning = True print(rem_cmd + "Uninstall is complete.") print(rem_cmd + "- files: " + str(file_count)) print(rem_cmd + "- directories: " + str(dir_count)) print(rem_cmd + "- missing: " + len(does_not_exist)) if (len(not_removed_files) + len(not_removed_dirs)) > 0: for path in not_removed_files: if path[0:1] == ".": if show_dot_warning: print(rem_cmd + "Paths starting with '.' are not yet" " implemented.") show_dot_warning = False print(rm_cmd + "\"" + path + "\"") for path in not_removed_dirs: print(rmdir_cmd + "\"" + path + "\"") print(rem_cmd + "Deleting items above FAILED:") print(" " + rem_cmd + "- files: " + str(not_removed_file_count)) print(" " + rem_cmd + "- directories: " + str(not_removed_dir_count)) print("") print("")