Dangerでインラインコメントをうまく付けられないケースに対処した話

https://github.com/danger/danger#1039 の話です。

Unified format

以前 danger-suggester の話 をしたときに unified format の話をしました。再度触れておくと、git の diff などでは unified format という形式が使われていて、それぞれの変更が hunk という単位で表現されているという話でした。

それぞれの hunk の先頭には、「@@ -1,1 +1,8 @@」のように、その hunk が変更前のファイル、変更後のファイルで言うとそれぞれどの範囲を表しているかという情報が記載されています。この例で言うと、変更前のファイルで言うと1行目から1行分、変更後のファイルで言うと1行目から8行分の情報がこの hunk に含まれているということを表現しています。

unified format では、もし範囲が1行分である場合には、「,1」の部分はそれぞれ省略できることになっており、git の diff でも省略されます。つまり「@@ -1 +1,8 @@」と書けます。自分の手元の環境にある git version 2.15.2 (Apple Git-101.1) でも省略されるようでした。

Danger の不具合

Danger では、GitHub で Pull Request にインラインコメントを付けるために、前述した hunk の範囲情報を利用しています。GitHub では、変更後の行だけでなく変更前の行にもインラインコメントを付けられるので、Web API を利用して diff にインラインコメントを付ける場合、hunk の何行目かという情報を指定する必要があります。それを計算するために、hunk の範囲情報が利用されています。

しかし(これは調査の末に分かったことなのですが)danger 5.8.1 では、範囲の省略形式に対応していませんでした。このため、変更前のファイルの行が hunk に1行しか含まれないような変更を行ったケースでは、その箇所にインラインコメントを付けようとすると失敗してしまう状況になっていました。この状況は、既存のファイルの先頭部分を(末尾まで、あるいは一定行数以上)書き換えると発生するのではないかと推測しています。

この不具合の利用者側の影響としては、例えば danger-rubocop を使っている場合、ファイルの先頭部分を書き換えたケースで「なぜか bot がインラインコメントで指摘してくれない」というような結果として現れるのではないかと思っています。

Pull Request

Danger のインラインコメントに関する実装を一通り見てみたところ、hunk の範囲情報は正規表現で抜き出しているだけのようだったので、これを少しだけ書き換える形で修正を加えました。

https://github.com/danger/danger#1039

Pull Request を作成してみたところ、数時間後には素早く merge していただけて、この修正が取り込まれた danger 5.8.2 がめでたくリリースされていました。