File tree Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Original file line number Diff line number Diff line change
1
+ from pathlib import Path
2
+ import re
3
+ import sys
4
+ from typing import Dict , List , Optional
5
+
6
+ ID = re .compile (r" +\* +@id\s*(.*)" )
7
+
8
+ def get_query_id (query_path : Path ) -> Optional [str ]:
9
+ with open (query_path ) as f :
10
+ for line in f :
11
+ m = ID .match (line )
12
+ if m :
13
+ return m .group (1 )
14
+ return None
15
+
16
+ def main ():
17
+ # Map query IDs to paths of queries with those IDs. We want to check that this is a 1:1 map.
18
+ query_ids : Dict [str , List [str ]] = {}
19
+
20
+ # Just check src folders for now to avoid churn
21
+ for query_path in Path ().glob ("**/src/**/*.ql" ):
22
+ # Skip compiled query packs
23
+ if any (p == ".codeql" for p in query_path .parts ):
24
+ continue
25
+ query_id = get_query_id (query_path )
26
+ if query_id is not None :
27
+ query_ids .setdefault (query_id , []).append (str (query_path ))
28
+
29
+ fail = False
30
+ for query_id , query_paths in query_ids .items ():
31
+ if len (query_paths ) > 1 :
32
+ fail = True
33
+ print (f"Query ID { query_id } is used in multiple queries:" )
34
+ for query_path in query_paths :
35
+ print (f" - { query_path } " )
36
+
37
+ if fail :
38
+ print ("FAIL: duplicate query IDs found in src folders. Please assign these queries unique IDs." )
39
+ sys .exit (1 )
40
+ else :
41
+ print ("PASS: no duplicate query IDs found in src folders." )
42
+
43
+ if __name__ == "__main__" :
44
+ main ()
You can’t perform that action at this time.
0 commit comments