0
GitHub CLIのAPIでpagenationした結果を表示する
2022-08-04

ドキュメント

gh api | GitHub CLI

In --paginate mode, all pages of results will sequentially be requested until there are no more pages of results. For GraphQL requests, this requires that the original query accepts an $endCursor: String variable and that it fetches the pageInfo{ hasNextPage, endCursor } set of fields from a collection.

gh api では、レスポンスの量が多い場合は--paginateオプションを渡すことでページングして全件取得した結果を返してくれる

GraphQLの場合

$endCursor変数を用意する

ページングさせたいConnection(edges)に対して次のようにクエリを書く

  • after: $endCursorとcursor指定をする
  • pageInfo.endCursor,pageInfo.hasNextPageを取得する

そして--paginateオプションを渡すと自動で全件取得してくれる…すごい

もともとできたのかー!!!って感じだった

今までシェルスクリプトを使って自前でendCursor取得して…とやってたので無駄だった

ことの発端

コミット履歴をGraphQLのAPIを使用して取ろうとして調べていたがpageInfo.endCursorの値がhash 99というようにスペースが入ってしまっている状態だった

これをそのままCLI経由で渡すとうまくいかなかった

シェルスクリプト側の問題のはずだったが一応回避策などないか調べてたらオプションあるやんけ!となった次第

  • エラー内容
accepts 1 arg(s), received 2

サンプルのGraphQLクエリ

query($endCursor: String, $org: String!, $repo: String!) {
  repository(owner: $org, name: $repo) {
    id
    defaultBranchRef {
      name
      target {
        ... on Commit {
          history(after: $endCursor) {
            pageInfo {
              startCursor
              hasNextPage
              endCursor
            }
            nodes {
              id
              pushedDate
              message
            }
          }
        }
      }
    }
  }
}

結果

{
  "data": {
    "repository": {
      "id": "hogehoge",
      "defaultBranchRef": {
        "name": "master",
        "target": {
          "history": {
            "pageInfo": {
              "startCursor": "hogehoge 0",
              "hasNextPage": true,
              "endCursor": "hogehoge 99"
            },
            "nodes": [
              {
                "id": "C_aaaaa",
                "pushedDate": "2022-08-01T06:44:36Z",
                "message": "Merge branch 'feature/fuga"
              }
              .....
              .....
              .....
              .....
              .....
            ]
          }
        }
      }
    }
  }
}
{
  "data": {
    "repository": {
      .....
      .....
      .....
      .....
      .....
    }
  }
}

jqで展開するとこんな感じ

実際は改行なしでレスポンスのデータをつなげた状態で出力される

0

Profile

swfz
swfz
日々学んだことを残していく
Today I Learned
コード片置き場

Account

RSS

Powered by Pixela
© 2024. swfz