Simple minds think alike

より多くの可能性を

【Golang】GitHubのOSSにPull Requestを送る

pdfcpu という golang で書かれたコマンドラインツールを使って、複数のPDFファイルを1つにまとめるという作業をたまに行っているのですが、ふとOSSだしPRを送ってみようかと思い立ったのでやってみました。

github.com

Pull Requestの内容

まずは簡単なPull Request(以下PR)を送ってみようと思い

  • Go Report Card でスコアを上げられる箇所の反映
  • テストを追加

してみました。

ローカル作業時の注意点

Githubで管理されているGo言語プロジェクトの場合、パッケージをimportとGithubリポジトリ名が入ります。

なので、ローカルで作業する時

すると、パッケージのパスとGoのコード内でimportするパッケージ名にずれが生じるので工夫が必要でした。

# forkしたリポジトリをgo getでローカルにインストール
$ go get github.com/moritamori/pdfcpu
$ cd $GOPATH/src/github.com/moritamori/pdfcpu

# 任意のコードを開いてパッケージ名を確認
$ cat cmd/pdfcpu/cmd.go -n

17 package main
18 
19 import (
20        "errors"
21        "flag"
22        "fmt"
23        "os"
24        "strings"
25    
26        "github.com/pdfcpu/pdfcpu/pkg/pdfcpu"
27    )

パッケージ名のずれを生じさせない工夫

以下の図のように本家である pdfcpu/pdfcpuリポジトリ(upstream)の master ブランチを git clone で取得した後、作業ブランチを切るようにしました。

こうするとmaster ブランチに差分が出た際、作業中のブランチに取り込み易いので良いです。 master ブランチに差分が出た際の作業中ブランチの取り込み方

PRを送るまでの手順

コミットにGPG署名できるように

GPG署名を求められているOSSプロジェクトだったので設定しました。具体的な手順は別記事にまとめています。

simple-minds-think-alike.hatenablog.com

Github上でForkする

まずは、プロジェクトのコードを自分のリポジトリにforkしてきます。

ossのforkボタン

ローカルにコードを取得

本家である pdfcpu/pdfcpugit clone

$ git clone https://github.com/pdfcpu/pdfcpu

ローカルでremoteの名前をupstreamに変える

originになっているpdfcpu/pdfcpuupstream に変更します。

$ cd pdfcpu
$ git remote rename origin upstream

fork した自分のアカウントのリポジトリorigin にする。

$ git remote add origin git@github.com:moritamori/pdfcpu.git

ローカルで修正するブランチを作る

$ git checkout -b awesome-feature
$ git push origin awesome-feature

リモートブランチを確認すると以下のようになっています。

$ git branch -r
origin/awesome-feature
upstream/HEAD -> upstream/master
upstream/master

開発途中で master ブランチの修正を取り込む場合、 upstreamfetch して開発中のブランチにマージします。

$ git fetch upstream
$ git merge upstream/master

PRを送る

PRを作るとContribution License Agreementに同意して欲しいとコメントが表示されるので、リンク先で同意します。 PR上のContribution License Agreementに同意して欲しいというコメント

ご投稿ありがとうございます。私たちは本当に感謝しています。多くのオープンソースプロジェクトと同様に、あなたの貢献を受け入れる前に、コントリビューターライセンス契約書に署名していただくようお願いしています。

リンクの遷移先では、以下のような画面になっていました。

Contribution License Agreement同意の画面

ライセンスの同意している間にCIが終わりCheckがpassしていたらやることはないので、メンテナの方のレスポンスを待ちました。 CIが終わりCheckがpassしている状態

メンテナの方からのレスポンス

大したPRでもないのであっさりマージされました。

メンテナの方からのコメント

今度はもう少し大きめの機能の追加にチャレンジしてみたいと思います。

参考記事