From 90309e5f42a9c60c6040d9d4ee0401fa413d1c7e Mon Sep 17 00:00:00 2001 From: Jonathan Chang Date: Sat, 27 Jun 2020 22:01:51 +1000 Subject: [PATCH] github: fetch approved reviews for a pull request --- Library/Homebrew/test/utils/github_spec.rb | 7 ++++ Library/Homebrew/utils/github.rb | 46 ++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/Library/Homebrew/test/utils/github_spec.rb b/Library/Homebrew/test/utils/github_spec.rb index 939ac6de5b..354c2585c4 100644 --- a/Library/Homebrew/test/utils/github_spec.rb +++ b/Library/Homebrew/test/utils/github_spec.rb @@ -42,6 +42,13 @@ describe GitHub do end end + describe "::approved_reviews", :needs_network do + it "can get reviews for a pull request" do + reviews = subject.approved_reviews("Homebrew", "homebrew-core", 1, commit: "deadbeef") + expect(reviews).to eq([]) + end + end + describe "::get_artifact_url", :needs_network do it "fails to find a nonexistant workflow" do expect { diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 556089c091..eae33a8eaf 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -394,6 +394,52 @@ module GitHub open_api(uri) { |json| json.fetch("items", []) } end + def approved_reviews(user, repo, pr, commit: nil) + url = "https://api.github.com/graphql" + data = { + query: <<~EOS, + { repository(name: "#{repo}", owner: "#{user}") { + pullRequest(number: #{pr}) { + reviews(states: APPROVED, first: 100) { + nodes { + author { + ... on User { email login name databaseId } + ... on Organization { email login name databaseId } + } + authorAssociation + commit { oid } + } + } + } + } + } + EOS + } + result = open_api(url, data: data, request_method: "POST") + raise Error, result["errors"] if result["errors"].present? + + reviews = result["data"]["repository"]["pullRequest"]["reviews"]["nodes"] + + reviews.map do |r| + next if commit.present? && commit != r["commit"]["oid"] + next unless %w[MEMBER OWNER].include? r["authorAssociation"] + + email = if r["author"]["email"].empty? + "#{r["author"]["databaseId"]}+#{r["author"]["login"]}@users.noreply.github.com" + else + r["author"]["email"] + end + + name = r["author"]["name"] || r["author"]["login"] + + { + "email" => email, + "name" => name, + "login" => r["author"]["login"], + } + end.compact + end + def dispatch_event(user, repo, event, **payload) url = "#{API_URL}/repos/#{user}/#{repo}/dispatches" open_api(url, data: { event_type: event, client_payload: payload },