使用したプログラム: bxcodec/go-clean-arch
概要
- Goの内部パッケージの関係が複雑なプログラムは理解するのが大変
- 可視化したい
- せっかくだからコミットごとに可視化してアニメーションにしてみる
準備
コード
やったこと
- コミットログを取得
- コミットごとにコマンドを実行
- Goの内部パッケージ関係をdotファリルに出力し、gifを作成
- コミットごとのgifのサイズを揃えて、アニメーションを作成
1. コミットログを取得
git log --pretty=oneline
で取得できる。
pythonでかくと
res = subprocess.check_output(["git", "-C", path_dir, "log", "--pretty=oneline"])
コミットのハッシュ値だけを取得したい(ハッシュ値+コメントになっている)。空白で区切って一番最初のハッシュ値だけを取得してリストにした。
2. コミットごとにコマンド実行
コミットごとにresetしてコマンドを実行した(reset以外にいい方法がある??)。
for commit in log_list:
subprocess.call(["git", "-C", path_dir, "reset", "--hard", commit]) |
command(path_dir)
コマンドを実行するときはプログラムのあるディレクトリのパスを使用する。
3. Goの内部パッケージ関係をdotファリルに出力し、gifを作成
3.1. dotファイル作成
ここが一番難しい。
parser というとても便利なパッケージがあり、ファイル内でimportしているパッケージを取得してくれる。これをファイルごとからパッケージごとにまとめれば良い。
困ったこと
- ファイルごと --> パッケージごと
parserはファイルのパッケージ名も取得してくれるが、別のディレクトリに同じパッケージ名があると区別できない。ディレクトリを保存したが、もっと簡単な方法がありそう - 外部パッケージの区別
内部パッケージ(自分で作ったもの)だけを対象にしたかったがどうやって区別すればいいか??「githubってあれば外部」みたいにしたが、あまりいい方法ではなさそう。
3.2. dotファイルからgifファイル作成
graphvizを使用する。
dot -T gif sample.dot -o sample.gif
4. コミットごとのgifのサイズを揃えて、アニメーションを作成
4.1. gifのサイズを揃える
アニメーションにするときファイルごとのサイズが違うと大きいサイズは切れてしまう。
mogrify -resize (width)x(height)! *.gif
指定するサイズはいい感じのを選ぶ。
4.2. アニメーション作成
ImageMagickを使用する。
convert -delay 5 -loop 0 *.gif animation.gif
参考にしたサイト
- Gitディレクトリ外からgitコマンドを実行する
- Pythonでsubprocessを使ってコマンドを実行する方法
- package parser
- 画像の拡大・縮小
- アニメーションGIF ImageMagick編
- st34-satoshi/for-each-commit
- st34-satoshi/call-graph
これから
コミットごとにグラフの表示位置がバラバラになってしまいアニメーションにしたとき見にくい。どうにか揃えたい。