Skip to content
Open
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
75 changes: 52 additions & 23 deletions did/plugins/github.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,36 @@
condition("+-org", exclude_org)
)

def issue_pr_commented_in_range(self,
issue_pr_url: str,
since: datetime,
until: datetime,
login: str) -> bool:
issue_checked = False
url = issue_pr_url
while not issue_checked:
response = self.request(url)
comments = response.json()
log.debug("%s comments fetched for %s", len(comments), url)
log.data(pretty(comments))
for comment in comments:
created_at = datetime.strptime(
comment["created_at"],
r"%Y-%m-%dT%H:%M:%SZ"
)
if created_at > until:
# Comments are sorted by created_at asc
issue_checked = True
break
if comment["user"]["login"] == login and since <= created_at:
issue_checked = True
return True
if 'next' in response.links:
url = response.links['next']['url']
else:
issue_checked = True
return False

def commented_in_range(self,
commented_issues: list,
since: datetime,
Expand All @@ -136,33 +166,32 @@
valid_issues = []
for issue in commented_issues:
issue_since = since
issue_checked = False
url = (
f"{issue['comments_url']}"
f"?per_page={PER_PAGE}&since={issue_since.isoformat()}"
)
while not issue_checked:
response = self.request(url)
comments = response.json()
log.debug("%s comments fetched for %s", len(comments), url)
log.data(pretty(comments))
for comment in comments:
created_at = datetime.strptime(
comment["created_at"],
r"%Y-%m-%dT%H:%M:%SZ"
)
if created_at > until:
# Comments are sorted by created_at asc
issue_checked = True
break
if comment["user"]["login"] == login and since <= created_at:
valid_issues.append(issue)
issue_checked = True
break
if 'next' in response.links:
url = response.links['next']['url']
else:
issue_checked = True
if self.issue_pr_commented_in_range(url, since,
until, login):
valid_issues.append(issue)
continue
# If the issue is a PR, retry with review comments, these
# are different from issue comments:
# https://docs.github.com/en/rest/pulls/comments?apiVersion=2026-03-10
pr_dict = issue.get('pull_request')
if pr_dict:
# pr_dict is a small dict that contains the actual
# pull request URL.
response = self.request(pr_dict['url'])
# the full PR dict, contains different fields
# than the issue dict even if the issue is actually a PR
pr = response.json()
url = (
f"{pr['review_comments_url']}"
f"?per_page={PER_PAGE}&since={issue_since.isoformat()}"
)
if self.issue_pr_commented_in_range(url, since,
until, login):
valid_issues.append(issue)
return valid_issues

@staticmethod
Expand Down
Loading