#!/usr/bin/env bash # Symlink dotfiles to home directory set -euo pipefail DOTFILES_DIR="$HOME/dotfiles" # Colors GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}Creating symlinks for dotfiles...${NC}" # Function to create symlink with backup link_file() { local source="$1" local target="$2" local backup_dir="$HOME/.dotfiles-backup/$(date +%Y%m%d_%H%M%S)" # Create target directory if it doesn't exist mkdir -p "$(dirname "$target")" # If target exists and is not a symlink, back it up if [ -e "$target" ] && [ ! -L "$target" ]; then echo -e "${YELLOW}Backing up existing $target${NC}" mkdir -p "$backup_dir" mv "$target" "$backup_dir/" fi # Remove existing symlink [ -L "$target" ] && rm "$target" # Create new symlink ln -sf "$source" "$target" echo -e "${GREEN}✓ Linked: $target -> $source${NC}" } # Shell configurations echo -e "${YELLOW}Linking shell configurations...${NC}" link_file "$DOTFILES_DIR/shell/.zshrc" "$HOME/.zshrc" link_file "$DOTFILES_DIR/.gitconfig" "$HOME/.gitconfig" link_file "$DOTFILES_DIR/.vimrc" "$HOME/.vimrc" link_file "$DOTFILES_DIR/.npmrc" "$HOME/.npmrc" # Link plugin manifest link_file "$DOTFILES_DIR/shell/.zsh-plugins.txt" "$HOME/.zsh-plugins.txt" # SSH config (template only - user must customize) if [ -f "$DOTFILES_DIR/ssh/config.example" ] && [ ! -f "$HOME/.ssh/config" ]; then echo -e "${YELLOW}Creating SSH config from template...${NC}" mkdir -p "$HOME/.ssh" cp "$DOTFILES_DIR/ssh/config.example" "$HOME/.ssh/config" chmod 600 "$HOME/.ssh/config" echo -e "${YELLOW}⚠ Edit ~/.ssh/config with your actual values${NC}" fi # Config directories echo -e "${YELLOW}Linking config directories...${NC}" mkdir -p "$HOME/.config" # Link config subdirectories if they exist for config_dir in git iterm2 kitty karabiner; do if [ -d "$DOTFILES_DIR/config/$config_dir" ]; then link_file "$DOTFILES_DIR/config/$config_dir" "$HOME/.config/$config_dir" fi done # Custom scripts echo -e "${YELLOW}Linking custom scripts...${NC}" mkdir -p "$HOME/bin" if [ -d "$DOTFILES_DIR/bin" ]; then for script in "$DOTFILES_DIR/bin"/*; do if [ -f "$script" ] && [ -x "$script" ]; then script_name=$(basename "$script") link_file "$script" "$HOME/bin/$script_name" fi done fi # Git hooks echo -e "${YELLOW}Setting up global git hooks...${NC}" if [ -d "$DOTFILES_DIR/git/hooks" ]; then git config --global core.hooksPath "$DOTFILES_DIR/git/hooks" echo -e "${GREEN}✓ Global git hooks configured${NC}" fi # Mackup configuration if [ -f "$DOTFILES_DIR/.mackup.cfg" ]; then link_file "$DOTFILES_DIR/.mackup.cfg" "$HOME/.mackup.cfg" fi # Shell enhancements are now integrated into the main .zshrc echo -e "${GREEN}✓ Shell enhancements integrated into main configuration${NC}" echo "" echo -e "${GREEN}Symlinks created successfully! 🔗${NC}" echo "" echo -e "${YELLOW}Next steps:${NC}" echo "1. Edit ~/.ssh/config with your actual values" echo "2. Restart your shell or run: source ~/.zshrc" echo "3. Review and customize any linked configurations"