diff --git a/README.md b/README.md index 088d582..c839575 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,41 @@ ## Quick Start -**Install (30 seconds):** +**Install:** ```bash git clone https://github.com/coderabbitai/git-worktree-runner.git cd git-worktree-runner +./install.sh +``` + +
+Manual installation options + +**macOS (Apple Silicon with Homebrew):** + +```bash +ln -s "$(pwd)/bin/git-gtr" "$(brew --prefix)/bin/git-gtr" +``` + +**macOS (Intel) / Linux:** + +```bash +sudo mkdir -p /usr/local/bin sudo ln -s "$(pwd)/bin/git-gtr" /usr/local/bin/git-gtr ``` +**User-local (no sudo required):** + +```bash +mkdir -p ~/bin +ln -s "$(pwd)/bin/git-gtr" ~/bin/git-gtr +# Add to ~/.zshrc or ~/.bashrc if ~/bin is not in PATH: +# export PATH="$HOME/bin:$PATH" +``` + +
+ **Usage:** ```bash @@ -470,11 +497,11 @@ git gtr config add gtr.hook.postRemove "echo 'Cleaned up!'" **Hook execution order:** -| Hook | Timing | Use Case | -|------|--------|----------| -| `postCreate` | After worktree creation | Setup, install dependencies | -| `preRemove` | Before worktree deletion | Cleanup requiring directory access | -| `postRemove` | After worktree deletion | Notifications, logging | +| Hook | Timing | Use Case | +| ------------ | ------------------------ | ---------------------------------- | +| `postCreate` | After worktree creation | Setup, install dependencies | +| `preRemove` | Before worktree deletion | Cleanup requiring directory access | +| `postRemove` | After worktree deletion | Notifications, logging | > **Note:** Pre-remove hooks abort removal on failure. Use `--force` to skip failed hooks. @@ -693,6 +720,32 @@ git gtr ai feature-auth-tests -- --message "Write integration tests" ## Troubleshooting +### "git: 'gtr' is not a git command" + +This error means `git-gtr` is not in your PATH. Verify installation: + +```bash +# Check if symlink exists (if neither exists, re-run ./install.sh) +ls -la /usr/local/bin/git-gtr 2>/dev/null || ls -la ~/bin/git-gtr 2>/dev/null + +# Check if git-gtr is findable +which git-gtr + +# Check your PATH includes the install location +echo $PATH | tr ':' '\n' | grep -E "(local/bin|/bin$)" +``` + +**Fix:** Re-run `./install.sh` or manually add the symlink location to your PATH: + +```bash +# Add to ~/.zshrc or ~/.bashrc: +export PATH="/usr/local/bin:$PATH" +# Or if using ~/bin: +export PATH="$HOME/bin:$PATH" +``` + +Then restart your terminal. + ### Worktree Creation Fails ```bash diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..64f3341 --- /dev/null +++ b/install.sh @@ -0,0 +1,250 @@ +#!/usr/bin/env bash +# install.sh - Install git-gtr (Git Worktree Runner) +# +# This script installs git-gtr by creating a symlink in an appropriate +# location based on your platform and available tools. + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Get the directory where this script lives +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GIT_GTR_PATH="$SCRIPT_DIR/bin/git-gtr" + +log_info() { + echo -e "${BLUE}==>${NC} $1" +} + +log_success() { + echo -e "${GREEN}==>${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}Warning:${NC} $1" +} + +log_error() { + echo -e "${RED}Error:${NC} $1" +} + +# Check if a directory is in PATH +in_path() { + echo "$PATH" | tr ':' '\n' | grep -Fqx "$1" +} + +# Windows-specific installation guidance +# Symlinks and sudo don't work reliably in Git Bash/MSYS/Cygwin +install_windows() { + local bin_dir="$SCRIPT_DIR/bin" + + log_warn "Automatic symlink creation is not supported on Windows Git Bash." + echo + log_info "Windows installation options:" + echo + echo " Option 1: Add git-gtr's bin directory to your PATH" + echo " ─────────────────────────────────────────────────────" + echo " Add this line to your ~/.bashrc or ~/.bash_profile:" + echo + echo " export PATH=\"$bin_dir:\$PATH\"" + echo + echo " Then restart your terminal or run: source ~/.bashrc" + echo + echo " Option 2: Create a symlink manually (requires admin)" + echo " ─────────────────────────────────────────────────────" + echo " Open an Administrator Command Prompt and run:" + echo + echo " mklink \"C:\\Program Files\\Git\\usr\\bin\\git-gtr\" \"$(cygpath -w "$GIT_GTR_PATH" 2>/dev/null || echo "$GIT_GTR_PATH")\"" + echo + echo " Option 3: Copy the script directly" + echo " ─────────────────────────────────────────────────────" + echo " Copy git-gtr to your local bin directory:" + echo + echo " mkdir -p ~/bin && cp \"$GIT_GTR_PATH\" ~/bin/git-gtr" + echo + + # Check if bin_dir is already in PATH + if in_path "$bin_dir"; then + log_success "Good news: $bin_dir is already in your PATH!" + verify_installation + else + echo + log_info "After completing one of the options above, verify with:" + echo " git gtr version" + fi +} + +# Detect platform +detect_platform() { + case "$(uname -s)" in + Darwin) + echo "macos" + ;; + Linux) + echo "linux" + ;; + MINGW*|MSYS*|CYGWIN*) + echo "windows" + ;; + *) + echo "unknown" + ;; + esac +} + +# Find the best installation directory +find_install_dir() { + # Option 1: Homebrew bin (if Homebrew is installed) + if command -v brew >/dev/null 2>&1; then + local brew_bin + brew_bin="$(brew --prefix)/bin" + if [ -d "$brew_bin" ] && [ -w "$brew_bin" ]; then + echo "$brew_bin" + return 0 + fi + fi + + # Option 2: /usr/local/bin (if it exists and is in PATH) + if [ -d "/usr/local/bin" ] && in_path "/usr/local/bin"; then + echo "/usr/local/bin" + return 0 + fi + + # Option 3: ~/bin (user-local, create if needed) + echo "$HOME/bin" + return 0 +} + +# Check if we need sudo for a directory +needs_sudo() { + local dir="$1" + [ ! -w "$dir" ] && [ -d "$dir" ] +} + +# Main installation +main() { + log_info "Installing git-gtr (Git Worktree Runner)..." + echo + + # Verify git-gtr exists + if [ ! -f "$GIT_GTR_PATH" ]; then + log_error "Could not find git-gtr at: $GIT_GTR_PATH" + log_error "Please run this script from the git-worktree-runner directory." + exit 1 + fi + + # Ensure git-gtr is executable (auto-fix if needed) + if [ ! -x "$GIT_GTR_PATH" ]; then + log_warn "git-gtr is not executable, fixing permissions..." + chmod +x "$GIT_GTR_PATH" + fi + + # Detect platform + local platform + platform="$(detect_platform)" + log_info "Detected platform: $platform" + + # Windows requires manual installation (symlinks/sudo don't work in Git Bash) + if [ "$platform" = "windows" ]; then + install_windows + exit 0 + fi + + # Find installation directory + local install_dir + install_dir="$(find_install_dir)" + local symlink_path="$install_dir/git-gtr" + + log_info "Installation directory: $install_dir" + + # Check if already installed + if [ -L "$symlink_path" ]; then + local existing_target + existing_target="$(readlink "$symlink_path" 2>/dev/null || true)" + if [ "$existing_target" = "$GIT_GTR_PATH" ]; then + log_success "git-gtr is already installed at $symlink_path" + verify_installation + exit 0 + else + log_warn "Existing symlink found pointing to: $existing_target" + log_info "Replacing with new installation..." + if needs_sudo "$install_dir"; then + sudo rm -f "$symlink_path" + else + rm -f "$symlink_path" + fi + fi + elif [ -e "$symlink_path" ]; then + log_error "A file already exists at $symlink_path (not a symlink)" + log_error "Please remove it manually and re-run this script." + exit 1 + fi + + # Create directory if needed + if [ ! -d "$install_dir" ]; then + log_info "Creating directory: $install_dir" + mkdir -p "$install_dir" + fi + + # Create symlink + if needs_sudo "$install_dir"; then + log_info "Creating symlink (requires sudo)..." + sudo ln -s "$GIT_GTR_PATH" "$symlink_path" + else + log_info "Creating symlink..." + ln -s "$GIT_GTR_PATH" "$symlink_path" + fi + + log_success "Symlink created: $symlink_path -> $GIT_GTR_PATH" + echo + + # Check if install_dir is in PATH + if ! in_path "$install_dir"; then + log_warn "$install_dir is not in your PATH" + echo + echo "Add this to your shell configuration file (~/.zshrc or ~/.bashrc):" + echo + echo " export PATH=\"$install_dir:\$PATH\"" + echo + echo "Then restart your terminal or run: source ~/.zshrc" + echo + fi + + verify_installation +} + +verify_installation() { + echo + log_info "Verifying installation..." + + # Try to find git-gtr in PATH + if command -v git-gtr >/dev/null 2>&1; then + log_success "git-gtr found in PATH: $(command -v git-gtr)" + else + log_warn "git-gtr not found in PATH (restart your terminal or update PATH)" + fi + + # Try running git gtr + if git gtr version >/dev/null 2>&1; then + local version + version="$(git gtr version 2>/dev/null)" + log_success "Installation verified: $version" + echo + echo "You can now use git gtr commands:" + echo " git gtr new # Create a new worktree" + echo " git gtr list # List all worktrees" + echo " git gtr help # Show all commands" + else + log_warn "git gtr command not working yet" + echo + echo "If you added the PATH export above, restart your terminal and try:" + echo " git gtr version" + fi +} + +main "$@"