From 03ef7f3f8d29c6e9e607bc17c1b03226c4ab0de0 Mon Sep 17 00:00:00 2001 From: George Papaioannou Date: Mon, 11 Dec 2023 18:38:17 +0200 Subject: [PATCH] feat: add homli commands. --- pre_commit/homli/__init__.py | 0 pre_commit/homli/constants.py | 6 ++ pre_commit/homli/install_uninstall.py | 104 ++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 pre_commit/homli/__init__.py create mode 100644 pre_commit/homli/constants.py create mode 100644 pre_commit/homli/install_uninstall.py diff --git a/pre_commit/homli/__init__.py b/pre_commit/homli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pre_commit/homli/constants.py b/pre_commit/homli/constants.py new file mode 100644 index 00000000..bf1ebd24 --- /dev/null +++ b/pre_commit/homli/constants.py @@ -0,0 +1,6 @@ +from pathlib import Path + +HOME_DIRECTORY = str(Path.home()) +CONFIG_FILE = '.pre-commit-config.yaml' +DEFAULT_CONFIG_FILE = HOME_DIRECTORY + '/' + CONFIG_FILE +GITHUB_DOTFILES_REPOSITORY = 'https://github.com/thehomli/dotfiles/' diff --git a/pre_commit/homli/install_uninstall.py b/pre_commit/homli/install_uninstall.py new file mode 100644 index 00000000..9dd483eb --- /dev/null +++ b/pre_commit/homli/install_uninstall.py @@ -0,0 +1,104 @@ +import itertools +import logging +import os.path +import shutil +import sys +from typing import Optional +from typing import Sequence +from typing import Tuple + +from pre_commit import git +from pre_commit import output +from pre_commit.clientlib import load_config +from pre_commit.repository import all_hooks +from pre_commit.repository import install_hook_envs +from pre_commit.store import Store +from pre_commit.util import make_executable +from pre_commit.util import resource_text +from pre_commit.commands.install_uninstall import _install_hook_script +from pre_commit.commands.install_uninstall import _hook_paths + +# import homli github with dotfiles # +from pathlib import Path +from git.repo.base import Repo +from pre_commit.homli.constants import GITHUB_DOTFILES_REPOSITORY + +logger = logging.getLogger(__name__) + +################################## +### Avlos installation scripts ### +################################## +def setup_homli() -> int: + """ + Installs the remote repository with dotfiles + and copies them over to home directory + """ + ### install github repository ### + home_directory = str(Path.home()) + installation_directory = home_directory + '/.dotfiles' + logger.info( + "Cloning git repository {} to {}".format(GITHUB_DOTFILES_REPOSITORY, installation_directory) + ) + # check if folder exists, remove # + if os.path.isdir(installation_directory): + shutil.rmtree(installation_directory) + Repo.clone_from(GITHUB_DOTFILES_REPOSITORY, installation_directory) + + ### copy dotfiles to home directory ### + dotfiles = os.listdir(installation_directory) + dotfiles = [d for d in dotfiles if d.startswith('.') and d not in ['.git', '.gitignore']] + + # check for existing dotfiles # + existing_dotfiles = list(set(os.listdir(home_directory)) & set(dotfiles)) + if len(existing_dotfiles) > 0: + logger.warning( + "The configuration files {} already exist.".format(", ".join(existing_dotfiles)) + ) + answer = input("Overwrite? (Y/N): ") + if not answer.lower().startswith('y'): + dotfiles = list(set(dotfiles) - set(existing_dotfiles)) + + # copy to home directory + for dotfile in dotfiles: + shutil.copyfile(installation_directory + '/' + dotfile, home_directory + '/' + dotfile) + + logger.info("Pre-commit configuration installed.") + return 0 + +def install_homli( + store: Store, + hook_types: Sequence[str], + overwrite: bool = False, + hooks: bool = False, + skip_on_missing_config: bool = False, + git_dir: Optional[str] = None, +) -> int: + """ + Installs the remote repository with dotfiles + and copies them over to home directory + """ + ### install github repository ### + logger.info("Installing hooks at git repository") + home_directory = str(Path.home()) + + installation_directory = home_directory + '/.dotfiles' + if os.path.isdir(installation_directory): + logger.warning("The configuration repository ~/.dotfiles already exists. If you want to update it run `pre-commit homli-setup`") + else: + setup_homli() + + config_file = home_directory + '/.pre-commit-config.yaml' + + for hook_type in hook_types: + _install_hook_script( + config_file, + hook_type, + overwrite=overwrite, + skip_on_missing_config=skip_on_missing_config, + git_dir=git_dir, + ) + + if hooks: + install_hooks(config_file, store) + + return 0