LoginSignup
0
1

More than 3 years have passed since last update.

Goの内部パッケージ関係をコミットごとに可視化する

Last updated at Posted at 2020-01-07

call-aimation.gif

使用したプログラム: bxcodec/go-clean-arch

概要

  1. Goの内部パッケージの関係が複雑なプログラムは理解するのが大変
  2. 可視化したい
  3. せっかくだからコミットごとに可視化してアニメーションにしてみる

準備

コード

やったこと

  1. コミットログを取得
  2. コミットごとにコマンドを実行
  3. Goの内部パッケージ関係をdotファリルに出力し、gifを作成
  4. コミットごとの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

参考にしたサイト

これから

コミットごとにグラフの表示位置がバラバラになってしまいアニメーションにしたとき見にくい。どうにか揃えたい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1