LoginSignup
3
0

More than 1 year has passed since last update.

その日にgithubにpushした数が規定の回数に届かなかったら自動でcommit&pushして草を生やしてくれるシェルスクリプト

Last updated at Posted at 2021-12-05

題名通りのシェルスクリプトを書いてみました。
理由としては二つあります。

  1. シェルスクリプトを全然書いた事が無いので勉強したかったから。
  2. 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を設定して...みたいにセットアップする必要があるので)

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0