Menno van Leeuwen ab0e80ec86
Some checks failed
Ansible Lint Check / check-ansible (push) Failing after 14s
Nix Format Check / check-format (push) Successful in 1m11s
Python Lint Check / check-python (push) Failing after 11s
fix: add signal handling for graceful script termination
2025-03-25 17:06:47 +01:00

127 lines
3.6 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import signal
import subprocess
import sys
def signal_handler(sig, frame):
print('Exiting.')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
# Script constants
DOTFILES_ROOT = os.path.expanduser("~/.dotfiles")
DOTFILES_BIN = os.path.join(DOTFILES_ROOT, "bin")
DOTFILES_PATH = DOTFILES_ROOT # For compatibility with the original scripts
# Import helper functions
sys.path.append(DOTFILES_BIN)
from helpers.functions import printfe, ensure_dependencies
ensure_dependencies()
def run_script(script_path, args):
"""Run an action script with the given arguments"""
if not os.path.isfile(script_path) or not os.access(script_path, os.X_OK):
printfe("red", f"Error: Script not found or not executable: {script_path}")
return 1
result = subprocess.run([script_path] + args, env={**os.environ, "DOTFILES_PATH": DOTFILES_PATH})
return result.returncode
def update(args):
"""Run the update action"""
return run_script(f"{DOTFILES_BIN}/actions/update.py", args)
def hello(args):
"""Run the hello action"""
return run_script(f"{DOTFILES_BIN}/actions/hello.py", args)
def help(args):
"""Run the help action"""
return run_script(f"{DOTFILES_BIN}/actions/help.py", args)
def secrets(args):
"""Run the secrets action"""
return run_script(f"{DOTFILES_BIN}/actions/secrets.py", args)
def auto_start(args):
"""Run the auto-start action"""
return run_script(f"{DOTFILES_BIN}/actions/auto-start.py", args)
def service(args):
"""Run the service/docker action"""
return run_script(f"{DOTFILES_BIN}/actions/service.py", args)
def lint(args):
"""Run the lint action"""
return run_script(f"{DOTFILES_BIN}/actions/lint.py", args)
def ensure_git_hooks():
"""Ensure git hooks are correctly set up"""
hooks_dir = os.path.join(DOTFILES_ROOT, ".git/hooks")
target_link = os.path.join(DOTFILES_BIN, "actions/git")
# Validate target directory exists
if not os.path.isdir(target_link):
printfe("red", f"Error: Git hooks source directory does not exist: {target_link}")
return 1
# Handle existing symlink
if os.path.islink(hooks_dir):
current_link = os.readlink(hooks_dir)
if current_link != target_link:
printfe("yellow", "Incorrect git hooks symlink found. Removing and recreating...")
os.remove(hooks_dir)
else:
return 0
# Handle existing directory
if os.path.isdir(hooks_dir) and not os.path.islink(hooks_dir):
printfe("yellow", "Removing existing hooks directory...")
import shutil
shutil.rmtree(hooks_dir)
# Create new symlink
try:
os.symlink(target_link, hooks_dir)
printfe("green", "Git hooks successfully configured!")
return 0
except Exception as e:
printfe("red", f"Failed to create git hooks symlink: {e}")
return 1
def main():
# Ensure we're in the correct directory
if not os.path.isdir(DOTFILES_ROOT):
printfe("red", "Error: Dotfiles directory not found")
return 1
# Setup git hooks
if ensure_git_hooks() != 0:
return 1
# Parse commands
command = sys.argv[1] if len(sys.argv) > 1 else "help"
args = sys.argv[2:]
commands = {
"update": update,
"help": help,
"hello": hello,
"secrets": secrets,
"auto-start": auto_start,
"service": service,
"lint": lint
}
if command in commands:
return commands[command](args)
else:
return help([])
if __name__ == "__main__":
sys.exit(main())