ワンタッチで最後にpushしたリポジトリをクローンする
clone
コマンドを作った。
成果物
現状
私はコードを書くとき、RAMディスクに保存し、GitHubにプッシュすることで永続化している。翌日、再びそのコードがほしいときはgit clone
でダウンロードし、更新するときはプッシュする。これを繰り返すことで自分のSSDを劣化させることなくコードを永続化している。
ふつうに自前のSSDやHDDに保存するときと比べて、次の点に気をつける必要がある。
- シャットダウン前にプッシュすること(RAMは電源を落としたら消えてしまうため)
- インターネットに接続していること(パケット通信が必要)
家の固定回線でやる分には問題ない。たまにシステムクラッシュや停電で大惨事になるが。
最新リポジトリURLの取得
git clone
するときリポジトリのURLが必要。このとき最後に更新したリポジトリのURLがほしい。私はいつも次のようなワークフローを手で実行している。
- ラズパイを起動する
- ブラウザを起動する
- GitHubサイトを閲覧する(ログイン済み)
- ログインユーザのリポジトリ一覧を閲覧する
- リストの最上位にあるリポジトリを探す(更新日時順にソートされているため)
- 該当リポジトリを右クリックする
- 右クリックメニューからリンクのアドレスをコピーする
- ターミナルを起動する(カレントディレクトリはRAMディスクである)
git clone
,CTRL
+SHIFT
+V
,ENTER
を入力する- 最終更新リポジトリをダウンロードする
これが面倒くさい。ワンタッチで実行したい。
リポジトリの閲覧
さらに言えばリポジトリ閲覧まで自動化したい。リポジトリの実態はディレクトリやファイルである。それらを閲覧・編集するにはファイラやテキストエディタを使う。私は端末用ファイラranger
とエディタvim
を使っている。そこで、最新リポジトリをダウンロードしたらそのルートディレクトリをranger
で参照して表示するところまで自動化したい。
案
次のようなツールを使えば自動化できそう。
たとえばCtrl
+G
で最新リポジトリをダウンロードし、端末用ファイラranger
でそのリポジトリ内を参照するところまで自動化するとか。
ただ、肝心のリポジトリ取得に関してはどうにかして自作せねばならない。
課題
- 最新リポジトリURLの取得
最新リポジトリ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 : |
1 〜100 |
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のほうがセキュリティが高いのでオススメ。TOKEN
はGitHubのサイトで作成する。ログインしてSetting
→Developer settings
→Personal accesso tokens
→Generate new token
で作成する。期限なしで使い回せば楽。毎回パスワードを手入力するよりセキュリティ性と自動化のバランスがとれていい感じ。なのにデフォルトでは30日期限つきで作成しようとするので注意。
話を戻す。これを参考にして最新リポジトリ取得するコマンドを作った。
実行ファイルをclone
という名前のシンボリックリンクで参照させる。それを環境変数PATH
に通す。すると以下コマンドで実行できるようになる。これ一発で最後にpushしたリポジトリを取得できる。楽ちん!
clone
指定した数だけリポジトリを取得することも可能。おなじくpushした日時の降順。なので最近いじったリポジトリをいくつかクローンしたいときはこいつで一発。名前やURLを覚えていなくてもOK。たすかるわ〜。
clone 2
あとはこれをsystemd
やOpenBox
で連携すればよい。でもこれで満足した。大部分はショートカットできたので良しとする。とくに遅いブラウザを起動せずに済むのは嬉しい。
所感
つまらない作業を自動化できたとき、とてもスッキリいい気分になる。プログラミングの醍醐味。面倒くさがりなネガティブパワーをコーディング力に変える。よき。
でもワンタッチじゃなかった。ワンコマンドだった。
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux