hene

hene.dev

今日変更したプルリクエストを出力

今日変更したプルリクエストを出力

背景

今日変更したプルリクエストを 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 行ずつ処理

空文字判定

時間指定

$ 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
    • 自分がアサインされているプルリクエストのみ
  • --search
    • is:merged: マージされている
    • is:unmerged: マージされていない
    • updated:>=???: ???以降に更新
  • --json
    • 出力したいデータを選択する
  • --jq
    • 必ず --json と一緒に使う
    • --json で出力したものを jq で加工するイメージ

参考

関連記事