import argparse import os import time from github import Github GITHUB_TOKEN = os.getenv('GITHUB_TOKEN') def get_mergeable_state(pr_number): """Get mergeable state of the PR https://docs.github.com/en/graphql/reference/enums#mergestatestatus""" github_api = Github(GITHUB_TOKEN) db_repo = github_api.get_repo("theorchard/database") # github calculates mergeable state when the api request occurs, so might need to retry a fetch if stale attempt = 1 while (attempt < 3): pr = db_repo.get_pull(pr_number) mergeable_state = pr.mergeable_state if mergeable_state != 'unknown': return mergeable_state print('PR {} status is currently unknown, sleeping and retrying.'.format( pr_number)) time.sleep(5) attempt = attempt + 1 raise Exception('PR {} has a mergeable_state of unknown. Please give ' 'GitHub a minute to finish calculating this state.') def is_pr_mergeable(pr_number, raise_exception): pr_mergeable_state = get_mergeable_state(pr_number) print('The status of PR {} is {}'.format(pr_number, pr_mergeable_state)) if pr_mergeable_state != 'clean': message = 'PR {} is not mergeable, blocking deploy'.format(pr_number) if raise_exception: raise Exception(message) print(message) return False print('This PR is mergeable') return True def main(*args): parser = argparse.ArgumentParser() parser.add_argument( '--pr-number', type=int, required=True, help='Pull Request to check if mergeable') parser.add_argument( '--raise-exception', action='store_true', help='Raise exception if PR is not mergeable') args = parser.parse_args() is_pr_mergeable(args.pr_number, args.raise_exception) if __name__ == '__main__': main()