やってみる

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

ワンタッチで最後にpushしたリポジトリをクローンする

 cloneコマンドを作った。

成果物

現状

 私はコードを書くとき、RAMディスクに保存し、GitHubにプッシュすることで永続化している。翌日、再びそのコードがほしいときはgit cloneでダウンロードし、更新するときはプッシュする。これを繰り返すことで自分のSSDを劣化させることなくコードを永続化している。

 ふつうに自前のSSDやHDDに保存するときと比べて、次の点に気をつける必要がある。

  • シャットダウン前にプッシュすること(RAMは電源を落としたら消えてしまうため)
  • インターネットに接続していること(パケット通信が必要)

 家の固定回線でやる分には問題ない。たまにシステムクラッシュや停電で大惨事になるが。

最新リポジトリURLの取得

 git cloneするときリポジトリのURLが必要。このとき最後に更新したリポジトリのURLがほしい。私はいつも次のようなワークフローを手で実行している。

  1. ラズパイを起動する
  2. ブラウザを起動する
  3. GitHubサイトを閲覧する(ログイン済み)
  4. ログインユーザのリポジトリ一覧を閲覧する
  5. リストの最上位にあるリポジトリを探す(更新日時順にソートされているため)
  6. 該当リポジトリを右クリックする
  7. 右クリックメニューからリンクのアドレスをコピーする
  8. ターミナルを起動する(カレントディレクトリはRAMディスクである)
  9. git clone, CTRL+SHIFT+V, ENTERを入力する
  10. 最終更新リポジトリをダウンロードする

 これが面倒くさい。ワンタッチで実行したい。

リポジトリの閲覧

 さらに言えばリポジトリ閲覧まで自動化したい。リポジトリの実態はディレクトリやファイルである。それらを閲覧・編集するにはファイラやテキストエディタを使う。私は端末用ファイラrangerとエディタvimを使っている。そこで、最新リポジトリをダウンロードしたらそのルートディレクトリをrangerで参照して表示するところまで自動化したい。

 次のようなツールを使えば自動化できそう。

  • systemdで起動時にスクリプトを実行する
  • OpenBoxのホットキーでスクリプトを実行する
  • テキストエキスパンダespansoでコマンド文字列を展開する

 たとえばCtrl+Gで最新リポジトリをダウンロードし、端末用ファイラrangerでそのリポジトリ内を参照するところまで自動化するとか。

 ただ、肝心のリポジトリ取得に関してはどうにかして自作せねばならない。

課題

最新リポジトリURLの取得

 GitHub API reposを使う。応答はJSON形式なのでjqツールで解析してURLだけを取得する。

USER=ytyaru
curl -u $USER "https://api.github.com/users/$USER/repos?per_page=1&page=1" | jq -r .[].clone_url

 APIの引数は次の通り。

引数 初期値
type all,public,private,forks,sources,member,internal all
sort created,updated,pushed,full_name created
direction asc,desc sort=full_nameならasc、他はdesc
per_page: 1100 30
page 1 1

 個人ユーザytyaruリポジトリを更新日時の降順に5件取得するなら以下。

NewerRepos() {
    local USER=${1:-ytyaru}
    local TYPE=all
    local SORT=${2:-pushed}
    local DIRECTION=$([ "$SORT" == 'full_name' ] && echo 'asc' || echo 'desc')
    local PER_PAGE=5
    local PAGE=1
    echo "https://api.github.com/users/$USER/repos?type=$TYPE&sort=$SORT&direction=$DIRECTION&per_page=$PER_PAGE&page=$PAGE"
}
NewerRepoUrls() { echo "$(NewerRepos)" | jq -r .[].clone_url; }

 あとはGitHubAPIの認証方法に応じてリクエストするだけ。

基本認証

curl -u $USER "$(NewerRepos)"

OAuth2

curl -s -H "Authorization: token $TOKEN" "$(NewerRepos)"

 OAuth2のほうがセキュリティが高いのでオススメ。TOKENGitHubのサイトで作成する。ログインしてSettingDeveloper settingsPersonal accesso tokensGenerate new tokenで作成する。期限なしで使い回せば楽。毎回パスワードを手入力するよりセキュリティ性と自動化のバランスがとれていい感じ。なのにデフォルトでは30日期限つきで作成しようとするので注意。

 話を戻す。これを参考にして最新リポジトリ取得するコマンドを作った。

 実行ファイルをcloneという名前のシンボリックリンクで参照させる。それを環境変数PATHに通す。すると以下コマンドで実行できるようになる。これ一発で最後にpushしたリポジトリを取得できる。楽ちん!

clone

 指定した数だけリポジトリを取得することも可能。おなじくpushした日時の降順。なので最近いじったリポジトリをいくつかクローンしたいときはこいつで一発。名前やURLを覚えていなくてもOK。たすかるわ〜。

clone 2

 あとはこれをsystemdOpenBoxで連携すればよい。でもこれで満足した。大部分はショートカットできたので良しとする。とくに遅いブラウザを起動せずに済むのは嬉しい。

所感

 つまらない作業を自動化できたとき、とてもスッキリいい気分になる。プログラミングの醍醐味。面倒くさがりなネガティブパワーをコーディング力に変える。よき。

 でもワンタッチじゃなかった。ワンコマンドだった。

対象環境

$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux