#!/usr/bin/env bash # =========================================================================== # Stage 05: Git Configuration & SSH Keys # Deploys .gitconfig and optionally generates SSH keys. # =========================================================================== # The Pop machine's .gitconfig is well-optimised: # - SSH key signing (gpg.format = ssh) # - zdiff3 conflict style, histogram diff algorithm # - rerere.enabled, autoSquash, autoStash # - push.autoSetupRemote, pull.rebase, fetch.prune # =========================================================================== CONFIG_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/config" # ---- Deploy .gitconfig ---- info "Deploying .gitconfig..." if [ -f "$HOME/.gitconfig" ]; then cp "$HOME/.gitconfig" "$HOME/.gitconfig.bak.$(date +%Y%m%d)" 2>/dev/null warn "Backed up existing .gitconfig" fi # Use the template from config/git/gitconfig # NOTE: This template does NOT contain your signing key or email. # Edit it after deployment to set: # [user] # name = Your Name # email = your.email@example.com # signingkey = cp "${CONFIG_DIR}/git/gitconfig" "$HOME/.gitconfig" ok ".gitconfig deployed." warn "REMINDER: Edit ~/.gitconfig to set your name, email, and signingkey." # ---- Deploy .gitignore_global ---- info "Deploying global .gitignore..." if [ -f "$HOME/.gitignore" ]; then warn "Global .gitignore already exists (keeping)." else # A sensible global gitignore for common OS + editor files cat > "$HOME/.gitignore" << 'EOF' # OS files .DS_Store Thumbs.db Desktop.ini # Editor/IDE *.swp *.swo *~ .vscode/ .idea/ *.sublime-* # Python __pycache__/ *.py[cod] *.egg-info/ .venv/ .eggs/ # Node node_modules/ .npm/ # Rust target/ EOF ok "Global .gitignore deployed." fi # ---- Git SSH key ---- # The Pop machine has a single SSH key: id_ed25519_github # Loading is handled by bw-load-ssh.sh (stage 07) from Bitwarden. # This stage can generate a new key if one doesn't exist. info "Checking SSH keys..." if [ ! -f "$HOME/.ssh/id_ed25519" ]; then warn "No SSH key found." warn "Options:" warn " 1. Generate a new key (recommended for new machine):" warn " ssh-keygen -t ed25519 -C 'hi@julianprester.com'" warn " 2. Restore from backup/Bitwarden (see TODO.md)" warn " 3. Skip for now (run bw-load-ssh.sh later to load from Bitwarden)" echo "" read -r -p "Generate a new SSH key now? [y/N] " response if [[ "$response" =~ ^[Yy]$ ]]; then ssh-keygen -t ed25519 -C "hi@julianprester.com" -f "$HOME/.ssh/id_ed25519" -N "" 2>/dev/null || { warn "Key generation skipped or failed." } ok "SSH key generated: ~/.ssh/id_ed25519.pub" cat "$HOME/.ssh/id_ed25519.pub" warn "Add this key to GitHub: https://github.com/settings/keys" fi else ok "SSH key already exists." fi # Ensure proper SSH permissions chmod 700 "$HOME/.ssh" 2>/dev/null || true find "$HOME/.ssh" -type f -name "id_*" -exec chmod 600 {} \; 2>/dev/null || true find "$HOME/.ssh" -type f -name "*.pub" -exec chmod 644 {} \; 2>/dev/null || true ok "Stage 05 complete: Git configured."