55
66token = sys .argv [1 ]
77endpoint = sys .argv [2 ]
8- exclude = sys .argv [3 ]
8+ exclude = sys .argv [3 ] if len (sys .argv ) > 3 else ""
9+ build_mode_manual_override = sys .argv [4 ] if len (sys .argv ) > 4 else ""
910codeql_languages = ["actions" , "cpp" , "csharp" , "go" , "java" , "javascript" , "python" , "ruby" , "rust" , "typescript" , "kotlin" , "swift" ]
1011
1112
@@ -17,32 +18,93 @@ def get_languages():
1718
1819# Find the intersection of the languages returned by the API and the languages supported by CodeQL
1920def build_languages_list (languages ):
20- languages = [language .lower () for language in languages .keys ()]
21- for i in range (len (languages )):
22- if languages [i ] == "c#" :
23- languages [i ] = ("csharp" )
24- if languages [i ] == "c++" :
25- languages [i ] = ("cpp" )
26- if languages [i ] == "c" :
27- languages [i ] = ("cpp" )
28- if languages [i ] == "typescript" :
29- languages [i ] = ("javascript" )
30- if languages [i ] == "kotlin" :
31- languages [i ] = ("java" )
32- if languages [i ] == "yaml" :
33- languages [i ] = ("actions" )
34- print ("After mapping:" , languages )
35- intersection = list (set (languages ) & set (codeql_languages ))
21+ original_languages = [language .lower () for language in languages .keys ()]
22+ mapped_languages = []
23+ language_mapping = {} # Track mapped language -> list of original languages
24+
25+ for orig_lang in original_languages :
26+ mapped_lang = orig_lang
27+ if orig_lang == "c#" :
28+ mapped_lang = "csharp"
29+ elif orig_lang == "c++" :
30+ mapped_lang = "cpp"
31+ elif orig_lang == "c" :
32+ mapped_lang = "cpp"
33+ elif orig_lang == "typescript" :
34+ mapped_lang = "javascript"
35+ elif orig_lang == "kotlin" :
36+ mapped_lang = "java"
37+ elif orig_lang == "yaml" :
38+ mapped_lang = "actions"
39+
40+ mapped_languages .append (mapped_lang )
41+
42+ # Track all original languages that map to this CodeQL language
43+ if mapped_lang not in language_mapping :
44+ language_mapping [mapped_lang ] = []
45+ language_mapping [mapped_lang ].append (orig_lang )
46+
47+ print ("After mapping:" , mapped_languages )
48+ intersection = list (set (mapped_languages ) & set (codeql_languages ))
3649 print ("Intersection:" , intersection )
37- return intersection
50+ return intersection , language_mapping
3851
3952# return a list of objects from language list if they are not in the exclude list
4053def exclude_languages (language_list ):
54+ if not exclude :
55+ return language_list
4156 excluded = [x .strip () for x in exclude .split (',' )]
4257 output = list (set (language_list ).difference (excluded ))
4358 print ("languages={}" .format (output ))
4459 return output
4560
61+ # Determine build mode for each language
62+ def get_build_mode (language , original_languages = None ):
63+ # Languages that should use manual build mode by default
64+ # Check original languages first if available
65+ if original_languages :
66+ # If any of the original languages require manual build mode, use manual
67+ for orig_lang in original_languages :
68+ if orig_lang in ["kotlin" , "go" , "swift" ]:
69+ manual_by_default = True
70+ break
71+ else :
72+ manual_by_default = False
73+ else :
74+ # Fallback to mapped language check
75+ manual_by_default = language in ["go" , "swift" , "java" ]
76+
77+ # Check if user overrode build mode to manual
78+ if build_mode_manual_override :
79+ override_languages = [x .strip () for x in build_mode_manual_override .split (',' )]
80+ if language in override_languages :
81+ return "manual"
82+ if original_languages :
83+ for orig_lang in original_languages :
84+ if orig_lang in override_languages :
85+ return "manual"
86+
87+ # Use default logic
88+ if manual_by_default :
89+ return "manual"
90+ else :
91+ return "none"
92+
93+ # Build the matrix include format
94+ def build_matrix (language_list , language_mapping ):
95+ include = []
96+ for language in language_list :
97+ original_languages = language_mapping .get (language , [language ])
98+ build_mode = get_build_mode (language , original_languages )
99+ include .append ({
100+ "language" : language ,
101+ "build-mode" : build_mode
102+ })
103+
104+ matrix = {"include" : include }
105+ print ("Matrix:" , matrix )
106+ return matrix
107+
46108# Set the output of the action
47109def set_action_output (output_name , value ) :
48110 if "GITHUB_OUTPUT" in os .environ :
@@ -51,9 +113,12 @@ def set_action_output(output_name, value) :
51113
52114def main ():
53115 languages = get_languages ()
54- language_list = build_languages_list (languages )
55- output = exclude_languages (language_list )
56- set_action_output ("languages" , json .dumps (output ))
116+ language_list , language_mapping = build_languages_list (languages )
117+ filtered_languages = exclude_languages (language_list )
118+ matrix = build_matrix (filtered_languages , language_mapping )
119+ set_action_output ("matrix" , json .dumps (matrix ))
120+ # Keep the old output for backward compatibility
121+ set_action_output ("languages" , json .dumps (filtered_languages ))
57122
58123if __name__ == '__main__' :
59124 main ()
0 commit comments