GitHubのDiscussionsをCLIから操作する
備忘メモです。
ZustandのGitHub Discussionsが増えすぎて、何が回答待ちなのか分かりにくくなったので、古いやつをクローズしようと思いました。しかし、600件以上あるので手で処理するのは骨が折れます。そこで、機械的に古いやつをクローズしてしまうことにしました。
ボットはないものかと思いましたが、Discussions自体が新しめの機能なのか見つからず(もしご存じでしたら教えてください)、GitHub CLIを使うことにしました。しかし、GitHub CLIではDiscussioinsはサポート外となっています。 https://github.com/cli/cli/issues/5659
幸い、上記issueにGraphQL APIを使う方法が紹介されています。 https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions を参照したところ、クローズのAPIが載っていませんでしたが、こちらに載ってました。 https://docs.github.com/en/graphql/reference/mutations#closediscussion
最初に、対象のDiscussionsをクエリします。Discussionsオブジェクトでは、すでにクローズ済みかなどの指定ができません。 https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions#repositorydiscussions そこで、汎用的なsearchを使うことにしました。 https://docs.github.com/en/graphql/reference/queries#search
以下、手順です。
最初に用意したgraphqlファイルがこちらです。
fragment discussion on Discussion {
number
id
}
query {
search(
first: 25,
type: DISCUSSION,
query: "repo:pmndrs/zustand is:open is:answered updated:<2022-07-19"
) {
discussionCount
nodes {
...discussion
}
}
}
これを実行して、ひとまずファイルに保存します。
gh api graphql -F query=@search_discussions.graphql > output.json
次に、mutation用のgraphqlファイルを作ります。
(echo 'mutation {' && jq -r '[.data.search.nodes[]]|map("close"+(.number|tostring)+": closeDiscussion(input: { discussionId: \""+.id+"\", reason: RESOLVED }) { discussion { number } }")|.[]' output.json && echo '}') > close_discussions.graphql
出来上がったファイルは次のようになります。
mutation {
close1: closeDiscussion(input: { discussionId: "id1", reason: RESOLVED }) { discussion { number } }
close2: closeDiscussion(input: { discussionId: "id2", reason: RESOLVED }) { discussion { number } }
}
最後に、それを実行します。
gh api graphql -F query=@close_discussions.graphql
以上で、完了。あとは、 query
をいじったり、 reason
をいじったりして微修正しましょう。
Discussion