mirror of
https://github.com/BillyOutlast/posthog.git
synced 2026-02-04 03:01:23 +01:00
200 lines
6.8 KiB
Bash
200 lines
6.8 KiB
Bash
#!/bin/bash
|
|
# PostHog Worktree wrapper function installer
|
|
# Source this file in your shell profile to use the phw function
|
|
|
|
# Get the directory of this script when being sourced
|
|
_phw_script_dir=""
|
|
if [ -n "${BASH_SOURCE[0]:-}" ]; then
|
|
_phw_script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
elif [ -n "${ZSH_VERSION:-}" ]; then
|
|
_phw_script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
fi
|
|
|
|
# Source utility functions for consistent error handling
|
|
source "$_phw_script_dir/helpers/_utils.sh" 2>/dev/null || {
|
|
# Fallback error function if utils not available
|
|
error() { echo "Error: $*" >&2; }
|
|
fatal() { error "$*"; return 1; }
|
|
}
|
|
|
|
# Helper function to find worktree path by branch name
|
|
_find_worktree_path() {
|
|
git worktree list 2>/dev/null | grep -E "\[$1\]$" | awk '{print $1}'
|
|
}
|
|
|
|
# Helper function to clean environment variables before entering worktree
|
|
_clean_environment() {
|
|
unset VIRTUAL_ENV PYTHONPATH CONDA_DEFAULT_ENV 2>/dev/null || true
|
|
}
|
|
|
|
# Helper function to activate Flox environment
|
|
_activate_flox() {
|
|
if ! command -v direnv &>/dev/null; then
|
|
echo "Activating Flox environment via .envrc…"
|
|
source .envrc
|
|
fi
|
|
# If direnv is set up, it will auto-activate via .envrc
|
|
}
|
|
|
|
# Helper function to switch to worktree directory
|
|
_switch_to_worktree() {
|
|
local worktree_path="$1"
|
|
local branch_name="$2"
|
|
|
|
if [[ -d "$worktree_path" ]]; then
|
|
echo "Switching to worktree directory…"
|
|
_clean_environment
|
|
cd "$worktree_path"
|
|
_activate_flox
|
|
else
|
|
error "Worktree directory not found: $worktree_path"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
phw() {
|
|
local script_path="${_phw_script_dir}/posthog-worktree"
|
|
local command="$1"
|
|
local branch="$2"
|
|
|
|
# Handle switch command directly (doesn't need main script)
|
|
if [[ "$command" == "switch" ]]; then
|
|
if [[ -z "$branch" ]]; then
|
|
error "Branch name required"
|
|
echo "Usage: phw switch <branch-name>"
|
|
return 1
|
|
fi
|
|
|
|
local worktree_path=$(_find_worktree_path "$branch")
|
|
|
|
if [[ -z "$worktree_path" ]]; then
|
|
error "No worktree found for branch '$branch'"
|
|
echo "Available worktrees:"
|
|
git worktree list
|
|
return 1
|
|
fi
|
|
|
|
if [[ ! -d "$worktree_path" ]]; then
|
|
error "Worktree directory does not exist: $worktree_path"
|
|
return 1
|
|
fi
|
|
|
|
echo "Switching to worktree: $branch"
|
|
echo "Location: $worktree_path"
|
|
|
|
# Add to shell history for convenience
|
|
if command -v history >/dev/null 2>&1; then
|
|
history -s "cd \"$worktree_path\""
|
|
fi
|
|
|
|
_switch_to_worktree "$worktree_path" "$branch"
|
|
return 0
|
|
fi
|
|
|
|
# Run the actual script for other commands
|
|
"$script_path" "$@"
|
|
|
|
# Auto-cd to worktree after successful command execution
|
|
if [[ -n "$branch" ]]; then
|
|
local worktree_base="${POSTHOG_WORKTREE_BASE:-$HOME/.worktrees/posthog}"
|
|
local worktree_path=""
|
|
|
|
case "$command" in
|
|
create|checkout|start)
|
|
worktree_path="$worktree_base/$branch"
|
|
;;
|
|
pr)
|
|
# For PR, find the directory by pattern (pr-NUMBER-author)
|
|
worktree_path=$(find "$worktree_base" -maxdepth 1 -type d -name "pr-${branch}-*" 2>/dev/null | head -n1)
|
|
;;
|
|
esac
|
|
|
|
if [[ -n "$worktree_path" ]] && [[ -d "$worktree_path" ]]; then
|
|
_switch_to_worktree "$worktree_path" "$branch"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Add completion support for bash and zsh
|
|
if [ -n "$BASH_VERSION" ]; then
|
|
_phw_completions() {
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
|
|
if [[ $COMP_CWORD -eq 1 ]]; then
|
|
COMPREPLY=($(compgen -W "create checkout pr remove list switch" -- "$cur"))
|
|
elif [[ $COMP_CWORD -eq 2 ]]; then
|
|
case "$prev" in
|
|
remove|switch)
|
|
# Complete with existing worktree branch names
|
|
local worktrees=$(git worktree list 2>/dev/null | sed -n 's/.*\[\(.*\)\].*/\1/p' | grep -v '^$')
|
|
COMPREPLY=($(compgen -W "$worktrees" -- "$cur"))
|
|
;;
|
|
checkout)
|
|
# Complete with branch names
|
|
local branches=$(git branch -a 2>/dev/null | grep -v HEAD | sed 's/^[* ]*//' | sed 's/remotes\/origin\///' | sort -u)
|
|
COMPREPLY=($(compgen -W "$branches" -- "$cur"))
|
|
;;
|
|
pr)
|
|
# No completion for PR numbers
|
|
;;
|
|
create)
|
|
# Suggest branch name format
|
|
COMPREPLY=($(compgen -W "haacked/" -- "$cur"))
|
|
;;
|
|
esac
|
|
fi
|
|
}
|
|
complete -F _phw_completions phw
|
|
elif [ -n "$ZSH_VERSION" ]; then
|
|
# Advanced zsh completion function
|
|
_phw_complete() {
|
|
local -a commands
|
|
local context state line
|
|
|
|
commands=(
|
|
'create:Create a new worktree for a branch'
|
|
'checkout:Checkout existing branch in a worktree'
|
|
'pr:Checkout a PR in a worktree'
|
|
'remove:Remove a worktree'
|
|
'list:List all worktrees'
|
|
'switch:Switch to existing worktree'
|
|
)
|
|
|
|
case $CURRENT in
|
|
2)
|
|
_describe 'commands' commands
|
|
;;
|
|
3)
|
|
case $words[2] in
|
|
remove|switch)
|
|
# Complete with existing worktree branch names
|
|
local -a worktrees
|
|
worktrees=($(git worktree list 2>/dev/null | sed -n 's/.*\[\(.*\)\].*/\1/p' | grep -v '^$' 2>/dev/null))
|
|
if [[ ${#worktrees[@]} -gt 0 ]]; then
|
|
_describe 'worktrees' worktrees
|
|
fi
|
|
;;
|
|
checkout)
|
|
# Complete with branch names
|
|
local -a branches
|
|
branches=($(git branch -a 2>/dev/null | grep -v HEAD | sed 's/^[* ]*//' | sed 's/remotes\/origin\///' | sort -u 2>/dev/null))
|
|
if [[ ${#branches[@]} -gt 0 ]]; then
|
|
_describe 'branches' branches
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Use compdef to register the completion function
|
|
if command -v compdef >/dev/null 2>&1; then
|
|
compdef _phw_complete phw
|
|
else
|
|
# Fallback to simple completion if compdef not available
|
|
compctl -k '(create checkout pr remove list)' phw
|
|
fi
|
|
fi
|
|
|
|
echo "PostHog worktree helper loaded. Use 'phw' command." |