Skip to content

Commit c8e32e4

Browse files
committed
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.
1 parent 553eef0 commit c8e32e4

4 files changed

Lines changed: 41 additions & 41 deletions

File tree

lib/entry-points.js

Lines changed: 19 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/codeql.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ export interface CodeQL {
126126
/**
127127
* Run 'codeql resolve languages' with '--format=betterjson'.
128128
*/
129-
resolveLanguages(options?: {
130-
filterToLanguagesWithQueries: boolean;
131-
}): Promise<ResolveLanguagesOutput>;
129+
resolveLanguages(): Promise<ResolveLanguagesOutput>;
132130
/**
133131
* Run 'codeql resolve build-environment'
134132
*/
@@ -784,28 +782,30 @@ async function getCodeQLForCmd(
784782
];
785783
await runCli(cmd, args);
786784
},
787-
async resolveLanguages(
788-
{
789-
filterToLanguagesWithQueries,
790-
}: {
791-
filterToLanguagesWithQueries: boolean;
792-
} = { filterToLanguagesWithQueries: false },
793-
) {
785+
async resolveLanguages() {
794786
return getCachedOrRun(
795787
CommandCacheKey.ResolveLanguages,
796788
cmd,
797-
() =>
798-
runCliJson<ResolveLanguagesOutput>(cmd, [
789+
async () => {
790+
const isFilterToLanguagesWithQueriesSupported =
791+
await this.supportsFeature(
792+
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
793+
);
794+
return runCliJson<ResolveLanguagesOutput>(cmd, [
799795
"resolve",
800796
"languages",
801797
"--format=betterjson",
802798
"--extractor-options-verbosity=4",
803799
"--extractor-include-aliases",
804-
...(filterToLanguagesWithQueries
800+
// TODO: Unconditionally include `--filter-to-languages-with-queries`
801+
// once CODEQL_MINIMUM_VERSION is at least v2.23.0
802+
// — the first version to support this flag.
803+
...(isFilterToLanguagesWithQueriesSupported
805804
? ["--filter-to-languages-with-queries"]
806805
: []),
807806
...getExtraOptionsFromEnv(["resolve", "languages"]),
808-
]),
807+
]);
808+
},
809809
isResolveLanguagesOutput,
810810
);
811811
},

src/config-utils.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ const mockRepositoryNwo = parseRepositoryNwo("owner/repo");
891891
extractor_root: "",
892892
};
893893
const codeQL = createStubCodeQL({
894-
resolveLanguages: (options) =>
894+
resolveLanguages: () =>
895895
Promise.resolve({
896896
aliases: {
897897
"c#": BuiltInLanguage.csharp,
@@ -905,11 +905,9 @@ const mockRepositoryNwo = parseRepositoryNwo("owner/repo");
905905
java: [stubExtractorEntry],
906906
javascript: [stubExtractorEntry],
907907
python: [stubExtractorEntry],
908-
...(options?.filterToLanguagesWithQueries
909-
? {}
910-
: {
911-
html: [stubExtractorEntry],
912-
}),
908+
// `html` is an extractor without default queries. It should be
909+
// excluded from the supported language map.
910+
html: [stubExtractorEntry],
913911
},
914912
}),
915913
});

src/config-utils.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,7 @@ async function getSupportedLanguageMap(
266266
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
267267
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
268268
);
269-
const resolveResult = await codeql.resolveLanguages({
270-
filterToLanguagesWithQueries: resolveSupportedLanguagesUsingCli,
271-
});
269+
const resolveResult = await codeql.resolveLanguages();
272270
if (resolveSupportedLanguagesUsingCli) {
273271
logger.debug(
274272
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`,
@@ -277,9 +275,9 @@ async function getSupportedLanguageMap(
277275
const supportedLanguages: Record<string, string> = {};
278276
// Populate canonical language names
279277
for (const extractor of Object.keys(resolveResult.extractors)) {
280-
// If the CLI supports resolving languages with default queries, use these
281-
// as the set of supported languages. Otherwise, require the language to be
282-
// a built-in language.
278+
// TODO: Delete this `if` condition once CODEQL_MINIMUM_VERSION
279+
// is at least v2.23.0 — the first version to support the
280+
// BuiltinExtractorsSpecifyDefaultQueries feature.
283281
if (
284282
resolveSupportedLanguagesUsingCli ||
285283
BuiltInLanguage[extractor] !== undefined

0 commit comments

Comments
 (0)