gitのcommit、push待ちの状態をプロンプトに表示すると結構便利

gitのブランチ名をプロンプトに表示すると結構便利 の続き。

gitでcommitし忘れ、pushし忘れないように、

_color_() {
  color=$1; shift
  echo -e "\e[${color}${@}\e[0m"
}

fg_black()   { _color_ "30m"   $@; }
fg_BLACK()   { _color_ "30;1m" $@; }
fg_red()     { _color_ "31m"   $@; }
fg_RED()     { _color_ "31;1m" $@; }
fg_green()   { _color_ "32m"   $@; }
fg_GREEN()   { _color_ "32;1m" $@; }
fg_yellow()  { _color_ "33m"   $@; }
fg_YELLOW()  { _color_ "33;1m" $@; }
fg_blue()    { _color_ "34m"   $@; }
fg_BLUE()    { _color_ "34;1m" $@; }
fg_magenta() { _color_ "35m"   $@; }
fg_MAGENTA() { _color_ "35;1m" $@; }
fg_cyan()    { _color_ "36m"   $@; }
fg_CYAN()    { _color_ "36;1m" $@; }
fg_white()   { _color_ "37m"   $@; }
fg_WHITE()   { _color_ "37;1m" $@; }
fg_BOLD()    { _color_ "1m" $@; }
fg_inverse() { _color_ "7m" $@; }
fg_INVERSE() { _color_ "1;7m" $@; }

gitmodified() {
  check_remote="n"
  case $1 in
    -[vr])
      check_remote="y"
      ;;
  esac

  fg_INVERSE '= list branches ='
  git branch -a
  fg_INVERSE '= working tree status ='
  git status
  echo 'try git diff'

  if [ "$check_remote" = 'y' ]; then
    if git config -l | grep svn.url; then
      fg_INVERSE '= remote ='
      git-svn dcommit -n
    else
      fg_INVERSE '= remote ='
      if [ -z "$(git log --pretty=oneline  origin..HEAD)" ]; then
        echo "up to date"
      else
        fg_RED "NEED TO PUSH!!"
        git log --name-status --pretty=oneline --abbrev-commit origin..HEAD
        echo; echo "try:"; echo "  git diff origin..HEAD"
      fi
    fi
  fi
}

なのを使って、こんなふうに確認していたのですが、

いちいち打つのがめんどくさくなってきたのでプロンプトに表示するようにしてみました。こんな感じ:

上から順に:

  1. commit待ちもpush待ちもないので最初のプロンプトはいつもと同じ。
  2. ファイルt1を変更したので、commit待ちを示す「*」がプロンプトに表示されている。
  3. commitしたので、「*」が消えて、push待ちを示す「^」が表示されている。
  4. 再びファイルt1を変更したので、「^」に加えてcommit待ちを示す「*」も表示されている。

プロンプト表示する度に git コマンドとかとか叩いてるんでちょっとあれですけど、便利に使ってます。

__git_reminder() {
  [ -d "$PWD/.git" ] || return
  M=
  git status | grep -q '^nothing to commit' 2>/dev/null || M=$M'*'
  [ ! -z "$(git log --pretty=oneline  origin..HEAD 2>/dev/null)" ] && M=$M'^'
  echo -n "$M"
}
#...
  _colesc="\[\e["
  _cse="\]"
  _colreset="${_colesc}0m${_cse}"

  if [ -r "$HOME/.bash_completion.d/git" ]; then
    PS1="${PS1}[\$(__git_ps1 \"${_colesc};1m${_cse}%s${_colesc}31;1m${_cse}\$(__git_reminder)${_colreset})\")\w]\\$ "
  else
    PS1="${PS1}[\w]\\$ "
  fi
#...