chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
"""Assigns the issue based on who created the file mentioned."""
|
||||
|
||||
# pylint: disable=line-too-long,too-many-arguments
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
|
||||
from github import Github
|
||||
|
||||
|
||||
def get_issue_number(event_path: str) -> int:
|
||||
"""Retrieves the issue number from GitHub event data."""
|
||||
# Load event data
|
||||
with open(event_path, encoding="utf-8") as f:
|
||||
event_data = json.load(f)
|
||||
|
||||
# Determine the issue number based on the event
|
||||
if "issue" in event_data:
|
||||
return int(event_data["issue"]["number"])
|
||||
|
||||
raise ValueError("Unable to determine issue number from event data.")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Gets filename mentioned in issue, finds author username in file, assigns issue to user."""
|
||||
# Get GitHub token and repository details
|
||||
repo_name = os.getenv("GITHUB_REPOSITORY", "")
|
||||
token = os.getenv("GITHUB_TOKEN")
|
||||
issue_number = get_issue_number(os.getenv("GITHUB_EVENT_PATH", ""))
|
||||
|
||||
g = Github(token)
|
||||
repo = g.get_repo(repo_name)
|
||||
issue = repo.get_issue(number=issue_number)
|
||||
|
||||
# Regex to find any file with an extension
|
||||
file_match = re.search(r"\b([\w-]+\.[\w]+)\b", issue.body, re.IGNORECASE)
|
||||
|
||||
if not file_match:
|
||||
print("No file found in issue.")
|
||||
return
|
||||
|
||||
file_name = file_match.group(1)
|
||||
result = g.search_code(f"repo:{repo_name} filename:{file_name}")
|
||||
|
||||
if result.totalCount == 0:
|
||||
result = g.search_code(f"repo:{repo_name} {file_name}")
|
||||
if result.totalCount == 0:
|
||||
print(f"No files found for {file_name}")
|
||||
return
|
||||
|
||||
file_path = result[0].path
|
||||
|
||||
# Get the commits for the file
|
||||
commits = repo.get_commits(path=file_path)
|
||||
|
||||
# Try to get the author of the first commit
|
||||
if commits.totalCount > 0:
|
||||
# The last commit in the list is the first commit
|
||||
first_commit = commits[commits.totalCount - 1]
|
||||
if first_commit.author:
|
||||
username = first_commit.author.login
|
||||
print(
|
||||
f"Assigning {username} to Issue #{issue_number} for File {file_path} based on the first commit."
|
||||
)
|
||||
issue.add_to_assignees(username)
|
||||
return
|
||||
|
||||
# If the file is a notebook and the first commit author wasn't found,
|
||||
# check the notebook metadata as a fallback.
|
||||
if file_name.endswith(".ipynb"):
|
||||
print(
|
||||
"Could not determine the first commit author, checking the notebook metadata."
|
||||
)
|
||||
file_content_encoded = repo.get_contents(file_path).content
|
||||
file_content = str(base64.b64decode(file_content_encoded))[:10000]
|
||||
match = re.search(
|
||||
r"Author.+https://github\.com/([^/\)]+)", file_content, flags=re.DOTALL
|
||||
)
|
||||
|
||||
if match:
|
||||
username = match.group(1)
|
||||
print(
|
||||
f"Assigning {username} to Issue #{issue_number} for File {file_path} based on notebook metadata."
|
||||
)
|
||||
issue.add_to_assignees(username)
|
||||
return
|
||||
|
||||
print(f"No User Found for {file_name}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user