diff --git a/dotfiles_install.py b/dotfiles_install.py index 701f54c..e00ea41 100644 --- a/dotfiles_install.py +++ b/dotfiles_install.py @@ -1,15 +1,102 @@ -from util import Path, Print +from util import Path, Print, Install from datetime import datetime +class InstallationChecks: + @staticmethod + def installation_error(package): + Print.err(f'Dotfiles installation cancelled - {package} not installed') + raise Install.InstallationError(f'{package} not installed') + + @staticmethod + def get_installation_path(standard_paths): + dir_exists, path = Path.check_dir_exists(standard_paths) + path = path.replace('~', '$HOME') + + return dir_exists, path + + @staticmethod + def install_package(package, standard_paths, status, use_aur=False): + if not Install.package( + package, + f'default + (This is {status} for dotfiles to work)', + aur=use_aur): + return False, None + else: + installation_path = InstallationChecks.get_installation_path( + standard_paths) + + if not installation_path: # Package was not found in standard paths after installation + Print.err( + f'Installation location of {package} has changed, please contact the developer' + ) + return False, None + else: + return True, installation_path + + @staticmethod + def check_zsh(): + if Install.check_not_installed('zsh'): + if not Install.package( + 'zsh', + 'default + (This is REQUIRED shell for dotfiles to work)'): + return False + return True + + @staticmethod + def check_oh_my_zsh(): + standard_paths = [ + '~/.oh-my-zsh', '~/oh-my-zsh', '~/ohmyzsh', '~/.config/oh-my-zsh', + '/usr/share/oh-my-zsh' + ] + oh_my_zsh_path = InstallationChecks.get_installation_path( + standard_paths) + + if oh_my_zsh_path: # Check if package was found in standard paths + return True, oh_my_zsh_path + else: # Package wasn't found, try to install it + return InstallationChecks.install_package('oh-my-zsh', + standard_paths, + 'REQUIRED zsh package', + use_aur=True) + + @staticmethod + def check_zsh_highlight(): + standard_paths = [ + '/usr/share/zsh/plugins/zsh-syntax-highlighting', + '/usr/share/zsh/zsh-syntax-highlighting', + '/usr/share/zsh-syntax-highlighting' + ] + zsh_highlight_path = InstallationChecks.get_installation_path( + standard_paths) + + if zsh_highlight_path: # Check if package was found in standard paths + return True, zsh_highlight_path + else: # Package wasn't found, try to install it + return InstallationChecks.install_package( + 'zsh-syntax-highlighting', standard_paths, + 'RECOMMENDED zsh extension') + + class Dotfiles: def __init__(self): self.backup_location = Path.join(Path.WORKING_FLODER, 'Backups') self.dotfiles_location = Path.join(Path.WORKING_FLODER, 'files') + + def start(self): self.initial_checks() def initial_checks(self): - pass + if not InstallationChecks.check_zsh(): + InstallationChecks.installation_error('zsh') + + self.oh_my_zsh_installed, self.oh_my_zsh_path = InstallationChecks.check_oh_my_zsh( + ) + if not self.oh_my_zsh_installed: + InstallationChecks.installation_error('oh-my-zsh') + + self.zsh_syntax_highlighting_installed, self.zsh_syntax_highlighting_path = InstallationChecks.check_zsh_highlight( + ) def make_backup(self): Print.action('Creating current dotfiles backup') @@ -36,3 +123,8 @@ class Dotfiles: def personalized_changes(self, file): pass + + +if __name__ == "__main__": + dotfiles = Dotfiles() + dotfiles.start() diff --git a/util/Install.py b/util/Install.py index 2365931..70f5511 100644 --- a/util/Install.py +++ b/util/Install.py @@ -5,6 +5,10 @@ import shutil from util import Command, Input, Print, Path +class InstallationError(Exception): + pass + + def _generate_install_text(install_text, package_name, yay=False, git=False): if install_text == 'default': install_text = f'Do you wish to install {package_name}?' diff --git a/util/Path.py b/util/Path.py index 6e3d85f..1f5c396 100644 --- a/util/Path.py +++ b/util/Path.py @@ -22,10 +22,10 @@ def check_dir_exists(paths): for dir_path in paths: dir_path = os.path.expanduser(dir_path) if os.path.isdir(dir_path): - return True + return True, dir_path break else: - return False + return False, None def check_file_exists(paths):