今日変更したプルリクエストを出力
今日変更したプルリクエストを出力
背景
今日変更したプルリクエストを shell 上で確認したい。
仕様
- 対象のプルリクエスト
06:00より前の時間- 前日の 
06:00~ 今日の05:59のプルリクエストを対象とする 
- 前日の 
 06:00以降- 今日の 
06:00~ 現在時刻 のプルリクエストを対象とする 
- 今日の 
 
 ## DONEには、マージしたプルリクエストを出力## WIPには、マージしていない、今日更新したプルリクエストを出力
出力
$ tps
## DONE
- [username/dotfiles #73 tps の追加](https://github.com/username/dotfiles/pull/73)
- [username/hogehogehoge #3 hogehoge](https://github.com/username/hogehogehoge/pull/3)
## WIP
- None
コード
dotfiles/zsh/.my_functions/.tps.zshrc
# 今日の GitHub 上での作業内容
function tps() {
  if [ ! -e $DOTFILES_PATH/zsh/.my_functions/.tps.txt ]; then
    echo "$DOTFILES_PATH/zsh/.my_functions/.tps.txt is required"
    return 1
  fi
  echo -n "## DONE\n\n$(_pr_list 'done')\n\n## WIP \n\n$(_pr_list 'wip')\n"
}
# プルリクエストを取得する
# * $ _pr_list done => 前日の `06:00` ~ 今日の `05:59` のプルリクエストを取得
# * $ _pr_list wip => 今日の `06:00` ~ 現在時刻 のプルリクエストを取得
function _pr_list() {
  if [ $# -ne 1 ]; then
    # 引数がないときは、終了する
    echo "Requires an argument"
    return 1
  elif [ ! -e $DOTFILES_PATH/zsh/.my_functions/.tps.txt ]; then
    # .tps.txt がないときは、終了する
    echo "$DOTFILES_PATH/zsh/.my_functions/.tps.txt is required"
    return 1
  fi
  local search_syntax
  local updated_today="$(date '+updated:>=%Y-%m-%dT06:00:00+09:00' --date '6 hour ago')"
  if [[ $1 == 'done' ]]; then
    search_syntax="is:merged $updated_today"
  elif [[ $1 == 'wip' ]]; then
    search_syntax="is:unmerged $updated_today"
  else
    echo "Unknown argument: \"$1\"\n Available argument: done, wip"
    return 1
  fi
  local result=''
  local json_fields='headRepositoryOwner,headRepository,title,url,number'
  local jq_expression='.[] | .result = "- [" + .headRepositoryOwner.login + "/" +  .headRepository.name + " #" + (.number|tostring) + " " + .title + "](" + .url + ")" | .result'
  cat $DOTFILES_PATH/zsh/.my_functions/.tps.txt | while read line
  do
    local pr_list="$(gh pr list -R $line --assignee @me --search $search_syntax --json $json_fields --jq $jq_expression)"
    if [ -n "$pr_list" ]; then
      result+="$pr_list\n"
    fi
  done
  # なにもないとき
  if [[ $result == '' ]]; then
    result+="- None"
  fi
  echo -n $result
}
dotfiles/zsh/.my_functions/.tps.txt
出力の対象にしたいディレクトリを指定。
username/dotfiles
username/hoge
username/hogehogehoge
使い方
# gh をインストール
$ brew install gh
$ pwd
/Users/username/dotfiles
# zsh/.my_functions/.tps.zshrc の読み込み
$ source zsh/.my_functions/.tps.zshrc
$ tps
## DONE
- [username/dotfiles #73 tps の追加](https://github.com/username/dotfiles/pull/73)
- [username/hogehogehoge #3 hogehoge](https://github.com/username/hogehogehoge/pull/3)
## WIP
- None
学び
a = b だとエラーになるので、a=b と書く
ファイルの中身を出力して、1 行ずつ処理
空文字判定
時間指定
- zsh date unix time (epoch time) を自由自在に出力する | typememo.jp
 --date '6 hour ago'6 時間前- date コマンドの使い方: UNIX/Linux の部屋
 
$ gh pr list
例: closed のプルリクエストを検索
$ gh pr list --search "is:closed"
Showing 2 of 2 pull requests in username/dotfiles that match your search
#2  hogehoge した                 feature/hogehoge
#1  hoge した                     feature/hoge
使ったオプション
--asignee @me- 自分がアサインされているプルリクエストのみ
 
--searchis:merged: マージされているis:unmerged: マージされていないupdated:>=???: ???以降に更新
--json- 出力したいデータを選択する
 
--jq- 必ず 
--jsonと一緒に使う --jsonで出力したものをjqで加工するイメージ
- 必ず 
 
