对单个代码文件进行正则匹配 :param source_dir: 项目代码根目录 :param file_path: 单个代码文件路径 :param rules: { rule_name: { 'reg_pattern': reg_pattern, 'exclude': exclude_paths, 'include': include_paths, 'msg': msg,
(source_dir, file_path, rules)
| 61 | |
| 62 | @staticmethod |
| 63 | def scan_file(source_dir, file_path, rules): |
| 64 | """对单个代码文件进行正则匹配 |
| 65 | :param source_dir: 项目代码根目录 |
| 66 | :param file_path: 单个代码文件路径 |
| 67 | :param rules: { |
| 68 | rule_name: { |
| 69 | 'reg_pattern': reg_pattern, |
| 70 | 'exclude': exclude_paths, |
| 71 | 'include': include_paths, |
| 72 | 'msg': msg, |
| 73 | 'ignore_comment': True|False |
| 74 | } |
| 75 | } |
| 76 | :return: [{ |
| 77 | "path":文件相对路径, |
| 78 | "line":行号, |
| 79 | "column":列号, |
| 80 | "msg":提示信息, |
| 81 | "rule":规则名 |
| 82 | }, |
| 83 | ... |
| 84 | ] |
| 85 | """ |
| 86 | source_dir = source_dir.replace(os.sep, '/').rstrip('/') |
| 87 | file_path = file_path.replace(os.sep, '/') |
| 88 | relpos = len(source_dir) + 1 |
| 89 | relative_path = file_path[relpos:] |
| 90 | rules_exclude_comment = {} |
| 91 | rules_include_comment = {} |
| 92 | |
| 93 | for rule_name, params in rules.items(): |
| 94 | filter_util = WildcardPathFilter(path_include=params['include'], path_exclude=params['exclude']) |
| 95 | if filter_util.should_filter_path(relative_path): |
| 96 | continue |
| 97 | if params['ignore_comment']: |
| 98 | rules_exclude_comment[rule_name] = params |
| 99 | else: |
| 100 | rules_include_comment[rule_name] = params |
| 101 | if not rules_exclude_comment and not rules_include_comment: |
| 102 | return [] |
| 103 | results = [] |
| 104 | if not os.path.isfile(file_path): |
| 105 | logger.debug("%s is not a file,filter!" % file_path) |
| 106 | return [] |
| 107 | with io.open(file_path, 'rb') as fp: |
| 108 | file_text = CodecClient().decode(fp.read()) |
| 109 | if rules_exclude_comment: |
| 110 | code_nocomment = CommentsManager(file_path, file_text).remove_comments() |
| 111 | issues = RegexScanner.scan_file_text(relative_path, code_nocomment, rules_exclude_comment) |
| 112 | results.extend(issues) |
| 113 | if rules_include_comment: |
| 114 | issues = RegexScanner.scan_file_text(relative_path, file_text, rules_include_comment) |
| 115 | results.extend(issues) |
| 116 | return results |
| 117 | |
| 118 | @staticmethod |
| 119 | def scan_file_text(rel_path, file_text, rules): |
no test coverage detected