Bläddra i källkod

feat(tmux): enable easy handling of worktrees

Joe 1 månad sedan
förälder
incheckning
894ba7e889

+ 28 - 0
.config/lazygit/config.yml

@@ -187,3 +187,31 @@ customCommands:
         title: "Review Branches to be Nuked"
         key: "Confirmation"
         command: /usr/bin/env zsh -c "/bin/zsh $DOTFILES_DIR/.scripts/lazygit_branch_pruner.zsh print true && echo nuke"
+
+  - key: '<c-w>'
+    context: 'localBranches'
+    description: 'Create worktree'
+    prompts:
+      - type: 'input'
+        key: 'Name'
+        title: 'Branch/Worktree Name'
+        initialValue: '{{.SelectedLocalBranch.Name}}'
+    command: |
+      bash -c '
+        INPUT_NAME="$1"
+        SELECTED_BRANCH="$2"
+        ROOT_DIR="$(git rev-parse --show-toplevel)"
+        CURRENT_BRANCH="$(git branch --show-current)"
+        SUFFIX="/$CURRENT_BRANCH"
+        if [[ "$ROOT_DIR" == *"$SUFFIX" ]]; then
+            BASE_PATH="${ROOT_DIR%$SUFFIX}"
+        else
+            BASE_PATH="$ROOT_DIR"
+        fi
+        TARGET_PATH="$BASE_PATH/$INPUT_NAME"
+        if [ "$INPUT_NAME" == "$SELECTED_BRANCH" ]; then
+            git worktree add "$TARGET_PATH" "$SELECTED_BRANCH"
+        else
+            git worktree add -b "$INPUT_NAME" "$TARGET_PATH" "$SELECTED_BRANCH"
+        fi;
+      ' -- "{{.Form.Name}}" "{{.SelectedLocalBranch.Name}}"

+ 23 - 0
.scripts/create_bare_worktrees_repo_workspace.zsh

@@ -0,0 +1,23 @@
+#!/usr/bin/env zsh
+set -e
+
+repo_url=$1
+target_dir=$2
+
+[[ -z $repo_url ]] && read "repo_url?Repository URL: "
+[[ -z $target_dir ]] && read "target_dir?Target Directory: "
+
+target_dir=${~target_dir}
+
+mkdir -p "$target_dir"/{worktrees,scripts}
+cd "$target_dir"
+
+git clone --bare "$repo_url" .bare
+
+git --git-dir=.bare config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
+git --git-dir=.bare fetch origin
+
+git --git-dir=.bare remote set-head origin -a
+default_branch=$(git --git-dir=.bare symbolic-ref refs/remotes/origin/HEAD | sed 's|refs/remotes/origin/||')
+
+git --git-dir=.bare worktree add "worktrees/$default_branch" "$default_branch"

+ 29 - 7
.scripts/project_launch.zsh

@@ -4,21 +4,43 @@ if [ -z "$1" ]; then
     (sleep 3; exit 1) &
     PROJECT=$(timeout 2 fd \
         --base-directory ~ \
-        -t d \
-        -d 5 \
+        -d 10 \
         -u -E '.[a-fh-zA-FG-Z]*' \
         --prune \\.git$ \
+        -E "Library" \
+        -E "OrbStack" \
+        -E "node_modules" \
+        -E "target" \
+        -E "dist" \
+        -E ".bare" \
+        -E ".cargo" \
+        -E ".npm" \
+        -E ".rustup" \
+        -E "venv" \
+        -E ".venv" \
         -x echo {//} \
         | fzf);
 else 
     PROJECT="$1"
 fi;
 
-if [ -n $PROJECT ] && [ ! "$PROJECT" = '' ]; then 
-    PROJECT=$(realpath $PROJECT)
-    NAME=$(basename $PROJECT)
-    tmux select-window -t $NAME || \
-        tmux new-window -c "$PROJECT" -n "$NAME" /bin/zsh $DOTFILES_DIR/.scripts/nvim_launch.zsh $PROJECT
+if [ -n "$PROJECT" ]; then 
+    PROJECT=$(realpath "$PROJECT")
+    NAME=$(basename "$PROJECT")
+
+    if git -C "$PROJECT" rev-parse --is-inside-work-tree &>/dev/null; then
+        GIT_DIR=$(git -C "$PROJECT" rev-parse --git-dir 2>/dev/null)
+        COMMON_DIR=$(git -C "$PROJECT" rev-parse --git-common-dir 2>/dev/null)
+
+        if [[ "$GIT_DIR" != "$COMMON_DIR" ]]; then
+            REPO_ROOT=$(dirname "$COMMON_DIR")
+            REPO_NAME=$(basename "$REPO_ROOT")
+            NAME="$NAME | $REPO_NAME"
+        fi
+    fi
+
+    tmux select-window -t "$NAME" || \
+        tmux new-window -c "$PROJECT" -n "$NAME" /bin/zsh $DOTFILES_DIR/.scripts/nvim_launch.zsh "$PROJECT"
 else
     exit 1
 fi;