github风格的日历显示commit

2015年04月05日

最近在知道了一个不错的东西,git-cal,可以针对任意git的repo产生github样式的 calendar view。我想把它的输出放到我的shell的motd里面去,不过有几个问题:

  • 它不能对于几个git repo的log进行汇总
  • 它不支持接受STDIN输入
  • 它是Perl写的,我基本上看不懂

在github上给作者留言让他加入接受STDIN json输入的feature request,没有回应,于是 ,自己写了一个。脚本的名字暂定stat_cal,用法目前有两种:

# in git repo, prints a calendar view for current repository
stat_cal
# accepts STDIN in the form of lines of
#   DATE    COUNT
some_cool_command | stat_cal

这样,我就可以自己把多个repo的数据进行汇总,然后用stat_cal显示出来。我在 .zshrc里是这样加的:

# Usage:
#
#   git_cal_view repo_a repo_b ....
#
git_cal_view() {
    pwd=$PWD
    for i in $*; do
        cd $i
        git log --no-merges --pretty=format:"%ai" --since="13 months"
        echo    # an "\n" is missing at the end of git log command
    done \
        |awk '{ a[$1] ++ }; END {for (i in a) {print i " " a[i]}}' \
        |sort \
        |stat_cal
    cd $pwd
}

core_proj=~/workspace/new2email
all_proj=(~/workspace/new2email ~/dotfiles ~/workspace/blog ~/workspace/yuncli)

motd() {
    echo "\tStatistics on ALL projects: \n"
    for i in $all_proj; echo "\t\t$i"
    echo
    git_cal_view ${all_proj[@]}
    echo
    echo "\tStatistics on CORE projects: \n"
    echo "\t\t$core_proj"
    echo
    git_cal_view $core_proj
    # taskwarrior jobs...
    t list
}

motd

用bash的话也许上面的代码需要稍作修改,不顾应该改动不大。

效果如图:

motd

还能想到的是用这个可以记录自己有哪些日子进行了锻炼等等,玩法有待继续开发。