pushし忘れないようにプロンプトに表示するようにした

SubversionからGitに乗り替えてからというものコミット漏れ/忘れが激減(Changed but not updatedとかUntracked filesって出るし)したんだけど、今度はpush忘れをするように……。
なんかローカルでコミットした時点で満足しちゃうんだよね。で、帰宅してから同期しようと思ったら何も流れてこなくてうわぁぁぁぁぁ!!て。


コミットしたらすぐpushっていうのはrebaseとかしづらくなっちゃうからちょっとやだし、実はgit-svnで運用してるのでイライラで爆発しちゃいそう。
なので帰宅前に忘れずにpush(dcommit)できればそれでいいんだけど、毎日定時で帰れるほど平和な生活してないのでアラームを仕掛けるという案もいまいち。


で、色々考えた結果、プロンプトにpush済みかそうでないか表示できたらいいかも!と思ったので早速やってみた。
git bash completionについてくる__git_ps1()に付け加える形でこんな風にしてみた。


※2011-07-22 remotesがない場合や初期化直後でHEADがない場合の判定を追加。

__git_not_pushed()
{
  if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then
    head="$(git rev-parse --verify -q HEAD 2>/dev/null)"
    if [[ $? -eq 0 ]]; then
      remotes=($(git rev-parse --remotes))
      if [[ -n "${remotes[@]}" ]]; then
        for x in ${remotes[@]}
        do
          if [[ "$head" = "$x" ]]; then
            return 0
          fi
        done
        echo -n " NOT PUSHED"
      fi
    fi
  fi
  return 0
}

# git bash completion
if [ -f ~/git-completion.bash ] ; then
  source /Users/pasela/git-completion.bash

# 前のやつ
#  PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\]
#$ '

# __git_not_pushedを追加したやつ
  PS1='\[\033]0;$MSYSTEM:\w\007
\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[31m\]$(__git_not_pushed)\033[0m\]
$ '
fi

これで


pasela@pasela.org ~/repos/foo (master) NOT PUSHED
$

pushしてない時はこんな感じにNOT PUSHEDって出る。
検出方法は見ての通りものすごく適当だけど、とりあえず今の自分には十分。
あまり複雑なことやりすぎるとプロンプトが激重になって発狂しそうだし。




実はシャットダウンを検出して(WindowsならWM_QUERYENDSESSIONとか)そのタイミングで調べてはどうかと考えたこともあったんだけど、ちょっとどうなの?って感じがしたのでやめた。