From 3e8e8047f24ee831fa3114c87d8d3f597bff3ad2 Mon Sep 17 00:00:00 2001 From: Tasha Upchurch Date: Thu, 25 May 2023 16:20:33 -0400 Subject: [PATCH] Added installation and uninstallation functionality Updated the script to prompt the user for installation or uninstallation and test mode. Implemented the uninstallation process, allowing the script to attempt to uninstall every file even if errors occur. Modified the move_files() function to ignore hidden directories during file movement. Enhanced the undo_moves() function to remove empty directories during the uninstallation process. Added an additional section to the README.md file explaining the script's usage. --- install.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 install.py diff --git a/install.py b/install.py new file mode 100644 index 0000000..873f5bf --- /dev/null +++ b/install.py @@ -0,0 +1,125 @@ +import os +import subprocess +import shutil +import yaml + +def clone_repo(repo_url, destination_path): + command = ["git", "clone", repo_url, destination_path] + subprocess.run(command, shell=True) + + +def move_files(source_dir, python_files_destination, all_else_files, test_mode=False): + all_else_files = os.path.normpath(all_else_files) + file_mapping = {} + + for root, dirs, files in os.walk(source_dir): + # Ignore hidden directories + dirs[:] = [d for d in dirs if not d.startswith('.')] + + for file in files: + source_file_path = os.path.join(root, file) + if file.endswith(".py"): + if test_mode: + print(f"[TEST MODE] Moving Python file: {file}") + destination_file_path = os.path.join(python_files_destination, file) + file_mapping[source_file_path] = destination_file_path + else: + destination_file_path = os.path.join(python_files_destination, file) + shutil.move(source_file_path, destination_file_path) + file_mapping[source_file_path] = destination_file_path + else: + relative_path = os.path.relpath(root, source_dir) + destination_subdir = os.path.join(all_else_files, relative_path) + destination_file_path = os.path.join(destination_subdir, file) + if test_mode: + print(f"[TEST MODE] Moving non-Python file: {file} -> {destination_file_path}") + destination_file_path = os.path.normpath(destination_file_path) + file_mapping[source_file_path] = destination_file_path + else: + os.makedirs(destination_subdir, exist_ok=True) + destination_file_path = os.path.normpath(destination_file_path) + shutil.move(source_file_path, destination_file_path) + file_mapping[source_file_path] = destination_file_path + + return file_mapping + + +def write_mapping_file(file_mapping, mapping_file_path): + with open(mapping_file_path, "w") as file: + yaml.dump(file_mapping, file) + + +import os + + +def undo_moves(file_mapping): + directories = set() + + for source_file, destination_file in file_mapping.items(): + try: + destination_dir = os.path.dirname(destination_file) + directories.add(destination_dir) + shutil.move(destination_file, source_file) + except Exception as e: + print(f"Error occurred during file move: {e}") + + # Remove empty directories + for directory in directories: + try: + os.removedirs(directory) + except Exception as e: + print(f"Error occurred during directory removal: {e}") + + +def uninstall(mapping_file_path): + if not os.path.exists(mapping_file_path): + print("Mapping file not found. Cannot perform uninstallation.") + return + + with open(mapping_file_path, "r") as file: + file_mapping = yaml.safe_load(file) + + if not file_mapping: + print("No file mapping found. Nothing to undo.") + return + + undo_moves(file_mapping) + print("Uninstallation complete. Files restored to their original locations.") + + +if __name__ == '__main__': + # Replace the following variables with your desired values + repo_url = "https://github.com/pythongosssss/ComfyUI-Custom-Scripts.git" + destination_path = "RawCustomNodesAndScripts" + python_files_destination = "custom_nodes" + all_else_files = "web/extensions" + mapping_file_path = "move_mapping.yaml" + + # Prompt user for installation or uninstallation + action = input("Do you want to [i]nstall or [u]ninstall? ").lower() + if action == "i": + test_mode = input("Do you want to run in test mode? (y/n): ").lower() == "y" + + # Check if the destination directory already exists + if os.path.exists(destination_path) and os.path.isdir(destination_path): + response = input( + f"The destination directory '{destination_path}' already exists. Do you want to remove it? (y/n): ") + if response.lower() == "y": + # Use system command to force delete the directory + if os.name == 'nt': # Windows + os.system(f'rmdir /s /q "{destination_path}"') + else: # Linux + os.system(f'rm -r -f "{destination_path}"') + else: + print("Operation cancelled. Exiting script.") + exit() + + clone_repo(repo_url, destination_path) + file_mapping = move_files(destination_path, python_files_destination, all_else_files, test_mode) + write_mapping_file(file_mapping, mapping_file_path) + + print("Installation complete.") + elif action == "u": + uninstall(mapping_file_path) + else: + print("Invalid action. Exiting script.")