diff --git a/.github/workflows/interview-question-submission.yml b/.github/workflows/interview-question-submission.yml index fdcde5f..b66440e 100644 --- a/.github/workflows/interview-question-submission.yml +++ b/.github/workflows/interview-question-submission.yml @@ -82,6 +82,7 @@ jobs: PR_TITLE: ${{ steps.import.outputs.pr_title }} ISSUE_NUMBER: ${{ steps.import.outputs.issue_number }} SUBMITTER: ${{ steps.import.outputs.submitter }} + SUBMITTER_ID: ${{ github.event.issue.user.id }} run: | if git ls-remote --exit-code --heads origin "$BRANCH" >/dev/null; then existing_pr="$(gh pr list --head "$BRANCH" --state open --json number --jq '.[0].number // empty')" @@ -96,7 +97,9 @@ jobs: git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git switch -c "$BRANCH" - git commit -m "面经收录:Issue #$ISSUE_NUMBER" + git commit \ + -m "面经收录:Issue #$ISSUE_NUMBER" \ + -m "Co-authored-by: $SUBMITTER <${SUBMITTER_ID}+${SUBMITTER}@users.noreply.github.com>" git push -u origin "$BRANCH" pr_url="$(gh pr create \ diff --git a/scripts/generate_contributors.py b/scripts/generate_contributors.py index a74033f..d7d2e73 100644 --- a/scripts/generate_contributors.py +++ b/scripts/generate_contributors.py @@ -3,10 +3,15 @@ import json import os import sys +import re import urllib.request API_ROOT = "https://api.github.com" +CO_AUTHORED_BY_RE = re.compile( + r"^Co-authored-by:\s*.+?\s*<(?P[0-9]+)\+(?P[a-zA-Z0-9-]+)@users\.noreply\.github\.com>\s*$", + re.MULTILINE, +) def request_json(url, token=None): @@ -57,17 +62,27 @@ def build_contributors(prs): for pr in prs: user = pr["user"] login = user["login"] - current = grouped.setdefault( - login, - { + user_id = user.get("id") + + if login == "github-actions[bot]": + co_authors = CO_AUTHORED_BY_RE.search(pr.get("body") or "") + if co_authors: + user_id = co_authors.group("id") + login = co_authors.group("login") + + if login == "github-actions[bot]": + continue + + if login not in grouped: + grouped[login] = { "login": login, - "html_url": user["html_url"], - "avatar_url": user["avatar_url"], + "html_url": user["html_url"] if user_id == user.get("id") else f"https://github.com/{login}", + "avatar_url": user["avatar_url"] if user_id == user.get("id") else f"https://avatars.githubusercontent.com/u/{user_id}?v=4", "name": None, "merged_prs": 0, - }, - ) - current["merged_prs"] += 1 + } + + grouped[login]["merged_prs"] += 1 return sorted(grouped.values(), key=lambda item: (-item["merged_prs"], item["login"].lower()))