Add dotfile overwriting

This commit is contained in:
ItsDrike 2020-10-23 01:34:58 +02:00
parent 45d43c7c90
commit d75a9d4f96
No known key found for this signature in database
GPG key ID: F4E8FF4F6AC7F3B4

View file

@ -1,20 +1,22 @@
import os import os
import shutil import shutil
import time
from datetime import datetime from datetime import datetime
from contextlib import suppress from contextlib import suppress
from src.util import command
from src.util.user import Print, Input from src.util.user import Print, Input
def _backup_file(backup_dir: str, subdir: str, file: str): def _backup_file(backup_dir: str, subdir: str, file: str) -> None:
""" """
Backup given `file` in given `subdir` Backup given `file` in given `subdir` from system
""" """
origin_subdir = subdir.replace("home/", f"{os.environ['HOME']}/").replace("root/", "/") system_subdir = subdir.replace("home", f"{os.environ['HOME']}/").replace("root", "/")
origin_path = os.path.join(origin_subdir, file) system_path = os.path.join(system_subdir, file)
# Only backup files which exists in origin destination (real system destination) # Only backup files which exists in origin destination (real system destination)
if os.path.exists(origin_path): if os.path.exists(system_path):
backup_subdir = os.path.join(backup_dir, subdir) backup_subdir = os.path.join(backup_dir, subdir)
backup_path = os.path.join(backup_subdir, file) backup_path = os.path.join(backup_subdir, file)
# Ensure directory existence in the new backup directory # Ensure directory existence in the new backup directory
@ -22,8 +24,8 @@ def _backup_file(backup_dir: str, subdir: str, file: str):
os.makedirs(backup_subdir) os.makedirs(backup_subdir)
if file != "placeholder": if file != "placeholder":
Print.comment(f"Backing up {origin_path}") Print.comment(f"Backing up {system_path}")
shutil.copyfile(origin_path, backup_path) shutil.copyfile(system_path, backup_path)
def make_backup() -> None: def make_backup() -> None:
@ -50,10 +52,44 @@ def make_backup() -> None:
Print.action("Backup complete") Print.action("Backup complete")
def install_dotfiles(): def _overwrite_dotfile(subdir: str, dotfile: str) -> None:
"""Overwrite given `dotfile` in `subdir` from system with the local one"""
local_path = os.path.join(subdir, dotfile)
system_subdir = subdir.replace("home", f"{os.environ['HOME']}").replace("root", "/")
system_path = os.path.join(system_subdir, dotfile)
# Ensure existence of system directory
with suppress(FileExistsError):
os.makedirs(system_subdir)
if dotfile != "placeholder":
Print.comment(f"Overwriting {system_path}")
# Use sudo to avoid PermissionError
command.execute(f"sudo cp {local_path} {system_path}")
def overwrite_dotfiles() -> None:
# overwrite system dotfiles with local in `home`
for subdir, _, files in os.walk("home"):
for file in files:
_overwrite_dotfile(subdir, file)
# overwrite system dotfiles with local in `root`
for subdir, _, files in os.walk("root"):
for file in files:
_overwrite_dotfile(subdir, file)
def install_dotfiles() -> None:
if Input.yes_no("Do you want to backup current dotfiles? (Recommended)"): if Input.yes_no("Do you want to backup current dotfiles? (Recommended)"):
make_backup() make_backup()
Print.action("Installing dotfiles (this will overwrite your original files)")
time.sleep(2)
overwrite_dotfiles()
Print.action("Dotfile installation complete, make sure to adjust the dotfiles to your liking.")
if __name__ == "__main__": if __name__ == "__main__":
install_dotfiles() install_dotfiles()