diff --git a/Library/Homebrew/.rubocop.yml b/Library/Homebrew/.rubocop.yml index 799d1baf79..b5cdb52bf7 100644 --- a/Library/Homebrew/.rubocop.yml +++ b/Library/Homebrew/.rubocop.yml @@ -36,8 +36,9 @@ Metrics/PerceivedComplexity: Max: 90 Metrics/MethodLength: Max: 260 +# TODO: Reduce to 600 after refactoring utils/github Metrics/ModuleLength: - Max: 650 + Max: 620 Exclude: - "test/**/*" diff --git a/Library/Homebrew/dev-cmd/update-maintainers.rb b/Library/Homebrew/dev-cmd/update-maintainers.rb index 2701fc800b..1ce882b7b5 100644 --- a/Library/Homebrew/dev-cmd/update-maintainers.rb +++ b/Library/Homebrew/dev-cmd/update-maintainers.rb @@ -26,29 +26,32 @@ module Homebrew # We assume that only public members wish to be included in the README public_members = GitHub.public_member_usernames("Homebrew") - plc = GitHub.members_by_team("Homebrew", "plc") - tsc = GitHub.members_by_team("Homebrew", "tsc") - linux = GitHub.members_by_team("Homebrew", "linux") - other = GitHub.members_by_team("Homebrew", "maintainers") - other.except!(*[plc, tsc, linux].map(&:keys).flatten.uniq) + members = { + plc: GitHub.members_by_team("Homebrew", "plc"), + tsc: GitHub.members_by_team("Homebrew", "tsc"), + linux: GitHub.members_by_team("Homebrew", "linux"), + } + members[:other] = GitHub.members_by_team("Homebrew", "maintainers") + .except(*members.values.map(&:keys).flatten.uniq) - sentences = [plc, tsc, linux, other].map do |h| - h.slice!(*public_members) - h.each { |k, v| h[k] = "[#{v}](https://github.com/#{k})" } - h.values.sort.to_sentence + sentences = {} + members.each do |group, hash| + hash.slice!(*public_members) + hash.each { |login, name| hash[login] = "[#{name}](https://github.com/#{login})" } + sentences[group] = hash.values.sort.to_sentence end readme = HOMEBREW_REPOSITORY/"README.md" content = readme.read content.gsub!(/(Homebrew's \[Project Leadership Committee.*) is .*\./, - "\\1 is #{sentences[0]}.") + "\\1 is #{sentences[:plc]}.") content.gsub!(/(Homebrew's \[Technical Steering Committee.*) is .*\./, - "\\1 is #{sentences[1]}.") + "\\1 is #{sentences[:tsc]}.") content.gsub!(/(Homebrew's Linux maintainers are).*\./, - "\\1 #{sentences[2]}.") + "\\1 #{sentences[:linux]}.") content.gsub!(/(Homebrew's other current maintainers are).*\./, - "\\1 #{sentences[3]}.") + "\\1 #{sentences[:other]}.") File.open(readme, "w+") { |f| f.write(content) } diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index feec12c973..a18b146200 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -577,7 +577,7 @@ module GitHub members = [] (1..API_MAX_PAGES).each do |page| - result = open_api(url + "&page=#{page}").map { |m| m["login"] } + result = open_api("#{url}&page=#{page}").map { |member| member["login"] } members.concat(result) return members if result.length < per_page @@ -587,6 +587,11 @@ module GitHub def members_by_team(org, team) query = <<~EOS { organization(login: "#{org}") { + teams(first: 100) { + nodes { + ... on Team { name } + } + } team(slug: "#{team}") { members(first: 100) { nodes { @@ -598,7 +603,14 @@ module GitHub } EOS result = open_graphql(query, scopes: ["read:org", "user"]) - result["organization"]["team"]["members"]["nodes"].map { |m| [m["login"], m["name"]] }.to_h + + if result["organization"]["teams"]["nodes"].blank? + raise Error, + "Your token needs the 'read:org' scope to access this API" + end + raise Error, "The team #{org}/#{team} does not exist" if result["organization"]["team"].blank? + + result["organization"]["team"]["members"]["nodes"].map { |member| [member["login"], member["name"]] }.to_h end def sponsors_by_tier(user)