題名通りのシェルスクリプトを書いてみました。
理由としては二つあります。
- シェルスクリプトを全然書いた事が無いので勉強したかったから。
- githubの草を自動で生やしたいから。(ごめんなさい)
※githubの草を生やす方法は下記をご参照ください(必ずしもcommit&pushすれば草が生えるというわけではありません)
今回書いたコードを下記に載せます。(泥臭いコードになっていますがそれは今後の課題としておきます)
筆者の環境
OS : macOS Big Sur 11.6
bash : 3.2.57(記事を書いてる途中でかなり古い事に気がつきました。すみません...)
#!/usr/bin/env bash
set -e
function push_commit (){
for i in `seq $1`;do
echo 'hoge' >> ./hoge.txt
git add ./hoge.txt
git commit -m "$(gdate +"%Y-%m-%d"):$i 回目の自動プッシュ"
git push
done
}
function calc_push_date (){
local commit_datetime=$1; local result
commit_datetime=`echo ${commit_datetime%Z}`
commit_datetime=`echo ${commit_datetime//T/ }`
result=$(gdate -d "9 hours $commit_datetime" +"%Y-%m-%d")
echo $result
}
declare -i today_push_count=0
readonly PUSH_QUOTA_COUNT=5
json=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/users/$GITHUB_USER_NAME/events | jq)
len=$(echo $json | jq length)
for i in $( seq 0 $(($len - 1)) ); do
row=`echo ${json} | jq .[${i}]`
event_type=`echo ${row} | jq -r .type`
if [ ${event_type} = "PushEvent" ]; then
created_datetime=`echo ${row} | jq -r .created_at`
push_date=`calc_push_date $created_datetime`
today=$(gdate +"%Y-%m-%d")
if [ "$push_date" = "$today" ]; then
today_push_count=$((today_push_count+1))
fi
fi
done
additional_push_count=$((PUSH_QUOTA_COUNT-today_push_count))
if [ $additional_push_count -gt 0 ]; then
push_commit $additional_push_count
else
echo "今日は既に$PUSH_QUOTA_COUNT 回のプッシュをしています"
fi
以降自分用のメモとして書いておきたいことをずらずらと書いていきます。
jsonを扱う時はjqコマンドで色々できて凄く便利
今までjqコマンドはcurlコマンドで取得したjsonを見やすくする為にcurl *url* | jq
くらいでしか使った事ないですが色んな事ができて便利です。
macOSのdateコマンドに--dateオプションが無い
dateコマンドでググるとよく出てくるdate -d "1 days"
みたいなオプションが最初使えませんでした。
理由としては上記のようなオプションで書くにはGNU版のコマンドではなくてはいけないらしいのですが、MacにはBSD版のコマンドがインストールされているため使えないかららしいです。
なので下記を参考にHomebrewからGNU版のコマンド達をインストールしました
リポジトリを跨いで全てのコミットを取得するにはActivityからどんどん辿っていけば取得できそう
今回はpushした数・日時を取得しましたがは本当はcommitの数・作成した日時を取得したいので、下記の流れでコミットの情報が取れそうです。
1.ユーザーのアクティビティを取得
2.取得したレスポンスのtypeパラメータのPushEventに各コミットのurlがあるのでそれを取得
3.作成日時を取得
もっと上手なやり方があったら是非ご指摘ください。
今後の改善点
- コードを綺麗に改善する
- pushではなくてcommitを集計する
- 初期化のコードとかも可能なら書く(現状だとまずはリモートリポジトリを作ってそれからoriginのURLを設定して...みたいにセットアップする必要があるので)