blog

Git oneline summary with stat

glog() {
  git log --pretty=format:'@%h %s' --numstat "$@" | awk -F'\t' '
    function w(v, m) { return length(v) > m ? length(v) : m }
    function flush() {
      if (h == "") return
      n++; H[n] = h; A[n] = "+" a; D[n] = "-" d; S[n] = s
      wh = w(h, wh); wa = w(A[n], wa); wd = w(D[n], wd)
    }
    /^@/ { flush(); i = index($0, " "); h = substr($0, 2, i - 2); s = substr($0, i + 1); a = d = 0; next }
    NF == 3 { a += $1; d += $2; ta += $1; td += $2 }
    END {
      flush()
      if (!n) exit
      wa = w("+" ta, wa); wd = w("-" td, wd)
      fmt = "\033[33m%-" wh "s\033[0m  \033[32m%" wa "s\033[0m  \033[31m%" wd "s\033[0m  %s\n"
      for (i = 1; i <= n; i++) printf fmt, H[i], A[i], D[i], S[i]
      printf "\n" fmt, "", "+" ta, "-" td, "\033[1mTotal (" n " commits)\033[0m"
    }' | less -RFX
}

← all posts