| import os | |
| import sys | |
| import traceback | |
| def main(argv): | |
| # Only check the history if the build is running on a pull request. | |
| # Build could be running on pull request using travis or kokoro. | |
| if is_travis_pull_request() or is_kokoro_presubmit_request(): | |
| # This function assumes that HEAD^1 is the base branch and HEAD^2 is the | |
| # pull request. | |
| exit_if_pull_request_has_merge_commits() | |
| print 'Checked pull request history: SUCCEEDED' | |
| else: | |
| print 'Skipped history check.' | |
| def is_kokoro_presubmit_request(): | |
| '''Returns true if KOKORO_GITHUB_PULL_REQUEST_NUMBER is set.''' | |
| if 'KOKORO_GITHUB_PULL_REQUEST_NUMBER' in os.environ: | |
| return True | |
| return False | |
| def is_travis_pull_request(): | |
| '''Returns true if TRAVIS_PULL_REQUEST is set to indicate a pull request.''' | |
| if 'TRAVIS_PULL_REQUEST' in os.environ: | |
| return os.environ['TRAVIS_PULL_REQUEST'] != 'false' | |
| return False | |
| def exit_if_pull_request_has_merge_commits(): | |
| '''Exits with an error if any of the commits added by the pull request are | |
| merge commits.''' | |
| # Print the parents of each commit added by the pull request. | |
| git_command = 'git log --format="%P" HEAD^1..HEAD^2' | |
| for line in os.popen(git_command): | |
| parents = line.split() | |
| assert len(parents) >= 1, line | |
| if len(parents) > 1: | |
| print 'Pull request contains a merge commit:' | |
| print_history() | |
| print 'Checked pull request history: FAILED' | |
| sys.exit(1) | |
| def print_history(): | |
| os.system('git log HEAD^1 HEAD^2 -30 --graph --oneline --decorate') | |
| def read_process(command): | |
| '''Runs a command and returns everything printed to stdout.''' | |
| with os.popen(command, 'r') as fd: | |
| return fd.read() | |
| if __name__ == '__main__': | |
| main(sys.argv) |