|
@@ -2,15 +2,9 @@
|
|
|
|
|
|
# @file: toolset/travis/travis_diff.py
|
|
|
# @author: Nate Brady
|
|
|
-# @description: This script is only for use within Travis-CI. It is meant to look through the commit history
|
|
|
-# and determine whether or not the current framework test directory needs to be run.
|
|
|
-#
|
|
|
-# Notes: This script will run in python 2 and 3. print is being used instead of the logging import because
|
|
|
-# travis does not echo python logging during the before_script lifecycle.
|
|
|
-
|
|
|
-# TODO: Needs to be updated to look at the new Travis test possibilities
|
|
|
-# of TEST, TESTDIR, and TESTLANG. IE. Only run a single framework test
|
|
|
-# in TESTLANG if it's the only one that's changed
|
|
|
+# @description: This script is only for use within Travis-CI. It is meant to
|
|
|
+# look through the commit history and determine whether or not the current
|
|
|
+# framework test directory needs to be run.
|
|
|
|
|
|
import subprocess
|
|
|
import os
|
|
@@ -22,12 +16,14 @@ from sets import Set
|
|
|
def get_docker_changes(changes_output):
|
|
|
return list(
|
|
|
Set(
|
|
|
- re.findall(r"toolset/setup/docker/.+/(.+)\.dockerfile",
|
|
|
- changes_output, re.M)))
|
|
|
+ re.findall(r"toolset/setup/docker/.+/(.+)\.dockerfile", changes_output,
|
|
|
+ re.M)))
|
|
|
|
|
|
|
|
|
def fw_found_in_changes(test, changes_output):
|
|
|
- return re.search(r"frameworks/" + test + "/", changes_output, re.M)
|
|
|
+ return re.search(
|
|
|
+ r"frameworks/" + test + "/",
|
|
|
+ changes_output, re.M)
|
|
|
|
|
|
|
|
|
# Cleans up diffing and grep output and into an array of strings
|
|
@@ -49,7 +45,7 @@ print("TRAVIS_COMMIT : {!s}".format(os.getenv("TRAVIS_COMMIT")))
|
|
|
is_PR = (os.getenv("TRAVIS_PULL_REQUEST") != "false")
|
|
|
commit_range = ""
|
|
|
first_commit = ""
|
|
|
-last_commit = ""
|
|
|
+last_commit = ""
|
|
|
|
|
|
if is_PR:
|
|
|
print('I am testing a pull request')
|
|
@@ -88,7 +84,7 @@ changes = clean_output(
|
|
|
'git log --name-only --pretty="format:" {!s}'.format(commit_range)
|
|
|
]))
|
|
|
print("Determining what to run based on the following file changes: \n{!s}"
|
|
|
- .format(changes))
|
|
|
+ .format(changes))
|
|
|
|
|
|
# COMMIT MESSAGES:
|
|
|
# Before any complicated diffing, check for forced runs from the commit message
|
|
@@ -96,15 +92,16 @@ print("Determining what to run based on the following file changes: \n{!s}"
|
|
|
last_commit_msg = subprocess.check_output(
|
|
|
["bash", "-c", "git log --format=%B -n 1 {!s}".format(last_commit)])
|
|
|
print("Parsing commit message for travis commands: {!s}"
|
|
|
- .format(last_commit_msg))
|
|
|
+ .format(last_commit_msg))
|
|
|
|
|
|
test_dirs = []
|
|
|
run_tests = []
|
|
|
|
|
|
# Break the test env variable down into test directories
|
|
|
if os.getenv("TESTLANG"):
|
|
|
- test_dirs = map(lambda x: os.getenv("TESTLANG") + '/' + x,
|
|
|
- os.listdir("frameworks/" + os.getenv("TESTLANG")))
|
|
|
+ dir = "frameworks/" + os.getenv("TESTLANG") + "/"
|
|
|
+ test_dirs = map(lambda x: os.getenv("TESTLANG") + "/" + x,
|
|
|
+ filter(lambda x: os.path.isdir(dir + x), os.listdir(dir)))
|
|
|
elif os.getenv("TESTDIR"):
|
|
|
test_dirs = os.getenv("TESTDIR").split(' ')
|
|
|
|
|
@@ -116,39 +113,50 @@ if re.search(r'\[ci run-all\]', last_commit_msg, re.M):
|
|
|
|
|
|
# Forced *fw-only* specific tests
|
|
|
if re.search(r'\[ci fw-only .+\]', last_commit_msg, re.M):
|
|
|
- tests = re.findall(r'\[ci fw-only (.+)\]', last_commit_msg,
|
|
|
- re.M)[0].strip().split(' ')
|
|
|
+ tests = re.findall(r'\[ci fw-only (.+)\]', last_commit_msg, re.M)[0].strip().split(' ')
|
|
|
for test in tests:
|
|
|
if test in test_dirs:
|
|
|
- print(
|
|
|
- "{!s} has been forced to run from the commit message.".format(
|
|
|
- test))
|
|
|
+ print("{!s} has been forced to run from the commit message.".format(test))
|
|
|
run_tests.append(test)
|
|
|
|
|
|
# quit here because we're using "only"
|
|
|
quit_diffing()
|
|
|
|
|
|
+# Forced *lang-only* specific tests
|
|
|
+if re.search(r'\[ci lang-only .+\]', last_commit_msg, re.M):
|
|
|
+ langs = re.findall(r'\[ci lang-only (.+)\]', last_commit_msg, re.M)[0].strip().split(' ')
|
|
|
+ for test in test_dirs:
|
|
|
+ for lang in langs:
|
|
|
+ if test.startswith(lang + "/"):
|
|
|
+ print("{!s} has been forced to run from the commit message.".format(test))
|
|
|
+ run_tests.append(test)
|
|
|
+
|
|
|
+ # quit here because we're using "only"
|
|
|
+ quit_diffing()
|
|
|
+
|
|
|
# Forced framework run in addition to other tests
|
|
|
if re.search(r'\[ci fw .+\]', last_commit_msg, re.M):
|
|
|
- tests = re.findall(r'\[ci fw (.+)\]', last_commit_msg,
|
|
|
- re.M)[0].strip().split(' ')
|
|
|
+ tests = re.findall(r'\[ci fw (.+)\]', last_commit_msg, re.M)[0].strip().split(' ')
|
|
|
for test in tests:
|
|
|
if test in test_dirs:
|
|
|
- print(
|
|
|
- "{!s} has been forced to run from the commit message.".format(
|
|
|
- test))
|
|
|
+ print("{!s} has been forced to run from the commit message.".format(test))
|
|
|
run_tests.append(test)
|
|
|
|
|
|
-# TODO: any changes in the toolset folder will generate a full run.
|
|
|
-# Instead limit this to core toolset files and work on diffing
|
|
|
-# docker dependencies
|
|
|
+# Forced lang run in addition to other running tests
|
|
|
+if re.search(r'\[ci lang .+\]', last_commit_msg, re.M):
|
|
|
+ langs = re.findall(r'\[ci lang (.+)\]', last_commit_msg, re.M)[0].strip().split(' ')
|
|
|
+ for test in test_dirs:
|
|
|
+ for lang in langs:
|
|
|
+ if test.startswith(lang + "/"):
|
|
|
+ print("{!s} has been forced to run from the commit message.".format(test))
|
|
|
+ run_tests.append(test)
|
|
|
+
|
|
|
+
|
|
|
# Ignore travis and docker directory changes
|
|
|
# Also for now, ignore the old linux setup folders, as we don't want to
|
|
|
# trigger a full run as we remove old fw_depends scripts. [ci run-all] will
|
|
|
# still work if it's needed.
|
|
|
-
|
|
|
-if re.search(r'^toolset/(?!(travis/|setup/|continuous/))', changes,
|
|
|
- re.M) is not None:
|
|
|
+if re.search(r'^toolset/(?!(travis/|setup/|continuous/))', changes, re.M) is not None:
|
|
|
print("Found changes to core toolset. Running all tests.")
|
|
|
run_tests = test_dirs
|
|
|
quit_diffing()
|
|
@@ -169,11 +177,11 @@ for test in test_dirs:
|
|
|
found = False
|
|
|
while i <= len(docker_changes) - 1 and not found:
|
|
|
|
|
|
- # Generates output of files that contain a FROM import for this dependency
|
|
|
+ # Generates output of files that contain a FROM for this dependency
|
|
|
more_changes = subprocess.check_output([
|
|
|
- 'bash', '-c',
|
|
|
- 'grep -RP "FROM tfb/' + re.escape(docker_changes[i].replace(
|
|
|
- '.dockerfile', '')) + '(:|$)" . || echo ""'
|
|
|
+ 'bash', '-c', 'grep -RP "FROM tfb/' +
|
|
|
+ re.escape(docker_changes[i].replace('.dockerfile', ''))
|
|
|
+ + '(:|$)" . || echo ""'
|
|
|
])
|
|
|
print("more_changes: {!s}".format(more_changes))
|
|
|
if fw_found_in_changes(test, more_changes):
|
|
@@ -186,4 +194,4 @@ for test in test_dirs:
|
|
|
Set(get_docker_changes(more_changes)) - Set(docker_changes))
|
|
|
i += 1
|
|
|
|
|
|
-quit_diffing()
|
|
|
+quit_diffing()
|