diff --git a/.gitlab-ci/default.yml b/.gitlab-ci/default.yml index 54338ba6c7a1a11705811bc66096bf471c9b6c1a..f68b2283edd53cded8fc46e1a9e53a033d527637 100644 --- a/.gitlab-ci/default.yml +++ b/.gitlab-ci/default.yml @@ -19,10 +19,8 @@ select tests: script: - | if [[ "$TRIGGER_SOURCE" == "merge_request_event" ]]; then - dunecontrol --opts=$DUNE_OPTS_FILE --current all - pushd build-cmake - python3 ../bin/testing/findtests.py -f ../affectedtests.json -t origin/$MR_TARGET_BRANCH_NAME - popd + python3 bin/testing/getchangedfiles.py -o changedfiles.txt -t origin/$MR_TARGET_BRANCH_NAME + python3 bin/testing/findtests.py -f affectedtests.json --file-list changedfiles.txt --build-dir build-cmake else echo "Skipping test selection, build/test stages will consider all tests!" echo "{}" >> ../affectedtests.json diff --git a/bin/testing/findtests.py b/bin/testing/findtests.py index f9a810522d6e49a9cd441d2c1435abd891ddaaaa..52923c1541a70a735f58d859d69f1243cc92e184 100755 --- a/bin/testing/findtests.py +++ b/bin/testing/findtests.py @@ -68,19 +68,10 @@ def isAffectedTest(testConfigFile, changedFiles): headers = subprocess.run(command + ["-MM", "-H"], stderr=PIPE, stdout=PIPE, cwd=dir, encoding='ascii').stderr.splitlines() + headers = [h.lstrip('. ') for h in headers] + headers.append(mainFile) - # filter only headers from this project and turn them into relative paths - projectDir = os.path.abspath(os.getcwd().rstrip("build-cmake")) - - def isProjectHeader(headerPath): - return projectDir in headerPath - - testFiles = [os.path.relpath(mainFile.lstrip(". "), projectDir)] - testFiles.extend([os.path.relpath(header.lstrip(". "), projectDir) - for header in filter(isProjectHeader, headers)]) - testFiles = set(testFiles) - - if hasCommonMember(changedFiles, testFiles): + if hasCommonMember(changedFiles, headers): return True, testConfig["name"], testConfig["target"] return False, testConfig["name"], testConfig["target"] @@ -90,26 +81,25 @@ if __name__ == '__main__': # parse input arguments parser = ArgumentParser(description='Find tests affected by changes') - parser.add_argument('-s', '--source', - required=False, default='HEAD', - help='The source tree (default: `HEAD`)') - parser.add_argument('-t', '--target', - required=False, default='master', - help='The tree to compare against (default: `master`)') + parser.add_argument('-l', '--file-list', required=True, + help='A file containing a list of files that changed') parser.add_argument('-np', '--num-processes', required=False, type=int, default=4, help='Number of processes (default: 4)') parser.add_argument('-f', '--outfile', required=False, default='affectedtests.json', help='The file in which to write the affected tests') + parser.add_argument('-b', '--build-dir', + required=False, default='.', + help='The path to the top-level build directory of the project to be checked') args = vars(parser.parse_args()) - # find the changes files - changedFiles = subprocess.check_output( - ["git", "diff-tree", "-r", "--name-only", args['source'], args['target']], - encoding='ascii' - ).splitlines() - changedFiles = set(changedFiles) + targetFile = os.path.abspath(args['outfile']) + with open(args['file_list']) as files: + changedFiles = set([line.strip('\n') for line in files.readlines()]) + + owd = os.getcwd() + os.chdir(args['build_dir']) # clean build directory subprocess.run(["make", "clean"]) @@ -133,5 +123,7 @@ if __name__ == '__main__': print("Detected {} affected tests".format(len(affectedTests))) - with open(args['outfile'], 'w') as jsonFile: + with open(targetFile, 'w') as jsonFile: json.dump(affectedTests, jsonFile) + + os.chdir(owd)