rpmのspecファイルのSourceにGitHubの任意のコミットのtarballのURLを指定するときの良い書き方

Packaging:SourceURL - FedoraProjectで知ったtipsの紹介です。

GitHubでプロジェクトの[Download ZIP]ボタンを押すと、ソースをZIP形式でダウンロードできます。 コミット数が多いプロジェクトだと git clone するよりも高速に取得できるので履歴が不要な場合には便利な方法です。

例えばopenresty/lua-nginx-moduleなら https://github.com/openresty/lua-nginx-module/archive/master.zip というURLになるのですが、 .zip.tar.gz に変えればtar.gz形式でダウンロードできます。

また、 master の部分はブランチ名、タグ名、コミットハッシュを指定することも出来るので任意のコミットのソースを取得可能です。

好みのファイル名でダウンロードするのは、通常ならダウンロードするツール側で対応すれば良い話です。例えばcurl(1): transfer URL - Linux man pageを使う場合は -o オプションで -o ファイル名 のように指定すれば良いだけです。

ただ、RPMのspecファイルの Source: に指定するときはちょっと厄介です。 SPEC file overviewSource0 の説明を読むと、URLのベースネーム (最後のスラッシュの後の部分) が ~/rpmbuild/SOURCES ディレクトリ配下に置くファイル名になるようにするべきとあります。

しかし、上述のようにGitHubでソースのtarballのURLのベースネームは コミットハッシュなど.tar.gz という形式となっています。これだと複数のソースをダウンロードした時に、どれがどれかわかりにくいですし、 バージョン番号.tar.gz の場合だとファイル名が衝突する恐れもあります。

解決策ですが、元のURLに #/ をつけてその後に好きなファイル名を指定すればOKです。具体的には https://github.com/ユーザ名/プロジェクト名/archive/コミットハッシュなど.tar.gz#/プロジェクト名-コミットハッシュなど.tar.gz のように書きます。

Packaging:SourceURL - FedoraProjectにはbitbucket.orgとgitlab.comの場合の書き方も紹介されていますので、必要に応じてご参照ください。