Posted at

git pushでsimpleでもcurrent

push.default = current は楽だけど、ちゃんと tracking 設定したいなぁ。でも push.default = simple でいちいち -u つけるのは面倒だなぁ。」という人向けの zsh の設定。

.gitconfig の alias で設定したいけど、 git のコマンドは存在するコマンドを上書きさせてくれないので zsh で変更する。

まず、 setopt correctcorrect_all で修正を提示する感じをシミュレーションする。 SPROMPT にフォーマットが入っているので、 read で聞いて 0 から 3 の数値を返す。

function ask_ynae {

local prompt=${SPROMPT/\%r/$1}
while true; do
read -rsk \?"$prompt" ynae
case $ynae in
[Yy] ) return 0 ;;
"" | [Nn] ) return 1 ;;
[Aa] ) return 2 ;;
[Ee] ) return 3 ;;
esac
echo -ne "\r"
done
}

実際に git をラップする部分。 \git のようバックスラッシュを使うと、置き換え前のコマンドを使える。組み込みの print コマンドは -z で次の編集中のコマンドにできる。

function in_git() {

[[ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" = "true" ]]
}
function wrapped_git() {
if [[ "$*" = "push" ]] && in_git && ! (\git rev-parse --abbrev-ref @{upstream} >/dev/null 2>&1); then
suggest="push -u origin $(\git rev-parse --abbrev-ref HEAD)"
ask_ynae "git $suggest"
exit_code=$?
echo
case $exit_code in
"0" ) \git ${=suggest} ;;
"1" ) \git $@ ;;
"2" ) return 130 ;;
"3" ) print -z "git $@" ;;
esac
else
\git $@
fi
}
alias git=wrapped_git