画像変更なPull Requestでちょっと便利なTips

Diverse Advent Calendar 2019 13日目の記事です。

突然ですが、Pull Requestちゃんとレビューできてますか？

先日私はやらかしました :innocent: 

本日はそのやらかし話とそれに対しての対策したお話しします。

# 序章 ~罠との遭遇~

まず、下記の図はお馴染みのGitHubのPull Requestのdiff画面です。

<img width="806" alt="スクリーンショット 2019-11-27 14.47.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/6c806e15-2df9-8c50-0c3a-2b9978d0709b.png">


GitHubには画像差分を比較するために強い機能[^1]を持っています。
しかし、デフォルトで画像の差分は展開されません。
見るためには、指定のボタン ![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/5d700ff7-b4f9-88a4-ad20-280cb99742aa.png) を押す必要があります。

<img width="808" alt="スクリーンショット_2019-11-27_14_47_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/27cec4cd-a603-8b4d-2f6b-566eefa45144.png">

すると、削除された画像は、 `Binary file not shown.` から `Deleted file not shown.` に変わったことがわかります。

本題はここからです。

変更画像がたくさんあった場合のPull Requestのとき、どうしましょう。
ボタン押さないと差分はわかりません。

3こ、4こ程度ならボタンポチポチで大丈夫だと思います。
10こ辺りから悩ましくなります...

意を決してポチポチ作戦を試みたものの、上記の画像みたいにファイル削除が続いた後に、「あー、全部削除なのねー」って気を抜いた次の瞬間、


<img width="794" alt="スクリーンショット 2019-11-27 14.48.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/e7ea70bb-d04b-6e43-54e5-969cfe8cf721.png">

やらかしましたね :innocent: :innocent: :innocent: 


# 第1章 ~罠に立ち向かう術~

画像変更差分が多いPull Requestが突きつけられたとき、ポチポチはめんどくさい。

そこで気づきました。


**JSあるじゃん**

ということで早速、画像差分を表示するボタン ![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/5d700ff7-b4f9-88a4-ad20-280cb99742aa.png) を確認。

```html
<button class="btn btn-sm BtnGroup-item tooltipped tooltipped-w rendered js-rendered selected" aria-label="Display the rich diff" type="submit" data-disable-with="" aria-current="true">...</button>
```

すると、`js-rendered`クラスが該当ボタン ![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/5d700ff7-b4f9-88a4-ad20-280cb99742aa.png) に割り当てられてそうな臭いを察知 :eyes: 

早速ボタンポチポチスクリプトを作成。

```js
Array.from(document.getElementsByClassName('js-rendered')).forEach((b) => b.click());
```

これをconsoleで実行すると、

<img width="807" alt="スクリーンショット 2019-11-27 15.50.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/3291bde4-3b9e-f82c-7f19-91a264908917.png">

:raised_hands: :raised_hands: :raised_hands: 


# 第2章 ~それでもボク(自動化)はやってない~

なんとかボタンポチポチマンからスクリプトポチーマンまで進化しました。

しかし、便利になったとはいえPull Requestの都度スクリプトポチーはだるい...

そこで、 [Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja) の登場です。 


## Tampermonkeyとは

Tampermonkeyは、指定のページを表示時にユーザが組んだスクリプトを実行してくれる無料で使えるGoogle Chromeの拡張機能[^2]です。


## 環境

* Google Chrome (78.0.3904.108)
* Tampermonkey (v4.9)


## ユーザスクリプト

実行させるスクリプトを定義します。

```js
// ==UserScript==
// @name         画像差分を表示するくん
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://github.com/*/*/*/files*
// @grant        none
// ==/UserScript==

window.onload = () => {
  Array.from(document.getElementsByClassName('js-rendered')).forEach((b) => b.click());
};
```

スクリプト本体に関しては、先ほどのスクリプトを `window.onload` で実行するようにしました。

そしてポイントは、ヘッダー内の `@match` に、スクリプト実行したいサイトのURLを定義します。[^3][^4]

すると、GitHub File Changedの画面を開くと、自動で画像差分を表示してくれるようになりました！ :tada: :congratulations: 

<img width="807" alt="スクリーンショット 2019-11-27 15.50.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139890/3291bde4-3b9e-f82c-7f19-91a264908917.png">


# 最後に

今回、Tampermonkeyをご紹介しましたが、これ以外に似たような拡張機能を使っても同様のことは実現できると思います。
また今回実装したスクリプトは必要最低限の実装のみのため、変更ファイル数が多いPRだと遅延読み込みが発生して全ての差分が表示できない場合があるので、自分にあったスクリプトを書いて快適なレビューライフを送りましょう！ :christmas_tree: 


# 参考

[^1]: https://help.github.com/en/github/managing-files-in-a-repository/rendering-and-diffing-images#viewing-differences
[^2]: Google Chrome以外に、Firefox, Safari, Microsoft Edgeなどの主要ブラウザ用のプラグインもあります。
[^3]: [Tampermonkey • Documentation](https://www.tampermonkey.net/documentation.php)
[^4]: `@match` の記述方法は[こちら](https://developer.chrome.com/extensions/match_patterns)を参照。