def prs_by_email(start_ref, end_ref): """ Returns an ordered dictionary of {email: pr_list} Email is the email address of the person who merged the pull request The dictionary is alphabetically ordered by email address The pull request list is ordered by merge date """ username, token = get_github_creds() headers = { "Authorization": "token {}".format(token), "User-Agent": "edx-release", } # `emails` maps from other_emails to primary email, based on people.yaml. emails = {} people_resp = requests.get(PEOPLE_YAML, headers=headers) people_resp.raise_for_status() people = yaml.safe_load(people_resp.text) for person in people.itervalues(): if 'other_emails' in person: for other_email in person['other_emails']: emails[other_email] = person['email'] unordered_data = collections.defaultdict(set) for pr_num in get_merged_prs(start_ref, end_ref): ref = "refs/remotes/edx/pr/{num}".format(num=pr_num) branch = SymbolicReference(repo, ref) try: merge = get_merge_commit(branch.commit, end_ref) except DoesNotExist: pass # this commit will be included in the commits_without_prs table else: email = emails.get(merge.author.email, merge.author.email) if email.endswith("@users.noreply.github.com"): # A bogus GitHub address, look up their GitHub name in # people.yaml username = email.split("@")[0] try: email = people[username]['email'] except KeyError: pass unordered_data[email].add((pr_num, merge)) ordered_data = collections.OrderedDict() for email in sorted(unordered_data.keys()): ordered = sorted(unordered_data[email], key=lambda pair: pair[1].authored_date) ordered_data[email] = [num for num, merge in ordered] return ordered_data
def prs_by_email(start_ref, end_ref): """ Returns an ordered dictionary of {email: pr_list} Email is the email address of the person who merged the pull request The dictionary is alphabetically ordered by email address The pull request list is ordered by merge date """ # `emails` maps from other_emails to primary email, based on people.yaml. emails = {} try: people_resp = requests.get(PEOPLE_YAML) people_resp.raise_for_status() people = yaml.safe_load(people_resp.text) except requests.exceptions.RequestException as e: # Hmm, muddle through without canonicalized emails... message = ( "Warning: could not fetch people.yaml: {message}".format(message=e.message) ) print(colorize("red", message), file=sys.stderr) else: for person in people.itervalues(): if 'other_emails' in person: for other_email in person['other_emails']: emails[other_email] = person['email'] unordered_data = collections.defaultdict(set) for pr_num in get_merged_prs(start_ref, end_ref): ref = "refs/remotes/edx/pr/{num}".format(num=pr_num) branch = SymbolicReference(repo, ref) try: merge = get_merge_commit(branch.commit, end_ref) except DoesNotExist: pass # this commit will be included in the commits_without_prs table else: email = emails.get(merge.author.email, merge.author.email) unordered_data[email].add((pr_num, merge)) ordered_data = collections.OrderedDict() for email in sorted(unordered_data.keys()): ordered = sorted(unordered_data[email], key=lambda pair: pair[1].authored_date) ordered_data[email] = [num for num, merge in ordered] return ordered_data
def prs_by_email(start_ref, end_ref): """ Returns an ordered dictionary of {email: pr_list} Email is the email address of the person who merged the pull request The dictionary is alphabetically ordered by email address The pull request list is ordered by merge date """ unordered_data = collections.defaultdict(set) for pr_num in get_merged_prs(start_ref, end_ref): ref = "refs/remotes/edx/pr/{num}".format(num=pr_num) branch = SymbolicReference(repo, ref) try: merge = get_merge_commit(branch.commit, end_ref) except DoesNotExist: pass # this commit will be included in the commits_without_prs table else: unordered_data[merge.author.email].add((pr_num, merge)) ordered_data = collections.OrderedDict() for email in sorted(unordered_data.keys()): ordered = sorted(unordered_data[email], key=lambda pair: pair[1].authored_date) ordered_data[email] = [num for num, merge in ordered] return ordered_data