GeekFactory

int128.hatenablog.com

GitHub GraphQLでRef, Commit, Treeを取得する

int128.hatenablog.com

上記の記事ではv3 REST APIで新しいブランチを作る方法を紹介しました.本記事ではv4 GraphQL APIを組み合わてAPI問い合わせを削減する方法を紹介します.

新しいブランチを作成/更新する手順は以下になります.

  1. RefのCommit SHA, Tree SHAを取得する。
  2. Blobを作成する。
  3. Treeを作成する。
  4. Commitを作成する。
  5. Refを作成/更新する。

このうち,Commit SHAとTree SHAの取得ではGraphQLが使えます.それ以外の更新系はRESTを利用する必要があります.なお,最近になってGraphQLでもRefの作成/更新(createRef, updateRef)が使えるようです.

デフォルトブランチのCommit SHA, Tree SHAを取得する

GitHub GraphQL APIでは,repository オブジェクトの defaultBranchRef フィールドを利用してデフォルトブランチの情報を取得できます. 例えば,以下のクエリを実行するとデフォルトブランチの名前,Commit SHA, Tree SHAを取得できます.

{
  repository(owner: "int128", name: "sandbox") {
    defaultBranchRef {
      name
      target {
        ... on Commit {
          oid
          tree {
            oid
          }
        }
      }
    }
  }
}

以下のような結果が返ってきます.

{
  "data": {
    "repository": {
      "defaultBranchRef": {
        "name": "master",
        "target": {
          "oid": "30170d4178c22a6fa30d9794e4f8c829b18fc6fd",
          "tree": {
            "oid": "2b2b711266cd916c7c1e2233aec80aec6d652a3d"
          }
        }
      }
    }
  }
}

デフォルトブランチの名前は master,Commit SHAは 30170d4178c22a6fa30d9794e4f8c829b18fc6fd,Tree SHAは 2b2b711266cd916c7c1e2233aec80aec6d652a3d であることが分かります.

RESTを利用する場合は,以下のAPIに3回リクエストを送る必要があります.GraphQLでは必要な情報を1回で取得できます.

上記で取得したCommit SHA, Tree SHAを元にブランチを更新する方法は元記事を参照してください.

特定のブランチのCommit SHA, Tree SHAを取得する

特定のブランチの情報を取得したい場合は, ref オブジェクトqualifiedName 属性にブランチ名を渡します. 例えば,以下のクエリを実行すると feature-1 ブランチのCommit SHA, Tree SHAを取得できます.

{
  repository(owner: "int128", name: "sandbox") {
    ref(qualifiedName: "refs/heads/feature-1") {
      target {
        ... on Commit {
          oid
          tree {
            oid
          }
        }
      }
    }
  }
}

まとめ

GraphQL APIを利用すると,リポジトリやブランチなどの情報をまとめて取得できるので実行時間を短縮できます.また, https://developer.github.com/v4/explorer/ で簡単にクエリを試せるので便利です.

宣伝:GitHub APIを利用してリポジトリにファイルをコミットするツールを作っているので,よかったら使ってください.

github.com