diff --git a/src/__main__.py b/src/__main__.py index 42e71b7..163df83 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -1,6 +1,7 @@ import os from src.packages import install_packages +from src.dotfiles import install_dotfiles from src.util.user import Input, Print @@ -11,6 +12,8 @@ def main(): if Input.yes_no("Do you wish to perform package install (from `packages.yaml`)?"): install_packages() + if Input.yes_no("Do you wish to install dotfiles (sync `home/` and `root/` directories accordingly)? You can make a backup."): + install_dotfiles() try: diff --git a/src/dotfiles.py b/src/dotfiles.py new file mode 100644 index 0000000..b050811 --- /dev/null +++ b/src/dotfiles.py @@ -0,0 +1,59 @@ +import os +import shutil +from datetime import datetime +from contextlib import suppress + +from src.util.user import Print, Input + + +def _backup_file(backup_dir: str, subdir: str, file: str): + """ + Backup given `file` in given `subdir` + """ + origin_subdir = subdir.replace("home/", f"{os.environ['HOME']}/").replace("root/", "/") + origin_path = os.path.join(origin_subdir, file) + + # Only backup files which exists in origin destination (real system destination) + if os.path.exists(origin_path): + backup_subdir = os.path.join(backup_dir, subdir) + backup_path = os.path.join(backup_subdir, file) + # Ensure directory existence in the new backup directory + with suppress(FileExistsError): + os.makedirs(backup_subdir) + + if file != "placeholder": + Print.comment(f"Backing up {origin_path}") + shutil.copyfile(origin_path, backup_path) + + +def make_backup() -> None: + """ + Find all files which will be replaced and back them up. + Files which doesn't exist in the real system destination + will be ignored. + """ + Print.action("Creating current dotfiles backup") + time = str(datetime.now()).replace(" ", "--") + backup_dir = os.path.join(os.getcwd(), "backup", time) + os.makedirs(backup_dir) + + # backup files in `home` directory + for subdir, _, files in os.walk("home"): + for file in files: + _backup_file(backup_dir, subdir, file) + + # backup files in `root` directory + for subdir, _, files in os.walk("root"): + for file in files: + _backup_file(backup_dir, subdir, file) + + Print.action("Backup complete") + + +def install_dotfiles(): + if Input.yes_no("Do you want to backup current dotfiles? (Recommended)"): + make_backup() + + +if __name__ == "__main__": + install_dotfiles()