| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #!/usr/bin/env bash
- # NAME: Setup dotfiles and configuration
- # REQUIRES: interactive
- set -euo pipefail
- # Source common functions
- source "$(dirname "$0")/../common.sh" || {
- echo "[ERROR] Could not source common.sh" >&2
- exit 1
- }
- readonly DOTFILES_REPO="https://git.mz.uy/marianozunino/dotfiles.git"
- readonly DOTFILES_DIR="$HOME/dotfiles"
- check_requirements() {
- local required_commands=(git git-crypt stow)
- for cmd in "${required_commands[@]}"; do
- if ! command_exists "$cmd"; then
- log_error "Required command not found: $cmd"
- exit 1
- fi
- done
- }
- clone_dotfiles() {
- log_info "Setting up dotfiles repository"
- if [[ -d "$DOTFILES_DIR" ]]; then
- log_info "Dotfiles directory already exists, updating"
- cd "$DOTFILES_DIR"
- git pull origin main || git pull origin master
- else
- log_info "Cloning dotfiles to $DOTFILES_DIR"
- git clone "$DOTFILES_REPO" "$DOTFILES_DIR"
- fi
- }
- handle_git_crypt() {
- log_info "Checking git-crypt status"
- cd "$DOTFILES_DIR"
- if git-crypt status | grep -q "unlocked"; then
- log_info "Repository already unlocked"
- return 0
- fi
- log_info "Repository is encrypted, attempting to unlock"
- if gpg --card-status &>/dev/null; then
- log_info "YubiKey detected, fetching public key"
- local key_id
- key_id=$(gpg --card-status 2>/dev/null | grep "General key info" -A 1 | tail -1 | awk '{print $1}' | sed 's/.*\///')
- if [[ -n "$key_id" ]] && ! gpg --list-keys "$key_id" &>/dev/null; then
- gpg --card-edit --batch --command-fd 0 <<<"fetch" &>/dev/null ||
- gpg --keyserver hkps://keys.openpgp.org --recv-keys "$key_id" &>/dev/null || true
- fi
- else
- log_error "YubiKey not detected"
- exit 1
- fi
- if git-crypt unlock 2>/dev/null; then
- log_info "Repository unlocked successfully"
- else
- log_error "Failed to unlock repository"
- log_info "Manual unlock required: cd $DOTFILES_DIR && git-crypt unlock"
- exit 1
- fi
- }
- create_directories() {
- log_info "Creating necessary directories"
- mkdir -p "$HOME/.config" "$HOME/Dev" "$HOME/.local/bin"
- }
- stow_packages() {
- cd "$DOTFILES_DIR"
- log_info "Available stow packages:"
- for dir in */; do
- if [[ -d "$dir" ]]; then
- log_info " ${dir%/}"
- fi
- done
- if confirm "Stow all packages?" "y"; then
- log_info "Stowing all packages"
- if stow */; then
- log_info "All packages stowed successfully"
- else
- log_error "Some packages failed to stow. Check for conflicts"
- fi
- else
- log_info "Skipping automatic stow. Run manually:"
- log_info " cd $DOTFILES_DIR"
- log_info " stow <package_name>"
- fi
- }
- main() {
- init_script
- check_requirements
- clone_dotfiles
- handle_git_crypt
- create_directories
- stow_packages
- log_info "Dotfiles location: $DOTFILES_DIR"
- finish_script 0
- }
- main "$@"
|