diff --git a/Library/Homebrew/dev-cmd/contributions.rb b/Library/Homebrew/dev-cmd/contributions.rb index 639807ce88..993f22bfd4 100755 --- a/Library/Homebrew/dev-cmd/contributions.rb +++ b/Library/Homebrew/dev-cmd/contributions.rb @@ -19,11 +19,11 @@ module Homebrew sig { returns(CLI::Parser) } def contributions_args Homebrew::CLI::Parser.new do - usage_banner "`contributions` [<--repositories>`=`] [<--csv>]" + usage_banner "`contributions` [<--repositories>`=`] [<--csv>]" description <<~EOS Contributions to Homebrew repos for a user. - The first argument is a name (e.g. "BrewTestBot") or an email address (e.g. "brewtestbot@brew.sh"). + The first argument is a GitHub username (e.g. "BrewTestBot") or an email address (e.g. "brewtestbot@brew.sh"). EOS comma_array "--repositories", @@ -65,13 +65,20 @@ module Homebrew end repo_path = find_repo_path_for_repo(repo) + tap = Tap.fetch("homebrew", repo) unless repo_path.exist? opoo "Repository #{repo} not yet tapped! Tapping it now..." - Tap.fetch("homebrew", repo).install + tap.install + end + + repo_full_name = if repo == "brew" + "homebrew/brew" + else + tap.full_name end results[repo] = { - commits: git_log_author_cmd(T.must(repo_path), args), + commits: GitHub.repo_commit_count_for_user(repo_full_name, args.named.first), coauthorships: git_log_trailers_cmd(T.must(repo_path), "Co-authored-by", args), signoffs: git_log_trailers_cmd(T.must(repo_path), "Signed-off-by", args), } @@ -127,15 +134,6 @@ module Homebrew .sum(&:sum) # 956 end - sig { params(repo_path: Pathname, args: Homebrew::CLI::Args).returns(Integer) } - def git_log_author_cmd(repo_path, args) - cmd = ["git", "-C", repo_path, "log", "--oneline", "--author=#{args.named.first}"] - cmd << "--before=#{args.to}" if args.to - cmd << "--after=#{args.from}" if args.from - - Utils.safe_popen_read(*cmd).lines.count - end - sig { params(repo_path: Pathname, trailer: String, args: Homebrew::CLI::Args).returns(Integer) } def git_log_trailers_cmd(repo_path, trailer, args) cmd = ["git", "-C", repo_path, "log", "--oneline"] diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 7222a0b641..e4fc791c4c 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -699,4 +699,14 @@ module GitHub output[/^Status: (200)/, 1] != "200" end + + def repo_commit_count_for_user(nwo, user) + return if Homebrew::EnvConfig.no_github_api? + + commits = 0 + API.paginate_rest("#{API_URL}/repos/#{nwo}/commits", additional_query_params: "author=#{user}") do |result| + commits += result.length + end + commits + end end diff --git a/Library/Homebrew/utils/github/api.rb b/Library/Homebrew/utils/github/api.rb index 610b8ba0a8..2dd8bfe408 100644 --- a/Library/Homebrew/utils/github/api.rb +++ b/Library/Homebrew/utils/github/api.rb @@ -253,9 +253,9 @@ module GitHub end end - def paginate_rest(url, per_page: 100) + def paginate_rest(url, additional_query_params: nil, per_page: 100) (1..API_MAX_PAGES).each do |page| - result = API.open_rest("#{url}?per_page=#{per_page}&page=#{page}") + result = API.open_rest("#{url}?per_page=#{per_page}&page=#{page}&#{additional_query_params}") yield(result, page) end end