Merge pull request #14722 from issyl0/contributions-all-maintainers-sentence
dev-cmd/contributions: Stats for all maintainers
This commit is contained in:
commit
b4e9f33c62
@ -338,6 +338,9 @@ module Homebrew
|
||||
|
||||
sig { returns(T::Boolean) }
|
||||
def csv?; end
|
||||
|
||||
sig { returns(T.nilable(String)) }
|
||||
def user; end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -19,11 +19,9 @@ module Homebrew
|
||||
sig { returns(CLI::Parser) }
|
||||
def contributions_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner "`contributions` <email|username> [<--repositories>`=`] [<--csv>]"
|
||||
usage_banner "`contributions` [--user=<email|username>] [<--repositories>`=`] [<--csv>]"
|
||||
description <<~EOS
|
||||
Contributions to Homebrew repos for a user.
|
||||
|
||||
The first argument is a GitHub username (e.g. "BrewTestBot") or an email address (e.g. "brewtestbot@brew.sh").
|
||||
Contributions to Homebrew repos.
|
||||
EOS
|
||||
|
||||
comma_array "--repositories",
|
||||
@ -37,10 +35,11 @@ module Homebrew
|
||||
flag "--to=",
|
||||
description: "Date (ISO-8601 format) to stop searching contributions."
|
||||
|
||||
flag "--user=",
|
||||
description: "A GitHub username or email address of a specific person to find contribution data for."
|
||||
|
||||
switch "--csv",
|
||||
description: "Print a CSV of a user's contributions across repositories over the time period."
|
||||
|
||||
named_args number: 1
|
||||
end
|
||||
end
|
||||
|
||||
@ -59,33 +58,26 @@ module Homebrew
|
||||
args.repositories
|
||||
end
|
||||
|
||||
repos.each do |repo|
|
||||
if SUPPORTED_REPOS.exclude?(repo)
|
||||
return ofail "Unsupported repository: #{repo}. Try one of #{SUPPORTED_REPOS.join(", ")}."
|
||||
end
|
||||
return ofail "CSVs not yet supported for the full list of maintainers at once." if args.csv? && args.user.nil?
|
||||
|
||||
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.install
|
||||
end
|
||||
|
||||
repo_full_name = if repo == "brew"
|
||||
"homebrew/brew"
|
||||
else
|
||||
tap.full_name
|
||||
end
|
||||
|
||||
results[repo] = {
|
||||
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),
|
||||
}
|
||||
maintainers = GitHub.members_by_team("Homebrew", "maintainers")
|
||||
maintainers.each do |username, _|
|
||||
puts "Determining contributions for #{username}..." if args.verbose?
|
||||
# TODO: Using the GitHub username to scan the `git log` undercounts some
|
||||
# contributions as people might not always have configured their Git
|
||||
# committer details to match the ones on GitHub.
|
||||
# TODO: Switch to using the GitHub APIs instead of `git log` if
|
||||
# they ever support trailers.
|
||||
results[username] = scan_repositories(repos, username, args)
|
||||
puts "#{username} contributed #{total(results[username])} times #{time_period(args)}."
|
||||
end
|
||||
|
||||
puts "The user #{args.named.first} has made #{total(results)} contributions #{time_period(args)}."
|
||||
puts generate_csv(args.named.first, results) if args.csv?
|
||||
return unless args.user
|
||||
|
||||
user = args.user
|
||||
results[user] = scan_repositories(repos, user, args)
|
||||
puts "#{user} contributed #{total(results[user])} times #{time_period(args)}."
|
||||
puts generate_csv(T.must(user), results[user]) if args.csv?
|
||||
end
|
||||
|
||||
sig { params(repo: String).returns(Pathname) }
|
||||
@ -126,6 +118,37 @@ module Homebrew
|
||||
end
|
||||
end
|
||||
|
||||
def scan_repositories(repos, person, args)
|
||||
data = {}
|
||||
|
||||
repos.each do |repo|
|
||||
if SUPPORTED_REPOS.exclude?(repo)
|
||||
return ofail "Unsupported repository: #{repo}. Try one of #{SUPPORTED_REPOS.join(", ")}."
|
||||
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.install
|
||||
end
|
||||
|
||||
repo_full_name = if repo == "brew"
|
||||
"homebrew/brew"
|
||||
else
|
||||
tap.full_name
|
||||
end
|
||||
|
||||
data[repo] = {
|
||||
commits: GitHub.repo_commit_count_for_user(repo_full_name, person),
|
||||
coauthorships: git_log_trailers_cmd(T.must(repo_path), "Co-authored-by", person, args),
|
||||
signoffs: git_log_trailers_cmd(T.must(repo_path), "Signed-off-by", person, args),
|
||||
}
|
||||
end
|
||||
|
||||
data
|
||||
end
|
||||
|
||||
sig { params(results: Hash).returns(Integer) }
|
||||
def total(results)
|
||||
results
|
||||
@ -134,13 +157,13 @@ module Homebrew
|
||||
.sum(&:sum) # 956
|
||||
end
|
||||
|
||||
sig { params(repo_path: Pathname, trailer: String, args: Homebrew::CLI::Args).returns(Integer) }
|
||||
def git_log_trailers_cmd(repo_path, trailer, args)
|
||||
sig { params(repo_path: Pathname, person: String, trailer: String, args: Homebrew::CLI::Args).returns(Integer) }
|
||||
def git_log_trailers_cmd(repo_path, person, trailer, args)
|
||||
cmd = ["git", "-C", repo_path, "log", "--oneline"]
|
||||
cmd << "--format='%(trailers:key=#{trailer}:)'"
|
||||
cmd << "--before=#{args.to}" if args.to
|
||||
cmd << "--after=#{args.from}" if args.from
|
||||
|
||||
Utils.safe_popen_read(*cmd).lines.count { |l| l.include?(args.named.first) }
|
||||
Utils.safe_popen_read(*cmd).lines.count { |l| l.include?(person) }
|
||||
end
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user