やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubのリモートリポジトリをコンソールから作成したい

いちいちサイトから作成するのが面倒。楽できないか模索してみた。

対象環境

概要

以前、GitHubにアップロードしてみた - やってみるGitHubのアップロードをした。バッチファイルまで書いて自動化した。

しかし、リモート・リポジトリの作成は手動である。 今まではリモート・リポジトリGitHubサイトで手動で作成してからバッチを実行していた。

今回は、リモート・リポジトリの作成を自動化しい。

まずはコンソールから作成する方法を探した。

GitHub API

以前、成果物まとめ一覧ページを自動作成したい - やってみるcURLをもちいてWebAPIを実行した。

リモート・リポジトリを作成するAPIもある。こいつを使う。

必要なもの

事前準備

実行環境

msysはmingw-get.exeで取得した5.3.0を使う。

cURLは、以前ブログで言及した「どこで入手したか忘れたcURL.exe」を使った。バージョンは以下の通り。

C:\root\tool\System>curl --version
curl 7.24.0 (i386-pc-win32) libcurl/7.24.0 OpenSSL/0.9.8t zlib/1.2.5 libidn/1.18
 libssh2/1.3.0 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp
rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN Largefile NTLM SPNEGO SSL SSPI libz

今回のコマンドはなぜかcmd.exeで実行するとエラーになった。msys(sh.exe)で呼び出すと実行できた。 おそらく、MinGW/msysでコンパイルされたcURL.exeなのだろう。

そこで、cURL.exeの処理はシェルスクリプト(.sh)で呼び出すことにする。 しかし、.shはダブルクリックで実行できない。 そこで、バッチファイル(.bat)から.shを呼び出すことにする。

面倒になってゆく

たかがGitHubのWebAPIを使いたいだけなのに、私の環境では大仰になってしまう。

これだけのシステムが関わる。cmd.exe, sh.exeの2つを使わねばならないから、WindowsUnixのコンソール環境を学習せねばならなくなる。ただでさえ、curl.exe, GitHubAPIについても学習せねばならないのに。

.batと.shの構文を学習するところが、とても苦労した。

コマンド

キモとなるのはリポジトリを生成するGitHubAPI。Basic認証し、JSON引数をPOSTする。 それをcurlコマンドでやると以下のとおり。

curl --cacert "C:\Program Files\Git\ssl\certs\cacert.pem" -u 'GithubUsername:GithubPassword' https://api.github.com/user/repos -d '{"name":"repo_name", "description":"this is repository description.", "homepage":"https://www.google.co.jp"}'

msys(sh.exe)上で実行すること。cmd.exe(MS-DOS/コマンドプロンプト)上ではエラーになってしまう。

いくつか変数にしてみたのが以下のコマンド。REPO_NAME=MyRepoのように変数を設定してやると動作する。

curl --cacert "${CURL_PEM}" -u "${GITHUB_USER}:${GITHUB_PASS}" https://api.github.com/user/repos -d '{"name":"'${REPO_NAME}'","description":"'${REPO_DESC}'","homepage":"'${REPO_HOME}'"}'

しかし、上記のコードはdescriptionに日本語を使うとエラーになってしまう。 文字コード問題である。 コンソールはCP932(Shift-JIS)だが、GitHubAPIはUTF-8で処理するためである。 そこで、nkf.exeにてCP932(Shift-JIS)からUTF-8に変換して送信するようにしたのが以下のコマンド。

echo '{"name":"'${REPO_NAME}'","description":"'${REPO_DESC}'","homepage":"'${REPO_HOME}'"}' | nkf -w | curl --cacert "${CURL_PEM}" -u "${GITHUB_USER}:${GITHUB_PASS}" https://api.github.com/user/repos -d @-

成功するとJSONレスポンスが返ってくる。GitHubAPIの応答もUTF-8。しかしコンソールがCP932(Shift-JIS)なので文字化けする。そこで応答をCP932(Shift-JIS)に変換したのが以下のコード。

echo '{"name":"'${REPO_NAME}'","description":"'${REPO_DESC}'","homepage":"'${REPO_HOME}'"}' | nkf -w | curl --cacert "${CURL_PEM}" -u "${GITHUB_USER}:${GITHUB_PASS}" https://api.github.com/user/repos -d @- | nkf -s

所感

これで少しは楽ができそうな目処が立った。 次はバッチファイル化したい。