Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Pager variables are not evaluated #381

Merged
merged 4 commits into from
Apr 9, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 43 additions & 24 deletions bin/git-forgit
Original file line number Diff line number Diff line change
Expand Up @@ -127,19 +127,33 @@ _forgit_quote_files() {
echo "${files[*]}"
}

_forgit_pager=${FORGIT_PAGER:-$(git config core.pager || echo 'cat')}
_forgit_show_pager=${FORGIT_SHOW_PAGER:-$(git config pager.show || echo "$_forgit_pager")}
_forgit_diff_pager=${FORGIT_DIFF_PAGER:-$(git config pager.diff || echo "$_forgit_pager")}
_forgit_ignore_pager=${FORGIT_IGNORE_PAGER:-$(hash bat &>/dev/null && echo 'bat -l gitignore --color=always' || echo 'cat')}
_forgit_blame_pager=${FORGIT_BLAME_PAGER:-$(git config pager.blame || echo "$_forgit_pager")}
_forgit_enter_pager=${FORGIT_ENTER_PAGER:-"LESS='-r' less"}

_forgit_log_graph_enable=${FORGIT_LOG_GRAPH_ENABLE:-"true"}
_forgit_log_format=${FORGIT_LOG_FORMAT:-%C(auto)%h%d %s %C(black)%C(bold)%cr%Creset}
_forgit_log_preview_options=("--graph" "--pretty=format:$_forgit_log_format" "--color=always" "--abbrev-commit" "--date=relative")
_forgit_fullscreen_context=${FORGIT_FULLSCREEN_CONTEXT:-10}
_forgit_preview_context=${FORGIT_PREVIEW_CONTEXT:-3}

_forgit_pager() {
local pager
pager=$(_forgit_get_pager "$1")
[[ -z "${pager}" ]] && exit 1
eval "${pager} ${*:2}"
}

_forgit_get_pager() {
local pager
pager=${1:-core}
case "$pager" in
core) echo -n "${FORGIT_PAGER:-$(git config core.pager || echo 'cat')}" ;;
show) echo -n "${FORGIT_SHOW_PAGER:-$(git config pager.show || _forgit_get_pager)}" ;;
diff) echo -n "${FORGIT_DIFF_PAGER:-$(git config pager.diff || _forgit_get_pager)}" ;;
ignore) echo -n "${FORGIT_IGNORE_PAGER:-$(hash bat &>/dev/null && echo 'bat -l gitignore --color=always' || echo 'cat')}" ;;
blame) echo -n "${FORGIT_BLAME_PAGER:-$(git config pager.blame || _forgit_get_pager)}" ;;
enter) echo -n "${FORGIT_ENTER_PAGER:-"LESS='-r' less"}" ;;
*) echo "pager not found: $1" >&2 ;;
esac
}

_forgit_is_file_tracked() {
git ls-files "$1" --error-unmatch &> /dev/null
}
Expand All @@ -148,7 +162,7 @@ _forgit_log_preview() {
local sha
sha=$(echo "$1" | _forgit_extract_sha)
shift
echo "$sha" | xargs -I% git show --color=always -U"$_forgit_preview_context" % -- "$@" | $_forgit_show_pager
echo "$sha" | xargs -I% git show --color=always -U"$_forgit_preview_context" % -- "$@" | _forgit_pager show
}

_forgit_log_enter() {
Expand Down Expand Up @@ -223,7 +237,7 @@ _forgit_diff_view() {
IFS=" " read -r -a commits <<< "${*:3}"
fi
echo "$input_line" | _forgit_get_files_from_diff_line | xargs -0 \
"$FORGIT" exec_diff "${commits[@]}" -U"$diff_context" -- | $_forgit_diff_pager
"$FORGIT" exec_diff "${commits[@]}" -U"$diff_context" -- | _forgit_pager diff
}

_forgit_edit_diffed_file() {
Expand Down Expand Up @@ -264,7 +278,7 @@ _forgit_diff() {
done
opts="
$FORGIT_FZF_DEFAULT_OPTS
+m -0 --bind=\"enter:execute($FORGIT diff_enter {} $escaped_commits | $_forgit_enter_pager)\"
+m -0 --bind=\"enter:execute($FORGIT diff_enter {} $escaped_commits | $FORGIT pager enter)\"
--preview=\"$FORGIT diff_view {} '$_forgit_preview_context' $escaped_commits\"
--bind=\"alt-e:execute-silent($FORGIT edit_diffed_file {})+refresh-preview\"
$FORGIT_DIFF_FZF_OPTS
Expand All @@ -285,9 +299,9 @@ _forgit_diff() {
_forgit_add_preview() {
file=$(echo "$1" | _forgit_get_single_file_from_add_line)
if (git status -s -- "$file" | grep '^??') &>/dev/null; then # diff with /dev/null for untracked files
git diff --color=always --no-index -- /dev/null "$file" | $_forgit_diff_pager | sed '2 s/added:/untracked:/'
git diff --color=always --no-index -- /dev/null "$file" | _forgit_pager diff | sed '2 s/added:/untracked:/'
else
git diff --color=always -- "$file" | $_forgit_diff_pager
git diff --color=always -- "$file" | _forgit_pager diff
fi
}

Expand Down Expand Up @@ -339,7 +353,7 @@ _forgit_add() {

_forgit_reset_head_preview() {
file=$1
git diff --staged --color=always -- "$file" | $_forgit_diff_pager
git diff --staged --color=always -- "$file" | _forgit_pager diff
}

_forgit_git_reset_head() {
Expand Down Expand Up @@ -377,7 +391,7 @@ _forgit_reset_head() {
_forgit_stash_show_preview() {
local stash
stash=$(echo "$1" | cut -d: -f1)
_forgit_git_stash_show "$stash" | $_forgit_diff_pager
_forgit_git_stash_show "$stash" | _forgit_pager diff
}

_forgit_git_stash_show() {
Expand All @@ -393,7 +407,7 @@ _forgit_stash_show() {
_forgit_parse_array _forgit_stash_show_git_opts "$FORGIT_STASH_SHOW_GIT_OPTS"
opts="
$FORGIT_FZF_DEFAULT_OPTS
+s +m -0 --tiebreak=index --bind=\"enter:execute($FORGIT stash_show_preview {} | $_forgit_enter_pager)\"
+s +m -0 --tiebreak=index --bind=\"enter:execute($FORGIT stash_show_preview {} | $FORGIT pager enter)\"
--bind=\"ctrl-y:execute-silent($FORGIT yank_stash_name {})\"
--preview=\"$FORGIT stash_show_preview {}\"
$FORGIT_STASH_FZF_OPTS
Expand All @@ -407,9 +421,9 @@ _forgit_stash_show() {

_forgit_stash_push_preview() {
if _forgit_is_file_tracked "$1"; then
git diff --color=always -- "$1" | $_forgit_diff_pager
git diff --color=always -- "$1" | _forgit_pager diff
else
git diff --color=always /dev/null "$1" | $_forgit_diff_pager
git diff --color=always /dev/null "$1" | _forgit_pager diff
fi
}

Expand Down Expand Up @@ -468,7 +482,7 @@ _forgit_clean() {
}

_forgit_cherry_pick_preview() {
echo "$1" | cut -f2- | _forgit_extract_sha | xargs -I% git show --color=always % | $_forgit_show_pager
echo "$1" | cut -f2- | _forgit_extract_sha | xargs -I% git show --color=always % | _forgit_pager show
}

_forgit_cherry_pick() {
Expand Down Expand Up @@ -585,7 +599,7 @@ _forgit_file_preview() {
local sha
sha=$(echo "$1" | _forgit_extract_sha)
shift
echo "$sha" | xargs -I% git show --color=always % -- "$@" | $_forgit_show_pager
echo "$sha" | xargs -I% git show --color=always % -- "$@" | _forgit_pager show
}

_forgit_fixup() {
Expand Down Expand Up @@ -618,7 +632,7 @@ _forgit_fixup() {
}

_forgit_checkout_file_preview() {
git diff --color=always -- "$1" | $_forgit_diff_pager
git diff --color=always -- "$1" | _forgit_pager diff
}

_forgit_git_checkout_file() {
Expand Down Expand Up @@ -712,7 +726,7 @@ _forgit_checkout_tag() {
}

_forgit_checkout_commit_preview() {
echo "$1" | _forgit_extract_sha | xargs -I% git show --color=always % | $_forgit_show_pager
echo "$1" | _forgit_extract_sha | xargs -I% git show --color=always % | _forgit_pager show
}

_forgit_git_checkout_commit() {
Expand Down Expand Up @@ -779,7 +793,7 @@ _forgit_revert_preview() {
cut -f2- |
_forgit_extract_sha |
xargs -I% git show --color=always % |
$_forgit_show_pager
_forgit_pager show
}

_forgit_git_revert() {
Expand Down Expand Up @@ -828,7 +842,7 @@ _forgit_blame_preview() {
if _forgit_is_file_tracked "$1"; then
_forgit_blame_git_opts=()
_forgit_parse_array _forgit_blame_git_opts "$FORGIT_BLAME_GIT_OPTS"
git blame "$@" "${_forgit_blame_git_opts[@]}" --date=short | $_forgit_blame_pager
git blame "$@" "${_forgit_blame_git_opts[@]}" --date=short | _forgit_pager blame
else
echo "File not tracked"
fi
Expand Down Expand Up @@ -867,7 +881,11 @@ export FORGIT_GI_REPO_LOCAL="${FORGIT_GI_REPO_LOCAL:-${XDG_CACHE_HOME:-$HOME/.ca
export FORGIT_GI_TEMPLATES=${FORGIT_GI_TEMPLATES:-$FORGIT_GI_REPO_LOCAL/templates}

_forgit_ignore_preview() {
$_forgit_ignore_pager "$FORGIT_GI_TEMPLATES/$1"{,.gitignore} 2>/dev/null
quoted_files=()
for file in "$FORGIT_GI_TEMPLATES/$1"{,.gitignore}; do
quoted_files+=("'$file'")
done
_forgit_pager ignore "${quoted_files[@]}" 2>/dev/null
}

_forgit_ignore() {
Expand Down Expand Up @@ -961,6 +979,7 @@ private_commands=(
"diff_view"
"edit_diffed_file"
"edit_add_file"
"pager"
)

cmd="$1"
Expand Down