88
99import os
1010import csv
11+ import json
1112import sys
1213import psutil
1314
1920from util .pathfilter import PathMgr , FilterPathUtil
2021from util .textutil import CommentsManager
2122from util .logutil import LogPrinter
23+ from util .configlib import ConfigReader
2224from node .app import settings
2325from task .authcheck .check_license import __lu__
2426
@@ -125,10 +127,40 @@ def check(self, files=None, want_suffix=None, force_all=False, method_mode=False
125127 ]
126128 if method_mode :
127129 options .append ("-m" )
130+
131+ # 默认开启所有规则
132+ # 支持指定规则,使用配置文件的方式,以下是demo
133+ # {
134+ # "enableCheckers": {
135+ # "GoFuncVisitor": {},
136+ # "JavaScriptFuncVisitor": {
137+ # "ignoreNestingMethods": true
138+ # }
139+ # }
140+ # }
141+ config = dict ()
142+ enable_rules = dict ()
143+ rule_list = self .params .get ("rule_list" , list ())
144+ for rule in rule_list :
145+ # 因为有这个字段但本身就是None,所以返回None
146+ rule_params = rule .get ("params" )
147+ if rule_params is None :
148+ rule_params = ""
149+ if f"[{ self .tool_name .lower ()} ]" not in rule_params :
150+ rule_params = f"[{ self .tool_name .lower ()} ]\r \n " + rule_params
151+ rule_params_dict = ConfigReader (cfg_string = rule_params ).read (self .tool_name .lower ())
152+ enable_rules [rule ["name" ]] = rule_params_dict
153+ config ["enableCheckers" ] = enable_rules
154+ config_path = os .path .join (self .work_dir , f"{ self .tool_name } _config.json" )
155+ with open (config_path , "w" ) as f :
156+ json .dump (config , f , indent = 2 )
157+ options .extend (["-c" , config_path ])
158+
128159 scan_cmd = self .get_cmd (options )
129160
130161 spc = SubProcController (
131162 scan_cmd ,
163+ cwd = self .tool_home ,
132164 stdout_line_callback = subprocc_log ,
133165 stderr_line_callback = subprocc_log ,
134166 )
@@ -171,8 +203,9 @@ def get_issue(self, output):
171203 if not output or not os .path .exists (output ):
172204 return
173205
206+ relpos = len (self .params .source_dir ) + 1
174207 rules = self .params .get ("rules" , list ())
175-
208+
176209 f = open (output , "r" , encoding = "utf-8" )
177210 fieldnames = (
178211 "checker" ,
@@ -185,19 +218,33 @@ def get_issue(self, output):
185218 reader = csv .DictReader (csv_f , fieldnames )
186219 next (reader )
187220 for row in reader :
188- path = row ["path" ]
221+ path = row ["path" ][ relpos :]
189222 line = int (row ["line" ])
190223 column = int (row ["column" ])
191224 rule = row ["checker" ]
192225 if rule not in rules :
193226 continue
194227 msg = row ["description" ]
228+
229+ row_refs = row [None ]
230+ refs = list ()
231+ for ref in row_refs :
232+ parts = ref .split (":" )
233+ refs .append (
234+ {
235+ "line" : parts [2 ],
236+ "column" : parts [3 ],
237+ "msg" : parts [0 ],
238+ "path" : parts [1 ][relpos :],
239+ }
240+ )
195241 yield {
196242 "rule" : rule ,
197243 "msg" : msg ,
198244 "path" : path ,
199245 "line" : line ,
200246 "column" : column ,
247+ "refs" : refs ,
201248 }
202249
203250 f .close ()
0 commit comments