#!/usr/bin/env python3
import subprocess
import re
import sys
# Regular expression to extract email addresses
email_pattern = re.compile(r'<(.+?)>')
# Function to check if the email belongs to the company
def is_googler_email(email):
return '@chromium.org' in email or '@google.com' in email
# Function to process the logs and count reviewers and authors
def process_logs(since_date):
# Start a subprocess to stream the git log output
proc = subprocess.Popen(['git', 'log', '--since={}'.format(since_date)],
stdout=subprocess.PIPE,
text=True)
# Variables to keep track of the current commit being processed
current_commit_hash = None
author_email = None
contributors_count = 0
googler_contributors_count = 0
rubber_stamp = False
owners_override = False
# Process each line from the git log output
for line in proc.stdout:
stripped_line = line.strip()
if line.startswith('commit '):
# If we're starting a new commit, output the data for the previous commit
if current_commit_hash is not None:
print(
f"{current_commit_hash},{author_email},{contributors_count},"
f"{googler_contributors_count},{rubber_stamp},{owners_override}"
)
# Reset counters for the new commit
current_commit_hash = stripped_line.split()[1]
author_email = None
contributors_count = 0
googler_contributors_count = 0
rubber_stamp = False
owners_override = False
elif stripped_line.startswith('Author:') or stripped_line.startswith(
'Reviewed-by:'):
contributors_count += 1
match = email_pattern.search(line)
if match:
email = match.group(1)
if stripped_line.startswith('Author:'):
author_email = email
if is_googler_email(email):
googler_contributors_count += 1
elif stripped_line.startswith('Bot-Commit: Rubber Stamper'):
rubber_stamp = True
elif stripped_line.startswith('Owners-Override:'):
rubber_stamp = True
# Don't forget to output the last commit
if current_commit_hash is not None:
print(f"{current_commit_hash},{author_email},{contributors_count},"
f"{googler_contributors_count},{rubber_stamp},{owners_override}")
# Close the subprocess
proc.stdout.close()
proc.wait()
# Main function
def main():
if len(sys.argv) != 2:
print("Usage: reviewer-counts.py <since_date>")
sys.exit(1)
since_date = sys.argv[1]
print("Commit Hash,Author,Contributors,Google Contributors,Rubber Stamp,"
"Owners Override")
process_logs(since_date)
if __name__ == "__main__":
main()