summaryrefslogtreecommitdiff
path: root/mut/bin/kakup
diff options
context:
space:
mode:
Diffstat (limited to 'mut/bin/kakup')
-rwxr-xr-xmut/bin/kakup100
1 files changed, 100 insertions, 0 deletions
diff --git a/mut/bin/kakup b/mut/bin/kakup
new file mode 100755
index 0000000..af1a520
--- /dev/null
+++ b/mut/bin/kakup
@@ -0,0 +1,100 @@
+#!@bash@/bin/bash
+session-or-client() {
+ {
+ project="$(cat -)"
+ if [[ -z $project ]]; then
+ return
+ fi
+ pushd $project
+ name=${PWD#$HOME/}
+ name=${name//\//-}
+ name=${name#-}
+ server=kaks@$name
+ client=kakc@$name
+ TMUX_ENV="-e KAK_SERVER=$server -e KAK_CLIENT=$client"
+
+ tmux has-session -t $server || {
+ tmux new $TMUX_ENV -d -s $server -n $server bash -c '[[ -f .envrc ]] && eval "$(direnv export bash)"; { kak -s '$name' -d & }; tmux wait -S '$name'; wait'
+ tmux wait "$name"
+ }
+ if [[ -z $TMUX ]] || [ $SWITCH_TO_SESSION -eq 1 ]; then
+ tmux has-session -t $client || tmux new $TMUX_ENV -d -s $client -n $client kak -c $name
+ fi
+ popd
+ } </dev/stdin >debug 2>&1
+ echo $client
+}
+
+search() {
+ if tty -s
+ then
+ project="$(fd -d1 "." -t d $HOME $HOME/projects | fzf -1)"
+ else
+ output=$(mktemp -d /tmp/kakup.XXXXXXXX)/fifo
+ mkfifo ${output}
+ st -e bash -c "fd -d1 '.' -t d $HOME $HOME/projects | fzf -1 | tee ${output} >/dev/null 2>&1" &
+ project="$(cat ${output})"
+ rm -r $(dirname ${output})
+ fi
+
+ pushd $project >/dev/null 2>&1
+ if grep 'bare = true' config >/dev/null 2>&1 ; then
+ if tty -s
+ then
+ branch="$(git branch -a --format '%(refname)' | fzf -1)"
+ else
+ output=$(mktemp -d /tmp/kakup.XXXXXXXX)/fifo
+ mkfifo ${output}
+ st -e bash -c "git branch -a --format '%(refname)' | fzf -1 >${output}" &
+ branch="$(cat ${output})"
+ rm -r $(dirname ${output})
+ fi
+ echo "$branch" >debug 2>&1
+ if [[ "$branch" == "refs/remotes/"* ]]; then
+ git branch ${branch#refs/remotes/*/} -t $branch >debug 2>&1
+ git worktree add ${branch#refs/remotes/*/} ${branch#refs/remotes/*/} >debug 2>&1
+ branch="${branch#refs/remotes/*/}"
+ elif [[ "$branch" == "refs/heads/"* ]]; then
+ branch="${branch#refs/heads/}"
+ git worktree add $branch $branch >debug 2>&1
+ fi
+ echo "$project/$branch"
+ else
+ echo "$project"
+ fi
+ popd >/dev/null 2>&1
+}
+
+NEW_TERM=0
+SWITCH_TO_SESSION=0
+while getopts "tfF" opt; do
+ case "$opt" in
+ h|\?) exit 0 ;;
+ t) NEW_TERM=1 ;;
+ f) client="$(search | session-or-client)" ;;
+ F) SWITCH_TO_SESSION=1; client="$(search | session-or-client)" ;;
+ esac
+done
+
+shift $((OPTIND - 1))
+
+[ -z "$client" ] && {
+ case "${@}" in
+ "") client="$(pwd | session-or-client)" ;;
+ *) client="$(echo "${@}" | session-or-client)" ;;
+ esac
+}
+
+[[ ! -z "$client" ]] && {
+ if [ $NEW_TERM -eq 1 ]; then
+ st -e tmux attach -t "$client"
+ elif [[ -z $TMUX ]]; then
+ tmux attach -t "$client"
+ else
+ if [ $SWITCH_TO_SESSION -eq 0 ]; then
+ tmux new-window -n $client kak -c ${client##kakc@}
+ else
+ tmux switch -t $client
+ fi
+ fi
+}