aboutsummaryrefslogtreecommitdiff
path: root/scripts/check-git-history.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/check-git-history.py')
-rw-r--r--scripts/check-git-history.py51
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)