ci: detect what changed in a PR and if full sanitycheck is needed.

Script to detect if full sanitycheck should run or if we can skip it and
just run the code that actuallt changed (in samples/tests).

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
Anas Nashif 2020-03-30 15:10:00 -04:00
commit 0e558059d1
2 changed files with 80 additions and 0 deletions

View file

@ -0,0 +1,26 @@
# Add one pattern per line.
#
# The patterns listed in this file will be compared with the list of files
# changed in a patch series (Pull Request) and if all files in the pull request
# are matched, then sanitycheck will not do a full run and optionally will only
# run on changed tests or boards.
#
.clang-format
.codecov.yml
.editorconfig
.gitattributes
.gitignore
.known-issues
.mailmap
.uncrustify.cfg
CODEOWNERS
LICENSE
Makefile
tests/*
samples/*
*.rst
*.md
# if we change this file or associated script, it should not trigger a full
# sanitycheck.
scripts/ci/sanitycheck_ignore.txt
scripts/ci/what_changed.py

54
scripts/ci/what_changed.py Executable file
View file

@ -0,0 +1,54 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2020 Intel Corporation
# Check if full sanitycheck is needed.
import os
import sh
import argparse
import fnmatch
if "ZEPHYR_BASE" not in os.environ:
exit("$ZEPHYR_BASE environment variable undefined.")
repository_path = os.environ['ZEPHYR_BASE']
sh_special_args = {
'_tty_out': False,
'_cwd': repository_path
}
def parse_args():
parser = argparse.ArgumentParser(
description="Check if change requires full sanitycheck")
parser.add_argument('-c', '--commits', default=None,
help="Commit range in the form: a..b")
return parser.parse_args()
def main():
args = parse_args()
if not args.commits:
exit(1)
# pylint does not like the 'sh' library
# pylint: disable=too-many-function-args,unexpected-keyword-arg
commit = sh.git("diff", "--name-only", args.commits, **sh_special_args)
files = commit.split("\n")
with open("scripts/ci/sanitycheck_ignore.txt", "r") as sc_ignore:
ignores = sc_ignore.read().splitlines()
ignores = filter(lambda x: not x.startswith("#"), ignores)
found = []
files = list(filter(lambda x: x, files))
for pattern in ignores:
if pattern:
found.extend(fnmatch.filter(files, pattern))
if sorted(files) != sorted(found):
print("full")
if __name__ == "__main__":
main()