Skip to content

Commit 1909517

Browse files
committed
added rule_id to sarif-to-table
1 parent 8741e12 commit 1909517

1 file changed

Lines changed: 31 additions & 28 deletions

File tree

bin/sarif-to-table

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import sarif_cli.traverse as S
55
import sys
66
import sqlite3
77
import hashlib
8-
import json as pyjson
98

109
# --------------------------------------------------------------------
1110
# Argument parsing
@@ -39,21 +38,16 @@ if not S.is_sarif_struct(sarif_struct):
3938
# Compute unique id (tool version, git commit, date)
4039
# --------------------------------------------------------------------
4140
def compute_unique_id(sarif_struct, runi, sarif_file):
42-
try:
43-
tool_version = S.get(sarif_struct, 'runs', runi, 'tool', 'driver', 'version')
44-
except Exception:
45-
tool_version = None
46-
try:
47-
revision_id = S.get(sarif_struct, 'runs', runi, 'versionControlProvenance', 0, 'revisionId')
48-
except Exception:
49-
revision_id = None
50-
try:
51-
start_time = S.get(sarif_struct, 'runs', runi, 'invocations', 0, 'startTimeUtc')
52-
except Exception:
53-
start_time = None
41+
def _safeget(*path):
42+
try:
43+
return S.get(*path)
44+
except Exception:
45+
return None
46+
tool_version = _safeget(sarif_struct, 'runs', runi, 'tool', 'driver', 'version')
47+
revision_id = _safeget(sarif_struct, 'runs', runi, 'versionControlProvenance', 0, 'revisionId')
48+
start_time = _safeget(sarif_struct, 'runs', runi, 'invocations', 0, 'startTimeUtc')
5449
seed = f"{tool_version or ''}|{revision_id or ''}|{start_time or ''}|{sarif_file}"
55-
h = hashlib.sha1(seed.encode('utf-8')).hexdigest()
56-
return h
50+
return hashlib.sha1(seed.encode('utf-8')).hexdigest()
5751

5852
# --------------------------------------------------------------------
5953
# Define keep_with_context inside S
@@ -79,13 +73,15 @@ def _init_db(dbfile):
7973
line_num INTEGER,
8074
msg_type TEXT,
8175
message TEXT,
82-
source_line TEXT
76+
source_line TEXT,
77+
rule_id TEXT
8378
);
8479
""")
8580
cur.execute("CREATE INDEX IF NOT EXISTS idx_artifact_uri ON sarif_results(artifact_uri);")
8681
cur.execute("CREATE INDEX IF NOT EXISTS idx_runi_resi ON sarif_results(runi, resi);")
8782
cur.execute("CREATE INDEX IF NOT EXISTS idx_msg_type ON sarif_results(msg_type);")
8883
cur.execute("CREATE INDEX IF NOT EXISTS idx_unique_id ON sarif_results(unique_id);")
84+
cur.execute("CREATE INDEX IF NOT EXISTS idx_rule_id ON sarif_results(rule_id);")
8985
conn.commit()
9086
return conn
9187

@@ -101,10 +97,10 @@ def _flush_buffer():
10197
cur.executemany("""
10298
INSERT INTO sarif_results (
10399
sarif_file, unique_id, runi, resi, codefi, threadi, loci, related_index,
104-
artifact_uri, l1, c1, l2, c2, line_num, msg_type, message, source_line
100+
artifact_uri, l1, c1, l2, c2, line_num, msg_type, message, source_line, rule_id
105101
) VALUES (
106102
:sarif_file, :unique_id, :runi, :resi, :codefi, :threadi, :loci, :related_index,
107-
:artifact_uri, :l1, :c1, :l2, :c2, :line_num, :msg_type, :message, :source_line
103+
:artifact_uri, :l1, :c1, :l2, :c2, :line_num, :msg_type, :message, :source_line, :rule_id
108104
)
109105
""", _buffer)
110106
_conn.commit()
@@ -131,6 +127,13 @@ for runi in S.indices(sarif_struct, 'runs'):
131127
continue
132128
for resi in S.indices(sarif_struct, 'runs', runi, 'results'):
133129
result = S.get(sarif_struct, 'runs', runi, 'results', resi)
130+
rule_id = result.get("ruleId")
131+
if not rule_id:
132+
try:
133+
rule_id = S.get(result, "rule", "id")
134+
except Exception:
135+
rule_id = None
136+
134137
# ---------------- Locations (non-path problems)
135138
if 'locations' in result:
136139
message, artifact, region = S.get_location_message_info(result)
@@ -147,7 +150,7 @@ for runi in S.indices(sarif_struct, 'runs'):
147150
"artifact_uri": artifact.get('uri', ''),
148151
"l1": l1, "c1": c1, "l2": l2, "c2": c2,
149152
"line_num": None, "msg_type": "RESULT",
150-
"message": message, "source_line": ""
153+
"message": message, "source_line": "", "rule_id": rule_id
151154
})
152155

153156
if region != S.WholeFile and args.list_source:
@@ -161,7 +164,7 @@ for runi in S.indices(sarif_struct, 'runs'):
161164
"artifact_uri": artifact.get('uri', ''),
162165
"l1": l1, "c1": c1, "l2": l2, "c2": c2,
163166
"line_num": line_num, "msg_type": "SOURCE",
164-
"message": message, "source_line": line
167+
"message": message, "source_line": line, "rule_id": rule_id
165168
})
166169

167170
if args.related_locations:
@@ -178,7 +181,7 @@ for runi in S.indices(sarif_struct, 'runs'):
178181
"loci": None, "related_index": relo_index,
179182
"artifact_uri": "", "l1": -1, "c1": -1, "l2": -1, "c2": -1,
180183
"line_num": None, "msg_type": "REFERENCE",
181-
"message": message, "source_line": ""
184+
"message": message, "source_line": "", "rule_id": rule_id
182185
})
183186
else:
184187
if region == S.WholeFile:
@@ -195,7 +198,7 @@ for runi in S.indices(sarif_struct, 'runs'):
195198
"artifact_uri": artifact.get('uri', ''),
196199
"l1": l1, "c1": c1, "l2": l2, "c2": c2,
197200
"line_num": None, "msg_type": "REFERENCE",
198-
"message": message, "source_line": ""
201+
"message": message, "source_line": "", "rule_id": rule_id
199202
})
200203
if args.list_source:
201204
lines = S.load_lines(args.list_source, artifact['uri'], l1, l2)
@@ -209,7 +212,7 @@ for runi in S.indices(sarif_struct, 'runs'):
209212
"artifact_uri": artifact.get('uri', ''),
210213
"l1": l1, "c1": c1, "l2": l2, "c2": c2,
211214
"line_num": line_num, "msg_type": "SOURCE",
212-
"message": message, "source_line": line
215+
"message": message, "source_line": line, "rule_id": rule_id
213216
})
214217

215218
# ---------------- CodeFlows (path problems)
@@ -224,7 +227,7 @@ for runi in S.indices(sarif_struct, 'runs'):
224227
"threadi": None, "loci": None, "related_index": None,
225228
"artifact_uri": "", "l1": -1, "c1": -1, "l2": -1, "c2": -1,
226229
"line_num": None, "msg_type": "PATH",
227-
"message": "", "source_line": ""
230+
"message": "", "source_line": "", "rule_id": rule_id
228231
})
229232

230233
for threadi in S.indices(codeFlow, 'threadFlows'):
@@ -253,7 +256,7 @@ for runi in S.indices(sarif_struct, 'runs'):
253256
"loci": loci, "related_index": None,
254257
"artifact_uri": "", "l1": -1, "c1": -1, "l2": -1, "c2": -1,
255258
"line_num": None, "msg_type": "FLOW_STEP",
256-
"message": message, "source_line": ""
259+
"message": message, "source_line": "", "rule_id": rule_id
257260
})
258261
else:
259262
if region == S.WholeFile:
@@ -270,7 +273,7 @@ for runi in S.indices(sarif_struct, 'runs'):
270273
"artifact_uri": artifact.get('uri', ''),
271274
"l1": l1, "c1": c1, "l2": l2, "c2": c2,
272275
"line_num": None, "msg_type": "FLOW_STEP",
273-
"message": message, "source_line": ""
276+
"message": message, "source_line": "", "rule_id": rule_id
274277
})
275278
if args.list_source:
276279
lines = S.load_lines(args.list_source, artifact['uri'], l1, l2)
@@ -284,7 +287,7 @@ for runi in S.indices(sarif_struct, 'runs'):
284287
"artifact_uri": artifact.get('uri', ''),
285288
"l1": l1, "c1": c1, "l2": l2, "c2": c2,
286289
"line_num": line_num, "msg_type": "SOURCE",
287-
"message": message, "source_line": line
290+
"message": message, "source_line": line, "rule_id": rule_id
288291
})
289292
last_codeFlow = codeFlow
290293
S.msg("\n")
@@ -294,5 +297,5 @@ for runi in S.indices(sarif_struct, 'runs'):
294297
"codefi": None, "threadi": None, "loci": None, "related_index": None,
295298
"artifact_uri": "", "l1": -1, "c1": -1, "l2": -1, "c2": -1,
296299
"line_num": None, "msg_type": "NEWLINE",
297-
"message": "", "source_line": ""
300+
"message": "", "source_line": "", "rule_id": rule_id
298301
})

0 commit comments

Comments
 (0)