9-dotfiles 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/usr/bin/env bash
  2. # NAME: Setup dotfiles and configuration
  3. # REQUIRES: interactive
  4. set -euo pipefail
  5. # Source common functions
  6. source "$(dirname "$0")/../common.sh" || {
  7. echo "[ERROR] Could not source common.sh" >&2
  8. exit 1
  9. }
  10. readonly DOTFILES_REPO="https://git.mz.uy/marianozunino/dotfiles.git"
  11. readonly DOTFILES_DIR="$HOME/dotfiles"
  12. check_requirements() {
  13. local required_commands=(git git-crypt stow)
  14. for cmd in "${required_commands[@]}"; do
  15. if ! command_exists "$cmd"; then
  16. log_error "Required command not found: $cmd"
  17. exit 1
  18. fi
  19. done
  20. }
  21. clone_dotfiles() {
  22. log_info "Setting up dotfiles repository"
  23. if [[ -d "$DOTFILES_DIR" ]]; then
  24. log_info "Dotfiles directory already exists, updating"
  25. cd "$DOTFILES_DIR"
  26. git pull origin main || git pull origin master
  27. else
  28. log_info "Cloning dotfiles to $DOTFILES_DIR"
  29. git clone "$DOTFILES_REPO" "$DOTFILES_DIR"
  30. fi
  31. }
  32. handle_git_crypt() {
  33. log_info "Checking git-crypt status"
  34. cd "$DOTFILES_DIR"
  35. if git-crypt status | grep -q "unlocked"; then
  36. log_info "Repository already unlocked"
  37. return 0
  38. fi
  39. log_info "Repository is encrypted, attempting to unlock"
  40. if gpg --card-status &>/dev/null; then
  41. log_info "YubiKey detected, fetching public key"
  42. local key_id
  43. key_id=$(gpg --card-status 2>/dev/null | grep "General key info" -A 1 | tail -1 | awk '{print $1}' | sed 's/.*\///')
  44. if [[ -n "$key_id" ]] && ! gpg --list-keys "$key_id" &>/dev/null; then
  45. gpg --card-edit --batch --command-fd 0 <<<"fetch" &>/dev/null ||
  46. gpg --keyserver hkps://keys.openpgp.org --recv-keys "$key_id" &>/dev/null || true
  47. fi
  48. else
  49. log_error "YubiKey not detected"
  50. exit 1
  51. fi
  52. if git-crypt unlock 2>/dev/null; then
  53. log_info "Repository unlocked successfully"
  54. else
  55. log_error "Failed to unlock repository"
  56. log_info "Manual unlock required: cd $DOTFILES_DIR && git-crypt unlock"
  57. exit 1
  58. fi
  59. }
  60. create_directories() {
  61. log_info "Creating necessary directories"
  62. mkdir -p "$HOME/.config" "$HOME/Dev" "$HOME/.local/bin"
  63. }
  64. stow_packages() {
  65. cd "$DOTFILES_DIR"
  66. log_info "Available stow packages:"
  67. for dir in */; do
  68. if [[ -d "$dir" ]]; then
  69. log_info " ${dir%/}"
  70. fi
  71. done
  72. if confirm "Stow all packages?" "y"; then
  73. log_info "Stowing all packages"
  74. if stow */; then
  75. log_info "All packages stowed successfully"
  76. else
  77. log_error "Some packages failed to stow. Check for conflicts"
  78. fi
  79. else
  80. log_info "Skipping automatic stow. Run manually:"
  81. log_info " cd $DOTFILES_DIR"
  82. log_info " stow <package_name>"
  83. fi
  84. }
  85. main() {
  86. init_script
  87. check_requirements
  88. clone_dotfiles
  89. handle_git_crypt
  90. create_directories
  91. stow_packages
  92. log_info "Dotfiles location: $DOTFILES_DIR"
  93. finish_script 0
  94. }
  95. main "$@"