Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 64 additions & 65 deletions src/mcp_github/github_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,8 @@ async def search_user(self, username: str) -> UserSearchResult:
return user_info

def _filtered_contributions(self, collection: dict[str, Any], key: str, org: str, repo: str):
"""Yield (contribution_node, owner, repo_name) for every contribution under the
given collection key, applying the optional org/repo filters."""
for repo_contrib in collection.get(key, []):
repo_info = repo_contrib["repository"]
owner = repo_info["owner"]["login"]
Expand All @@ -671,7 +673,8 @@ def _filtered_contributions(self, collection: dict[str, Any], key: str, org: str
continue
if repo and repo_name.lower() != repo.lower():
continue
yield repo_contrib, owner, repo_name
for contrib in repo_contrib.get("contributions", {}).get("nodes", []):
yield contrib, owner, repo_name

@_read_only(task=True)
async def get_user_activities(
Expand Down Expand Up @@ -713,87 +716,83 @@ async def get_user_activities(
if ctx:
await ctx.report_progress(progress=0, total=5)
await ctx.info("Fetching commits...")
for repo_contrib, owner, repo_name in self._filtered_contributions(
for contrib, owner, repo_name in self._filtered_contributions(
collection, "commitContributionsByRepository", org, repo
):
for contrib in repo_contrib.get("contributions", {}).get("nodes", []):
if len(commits) >= max_results:
break
commits.append(
{
"repo": repo_name,
"owner": owner,
"commit_count": contrib.get("commitCount", 0),
"url": contrib.get("url", ""),
"date": contrib.get("occurredAt", ""),
}
)
if len(commits) >= max_results:
break
commits.append(
{
"repo": repo_name,
"owner": owner,
"commit_count": contrib.get("commitCount", 0),
"url": contrib.get("url", ""),
"date": contrib.get("occurredAt", ""),
}
)
if ctx:
await ctx.report_progress(progress=1, total=5)
await ctx.info("Fetching pull requests...")
for repo_contrib, owner, repo_name in self._filtered_contributions(
for contrib, owner, repo_name in self._filtered_contributions(
collection, "pullRequestContributionsByRepository", org, repo
):
for contrib in repo_contrib.get("contributions", {}).get("nodes", []):
if len(pull_requests) >= max_results:
break
pr = contrib["pullRequest"]
pull_requests.append(
{
"repo": repo_name,
"owner": owner,
"number": pr["number"],
"title": pr["title"],
"state": pr["state"],
"url": pr["url"],
"created": pr["createdAt"],
"merged": pr.get("merged", False),
}
)
if len(pull_requests) >= max_results:
break
pr = contrib["pullRequest"]
pull_requests.append(
{
"repo": repo_name,
"owner": owner,
"number": pr["number"],
"title": pr["title"],
"state": pr["state"],
"url": pr["url"],
"created": pr["createdAt"],
"merged": pr.get("merged", False),
}
)
if ctx:
await ctx.report_progress(progress=2, total=5)
await ctx.info("Fetching issues...")
for repo_contrib, owner, repo_name in self._filtered_contributions(
for contrib, owner, repo_name in self._filtered_contributions(
collection, "issueContributionsByRepository", org, repo
):
for contrib in repo_contrib.get("contributions", {}).get("nodes", []):
if len(issues) >= max_results:
break
issue = contrib["issue"]
issues.append(
{
"repo": repo_name,
"owner": owner,
"number": issue["number"],
"title": issue["title"],
"state": issue["state"],
"url": issue["url"],
"created": issue["createdAt"],
}
)
if len(issues) >= max_results:
break
issue = contrib["issue"]
issues.append(
{
"repo": repo_name,
"owner": owner,
"number": issue["number"],
"title": issue["title"],
"state": issue["state"],
"url": issue["url"],
"created": issue["createdAt"],
}
)
if ctx:
await ctx.report_progress(progress=3, total=5)
await ctx.info("Fetching reviews...")
for repo_contrib, owner, repo_name in self._filtered_contributions(
for contrib, owner, repo_name in self._filtered_contributions(
collection, "pullRequestReviewContributionsByRepository", org, repo
):
for contrib in repo_contrib.get("contributions", {}).get("nodes", []):
if len(reviews) >= max_results:
break
review = contrib["pullRequestReview"]
pr = contrib["pullRequest"]
reviews.append(
{
"repo": repo_name,
"owner": owner,
"pr_number": pr["number"],
"pr_title": pr["title"],
"pr_url": pr["url"],
"review_state": review["state"],
"review_url": review["url"],
"date": contrib["occurredAt"],
}
)
if len(reviews) >= max_results:
break
review = contrib["pullRequestReview"]
pr = contrib["pullRequest"]
reviews.append(
{
"repo": repo_name,
"owner": owner,
"pr_number": pr["number"],
"pr_title": pr["title"],
"pr_url": pr["url"],
"review_state": review["state"],
"review_url": review["url"],
"date": contrib["occurredAt"],
}
)
if ctx:
await ctx.report_progress(progress=4, total=5)
await ctx.info("Fetching repo stars...")
Expand Down