From c38e4b043f4bbba430682ae1d4a5c4008f1bb136 Mon Sep 17 00:00:00 2001 From: koumakpet Date: Sat, 4 Apr 2020 01:40:27 +0200 Subject: [PATCH] OOP: Dotfile Creation --- dotfiles_install.py | 47 +++++++++++++++++++++++++++++++++++++++++++-- util/Input.py | 12 ++++++++++-- util/Path.py | 9 +++++---- 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/dotfiles_install.py b/dotfiles_install.py index e00ea41..ad13f8d 100644 --- a/dotfiles_install.py +++ b/dotfiles_install.py @@ -1,4 +1,4 @@ -from util import Path, Print, Install +from util import Path, Print, Install, Input from datetime import datetime @@ -11,7 +11,8 @@ class InstallationChecks: @staticmethod def get_installation_path(standard_paths): dir_exists, path = Path.check_dir_exists(standard_paths) - path = path.replace('~', '$HOME') + if dir_exists: + path = path.replace('~', '$HOME') return dir_exists, path @@ -84,8 +85,36 @@ class Dotfiles: self.dotfiles_location = Path.join(Path.WORKING_FLODER, 'files') def start(self): + Print.action('Installing dotfiles') + + # Check for necessary packages self.initial_checks() + # Check backup + if Input.yes_no( + 'Do you wish to create backup of your current dotfiles?'): + self.make_backup() + else: + Print.warning( + 'Proceeding without backup, you will loose your current dotfiles settings' + ) + + # Symlinks or Files + create_dotfiles = Input.multiple('Do you wish to create dotfiles?', [ + 'symlinks (dotfiles/ dir will be required)', + 'files (dotfiles/ dir can be removed afterwards)' + ]) + + if create_dotfiles == 'symlinks': + self.use_symlinks = True + elif create_dotfiles == 'files': + self.use_symlinks = False + else: + Print.err('Symlink creation aborted (canceled by user.)') + return False + + self.create_dotfiles() + def initial_checks(self): if not InstallationChecks.check_zsh(): InstallationChecks.installation_error('zsh') @@ -124,6 +153,20 @@ class Dotfiles: def personalized_changes(self, file): pass + def create_dotfiles(self): + file_list = Path.get_all_files(self.dotfiles_location) + for target_file in file_list: # Loop through every file in dotfiles + self.personalized_changes(target_file) + + # Remove dotfiles_location from file path + file_blank = target_file.replace(f'{self.dotfiles_location}/', '') + destination = Path.join(Path.get_home(), file_blank) + + if self.use_symlinks: + Path.create_symlink(target_file, destination) + else: + Path.copy(target_file, destination) + if __name__ == "__main__": dotfiles = Dotfiles() diff --git a/util/Input.py b/util/Input.py index 35f3da6..1990a15 100644 --- a/util/Input.py +++ b/util/Input.py @@ -1,5 +1,6 @@ #!/bin/python3 from util import Print +import re def yes_no(question): @@ -30,7 +31,7 @@ def multiple(question, options): options {list} -- list of possible options (strings) Returns: - str -- one of options + str -- one of options (without content in brackets in the end) ''' def get_input_range(max): while True: @@ -55,7 +56,14 @@ def multiple(question, options): answer = get_input_range(len(options)) if answer != 0: - return options[answer - 1] + result = options[answer - 1] + result = re.sub(r'\(.*\)$', '', + result) # remove bracket content in the end + if result[ + -1] == ' ': # remove remaining space (might happen after removing brackets) + result = result[:-1] + return result + else: return False diff --git a/util/Path.py b/util/Path.py index 1f5c396..851251d 100644 --- a/util/Path.py +++ b/util/Path.py @@ -4,8 +4,6 @@ import pathlib from util import Command, Print -WORKING_FLODER = os.path.dirname(os.path.realpath(__file__)) - def check_dir_exists(paths): '''Check for directory/ies existence @@ -111,7 +109,7 @@ def ensure_dirs(path, file_end=False, absolute_path=True): if check_file_exists(path) or file_end: path = get_parent(path) - if not check_dir_exists(path): + if not check_dir_exists(path)[0]: Command.execute(f'mkdir -p {path}') Print.comment(f'Creating directory {path}') @@ -156,4 +154,7 @@ def join(*paths): Returns: str -- Joined paths ''' - return os.path.join(paths) + return os.path.join(*paths) + + +WORKING_FLODER = get_parent(os.path.dirname(os.path.realpath(__file__)))