@@ -1003,12 +1003,20 @@ _forgit_ignore_clean() {
10031003 [[ -d " $FORGIT_GI_REPO_LOCAL " ]] && rm -rf " $FORGIT_GI_REPO_LOCAL "
10041004}
10051005
1006+ _forgit_filter_existing_paths () {
1007+ while read -r path; do
1008+ [[ -d " $path " ]] && echo " $path "
1009+ done
1010+ }
1011+
10061012_forgit_worktree_preview () {
10071013 local sha
10081014 # trailing space in grep to avoid matching worktrees with a common path
10091015 sha=$( git worktree list | grep " $1 " | awk ' {print $2}' )
1010- # bare git-dir has no history
1011- [[ " $sha " == " (bare)" ]] && return
1016+ if [[ " $sha " == " (bare)" ]]; then
1017+ printf " %b(bare)%b %s\n" ' \e[0;33m' ' \e[0m' ' No history for git dir'
1018+ return
1019+ fi
10121020 _forgit_worktree_preview_git_opts=()
10131021 _forgit_parse_array _forgit_worktree_preview_git_opts " $FORGIT_WORKTREE_PREVIEW_GIT_OPTS "
10141022 # the trailing '--' ensures that this works for branches that have a name
@@ -1018,9 +1026,10 @@ _forgit_worktree_preview() {
10181026
10191027_forgit_worktree_jump () {
10201028 _forgit_inside_work_tree || _forgit_inside_git_dir || return 1
1021- local count tree opts
1022- count =$( git worktree list | wc -l )
1029+ local worktree_list count tree opts
1030+ worktree_list =$( git worktree list | grep -vE " prunable$ " | awk ' {print $1} ' | _forgit_filter_existing_paths )
10231031
1032+ count=$( echo " $worktree_list " | wc -l)
10241033 [[ $count -eq 1 ]] && return 1
10251034
10261035 opts="
@@ -1030,7 +1039,7 @@ _forgit_worktree_jump() {
10301039 $FORGIT_WORKTREE_JUMP_FZF_OPTS
10311040 "
10321041
1033- tree=$( git worktree list | awk ' {print $1} ' | FZF_DEFAULT_OPTS=" $opts " fzf)
1042+ tree=$( echo " $worktree_list " | FZF_DEFAULT_OPTS=" $opts " fzf)
10341043 [[ -z " $tree " ]] && return 1
10351044 echo " $tree "
10361045}
@@ -1043,16 +1052,21 @@ _forgit_git_worktree_lock() {
10431052
10441053_forgit_worktree_lock () {
10451054 _forgit_inside_work_tree || _forgit_inside_git_dir || return 1
1055+ if [[ $# -ne 0 ]]; then
1056+ git worktree lock " $@ "
1057+ worktree_lock_status=$?
1058+ return $worktree_lock_status
1059+ fi
10461060 local tree opts
10471061
10481062 opts="
10491063 $FORGIT_FZF_DEFAULT_OPTS
1050- +s - m --tiebreak=index
1064+ +s + m --tiebreak=index
10511065 --preview=\" $FORGIT worktree_preview {1}\"
10521066 $FORGIT_WORKTREE_LOCK_FZF_OPTS
10531067 "
10541068
1055- tree=$( git worktree list | awk ' {print $1}' | grep -v " (bare) " | FZF_DEFAULT_OPTS=" $opts " fzf)
1069+ tree=$( git worktree list | grep -vE " \(bare\)|locked " | awk ' {print $1}' | FZF_DEFAULT_OPTS=" $opts " fzf)
10561070 [[ -z " $tree " ]] && return 1
10571071 _forgit_git_worktree_lock " $tree "
10581072}
@@ -1065,32 +1079,50 @@ _forgit_git_worktree_remove() {
10651079
10661080_forgit_worktree_remove () {
10671081 _forgit_inside_work_tree || _forgit_inside_git_dir || return 1
1068- local tree opts
1082+ if [[ $# -ne 0 ]]; then
1083+ git worktree remove " $@ "
1084+ worktree_remove_status=$?
1085+ return $worktree_remove_status
1086+ fi
1087+ local worktree_list tree opts
1088+ worktree_list=$( git worktree list | grep -v " (bare)" )
1089+
1090+ count=$( echo " $worktree_list " | wc -l)
1091+ [[ $count -eq 1 ]] && return 1
10691092
10701093 opts="
10711094 $FORGIT_FZF_DEFAULT_OPTS
1072- +s - m --tiebreak=index --header-lines=1
1095+ +s + m --tiebreak=index
10731096 --preview=\" $FORGIT worktree_preview {1}\"
10741097 $FORGIT_WORKTREE_REMOVE_FZF_OPTS
10751098 "
10761099
1077- tree=$( git worktree list | awk ' {print $1}' | grep -v " (bare) " | FZF_DEFAULT_OPTS=" $opts " fzf)
1100+ tree=$( echo " $worktree_list " | awk ' {print $1}' | FZF_DEFAULT_OPTS=" $opts " fzf)
10781101 [[ -z " $tree " ]] && return 1
10791102 _forgit_git_worktree_remove " $tree "
10801103}
10811104
10821105_forgit_worktree_unlock () {
10831106 _forgit_inside_work_tree || _forgit_inside_git_dir || return 1
1084- local tree opts
1107+ if [[ $# -ne 0 ]]; then
1108+ git worktree unlock " $@ "
1109+ worktree_unlock_status=$?
1110+ return $worktree_unlock_status
1111+ fi
1112+ local worktree_list tree opts
1113+
1114+ worktree_list=$( git worktree list | grep -v " (bare)" | grep -E " locked$" )
1115+ count=$( echo " $worktree_list " | wc -l)
1116+ [[ $count -eq 1 ]] && return 1
10851117
10861118 opts="
10871119 $FORGIT_FZF_DEFAULT_OPTS
1088- +s - m --tiebreak=index --header-lines=1
1120+ +s + m --tiebreak=index
10891121 --preview=\" $FORGIT worktree_preview {1}\"
10901122 $FORGIT_WORKTREE_UNLOCK_FZF_OPTS
10911123 "
10921124
1093- tree=$( git worktree list | awk ' {print $1}' | grep -v " (bare) " | FZF_DEFAULT_OPTS=" $opts " fzf)
1125+ tree=$( echo " $worktree_list " | awk ' {print $1}' | FZF_DEFAULT_OPTS=" $opts " fzf)
10941126 [[ -z " $tree " ]] && return 1
10951127 git worktree unlock " $tree "
10961128}
0 commit comments