mirror of
https://github.com/github/codeql-action.git
synced 2026-08-05 04:57:19 -05:00
Refactor resolveLanguages() to cache output according to CLI feature support
The output of `resolveLanguages()` can vary based on whether the flag `--filter-to-languages-with-queries` is included, but not all versions of the CLI support that. This makes caching a single execution problematic, so I opted to cache it based on whether it's supported. If it's supported, it's used; otherwise, it's not.
This commit is contained in:
Generated
+19
-15
@@ -151415,9 +151415,7 @@ async function getSupportedLanguageMap(codeql, logger) {
|
|||||||
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
|
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
|
||||||
"builtinExtractorsSpecifyDefaultQueries" /* BuiltinExtractorsSpecifyDefaultQueries */
|
"builtinExtractorsSpecifyDefaultQueries" /* BuiltinExtractorsSpecifyDefaultQueries */
|
||||||
);
|
);
|
||||||
const resolveResult = await codeql.resolveLanguages({
|
const resolveResult = await codeql.resolveLanguages();
|
||||||
filterToLanguagesWithQueries: resolveSupportedLanguagesUsingCli
|
|
||||||
});
|
|
||||||
if (resolveSupportedLanguagesUsingCli) {
|
if (resolveSupportedLanguagesUsingCli) {
|
||||||
logger.debug(
|
logger.debug(
|
||||||
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`
|
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`
|
||||||
@@ -153931,21 +153929,27 @@ async function getCodeQLForCmd(cmd, checkVersion) {
|
|||||||
];
|
];
|
||||||
await runCli(cmd, args);
|
await runCli(cmd, args);
|
||||||
},
|
},
|
||||||
async resolveLanguages({
|
async resolveLanguages() {
|
||||||
filterToLanguagesWithQueries
|
|
||||||
} = { filterToLanguagesWithQueries: false }) {
|
|
||||||
return getCachedOrRun(
|
return getCachedOrRun(
|
||||||
"resolveLanguages" /* ResolveLanguages */,
|
"resolveLanguages" /* ResolveLanguages */,
|
||||||
cmd,
|
cmd,
|
||||||
() => runCliJson(cmd, [
|
async () => {
|
||||||
"resolve",
|
const isFilterToLanguagesWithQueriesSupported = await this.supportsFeature(
|
||||||
"languages",
|
"builtinExtractorsSpecifyDefaultQueries" /* BuiltinExtractorsSpecifyDefaultQueries */
|
||||||
"--format=betterjson",
|
);
|
||||||
"--extractor-options-verbosity=4",
|
return runCliJson(cmd, [
|
||||||
"--extractor-include-aliases",
|
"resolve",
|
||||||
...filterToLanguagesWithQueries ? ["--filter-to-languages-with-queries"] : [],
|
"languages",
|
||||||
...getExtraOptionsFromEnv(["resolve", "languages"])
|
"--format=betterjson",
|
||||||
]),
|
"--extractor-options-verbosity=4",
|
||||||
|
"--extractor-include-aliases",
|
||||||
|
// TODO: Unconditionally include `--filter-to-languages-with-queries`
|
||||||
|
// once CODEQL_MINIMUM_VERSION is at least v2.23.0
|
||||||
|
// — the first version to support this flag.
|
||||||
|
...isFilterToLanguagesWithQueriesSupported ? ["--filter-to-languages-with-queries"] : [],
|
||||||
|
...getExtraOptionsFromEnv(["resolve", "languages"])
|
||||||
|
]);
|
||||||
|
},
|
||||||
isResolveLanguagesOutput
|
isResolveLanguagesOutput
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
+14
-14
@@ -126,9 +126,7 @@ export interface CodeQL {
|
|||||||
/**
|
/**
|
||||||
* Run 'codeql resolve languages' with '--format=betterjson'.
|
* Run 'codeql resolve languages' with '--format=betterjson'.
|
||||||
*/
|
*/
|
||||||
resolveLanguages(options?: {
|
resolveLanguages(): Promise<ResolveLanguagesOutput>;
|
||||||
filterToLanguagesWithQueries: boolean;
|
|
||||||
}): Promise<ResolveLanguagesOutput>;
|
|
||||||
/**
|
/**
|
||||||
* Run 'codeql resolve build-environment'
|
* Run 'codeql resolve build-environment'
|
||||||
*/
|
*/
|
||||||
@@ -784,28 +782,30 @@ async function getCodeQLForCmd(
|
|||||||
];
|
];
|
||||||
await runCli(cmd, args);
|
await runCli(cmd, args);
|
||||||
},
|
},
|
||||||
async resolveLanguages(
|
async resolveLanguages() {
|
||||||
{
|
|
||||||
filterToLanguagesWithQueries,
|
|
||||||
}: {
|
|
||||||
filterToLanguagesWithQueries: boolean;
|
|
||||||
} = { filterToLanguagesWithQueries: false },
|
|
||||||
) {
|
|
||||||
return getCachedOrRun(
|
return getCachedOrRun(
|
||||||
CommandCacheKey.ResolveLanguages,
|
CommandCacheKey.ResolveLanguages,
|
||||||
cmd,
|
cmd,
|
||||||
() =>
|
async () => {
|
||||||
runCliJson<ResolveLanguagesOutput>(cmd, [
|
const isFilterToLanguagesWithQueriesSupported =
|
||||||
|
await this.supportsFeature(
|
||||||
|
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
|
||||||
|
);
|
||||||
|
return runCliJson<ResolveLanguagesOutput>(cmd, [
|
||||||
"resolve",
|
"resolve",
|
||||||
"languages",
|
"languages",
|
||||||
"--format=betterjson",
|
"--format=betterjson",
|
||||||
"--extractor-options-verbosity=4",
|
"--extractor-options-verbosity=4",
|
||||||
"--extractor-include-aliases",
|
"--extractor-include-aliases",
|
||||||
...(filterToLanguagesWithQueries
|
// TODO: Unconditionally include `--filter-to-languages-with-queries`
|
||||||
|
// once CODEQL_MINIMUM_VERSION is at least v2.23.0
|
||||||
|
// — the first version to support this flag.
|
||||||
|
...(isFilterToLanguagesWithQueriesSupported
|
||||||
? ["--filter-to-languages-with-queries"]
|
? ["--filter-to-languages-with-queries"]
|
||||||
: []),
|
: []),
|
||||||
...getExtraOptionsFromEnv(["resolve", "languages"]),
|
...getExtraOptionsFromEnv(["resolve", "languages"]),
|
||||||
]),
|
]);
|
||||||
|
},
|
||||||
isResolveLanguagesOutput,
|
isResolveLanguagesOutput,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -891,7 +891,7 @@ const mockRepositoryNwo = parseRepositoryNwo("owner/repo");
|
|||||||
extractor_root: "",
|
extractor_root: "",
|
||||||
};
|
};
|
||||||
const codeQL = createStubCodeQL({
|
const codeQL = createStubCodeQL({
|
||||||
resolveLanguages: (options) =>
|
resolveLanguages: () =>
|
||||||
Promise.resolve({
|
Promise.resolve({
|
||||||
aliases: {
|
aliases: {
|
||||||
"c#": BuiltInLanguage.csharp,
|
"c#": BuiltInLanguage.csharp,
|
||||||
@@ -905,11 +905,9 @@ const mockRepositoryNwo = parseRepositoryNwo("owner/repo");
|
|||||||
java: [stubExtractorEntry],
|
java: [stubExtractorEntry],
|
||||||
javascript: [stubExtractorEntry],
|
javascript: [stubExtractorEntry],
|
||||||
python: [stubExtractorEntry],
|
python: [stubExtractorEntry],
|
||||||
...(options?.filterToLanguagesWithQueries
|
// `html` is an extractor without default queries. It should be
|
||||||
? {}
|
// excluded from the supported language map.
|
||||||
: {
|
html: [stubExtractorEntry],
|
||||||
html: [stubExtractorEntry],
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
+4
-6
@@ -266,9 +266,7 @@ async function getSupportedLanguageMap(
|
|||||||
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
|
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
|
||||||
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
|
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
|
||||||
);
|
);
|
||||||
const resolveResult = await codeql.resolveLanguages({
|
const resolveResult = await codeql.resolveLanguages();
|
||||||
filterToLanguagesWithQueries: resolveSupportedLanguagesUsingCli,
|
|
||||||
});
|
|
||||||
if (resolveSupportedLanguagesUsingCli) {
|
if (resolveSupportedLanguagesUsingCli) {
|
||||||
logger.debug(
|
logger.debug(
|
||||||
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`,
|
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`,
|
||||||
@@ -277,9 +275,9 @@ async function getSupportedLanguageMap(
|
|||||||
const supportedLanguages: Record<string, string> = {};
|
const supportedLanguages: Record<string, string> = {};
|
||||||
// Populate canonical language names
|
// Populate canonical language names
|
||||||
for (const extractor of Object.keys(resolveResult.extractors)) {
|
for (const extractor of Object.keys(resolveResult.extractors)) {
|
||||||
// If the CLI supports resolving languages with default queries, use these
|
// TODO: Delete this `if` condition once CODEQL_MINIMUM_VERSION
|
||||||
// as the set of supported languages. Otherwise, require the language to be
|
// is at least v2.23.0 — the first version to support the
|
||||||
// a built-in language.
|
// BuiltinExtractorsSpecifyDefaultQueries feature.
|
||||||
if (
|
if (
|
||||||
resolveSupportedLanguagesUsingCli ||
|
resolveSupportedLanguagesUsingCli ||
|
||||||
BuiltInLanguage[extractor] !== undefined
|
BuiltInLanguage[extractor] !== undefined
|
||||||
|
|||||||
Reference in New Issue
Block a user