前回の続き。
試していなかった、 info
, hotspot
, hotgraph
, author
といったコマンドを試してみる。
環境
gilotのアップデート
前回試してからgilotをアンインストールしていたため、インストールしようとしたらエラー。
pip install gilot (中略) Running setup.py install for python-Levenshtein ... error ERROR: Command errored out with exit status 1: (中略) error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/
どうも、前回試した後に、 Microsoft Visual C++ Build Tools
をアンインストールしていたらしい。それぞれインストールして成功、gilotのバージョンは0.2.4。
cinst microsoft-visual-cpp-build-tools pip install gilot (中略) Successfully installed argparse-1.4.0 datetime-4.3 gilot-0.2.4 python-Levenshtein-0.12.0 python-louvain-0.14 zope.interface-5.1.0
また、後述する author
コマンドによる出力で使用されるため、
IPAゴシック Ver.003.03をインストールしておくといい。
対象のリポジトリ
前回と同様、以降のコマンドはGit Bashで実行する。
git clone https://github.com/vuejs/vue.git
logコマンド
gilot log Gitリポジトリパス
でログ出力するのは前回と同じだが、 hotspot
や hotgraph
では、 --full
オプションを付けて出力する必要がある。
--full
を付けて出力しても、 plot
によるグラフ出力ができなくなったりはしないため、とりあえず付けておくのが良さそう。
デフォルトブランチの dev
を対象として、出力を実行。
gilot log --full --branch dev -o log-vue.csv vue/
あまり量が出ない。プルリクエストガイドラインによると、マージ前にsquashしているからか。
デフォルトでは直近6か月分が出力されるが、--month 整数
オプションで月数を変更したり、 --since YYYY-MM-DD
や --until YYYY-MM-DD
で開始日・終了日を指定できる。
トータルで3,000コミット強程度のため、最初のコミットまで遡ってみる。日付は 11 Apr 2016
のため、 --since 2016-04-01
を指定。終了日も指定しないと、6か月後の2016/10/1までになるため、 --until 2020-09-01
も指定しておく。
gilot log --full --since 2016-04-01 --until 2020-09-01 --branch dev -o log.csv vue/
4分程度で出力完了。
解析コマンド共通オプション
共通で以下のオプションがある。詳細は、各コマンドのヘルプ参照。
オプション名 | 概要 |
---|---|
-i , --input |
logの出力結果をファイル出力している場合、そのパスを指定。 |
--allow-files | 解析対象に含める、Gitリポジトリ上のファイルパス。 JavaのMavenプロジェクトであれば 'src/main/*' を指定するなど。 |
--ignore-files | 解析対象から除外する、Gitリポジトリ上のファイルパス。--allow-files で指定したファイルパスから、特定のファイルを除外することができる。 |
いずれも、スペース区切りで複数記述したり、 *
をワイルドカードとして使用できる。
実際のプロジェクトに対して実行する場合、ユニットテストを除外したりする必要がありそう。
plotコマンド
gilot plot
で、logの結果をプロットした画像に変換できる。デフォルトでのタイムスロットは2週間ごとだが、4年半分と期間が長いため、 -t 1m
で1か月単位にしてみる。
gilot plot -i log.csv -o plot.png -t 1m
結果は以下。
infoコマンド
gilot info
で、plotのグラフ生成元となる情報をJSONで出力可能。 -o
オプションはないので、必要があればファイルにリダイレクトして出力する。 -t
でタイムスロットは指定可能なので、以下のコマンドを実行。
gilot info -i log.csv -t 1m > info.json
結果は以下、長いので折り畳み。どうやら、タイムスロットの指定が効いていない模様。
info結果
{ "gini": 0.7823790383228998, "output": { "lines": 922130, "added": 165974, "refactor": 0.8200101937904634 }, "since": "2016-04-11T11:47:28.000000000", "until": "2020-08-20T22:10:59.000000000", "timeslot": "2 Weeks", "insertions": { "mean": 4730.886956521739, "std": 9466.989587800872, "min": 0.0, "25%": 33.0, "50%": 195.0, "75%": 4341.0, "max": 53336.0 }, "deletions": { "mean": 3287.634782608696, "std": 7541.675235428418, "min": 0.0, "25%": 19.5, "50%": 152.0, "75%": 2620.5, "max": 52753.0 }, "lines": { "mean": 8018.521739130435, "std": 15533.282323544638, "min": 0.0, "25%": 62.5, "50%": 307.0, "75%": 7497.5, "max": 85416.0 }, "files": { "mean": 82.41739130434783, "std": 123.61243781516767, "min": 0.0, "25%": 4.5, "50%": 22.0, "75%": 140.0, "max": 831.0 }, "authors": { "mean": 5.756521739130434, "std": 6.069179117804726, "min": 0.0, "25%": 1.0, "50%": 4.0, "75%": 9.0, "max": 32.0 }, "addedlines": { "mean": 1443.2521739130434, "std": 7191.568304720781, "min": -45723.0, "25%": 0.0, "50%": 27.0, "75%": 1067.5, "max": 33762.0 } }
hotspotコマンド
gilot hotspot
で、変更されやすいファイルを出力可能。これはグラフではなくテキストで出力される。
ヘルプを見ると -o
オプションが用意されているが、 --csv
オプションとセットで指定しないと標準出力に結果が表示されるため、リダイレクトする。
デフォルトでは30件出力される、件数の変更は -n 整数
オプションで可能。
gilot hotspot -i log.csv -n 10 > hotspot.txt
結果は以下。
------------------------------------------------------------ gilot hotspot ( https://github.com/hirokidaichi/gilot ) ------------------------------------------------------------ hotspot commits authors file_name 1.86 166 5 BACKERS.md 1.30 174 28 README.md 0.82 51 5 yarn.lock 0.39 102 2 dist/vue.js (後略)
また、 --csv
オプションでCSV出力も可能。このオプションを使用すると、 -o
オプションによる出力先ファイル指定が有効となる。 また、 -n
オプションは無視され、logで出力したコミットに含まれる全ファイルに対する解析結果が出力される。
gilot hotspot -i log.csv --csv -o hotspot.csv
結果は以下。 --csv
オプションを付けない場合より、詳細な情報を取得できる。
file_name,hotspot,commits,authors,edit_rate,lines BACKERS.md,1.8565003497904684,166,5,0.5469133051036327,4487 README.md,1.3033147402277916,174,28,0.5703506435863294,2253 yarn.lock,0.8172803516743423,51,5,0.6243990891456523,23714 dist/vue.js,0.3879481352423523,102,2,0.5622198102968241,42382 (後略)
hotgraphコマンド
同時に変更されることの多いファイルのネットワークを出力できる。
Windowsで実行する場合、 --stop-retry
オプションを付けないとエラーが発生する。
gilot hotgraph -i log.csv -o hotgraph.png --stop-retry
結果は以下。コミットが多すぎて重なってしまった...
出力結果の調整をしたい場合、 -r 整数
でランクの閾値の変更ができる。デフォルトでは70の模様。小さくすると結果は少なく、大きくすると結果は多くなる。
また、オプションに --csv
があるが、指定しても意味はなさそう。
authorコマンド
コミッターごとのコミット数や割合をグラフ化できる。
gilot author -i log.csv -o author.png
結果は以下。Evan Youさん無双。
デフォルトでは上位10名が出力される。 -t 整数
で人数の変更可能。
-n 文字列
オプションを指定すると、右上の「GIT LOG -- AUTHORS REPORT」の「--」が指定文字列となる。
また、 --only コミッター名
で、指定したコミッター以外を「Others」にできる。
gilot author -i log.csv -o author-only.png --only 'Evan You' 'vue-bot'
結果は以下。
authorコマンド実行時の注意点
出力フォントにIPAゴシックを使用している模様。フォントがインストールされていないと、以下の警告が発生。
WARNING : findfont: Font family ['IPAGothic'] not found. Falling back to DejaVu Sans.
グラフ自体は出力されるが、コミッター名に日本語など非ASCII文字が含まれると文字化けする。
警告表示されたら、IPAゴシックをインストール後、 python -c "import matplotlib, shutil; print(matplotlib.get_cachedir());"
で表示される matplotlib
のキャッシュディレクトリを削除して再実行する。
振り返り
おそらく、 vuejs/vue-nextなど他のGitリポジトリも含めれば、また違った結果が出たかと思う。
あとは、plot結果のグラフの読み方を理解しないとだな...