OpenCVのissueとpull request

# はじめに
みなさんこんばんわ、24日目担当のtomoaki_teshimaです。この記事は[OpenCV Advent Calendar 2017 24日目の記事](https://qiita.com/advent-calendar/2017/opencv)です。関連記事は[目次](https://qiita.com/advent-calendar/2017/opencv)にまとめられています。また、本来ならこの記事は"去年書いた浮動小数点数の精度問題のネタ"というタイトルの予定でしたが、一年眠らせてるうちに、最新のOpenCVでは再現しなくなってしまった、言うなれば**ネタが腐ってしまった**ため、泣く泣く新しく書き起こしています。[^1]

[^1]: (一年も寝かされた挙句公開されずに闇に葬られた記事もかわいそうなので、気になる人は[こちらのissue](https://github.com/opencv/opencv/issues/6536)に英語で執念が書いてあるので良かったら眺めて下さい。あと期待してくれていたhon_no_mushiさんとか、ごめんなさい。)

さて本題。今日は[OpenCVのGithub](https://github.com/opencv/opencv/)上のissueとpull requestについて調べてみたよ

# IssueとPull Requestとは
詳細は割愛しますが、「こういう問題があるよ」という情報共有/方向がissue、実際の「修正の提案」がPull Requestと言い換えられます。

# 現状(2017年12月21日23:00時点)のIssueとPull Requestの数
issueが1238個、PRが40個、それぞれopenになっています。PRに対してissueが**30倍も多い**ことになっています。ちょっとissueが多すぎますね。
最初見たときは、みんなアホみたいにissueだけ投げて、どんどん増えてるんだな、と思っていたのですが、ずっと見ていて、この50前後のPRに対して、2-30倍の数のissueという構図は、**ずーっと変わっていません**。では一体issueの数がPRに対して多いのは何が原因なのでしょう？

# IssueとPull Requestの生存期間
![opencv-issue-pr.png](https://qiita-image-store.s3.amazonaws.com/0/12162/29490879-2a89-2157-3216-275adf28271b.png)
なお、この図は2017年8月18日14:23時点での数です。
なお、必要な人には[SVG版](https://www.dropbox.com/s/lru7si56bqzv6f4/opencv-issue-pr.svg?dl=0)もあります

## IssueとPRのガントチャートの作り方
 1. https://github.com/opencv/opencv/issue/xxx のページをダウンロードしてくる
 2. 適当にOpen dateとClose dateを抽出する
 3. 1.-2.を、全issue/PRに対して繰り返す
 だけです。なお、実際はコストパフォーマンスを考えてシェルスクリプトで「えいやっ！」とやりました。Github上ではissueもPRも通しで連番が振られるし、ついでにxxx番のissueが実はPRだったとしても、勝手にページ転送してくれるので、そのあたりは真面目に考えなくても大丈夫です。

一方で、open dateとclose dateのフォーマットはちょこちょこ変わるみたいで、8月に実行したスクリプトを12月に再度実行してみたら、正しく日付を抽出できませんでした(なので、advent calendarなのに、8月時点でのデータをもとに記事を書いている)

# よく観察してみる
まず気になるのは、下図の赤丸で示した、グラフが不連続になっている部分です
![opencv-issue-pr-gap.png](https://qiita-image-store.s3.amazonaws.com/0/12162/c76d20a7-898b-e21d-ebc6-837c85884ac2.png)
実は、左下の赤丸は

-  不連続の差が大きい
- 不連続より左(古い)issue/PRは無事に閉じられている
- 不連続より右(新しい)issue/PRは、未だopenのままのものが多い

では、これはいつぐらいに発生して、issue/PR番号はいくつぐらいのものなのでしょうか。見てみると、時期は2015年7月27日8時19分(4240)-2015年7月27日11時44分(5080)の間(時間はいずれも日本時間)に作成されています。では、[実際に見てみましょう](https://github.com/opencv/opencv/issues/4240)。

見てみると、```Transferred from http://code.opencv.org/issues/103``` と書いてあります。

実は、OpenCVはその昔、CSVやSVNで管理されていた時代があり、当時は「チケットシステム」でバグ報告を行っていました。当時のチケットを、最終的にはbotでGithubに転記したため、短時間の間に800近くもissuが生成されることとなった訳です。

なので、実際に調べてみると、issueとPRが投稿される頻度は、特段差が無いのに、機械で転記されて下駄を履いてる分、issueの方が大量に存在するように見えるのです。

実際、過去のissueは、OpenCV 2.4時点で既にfixされている、もしくは情報がひどく不足してるissueも多く、本来なら一度クリアしてもおかしくないレベルだと思います。ただ、そういう背景を踏まえて見ると、issueを必死に減らすOpenCV公式開発者の姿勢が見えてくる気がします。

## 不連続部分Part2
不連続部分、ぱっと見ただけではわからないのですが、2016年7月ごろにも不連続部分があります。
実はこの不連続部分は全PR作り直し、という苦労がありました。実は2016年7月は、OpenCVのリポジトリのURLがItseez から openv (https://github.com/itseez/opencv から https://github.com/opencv/opencv) に変わったタイミングでもあります。この時、公式開発者が使っているビルドマシンが、URLが変わったことが影響して、Githubと連携が取れなくなってしまいました。で、結局公式開発者の一人[Vadim Pisarevsky](https://github.com/vpisarev)さんが全PRをcloseして開き直す、という狂気の沙汰を手動で行ったようです。

# その他の不思議な点
![opencv-issue-NA.png](https://qiita-image-store.s3.amazonaws.com/0/12162/35e29f46-1f20-d0d2-b168-e8563f46184b.png)
今度の赤丸をつけたところは、何故か矢印が突き抜けています。つまり、連番で振られているはずのissueが、前後関係狂っています。
この前後関係が狂っているのは https://github.com/opencv/opencv/pull/4020 と https://github.com/opencv/opencv/pull/6368 番です。こいつらは何故か「2度issueがclose」されている、という不思議な現象が起きています。一体2度目のcloseは何が起きたの？

# 後日談というか、今回のオチ
さて、スクレイピングした結果を眺めると、openの日付も、closeの日付も取得に失敗しているissueがあります。[8328番](https://github.com/opencv/opencv/issues/8328)です。ところが、このURLにアクセスすると、404 error が返ってきます。前後のissueは有効なのに、このissueだけは404 errorになります。

さて、Github上において、一度立てたissue/PRは変更/クローズすることはできても、deleteすることはできません。本気でdeleteするためにはgithubの運営に連絡する必要があるそうですが、どうやら、誰か黒歴史を本気で取り消そうと思って、githubの運営にコンタクトを取ったようですね。



# まとめ
みんなもOpenCVのバグをPRでgithubに投げるといいよ！明日は最終日、発起人の[hon_no_mushi](https://qiita.com/hon_no_mushi)さんの締め投稿だよ！