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 update_pr(pull: PullRequest) -> None: repo = pull.base.repo if 'update me' in [l.name for l in pull.as_issue().labels]: print(f'Checking if #{pull.number} is up to date with master.') master = repo.get_branch('master') base, head = get_common_tree(repo, master.commit.sha, pull.head.sha) if head.issuperset(base): print('Up to date') return print(f'#{pull.number}: {pull.head.ref} is behind.') repo.merge(pull.head.ref, 'master', f'Merge master into #{pull.number}')
def check_pr_for_mergability(pr: PullRequest) -> str: repo = pr.base.repo commit = repo.get_commit(pr.head.sha) checks: Dict[str, str] = {} for status in commit.get_statuses(): print(status) if status.context == PDM_CHECK_CONTEXT: continue if checks.get(status.context) is None: checks[status.context] = status.state if status.state != 'success': commit.create_status(state='pending', description=f'Waiting for {status.context}', context=PDM_CHECK_CONTEXT) return f'Merge blocked by {status.context}' travis_pr = 'continuous-integration/travis-ci/pr' if travis_pr not in checks.keys(): # There's a lovely race condition where, if: # 1. travis/push has completed before the PR was made # 2. And the label is applied on creation (or author is whitelisted) # The PR can be merged before travis is aware of the PR. # The solution to this is to hardcode a check for /pr commit.create_status(state='pending', description=f'Waiting for {travis_pr}', context=PDM_CHECK_CONTEXT) return f'Merge blocked by {travis_pr}' labels = [l.name for l in pr.as_issue().labels] if 'do not merge' in labels: commit.create_status(state='failure', description='Blocked by "do not merge"', context=PDM_CHECK_CONTEXT) return 'Do not Merge' whitelisted = pr.user in repo.get_collaborators() if not whitelisted and not 'merge when ready' in labels: commit.create_status(state='pending', description='Waiting for "merge when ready"', context=PDM_CHECK_CONTEXT) return 'Waiting for label' if 'beta test' in labels: trying = repo.get_git_ref('heads/trying') if trying.object.sha == commit.sha: commit.create_status(state='success', description='Deployed to test branch', context=PDM_CHECK_CONTEXT) return 'Already deployed' trying.edit(commit.sha, True) commit.create_status(state='success', description='Deployed to test branch', context=PDM_CHECK_CONTEXT) return 'beta test' commit.create_status(state='success', description='Ready to merge', context=PDM_CHECK_CONTEXT) pr.merge() return 'good to merge'
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), }