1*a24ffb47SSadaf Ebrahimiimport os 2*a24ffb47SSadaf Ebrahimiimport sys 3*a24ffb47SSadaf Ebrahimiimport traceback 4*a24ffb47SSadaf Ebrahimi 5*a24ffb47SSadaf Ebrahimidef main(argv): 6*a24ffb47SSadaf Ebrahimi # Only check the history if the build is running on a pull request. 7*a24ffb47SSadaf Ebrahimi # Build could be running on pull request using travis or kokoro. 8*a24ffb47SSadaf Ebrahimi if is_travis_pull_request() or is_kokoro_presubmit_request(): 9*a24ffb47SSadaf Ebrahimi # This function assumes that HEAD^1 is the base branch and HEAD^2 is the 10*a24ffb47SSadaf Ebrahimi # pull request. 11*a24ffb47SSadaf Ebrahimi exit_if_pull_request_has_merge_commits() 12*a24ffb47SSadaf Ebrahimi print 'Checked pull request history: SUCCEEDED' 13*a24ffb47SSadaf Ebrahimi else: 14*a24ffb47SSadaf Ebrahimi print 'Skipped history check.' 15*a24ffb47SSadaf Ebrahimi 16*a24ffb47SSadaf Ebrahimidef is_kokoro_presubmit_request(): 17*a24ffb47SSadaf Ebrahimi '''Returns true if KOKORO_GITHUB_PULL_REQUEST_NUMBER is set.''' 18*a24ffb47SSadaf Ebrahimi if 'KOKORO_GITHUB_PULL_REQUEST_NUMBER' in os.environ: 19*a24ffb47SSadaf Ebrahimi return True 20*a24ffb47SSadaf Ebrahimi return False 21*a24ffb47SSadaf Ebrahimi 22*a24ffb47SSadaf Ebrahimidef is_travis_pull_request(): 23*a24ffb47SSadaf Ebrahimi '''Returns true if TRAVIS_PULL_REQUEST is set to indicate a pull request.''' 24*a24ffb47SSadaf Ebrahimi if 'TRAVIS_PULL_REQUEST' in os.environ: 25*a24ffb47SSadaf Ebrahimi return os.environ['TRAVIS_PULL_REQUEST'] != 'false' 26*a24ffb47SSadaf Ebrahimi return False 27*a24ffb47SSadaf Ebrahimi 28*a24ffb47SSadaf Ebrahimidef exit_if_pull_request_has_merge_commits(): 29*a24ffb47SSadaf Ebrahimi '''Exits with an error if any of the commits added by the pull request are 30*a24ffb47SSadaf Ebrahimi merge commits.''' 31*a24ffb47SSadaf Ebrahimi # Print the parents of each commit added by the pull request. 32*a24ffb47SSadaf Ebrahimi git_command = 'git log --format="%P" HEAD^1..HEAD^2' 33*a24ffb47SSadaf Ebrahimi for line in os.popen(git_command): 34*a24ffb47SSadaf Ebrahimi parents = line.split() 35*a24ffb47SSadaf Ebrahimi assert len(parents) >= 1, line 36*a24ffb47SSadaf Ebrahimi if len(parents) > 1: 37*a24ffb47SSadaf Ebrahimi print 'Pull request contains a merge commit:' 38*a24ffb47SSadaf Ebrahimi print_history() 39*a24ffb47SSadaf Ebrahimi print 'Checked pull request history: FAILED' 40*a24ffb47SSadaf Ebrahimi sys.exit(1) 41*a24ffb47SSadaf Ebrahimi 42*a24ffb47SSadaf Ebrahimidef print_history(): 43*a24ffb47SSadaf Ebrahimi os.system('git log HEAD^1 HEAD^2 -30 --graph --oneline --decorate') 44*a24ffb47SSadaf Ebrahimi 45*a24ffb47SSadaf Ebrahimidef read_process(command): 46*a24ffb47SSadaf Ebrahimi '''Runs a command and returns everything printed to stdout.''' 47*a24ffb47SSadaf Ebrahimi with os.popen(command, 'r') as fd: 48*a24ffb47SSadaf Ebrahimi return fd.read() 49*a24ffb47SSadaf Ebrahimi 50*a24ffb47SSadaf Ebrahimiif __name__ == '__main__': 51*a24ffb47SSadaf Ebrahimi main(sys.argv) 52