mirror of
https://github.com/tj/git-extras.git
synced 2026-09-10 07:26:17 -04:00
* ability to specify command when hitting enter * documentation * man page * generate man page and html * run default command through same logic as other commands impetuous: persist return val for display in promt if non-zero also future-proofs for other benefits / DRYness. no need for another eval invocation. * fix generated manpage
79 lines
2 KiB
Bash
Executable file
79 lines
2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
git version
|
|
echo "git-extras version ""$(git-extras -v)"
|
|
echo "Type 'ls' to ls files below current directory; '!command' to execute any command or just 'subcommand' to execute any git subcommand; 'quit', 'exit', 'q', ^D, or ^C to exit the git repl."
|
|
|
|
while true; do
|
|
# Current branch
|
|
cur=$(git symbolic-ref HEAD 2> /dev/null | cut -d/ -f3-)
|
|
|
|
# Prompt
|
|
if test -n "$cur"; then
|
|
cur_string=" ($cur)"
|
|
else
|
|
cur_string=""
|
|
fi
|
|
if test -n "$exit_status" && test "$exit_status" -ne 0; then
|
|
es_string=$' \e[31m['"$exit_status"$']\e[0m'
|
|
else
|
|
es_string=""
|
|
fi
|
|
prompt_character=$(git config --get --default '>' git-extras.repl.prompt-character)
|
|
|
|
prefix=$(git config --get --default 'git' git-extras.repl.prefix)
|
|
|
|
show_project_name=$(git config --get --default 'false' git-extras.repl.show-project-name)
|
|
if [[ "$show_project_name" == "true" ]]; then
|
|
project_name=" $(basename "$(git rev-parse --show-toplevel)" .git)"
|
|
else
|
|
project_name=""
|
|
fi
|
|
|
|
prompt_base="$prefix$project_name$cur_string$es_string$prompt_character"
|
|
prompt_base_stripped=$(echo "$prompt_base" | awk '{$1=$1};1')
|
|
prompt="$prompt_base_stripped "
|
|
|
|
# Use arguments as a command if any are provided.
|
|
if [ $# -ne 0 ]; then
|
|
cmd=$*
|
|
set --
|
|
echo "$prompt" "$cmd" # It is as though you had entered a command.
|
|
else
|
|
# Readline
|
|
read -e -r -p "$prompt" cmd
|
|
# Check for EOF, and end the program if so (handles ^D).
|
|
test $? -ne 0 && break
|
|
fi
|
|
|
|
# History
|
|
history -s "$cmd"
|
|
|
|
# Built-in commands
|
|
case $cmd in
|
|
ls) cmd=ls-files;;
|
|
"")
|
|
on_enter_cmd=$(git config --get --default '' git-extras.repl.on-enter-command)
|
|
if test -n "$on_enter_cmd"; then
|
|
cmd="$on_enter_cmd"
|
|
else
|
|
continue
|
|
fi
|
|
;;
|
|
quit|exit|q) break;;
|
|
esac
|
|
|
|
if [[ $cmd == !* ]]; then
|
|
# shellcheck disable=SC2086
|
|
eval ${cmd:1}
|
|
elif [[ $cmd == git* ]]; then
|
|
# shellcheck disable=SC2086
|
|
eval $cmd
|
|
else
|
|
eval git "$cmd"
|
|
fi
|
|
exit_status=$?
|
|
done
|
|
|
|
echo
|