diff options
Diffstat (limited to 'scripts/check-git-history.py')
-rw-r--r-- | scripts/check-git-history.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/scripts/check-git-history.py b/scripts/check-git-history.py new file mode 100644 index 00000000..df13e423 --- /dev/null +++ b/scripts/check-git-history.py @@ -0,0 +1,51 @@ +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) |