def update_pull_comments(self, pull: PullRequest, comments_data: List[Dict], dry_run: bool) -> None: pull_id = pull.number if dry_run: print(f"Would update pull {pull_id} comments") return num_comments = len(comments_data) existing_comments = list(pull.get_issue_comments()) # Create or update comments for comment_num, comment_data in enumerate(comments_data): print( f"Set comment {comment_num + 1}/{num_comments} of github pull request #{pull_id}..." ) comment_body = comment_data["body"] if comment_num < len(existing_comments): existing_comments[comment_num].edit(comment_body) else: pull.create_comment(comment_body) # Delete comments in excess comments_to_delete = existing_comments[num_comments:] for i, gh_comment in enumerate(comments_to_delete): print( f"Delete extra github comment {i + 1}/{len(comments_to_delete)} of pull request #{pull_id}..." ) gh_comment.delete()
def check_for_changelogs(pr: PullRequest) -> None: for change in pr.get_files(): if change.filename == 'requirements.txt': lines = build_changelog(change) for comment in pr.get_issue_comments(): if comment.body.startswith('# Changelogs'): # Changelog comment comment.edit(body='\n'.join(lines)) break else: pr.create_issue_comment('\n'.join(lines))
def get_conversations(pull_request: PullRequest): """Get conversations for a pull_request.""" conversations = [] for c in pull_request.get_issue_comments(): comment = { "user": c.user.login, "text": c.body, "created_at": int(c.created_at.timestamp()), "reactions": [r.content for r in c.get_reactions()], } conversations.append(comment) return conversations
def store(self, pull_request: GithubPullRequest): """Override :func:`~Entity.store`.""" commits = pull_request.commits created_at = int(pull_request.created_at.timestamp()) closed_at = int(pull_request.closed_at.timestamp() ) if pull_request.closed_at is not None else None merged_at = int(pull_request.merged_at.timestamp() ) if pull_request.merged_at is not None else None closed_by = pull_request.as_issue( ).closed_by.login if pull_request.as_issue( ).closed_by is not None else None labels = [label.name for label in pull_request.get_labels()] # Evaluate size of PR pull_request_size = None if labels: pull_request_size = GitHubKnowledge.get_labeled_size(labels) if not pull_request_size: lines_changes = pull_request.additions + pull_request.deletions pull_request_size = GitHubKnowledge.assign_pull_request_size( lines_changes=lines_changes) self.stored_entities[str(pull_request.number)] = { "size": pull_request_size, "created_by": pull_request.user.login, "created_at": created_at, "closed_at": closed_at, "closed_by": closed_by, "merged_at": merged_at, "commits_number": commits, "referenced_issues": PullRequest.get_referenced_issues(pull_request), "interactions": GitHubKnowledge.get_interactions( pull_request.get_issue_comments()), "reviews": self.extract_pull_request_reviews(pull_request), "requested_reviewers": self.extract_pull_request_review_requests(pull_request), "labels": GitHubKnowledge.get_labels(pull_request.as_issue()), }
def get_referenced_issues(pull_request: GithubPullRequest) -> List[str]: """Scan all of the Pull Request comments and get referenced issues. Arguments: pull_request {PullRequest} -- Pull request for which the referenced issues are extracted Returns: List[str] -- IDs of referenced issues within the Pull Request. """ issues_referenced = [] for comment in pull_request.get_issue_comments(): for id in PullRequest.search_for_references(comment.body): issues_referenced.append(id) for id in PullRequest.search_for_references(pull_request.body): issues_referenced.append(id) _LOGGER.debug(" referenced issues: %s" % issues_referenced) return issues_referenced
def get_release_notes(pr: PullRequest) -> str: for comment in pr.get_issue_comments(): m = re.search("(?si)Release notes:(.*)", comment.body) if m: return m[1].strip() return ""
def get_old_comment(pr: PullRequest.PullRequest): for comment in pr.get_issue_comments(): if ("github-actions" in comment.user.login) and ("No news item is found" in comment.body): return comment
def store(self, pull_request: GithubPullRequest): """Override :func:`~Entity.store`.""" _LOGGER.info("Extracting PR #%d", pull_request.number) if pull_request.number in self.previous_knowledge.index: _LOGGER.debug("PullRequest %s already analysed, skipping") return created_at = int(pull_request.created_at.timestamp()) closed_at = int(pull_request.closed_at.timestamp() ) if pull_request.closed_at is not None else None merged_at = int(pull_request.merged_at.timestamp() ) if pull_request.merged_at is not None else None closed_by = pull_request.as_issue( ).closed_by.login if pull_request.as_issue( ).closed_by is not None else None merged_by = pull_request.merged_by.login if pull_request.merged_by is not None else None labels = [label.name for label in pull_request.get_labels()] # Evaluate size of PR pull_request_size = None if labels: pull_request_size = GitHubKnowledge.get_labeled_size(labels) if not pull_request_size: lines_changes = pull_request.additions + pull_request.deletions pull_request_size = GitHubKnowledge.assign_pull_request_size( lines_changes=lines_changes) reviews = self.extract_pull_request_reviews(pull_request) self.stored_entities[str(pull_request.number)] = { "title": pull_request.title, "body": pull_request.body, "size": pull_request_size, "created_by": pull_request.user.login, "created_at": created_at, "closed_at": closed_at, "closed_by": closed_by, "merged_at": merged_at, "merged_by": merged_by, "commits_number": pull_request.commits, "changed_files_number": pull_request.changed_files, "interactions": GitHubKnowledge.get_interactions( pull_request.get_issue_comments()), "reviews": reviews, "labels": labels, "commits": [c.sha for c in pull_request.get_commits()], "changed_files": [f.filename for f in pull_request.get_files()], "first_review_at": get_first_review_time(reviews), "first_approve_at": get_approve_time(reviews), }
def _find_bot_pr_comment(self, github_pr: PullRequest) -> Optional[IssueComment]: for comment in github_pr.get_issue_comments(): if comment.user.login == self._settings.github.username: return comment return None