Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
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))
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    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()),
        }
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
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 ""
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
    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),
        }
Ejemplo n.º 9
0
    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