mirror of
https://github.com/AdaCore/learn.git
synced 2026-02-12 13:00:42 -08:00
147 lines
4.2 KiB
Python
Executable File
147 lines
4.2 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
|
|
"""
|
|
This program will check all the code blocks from all projects.
|
|
"""
|
|
|
|
import argparse
|
|
import os
|
|
import glob
|
|
|
|
import blocks
|
|
import check_code_block
|
|
import extract_projects
|
|
import fmt_utils
|
|
|
|
verbose = False
|
|
all_diagnostics = False
|
|
max_columns = 0 # no check for max. columns
|
|
force_checks = False
|
|
|
|
|
|
def get_blocks(json_files_regex_list):
|
|
projects = dict()
|
|
|
|
for json_regex in json_files_regex_list:
|
|
for json_file in glob.iglob(json_regex, recursive=True):
|
|
json_file_path = os.path.abspath(json_file)
|
|
b = blocks.CodeBlock.from_json_file(json_file_path)
|
|
|
|
if not b.project in projects:
|
|
projects[b.project] = list()
|
|
projects[b.project].append((b, json_file_path))
|
|
|
|
return projects
|
|
|
|
|
|
def get_projects(build_dir, projects_list_file=None):
|
|
json_files_regex_list = list()
|
|
|
|
os.chdir(build_dir)
|
|
|
|
if projects_list_file is not None:
|
|
extracted_projects = \
|
|
extract_projects.ProjectsList.from_json_file(projects_list_file)
|
|
|
|
if extracted_projects:
|
|
for prj in extracted_projects.projects:
|
|
json_files_regex_list.append(extract_projects.get_project_dir(prj) +
|
|
"/**/block_info.json")
|
|
else:
|
|
print("WARNING: no projects found in file: " + projects_list_file)
|
|
else:
|
|
json_files_regex_list.append("./**/block_info.json")
|
|
|
|
projects = get_blocks(json_files_regex_list)
|
|
|
|
return projects
|
|
|
|
|
|
def check_block(block, json_file):
|
|
has_error = check_code_block.check_block(
|
|
block, json_file, verbose, all_diagnostics, max_columns,
|
|
force_checks)
|
|
|
|
return has_error
|
|
|
|
|
|
def check_projects(build_dir, projects_list_file=None):
|
|
|
|
check_error = False
|
|
|
|
work_dir = os.getcwd()
|
|
|
|
projects = get_projects(build_dir, projects_list_file)
|
|
|
|
for project in projects:
|
|
|
|
if verbose:
|
|
print(fmt_utils.header("Checking project {}".format(project)))
|
|
print("Number of code blocks: {}".format(len(projects[project])))
|
|
|
|
for block, json_file in projects[project]:
|
|
|
|
if not block.active:
|
|
continue
|
|
|
|
os.chdir(work_dir) # change to work directory using absolute path
|
|
|
|
has_error = check_block(block, json_file)
|
|
|
|
if has_error:
|
|
check_error = True
|
|
|
|
os.chdir(work_dir)
|
|
|
|
return check_error
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument('--build-dir', '-B', type=str, default=None,
|
|
help='Dir in which to build code')
|
|
parser.add_argument('--extracted_projects', type=str, default=None,
|
|
help='JSON file containing list of extracted projects')
|
|
parser.add_argument('--verbose', '-v', action='store_true',
|
|
help='Show more information')
|
|
parser.add_argument('--all-diagnostics', '-A', action='store_true')
|
|
parser.add_argument('--max-columns', type=int, default=0)
|
|
parser.add_argument('--force', '-f', action='store_true',
|
|
help="Force checks even if previous check exists.")
|
|
|
|
args = parser.parse_args()
|
|
|
|
verbose = args.verbose
|
|
all_diagnostics = args.all_diagnostics
|
|
max_columns = args.max_columns
|
|
force_checks = args.force
|
|
extracted_projects = args.extracted_projects
|
|
|
|
if args.build_dir is None and \
|
|
extracted_projects is None:
|
|
print("ERROR: at least --extracted_projects or --build-dir should be specified (or both).")
|
|
exit(1)
|
|
|
|
if extracted_projects:
|
|
extracted_projects = os.path.abspath(extracted_projects)
|
|
|
|
if args.build_dir:
|
|
build_dir = os.path.abspath(args.build_dir)
|
|
else:
|
|
build_dir = os.path.dirname(extracted_projects)
|
|
if build_dir == '': ## Special case: no directory in path
|
|
build_dir = os.getcwd()
|
|
if verbose:
|
|
print("Build directory is set to: " + build_dir)
|
|
|
|
test_error = check_projects(build_dir, extracted_projects)
|
|
|
|
if test_error:
|
|
fmt_utils.simple_error("TEST ERROR")
|
|
exit(1)
|
|
elif verbose:
|
|
fmt_utils.simple_success("TEST SUCCESS")
|
|
|