From 6026c7c74d18a110d2bafe303a1a83534ff2d832 Mon Sep 17 00:00:00 2001 From: nandahkrishna Date: Thu, 4 Feb 2021 17:00:50 +0530 Subject: [PATCH] `brew update-maintainers`: dev-cmd to update maintainers in README --- Library/Homebrew/.rubocop.yml | 2 +- .../Homebrew/dev-cmd/update-maintainers.rb | 64 +++++++++++++++++++ Library/Homebrew/utils/github.rb | 29 +++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 Library/Homebrew/dev-cmd/update-maintainers.rb diff --git a/Library/Homebrew/.rubocop.yml b/Library/Homebrew/.rubocop.yml index 6a49053b64..799d1baf79 100644 --- a/Library/Homebrew/.rubocop.yml +++ b/Library/Homebrew/.rubocop.yml @@ -37,7 +37,7 @@ Metrics/PerceivedComplexity: Metrics/MethodLength: Max: 260 Metrics/ModuleLength: - Max: 600 + Max: 650 Exclude: - "test/**/*" diff --git a/Library/Homebrew/dev-cmd/update-maintainers.rb b/Library/Homebrew/dev-cmd/update-maintainers.rb new file mode 100644 index 0000000000..32c690d779 --- /dev/null +++ b/Library/Homebrew/dev-cmd/update-maintainers.rb @@ -0,0 +1,64 @@ +# typed: false +# frozen_string_literal: true + +require "cli/parser" +require "utils/github" + +module Homebrew + extend T::Sig + + module_function + + sig { returns(CLI::Parser) } + def update_maintainers_args + Homebrew::CLI::Parser.new do + description <<~EOS + Update the list of maintainers in the `Homebrew/brew` README. + EOS + + named_args :none + end + end + + def update_maintainers + update_maintainers_args.parse + + # 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) + + 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 + end + + readme = HOMEBREW_REPOSITORY/"README.md" + + content = readme.read + content.gsub!(/(Homebrew's \[Project Leadership Committee.*) is .*\./, + "\\1 is #{sentences[0]}.") + content.gsub!(/(Homebrew's \[Technical Steering Committee.*) is .*\./, + "\\1 is #{sentences[1]}.") + content.gsub!(%r{(Homebrew/brew's Linux maintainers are).*\.}, + "\\1 #{sentences[2]}.") + content.gsub!(/(Homebrew's other current maintainers are).*\./, + "\\1 #{sentences[3]}.") + + File.open(readme, "w+") { |f| f.write(content) } + + diff = system_command "git", args: [ + "-C", HOMEBREW_REPOSITORY, "diff", "--exit-code", "README.md" + ] + if diff.status.success? + puts "No changes to list of maintainers." + else + puts "List of maintainers updated in README." + end + end +end diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 293ae71d1d..feec12c973 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -572,6 +572,35 @@ module GitHub artifact.first["archive_download_url"] end + def public_member_usernames(org, per_page: 100) + url = "#{API_URL}/orgs/#{org}/public_members?per_page=#{per_page}" + members = [] + + (1..API_MAX_PAGES).each do |page| + result = open_api(url + "&page=#{page}").map { |m| m["login"] } + members.concat(result) + + return members if result.length < per_page + end + end + + def members_by_team(org, team) + query = <<~EOS + { organization(login: "#{org}") { + team(slug: "#{team}") { + members(first: 100) { + nodes { + ... on User { login name } + } + } + } + } + } + EOS + result = open_graphql(query, scopes: ["read:org", "user"]) + result["organization"]["team"]["members"]["nodes"].map { |m| [m["login"], m["name"]] }.to_h + end + def sponsors_by_tier(user) query = <<~EOS { organization(login: "#{user}") {