diff options
Diffstat (limited to 'mut/bin/kakup')
| -rwxr-xr-x | mut/bin/kakup | 100 |
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 +} |
