| # Copyright 2021 The IREE Authors | 
 | # | 
 | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
 | # See https://llvm.org/LICENSE.txt for license information. | 
 | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 |  | 
 | """A utility to enforce that a list matches a glob expression. | 
 |  | 
 | We use this primarily to enable the error-checking capabilities of globs of test | 
 | files in IREE while still allowing our Bazel to CMake conversion to not create | 
 | CMake globs (which are discouraged for collecting source files, see | 
 | https://cmake.org/cmake/help/latest/command/file.html#glob) and not be dependent | 
 | on any information outside of the BUILD file. | 
 | """ | 
 |  | 
 | def enforce_glob(files, **kwargs): | 
 |     """A utility to enforce that a list matches a glob expression. | 
 |  | 
 |     Note that the comparison is done in an order-independent fashion. | 
 |  | 
 |     Args: | 
 |         files: a list that is expected to contain the same files as the | 
 |             specified glob expression. | 
 |         **kwargs: keyword arguments forwarded to the glob. | 
 |  | 
 |     Returns: | 
 |         files. The input argument unchanged | 
 |     """ | 
 |     glob_result = native.glob(**kwargs) | 
 |     for skip_file in ["CMakeLists.txt"]: | 
 |         if skip_file in glob_result: | 
 |             glob_result.remove(skip_file) | 
 |  | 
 |     # glob returns a sorted list. | 
 |     if sorted(files) != glob_result: | 
 |         glob_result_dict = {k: None for k in glob_result} | 
 |         result_dict = {k: None for k in files} | 
 |         missing = [k for k in glob_result if k not in files] | 
 |         extra = [k for k in files if k not in glob_result] | 
 |         expected_formatted = "\n".join(['"{}",'.format(file) for file in glob_result]) | 
 |         fail(("Error in enforce_glob." + | 
 |               "\nExpected {}." + | 
 |               "\nGot {}." + | 
 |               "\nMissing {}." + | 
 |               "\nExtra {}" + | 
 |               "\nPaste this into the first enforce_glob argument:" + | 
 |               "\n{}").format( | 
 |             glob_result, | 
 |             files, | 
 |             missing, | 
 |             extra, | 
 |             expected_formatted, | 
 |         )) | 
 |     return files |