初めて OSS に PR を出してみた話 ～2度にわたる挑戦～

# 初めて OSS に PR を出してみた話


## はじめに
以前，結構古めの OSS に対して PR （プルリクエスト）を出してマージされました．

画像系の AI モデル開発をしていると，時々古いライブラリなどを動かす必要があります．そのとき私が使おうとしたのが，MSCOCO という有名なデータセット関連のライブラリ，[cocoapi](https://github.com/cocodataset/cocoapi) や [cocostuffapi](https://github.com/nightrome/cocostuffapi) でした．そして気づいたのです．**cocostuffapi が python3 に対応していない** と...．
> 「このご時世，python3 に対応していないなんて困っちゃう！」

そう思い，python3 で書き直して使用していました．
そして，「どうせ直したのなら OSS のコントリビューションの経験も積みたいし，PR 出してみるか！」ということで出してみました．

本記事は，そのときの流れの記録とこれから PR 出してみたい人の参考としてまとめてみました．

## PR の手順
いろいろ PR の方法はあるのかもしれませんが，今回私は下記の手順で実施しました．
1. オリジナルのリポジトリを fork
1. 自分の環境で修正 & コミット
1. 自分のリポジトリに push
1. github から PR 作成

## 具体的な作業
### オリジナルのリポジトリを fork
まず，オリジナルのリポジトリは別の人のものであるので，自分のリポジトリを作成します．
その時に使用するのが fork というものです．fork は他の人のリポジトリを丸々自分のリポジトリとしてコピーできます．

方法は簡単で，fork したいリポジトリにアクセスし，下記を押します．

![fork1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4078542/026ec4a8-7eeb-4595-8f4e-d01994b53365.png)

fork を押した後は下記のページが出てきます．

![fork2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4078542/d8567f9b-68ee-4872-b717-5fd721494d5c.png)

ここでリポジトリ名を決め，右下の「Create fork」を押すと fork 完了です．このとき，main ブランチのみコピーするかなど決めることができます．
これで，自分のアカウント内にオリジナルと同じリポジトリが作成できました．

このリポジトリは自分のものなので，どんな修正をしてもオリジナルには影響がありません．
このリポジトリに対して修正等行います．

### 自分の環境で修正 & コミット
1. クローン
[上記](#オリジナルのリポジトリを-fork)で fork したリポジトリを自分のマシンに clone します．
    ```bash
    $ git clone *リポジトリ*
    ```

2. 修正
クローンしたソースコードに対して Python3 で動くように修正を加えます．（私が修正した具体的な内容は[こちら](https://github.com/k2-gc/cocostuffapi/commit/675ff387d8297af0d95acd56ece4a36d9945893a)参照．大したことはしていません．）
2. コミット
修正した内容を記録するためにコミットします．
    ```bash
    $ git add . # 変更ファイル全部 add
    $ git commit -m "コミットメッセージ"
    ```
### 自分のリポジトリに push
修正が完了したら，まずは自分のリポジトリに push します．
ブランチなど切っていなければ，大体下記のコマンドかと思います．（環境によっては main ではなく master の可能性もあり）
```bash
$ git push origin main
```

この段階で，自分の github 上のリモートリポジトリが修正後のものに更新されます！

### github から PR 作成
ついに **PR** 作成です！

自分のリポジトリに push した後，再度ブラウザからリポジトリを確認すると，"This branch is X commit ahead of リポジトリ名" と出てきます．これは「あなたのコードはオリジナルよりも X コミット分進んでいるよ」という意味です．

![pr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4078542/4117e50d-a005-4c42-89ee-990ca246f03a.png)

そこで，**Contribute** を選択すると，**Open pull request** というボタンが出てくるので，そちらを押します．

![pr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4078542/7ba6527e-c0af-47d1-ba34-b083b8ab9b01.png)

そうすると PR のタイトルと説明を記入できるようになるので，必要な内容を記入して，右下の「Create pull request」を押すと完了です．
お疲れ様でした！

## PR の結果
### 第一回
結論から...**ダメでした！**
詳細は[こちら](https://github.com/nightrome/cocostuffapi/pull/3)にありますが，「多くの人に使用されているから後方互換性がないものはダメ」ということでした．
私の方で docker など使いながら py2 と py3 両方で動作確認をしてみましたが，py2 で動かなかったので，一度 close しました．

正直，残念な気持ちもありましたが，結構古いコード（最終コミットが2018年）だったので，リアクションがもらえただけで嬉しかったです！

ちなみに，この時の PR の内容は下記でした．
```plaintext
タイトル：Refactoring for Python3 
本文：
Refactored the code seems for python2 and modified for python3.
Mainly,

* xrange -> range
* import error
* And some other errors when using with python3

I checked and tested my programs by "testUserDemos.py" on env below.

* Python 3.10.12
* Ubuntu 22.04
```

### 第二回
**見事マージされました！！<3<3**

第一回の PR で指摘されたことを踏まえ，py2/py3 どちらでも動くようにコードを修正し，両方の環境で動作確認をしました．
また，オリジナルのコードにはテスト用のデータが添付されていたので，オリジナルのコード，修正後の py2 での結果，修正後の py3 での結果の3つが一致することも確認しました．

そして，リポジトリのオーナーからも下記のようなコメントをもらい，approve と merge がされ，PR は close されました．（詳細は[こちら](https://github.com/nightrome/cocostuffapi/pull/4)です）
> All changes look good to me. Thank you for your contributions

また，二回目の PR のときの内容は下記です．

```plaintext
タイトル：Refactoring for Both Python2 and Python3
本文：
I fixed the codes for Python2 and Python3 and checked compatibility between Py2 and Py3.

I confirmed them on env below.

* Python3:
 1. Ubuntu 22.04
 2. Python 3.10.12
* Python2:
 1. Ubuntu 18.04
 2. Python 2.7.17

I ran "testUserDemos.py" with stuff_examples.json and got same results with 3 conditions.

 1. Original program in your repository.
 2. My program with Py2
 3. My program with Py3

  > Mean IOU @[ classes= leaves ] = 0.2409
  > FW IOU @[ classes= leaves ] = 0.4830
  > Mean accuracy @[ classes= leaves ] = 0.2978
  > Pixel accuracy @[ classes= leaves ] = 0.5450
  > Mean IOU @[ classes=supercats ] = 0.4468
  > FW IOU @[ classes=supercats ] = 0.6636
  > Mean accuracy @[ classes=supercats ] = 0.6044
  > Pixel accuracy @[ classes=supercats ] = 0.7486
```

## 最後に
今回は，初めて OSS に対して PR を出し，マージされるまでの流れをご紹介しました．

あまり大きな貢献ではないかもしれませんが，この世界のコードの1つに自分が関われた，役に立てたということは大変嬉しいです．

反省点もいくつかあり，コミットの粒度が荒かった，コミットメッセージの書き方を工夫したら良かった，PR の内容をもう少し丁寧に書けば良かった，などなどあります．これらは今後のコーディングに活かしていきます！

GitHub のコードを読んでいて「これバグじゃない？」「なんか動かないな…」と思うことって，たまにありますよね．
そんなとき，もし自分で直せそうだったら，ぜひ PR を出してみてください！
受け入れられても，ダメでも学ぶことが多々あると思います！！
では今回はこの辺で！

## Appendix
* [自分のリポジトリ](https://github.com/k2-gc/cocostuffapi/tree/master)