diff --git a/bin/git-forgit b/bin/git-forgit index bcd9bfe..3746f4a 100755 --- a/bin/git-forgit +++ b/bin/git-forgit @@ -81,44 +81,6 @@ _forgit_parse_array() { ${old_IFS+"false"} && unset IFS || IFS="$old_IFS" } -# parse environment variables into global arrays -# this allows using them properly quoted without word splitting or glob expansion -_forgit_log_git_opts=() -_forgit_parse_array _forgit_log_git_opts "$FORGIT_LOG_GIT_OPTS" -_forgit_add_git_opts=() -_forgit_parse_array _forgit_add_git_opts "$FORGIT_ADD_GIT_OPTS" -_forgit_diff_git_opts=() -_forgit_parse_array _forgit_diff_git_opts "$FORGIT_DIFF_GIT_OPTS" -_forgit_reset_head_git_opts=() -_forgit_parse_array _forgit_reset_head_git_opts "$FORGIT_RESET_HEAD_GIT_OPTS" -_forgit_rebase_git_opts=() -_forgit_parse_array _forgit_rebase_git_opts "$FORGIT_REBASE_GIT_OPTS" -_forgit_fixup_git_opts=() -_forgit_parse_array _forgit_fixup_git_opts "$FORGIT_FIXUP_GIT_OPTS" -_forgit_blame_git_opts=() -_forgit_parse_array _forgit_blame_git_opts "$FORGIT_BLAME_GIT_OPTS" -_forgit_revert_commit_git_opts=() -_forgit_parse_array _forgit_revert_commit_git_opts "$FORGIT_REVERT_COMMIT_GIT_OPTS" -_forgit_branch_delete_git_opts=() -_forgit_parse_array _forgit_branch_delete_git_opts "$FORGIT_BRANCH_DELETE_GIT_OPTS" -_forgit_checkout_commit_git_opts=() -_forgit_parse_array _forgit_checkout_commit_git_opts "$FORGIT_CHECKOUT_COMMIT_GIT_OPTS" -_forgit_checkout_tag_git_opts=() -_forgit_parse_array _forgit_checkout_tag_git_opts "$FORGIT_CHECKOUT_TAG_GIT_OPTS" -_forgit_checkout_branch_git_opts=() -_forgit_parse_array _forgit_checkout_branch_git_opts "$FORGIT_CHECKOUT_BRANCH_GIT_OPTS" -_forgit_checkout_file_git_opts=() -_forgit_parse_array _forgit_checkout_file_git_opts "$FORGIT_CHECKOUT_FILE_GIT_OPTS" -_forgit_cherry_pick_git_opts=() -_forgit_parse_array _forgit_cherry_pick_git_opts "$FORGIT_CHERRY_PICK_GIT_OPTS" -_forgit_clean_git_opts=() -_forgit_parse_array _forgit_clean_git_opts "$FORGIT_CLEAN_GIT_OPTS" -_forgit_stash_push_git_opts=() -_forgit_parse_array _forgit_stash_push_git_opts "$FORGIT_STASH_PUSH_GIT_OPTS" -_forgit_stash_show_git_opts=() -_forgit_parse_array _forgit_stash_show_git_opts "$FORGIT_STASH_SHOW_GIT_OPTS" -_forgit_checkout_branch_branch_git_opts=() -_forgit_parse_array _forgit_checkout_branch_branch_git_opts "$FORGIT_CHECKOUT_BRANCH_BRANCH_GIT_OPTS" _forgit_pager=${FORGIT_PAGER:-$(git config core.pager || echo 'cat')} _forgit_show_pager=${FORGIT_SHOW_PAGER:-$(git config pager.show || echo "$_forgit_pager")} @@ -151,6 +113,8 @@ _forgit_log() { graph=--graph [[ $FORGIT_LOG_GRAPH_ENABLE == false ]] && graph= log_format=${FORGIT_GLO_FORMAT:-$_forgit_log_format} + _forgit_log_git_opts=() + _forgit_parse_array _forgit_log_git_opts "$FORGIT_LOG_GIT_OPTS" eval "git log $graph --color=always --format='$log_format' ${_forgit_log_git_opts[*]} $* $_forgit_emojify" | FZF_DEFAULT_OPTS="$opts" fzf fzf_exit_code=$? @@ -195,6 +159,8 @@ _forgit_diff() { # prevent fzf from interpreting this substring by escaping the opening bracket. # The string is evaluated a few subsequent times, so we need multiple escapes. escaped_commits=${commits//\{/\\\\\{} + _forgit_diff_git_opts=() + _forgit_parse_array _forgit_diff_git_opts "$FORGIT_DIFF_GIT_OPTS" git_diff="git diff --color=always ${_forgit_diff_git_opts[*]} $escaped_commits" preview_cmd="cd '$repo' && $get_files | xargs -0 $git_diff -U$_forgit_preview_context -- | $_forgit_diff_pager" enter_cmd="cd '$repo' && $get_files | xargs -0 $git_diff -U$_forgit_fullscreen_context -- | $_forgit_diff_pager" @@ -219,6 +185,8 @@ _forgit_diff() { _forgit_add() { _forgit_inside_work_tree || return 1 local git_add changed unmerged untracked files opts preview extract + _forgit_add_git_opts=() + _forgit_parse_array _forgit_add_git_opts "$FORGIT_ADD_GIT_OPTS" git_add="git add ${_forgit_add_git_opts[*]}" # Add files if passed as arguments [[ $# -ne 0 ]] && { $git_add "$@" && git status -su; return $?; } @@ -259,6 +227,8 @@ _forgit_add() { _forgit_reset_head() { _forgit_inside_work_tree || return 1 local git_reset_head cmd files opts rootdir + _forgit_reset_head_git_opts=() + _forgit_parse_array _forgit_reset_head_git_opts "$FORGIT_RESET_HEAD_GIT_OPTS" git_reset_head="git reset -q ${_forgit_reset_head_git_opts[*]} HEAD" [[ $# -ne 0 ]] && { $git_reset_head "$@" && git status --short; return $?; } rootdir=$(git rev-parse --show-toplevel) @@ -281,6 +251,8 @@ _forgit_stash_show() { local git_stash_show git_stash_list cmd opts git_stash_show="git stash show --color=always --ext-diff" [[ $# -ne 0 ]] && { $git_stash_show "$@"; return $?; } + _forgit_stash_show_git_opts=() + _forgit_parse_array _forgit_stash_show_git_opts "$FORGIT_STASH_SHOW_GIT_OPTS" git_stash_list="git stash list ${_forgit_stash_show_git_opts[*]}" cmd="echo {} |cut -d: -f1 |xargs -I% $git_stash_show % |$_forgit_diff_pager" opts=" @@ -301,6 +273,8 @@ _forgit_stash_show() { _forgit_stash_push() { _forgit_inside_work_tree || return 1 local git_stash_push msg args + _forgit_stash_push_git_opts=() + _forgit_parse_array _forgit_stash_push_git_opts "$FORGIT_STASH_PUSH_GIT_OPTS" git_stash_push="git stash push ${_forgit_stash_push_git_opts[*]}" args=( "$@" ) while (( "$#" )); do @@ -340,6 +314,8 @@ _forgit_clean() { _forgit_inside_work_tree || return 1 _forgit_contains_non_flags "$@" && { git clean -q "$@"; return $?; } local git_clean files opts + _forgit_clean_git_opts=() + _forgit_parse_array _forgit_clean_git_opts "$FORGIT_CLEAN_GIT_OPTS" git_clean="git clean ${_forgit_clean_git_opts[*]}" opts=" $FORGIT_FZF_DEFAULT_OPTS @@ -356,6 +332,8 @@ _forgit_clean() { _forgit_cherry_pick() { local git_cherry_pick base target preview opts fzf_selection fzf_exitval + _forgit_cherry_pick_git_opts=() + _forgit_parse_array _forgit_cherry_pick_git_opts "$FORGIT_CHERRY_PICK_GIT_OPTS" git_cherry_pick="git cherry-pick ${_forgit_cherry_pick_git_opts[*]}" base=$(git branch --show-current) @@ -436,6 +414,8 @@ _forgit_cherry_pick_from_branch() { _forgit_rebase() { _forgit_inside_work_tree || return 1 local git_rebase cmd preview opts graph files target_commit prev_commit + _forgit_rebase_git_opts=() + _forgit_parse_array _forgit_rebase_git_opts "$FORGIT_REBASE_GIT_OPTS" git_rebase="git rebase -i ${_forgit_rebase_git_opts[*]}" graph=--graph [[ $FORGIT_LOG_GRAPH_ENABLE == false ]] && graph= @@ -461,6 +441,8 @@ _forgit_fixup() { _forgit_inside_work_tree || return 1 git diff --cached --quiet && echo 'Nothing to fixup: there are no staged changes.' && return 1 local git_fixup cmd preview opts graph files target_commit prev_commit + _forgit_fixup_git_opts=() + _forgit_parse_array _forgit_fixup_git_opts "$FORGIT_FIXUP_GIT_OPTS" git_fixup="git commit --fixup ${_forgit_fixup_git_opts[*]}" graph=--graph [[ $FORGIT_LOG_GRAPH_ENABLE == false ]] && graph= @@ -488,6 +470,8 @@ _forgit_fixup() { _forgit_checkout_file() { _forgit_inside_work_tree || return 1 local git_checkout cmd files opts + _forgit_checkout_file_git_opts=() + _forgit_parse_array _forgit_checkout_file_git_opts "$FORGIT_CHECKOUT_FILE_GIT_OPTS" git_checkout="git checkout ${_forgit_checkout_file_git_opts[*]}" [[ $# -ne 0 ]] && { $git_checkout -- "$@"; return $?; } cmd="git diff --color=always -- {} | $_forgit_diff_pager" @@ -517,6 +501,8 @@ _forgit_checkout_branch() { fi local git_checkout cmd preview opts branch + _forgit_checkout_branch_branch_git_opts=() + _forgit_parse_array _forgit_checkout_branch_branch_git_opts "$FORGIT_CHECKOUT_BRANCH_BRANCH_GIT_OPTS" cmd="git branch --color=always ${_forgit_checkout_branch_branch_git_opts[*]:---all} | LC_ALL=C sort -k1.1,1.1 -rs" preview="git log {1} $_forgit_log_preview_options" opts=" @@ -528,6 +514,8 @@ _forgit_checkout_branch() { branch="$(eval "$cmd" | FZF_DEFAULT_OPTS="$opts" fzf | awk '{print $1}')" [[ -z "$branch" ]] && return 1 + _forgit_checkout_branch_git_opts=() + _forgit_parse_array _forgit_checkout_branch_git_opts "$FORGIT_CHECKOUT_BRANCH_GIT_OPTS" git_checkout="git checkout ${_forgit_checkout_branch_git_opts[*]}" # track the remote branch if possible if [[ "$branch" == "remotes/origin/"* ]]; then @@ -546,6 +534,8 @@ _forgit_checkout_branch() { _forgit_checkout_tag() { _forgit_inside_work_tree || return 1 local git_checkout cmd opts preview + _forgit_checkout_tag_git_opts=() + _forgit_parse_array _forgit_checkout_tag_git_opts "$FORGIT_CHECKOUT_TAG_GIT_OPTS" git_checkout="git checkout ${_forgit_checkout_tag_git_opts[*]}" [[ $# -ne 0 ]] && { $git_checkout "$@"; return $?; } cmd="git tag -l --sort=-v:refname" @@ -565,6 +555,8 @@ _forgit_checkout_tag() { _forgit_checkout_commit() { _forgit_inside_work_tree || return 1 local git_checkout cmd opts graph + _forgit_checkout_commit_git_opts=() + _forgit_parse_array _forgit_checkout_commit_git_opts "$FORGIT_CHECKOUT_COMMIT_GIT_OPTS" git_checkout="git checkout ${_forgit_checkout_commit_git_opts[*]}" [[ $# -ne 0 ]] && { $git_checkout "$@"; return $?; } cmd="echo {} | $_forgit_extract_sha |xargs -I% git show --color=always % | $_forgit_show_pager" @@ -585,6 +577,8 @@ _forgit_checkout_commit() { _forgit_branch_delete() { _forgit_inside_work_tree || return 1 local git_branch preview opts cmd branches + _forgit_branch_delete_git_opts=() + _forgit_parse_array _forgit_branch_delete_git_opts "$FORGIT_BRANCH_DELETE_GIT_OPTS" git_branch="git branch ${_forgit_branch_delete_git_opts[*]}" [[ $# -ne 0 ]] && { $git_branch -D "$@"; return $?; } preview="git log {1} $_forgit_log_preview_options" @@ -606,6 +600,8 @@ _forgit_branch_delete() { _forgit_revert_commit() { _forgit_inside_work_tree || return 1 local git_revert cmd opts files preview commits IFS + _forgit_revert_commit_git_opts=() + _forgit_parse_array _forgit_revert_commit_git_opts "$FORGIT_REVERT_COMMIT_GIT_OPTS" git_revert="git revert ${_forgit_revert_commit_git_opts[*]}" [[ $# -ne 0 ]] && { $git_revert "$@"; return $?; } @@ -645,6 +641,8 @@ _forgit_revert_commit() { _forgit_blame() { _forgit_inside_work_tree || return 1 local git_blame opts flags preview file + _forgit_blame_git_opts=() + _forgit_parse_array _forgit_blame_git_opts "$FORGIT_BLAME_GIT_OPTS" git_blame="git blame ${_forgit_blame_git_opts[*]}" _forgit_contains_non_flags "$@" && { $git_blame "$@"; return $?; } opts="