#!/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 = set()
    files.update(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 = set()
    files = list(filter(lambda x: x, files))

    for pattern in ignores:
        if pattern:
            found.update(fnmatch.filter(files, pattern))

    if sorted(files) != sorted(found):
        print("full")


if __name__ == "__main__":
    main()
