1#!/usr/bin/env python3
2
3import argparse
4import os
5import sys
6
7import checksymbolslib.file as file
8from checksymbolslib.db import DB
9
10
11def parse_args():
12    parser = argparse.ArgumentParser()
13    parser.add_argument('--search', action='store', default=None,
14                        help='print all symbols matching a given regular expression')
15    return parser.parse_args()
16
17
18def change_to_top_dir():
19    base_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
20    os.chdir(base_dir)
21
22
23def get_full_db(files_to_process):
24    db = DB()
25    for f in files_to_process:
26        file.populate_db_from_file(db, f)
27    return db
28
29
30def print_filenames_with_pattern(all_files, files_to_process, pattern):
31    ignored_filenames = file.get_list_of_filenames_with_pattern(all_files, files_to_process, pattern)
32    processed_filenames = file.get_list_of_filenames_with_pattern(files_to_process, [], pattern)
33    print('========== filenames found with pattern "{}": {}'.format(pattern, len(processed_filenames)))
34    for f in processed_filenames:
35        print(f)
36    print('========== ignored filenames with pattern "{}": {}'.format(pattern, len(ignored_filenames)))
37    for f in ignored_filenames:
38        print(f)
39
40
41def print_symbols_with_pattern(db, pattern):
42    symbols = db.get_symbols_with_pattern(pattern)
43    print('========== symbols with pattern "{}": {}'.format(pattern, len(symbols)))
44    for s in symbols:
45        print(s, str(symbols[s]))
46
47
48def __main__():
49    flags = parse_args()
50
51    change_to_top_dir()
52    all_files = file.get_list_of_files_in_the_repo()
53    files_to_process = file.get_list_of_files_to_process(all_files)
54    db = get_full_db(files_to_process)
55
56    if flags.search:
57        print_filenames_with_pattern(all_files, files_to_process, flags.search)
58        print_symbols_with_pattern(db, flags.search)
59        print('========== warnings:')
60
61    warnings = []
62    warnings += db.get_warnings_for_choices_selected()
63    warnings += db.get_warnings_for_legacy_symbols_being_defined()
64    warnings += db.get_warnings_for_legacy_symbols_being_used()
65    warnings += db.get_warnings_for_symbols_with_legacy_note_and_no_comment_on_usage()
66    warnings += db.get_warnings_for_symbols_with_legacy_note_and_no_usage()
67    warnings += db.get_warnings_for_symbols_without_definition()
68    warnings += db.get_warnings_for_symbols_without_usage()
69
70    for filename, lineno, msg in sorted(warnings):
71        print('{}:{}: {}'.format(filename, lineno, msg), file=sys.stderr)
72
73    if len(warnings) > 0:
74        sys.exit(1)
75
76
77if __name__ == '__main__':
78    __main__()
79