tb に、git-log の結果を csv で吐き出す機能をつけてみた。
とりあえず、git-log では、author date と committer date というふたつの時刻が記録されていることが分かったので、その差をプロットしてみよう。対象は perl のリポジトリ。
% (cd perl; tb git-log -o ../z1.csv) % ruby -EASCII-8BIT `which tb` cut author-date,committer-date z1.csv -o z2.csv % tb newfield timediff 'Time.parse(_["committer-date"]) - Time.parse(_["author-date"])' z2.csv -o perl-timediff.csv
ruby -EASCII-8BIT とか面倒なことをやっているのは、なんかメッセージのエンコーディングがうまくない模様。tb git-log は適当にエンコーディングを修復するようにすべきかもしれない。(そういえば、Ruby にエンコーディングを修復するメソッドをつけるべきであるような気はする。)
で、ggplot2 でプロット。
perl-timediff.R:
library(ggplot2) d <- read.csv("2012-01/perl-timediff.csv") d <- d[d$timediff != 0,] print(qplot(sign(timediff) * log10(abs(timediff)), data=d))
44410件中、26516件は author date と committer date が等しかったので、それは除いた。
また、最大で 6年くらい経ってから commit されているものがあるので、linear scale だと分布が見えない。しかし、(なぜか) author date より committer date が早いことがあるので、log scale は使えない。
しょうがないので、正負それぞれで log をとってプロットしてみた。なお、author date と committer date は秒単位であるため、(すでに除いた author date と committer date が等しいものを除き) -1 < timediff < 1 なデータは存在せず、log で符号が逆転することはない。
正負それぞれの山は値で見るとどんな感じですかね、ということでみてみる。
> summary(d$timediff[d$timediff < 0]) Min. 1st Qu. Median Mean 3rd Qu. Max. -1096000 -13550 -6709 -34860 -3190 -1 > summary(d$timediff[0 < d$timediff]) Min. 1st Qu. Median Mean 3rd Qu. Max. 1 8364 48960 960700 251500 187300000 > length(d$timediff[d$timediff < 0]) [1] 1539 > length(d$timediff[0 < d$timediff]) [1] 16355 > length(d$timediff[d$timediff == 0]) [1] 26516
author date より committer date が早いのはなにかの間違いとして気にしないことにすると、(まぁ、そういうデータがある時点でそんなに信用できたものではない気がするが) 中央値でみると 48960秒、つまり 13.6時間くらいで commit されているかんじ?
本人がコミットするのと、他人がコミットするのを区別してみよう。
% ruby -EASCII-8BIT `which tb` cut author-name,author-date,committer-name,committer-date z1.csv -o z2.csv % tb newfield timediff 'Time.parse(_["committer-date"]) - Time.parse(_["author-date"])' z2.csv -o z3.csv % tb newfield timediff '_["committer-name"] == _["author-name"]' z3.csv -o z4.csv % tb newfield sameperson '_["committer-name"] == _["author-name"]' z3.csv -o perl-timediff2.csv
perl-timediff2.R:
library(ggplot2) d <- read.csv("2012-01/perl-timediff2.csv") d <- d[d$timediff != 0,] print(qplot(sign(timediff) * log10(abs(timediff)), fill=sameperson, data=d[d$timediff != 0,]))
> summary(d$timediff[d$timediff < 0 & d$sameperson == "true"]) Min. 1st Qu. Median Mean 3rd Qu. Max. -43200 -22460 -10840 -16420 -3848 -1058 > summary(d$timediff[d$timediff < 0 & d$sameperson == "false"]) Min. 1st Qu. Median Mean 3rd Qu. Max. -1096000 -13430 -6705 -34980 -3191 -1 > summary(d$timediff[d$timediff > 0 & d$sameperson == "true"]) Min. 1st Qu. Median Mean 3rd Qu. Max. 2 626 7140 765300 172000 124100000 > summary(d$timediff[d$timediff > 0 & d$sameperson == "false"]) Min. 1st Qu. Median Mean 3rd Qu. Max. 1 22470 66520 1070000 270400 187300000
他人がコミットするのでも 66520秒つまり 18.5時間くらいか。
tb-0.3 をリリースした。
[latest]