Merge pull request #14737 from issyl0/api-commits-for-person
dev-cmd/contributions: Use GitHub APIs for commit author info
This commit is contained in:
commit
93ce211ebd
@ -19,11 +19,11 @@ module Homebrew
|
||||
sig { returns(CLI::Parser) }
|
||||
def contributions_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner "`contributions` <email|name> [<--repositories>`=`] [<--csv>]"
|
||||
usage_banner "`contributions` <email|username> [<--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"]
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user