You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.5 KiB
77 lines
2.5 KiB
2 years ago
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
from collections import defaultdict
|
||
|
import operator
|
||
|
import os
|
||
|
import re
|
||
|
|
||
|
|
||
|
def prompt_for_user():
|
||
|
while True:
|
||
|
try:
|
||
|
user_input = input("\nName or email (case insensitive): ")
|
||
|
except (KeyboardInterrupt, EOFError):
|
||
|
return None
|
||
|
clean_input = user_input.strip().lower()
|
||
|
if clean_input != "":
|
||
|
return clean_input
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
print("Utility to help generate 'Reviewers' string for Pull Requests. Use Ctrl+D or Ctrl+C to exit")
|
||
|
|
||
|
stream = os.popen("git log | grep Reviewers")
|
||
|
lines = stream.readlines()
|
||
|
all_reviewers = defaultdict(int)
|
||
|
for line in lines:
|
||
|
stripped = line.strip().lstrip("Reviewers: ")
|
||
|
reviewers = stripped.split(",")
|
||
|
for reviewer in reviewers:
|
||
|
all_reviewers[reviewer.strip()] += 1
|
||
|
parsed_reviewers = []
|
||
|
|
||
|
for item in all_reviewers.items():
|
||
|
m = re.match("(?P<name>.*)\s<(?P<email>.*)>", item[0])
|
||
|
if m is not None and len(m.groups()) == 2:
|
||
|
if item[1] > 2:
|
||
|
parsed_reviewers.append((m.group("name"), m.group("email"), item[1]))
|
||
|
|
||
|
selected_reviewers = []
|
||
|
while True:
|
||
|
if len(selected_reviewers) != 0:
|
||
|
print(f"Reviewers so far: {selected_reviewers}")
|
||
|
user_input = prompt_for_user()
|
||
|
if user_input is None:
|
||
|
break
|
||
|
candidates = []
|
||
|
for reviewer, email, count in parsed_reviewers:
|
||
|
if reviewer.lower().startswith(user_input) or email.lower().startswith(user_input):
|
||
|
candidates.append((reviewer, email, count))
|
||
|
if len(candidates) == 10:
|
||
|
break
|
||
|
if len(candidates) == 0:
|
||
|
continue
|
||
|
|
||
|
print("\nPossible matches (in order of most recent):")
|
||
|
for i, candidate in zip(range(10), candidates):
|
||
|
print(f"[{i+1}] {candidate[0]} {candidate[1]} ({candidate[2]})")
|
||
|
|
||
|
try:
|
||
|
selection_input = input("\nMake a selection: ")
|
||
|
selected_candidate = candidates[int(selection_input)-1]
|
||
|
selected_reviewers.append(selected_candidate)
|
||
|
except (EOFError, KeyboardInterrupt):
|
||
|
break
|
||
|
except (ValueError, IndexError):
|
||
|
print("Invalid selection")
|
||
|
continue
|
||
|
|
||
|
if len(selected_reviewers) != 0:
|
||
|
out = "\n\nReviewers: "
|
||
|
out += ", ".join([f"{name} <{email}>" for name, email, _ in selected_reviewers])
|
||
|
out += "\n"
|
||
|
print(out)
|
||
|
|
||
|
|