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)