GitHub GraphQLでRef, Commit, Treeを取得する
上記の記事ではv3 REST APIで新しいブランチを作る方法を紹介しました.本記事ではv4 GraphQL APIを組み合わてAPI問い合わせを削減する方法を紹介します.
新しいブランチを作成/更新する手順は以下になります.
- RefのCommit SHA, Tree SHAを取得する。
- Blobを作成する。
- Treeを作成する。
- Commitを作成する。
- 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回で取得できます.
- https://developer.github.com/v3/repos/#get
- https://developer.github.com/v3/git/refs/#get-a-reference
- https://developer.github.com/v3/git/commits/#get-a-commit
上記で取得した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を利用してリポジトリにファイルをコミットするツールを作っているので,よかったら使ってください.