$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

変更した箇所だけTest::UsedModulesで不要なuseを検知する

blog.shibayu36.org

以前こんなブログを書いたが、やはりCIでチェックしたいと考えた。

全ファイルをチェックしようとすると時間がかかってしまうので毎回のテストでは実行したくない。しかし、毎回のテストで実行しないと結局はmerge前に検出するのが難しくなる。この背景から、どうせgitを使ってるし、変更点だけチェックすればいいのではと考えた。

gitで変更があったファイルの一覧を取得するには

git diff --stat --name-only master...HEAD

とすれば良い。

これを利用すれば以下のようにして変更点だけテストできる。

use Test::More;
use Test::UsedModules;

my $base_branch = "origin/master";
my $changed_files = [
    split "\n", qx{git diff --stat --name-only $base_branch...HEAD}
];
my $target_files = [ grep { $_ =~ /(?:\.pm|\.t)\z/ } @$changed_files ];
for my $file (@$target_files) {
    used_modules_ok($file);
}

done_testing();

gitでpush前のcommitの一覧をリスト記法で取得する

github上でコードレビューをされた時、あるコメントに対する変更点を列挙して、「こういうふうに直しました」と言いたい時がある。こういう時にpush前のcommitをリスト記法で貼り付けたい。

なんか出来ないかなと思ったら、以下のようにしたら出来た。

$ git log @{u}..HEAD --format="- %H %s"
- 2b237548bcd779abd3f15d413b3540f4c8699cd2 perlで使っていないモジュールを検出してくれる
- 998d3198bf96ab545f315005128342e124941bc4 fix
- 3434242410997a2be106b3596b810539c5fce0f4 IntelliJの起動ショートカット
- ae0ab4f3397587282b87ed3de8754e971bd0c8c6 gopath
- 8f8a230ca3fffc4536fc4107e6d76308e91a801c envを移動

@{u}は現在のブランチのupstreamを指すための省略記法。man gitrevisionsをすればいろんな記法を知ることが出来る。

またgit logなどはformatを指定できるオプションが付いているので、それを利用して、

- (revision) (commitメッセージ)

というフォーマットで出力するようにしている。


これでちょっと便利になったけど、

  • pushしないと、githubに貼り付けた時にcommit hashがリンクになってくれない
  • コメントに対する対応関係は自分で手書きする必要がある

という不便さがまだあるので何とかしたい。