|
|
import shutil |
|
|
from colorama import init, Fore, Style |
|
|
from pathlib import Path |
|
|
|
|
|
def copy_file(source: Path, destination: Path): |
|
|
""" |
|
|
Copy a single file with path, with checking and asking about the existence. |
|
|
""" |
|
|
if not source.is_file(): |
|
|
print(f"Error: {source} is not a file.") |
|
|
return |
|
|
|
|
|
if destination.exists(): |
|
|
print(f"Warning: {destination.name} already exists in {destination.parent}.") |
|
|
user_input = input(f"Do you want to overwrite {destination.name}? (y/n): ").strip().lower() |
|
|
if user_input != 'y': |
|
|
print(f"Skipping {destination.name}.") |
|
|
return |
|
|
|
|
|
shutil.copy(source, destination) |
|
|
print(f"Copied {source.name} to {destination}.") |
|
|
|
|
|
def copy_files_without_recursion(source: Path, destination): |
|
|
""" |
|
|
Copy files under a path without recursion, with checking and asking about the existence. |
|
|
""" |
|
|
yes_to_all, none_to_all = False, False |
|
|
|
|
|
for template_file in source.iterdir(): |
|
|
if template_file.is_file(): |
|
|
if template_file.name == "__init__.py": |
|
|
continue |
|
|
destination_file = Path(destination) / template_file.name |
|
|
if destination_file.exists(): |
|
|
if none_to_all: |
|
|
print(f' Skipping {template_file.name}.\n') |
|
|
continue |
|
|
if not yes_to_all: |
|
|
|
|
|
print(f' {Fore.YELLOW}Warning: {template_file.name} already exists in {destination}.{Style.RESET_ALL}') |
|
|
user_input = input(f' Do you want to overwrite {template_file.name}? (y/n/all/none): ').strip().lower() |
|
|
if user_input == 'all': |
|
|
yes_to_all = True |
|
|
elif user_input == 'none': |
|
|
none_to_all = True |
|
|
print(f' Skipping {template_file.name}.\n') |
|
|
continue |
|
|
elif user_input != 'y': |
|
|
print(f' Skipping {template_file.name}.\n') |
|
|
continue |
|
|
shutil.copy(template_file, destination_file) |
|
|
print(f' Copied {template_file.name} to {destination}.\n') |
|
|
|
|
|
def copy_files_recursively(source_path: Path, destination_path: Path): |
|
|
""" |
|
|
Recursively copy all contents from source_path to destination_path. |
|
|
Prompts user if a file already exists in destination. |
|
|
""" |
|
|
if not source_path.exists(): |
|
|
print(f"{Fore.RED}Error: Source path does not exist.{Style.RESET_ALL}") |
|
|
return |
|
|
|
|
|
if not source_path.is_dir(): |
|
|
print(f"{Fore.RED}Error: Source path is not a directory.{Style.RESET_ALL}") |
|
|
return |
|
|
|
|
|
yes_to_all = False |
|
|
none_to_all = False |
|
|
|
|
|
for item in source_path.rglob('*'): |
|
|
relative_path = item.relative_to(source_path) |
|
|
dest_item = destination_path / relative_path |
|
|
|
|
|
if item.is_dir(): |
|
|
dest_item.mkdir(parents=True, exist_ok=True) |
|
|
else: |
|
|
if dest_item.exists(): |
|
|
if yes_to_all: |
|
|
pass |
|
|
elif none_to_all: |
|
|
print(f' Skipping {dest_item.name}.\n') |
|
|
continue |
|
|
else: |
|
|
print(f' {Fore.YELLOW}Warning: {dest_item.name} already exists in {destination_path}.{Style.RESET_ALL}') |
|
|
user_input = input(f' Do you want to overwrite {dest_item.name}? (y/n/all/none): ').strip().lower() |
|
|
if user_input == 'all': |
|
|
yes_to_all = True |
|
|
elif user_input == 'none': |
|
|
none_to_all = True |
|
|
print(f' Skipping {dest_item.name}.\n') |
|
|
continue |
|
|
elif user_input != 'y': |
|
|
print(f' Skipping {dest_item.name}.\n') |
|
|
continue |
|
|
|
|
|
shutil.copy2(item, dest_item) |
|
|
|
|
|
print(f'{Fore.GREEN}[Copied]\nFrom: {item}\nTo: {dest_item}{Style.RESET_ALL}\n') |