Skip to content

Commit

Permalink
use ExtraOptions in codeql commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Esben Sparre Andreasen committed Aug 18, 2020
1 parent c2b7b7f commit 288f49e
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 2 deletions.
32 changes: 32 additions & 0 deletions src/codeql.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,35 @@ test('parse codeql bundle url version', t => {
}
}
});

test('getExtraOptions works for explicit paths', t => {
t.deepEqual(codeql.getExtraOptions({}, ['foo'], []), []);

t.deepEqual(codeql.getExtraOptions({foo: [42]}, ['foo'], []), ['42']);

t.deepEqual(codeql.getExtraOptions({foo: {bar: [42]}}, ['foo', 'bar'], []), ['42']);
});

test('getExtraOptions works for wildcards', t => {
t.deepEqual(codeql.getExtraOptions({'*': [42]}, ['foo'], []), ['42']);
});

test('getExtraOptions works for wildcards and explicit paths', t => {
let o1 = {'*': [42], foo: [87]};
t.deepEqual(codeql.getExtraOptions(o1, ['foo'], []), ['42', '87']);

let o2 = {'*': [42], foo: [87]};
t.deepEqual(codeql.getExtraOptions(o2, ['foo', 'bar'], []), ['42']);

let o3 = {'*': [42], foo: { '*': [87], bar: [99]}};
let p = ['foo', 'bar'];
t.deepEqual(codeql.getExtraOptions(o3, p, []), ['42', '87', '99']);
});

test('getExtraOptions throws for bad content', t => {
t.throws(() => codeql.getExtraOptions({'*': 42}, ['foo'], []));

t.throws(() => codeql.getExtraOptions({foo: 87}, ['foo'], []));

t.throws(() => codeql.getExtraOptions({'*': [42], foo: { '*': 87, bar: [99]}}, ['foo', 'bar'], []));
});
68 changes: 66 additions & 2 deletions src/codeql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@ function getCodeQLForCmd(cmd: string): CodeQL {
'trace-command',
databasePath,
...compilerSpecArg,
...getExtraOptionsFromEnv(['database', 'trace-command']),
process.execPath,
path.resolve(__dirname, 'tracer-env.js'),
envFile
Expand All @@ -320,6 +321,7 @@ function getCodeQLForCmd(cmd: string): CodeQL {
databasePath,
'--language=' + language,
'--source-root=' + sourceRoot,
...getExtraOptionsFromEnv(['database', 'init']),
]);
},
runAutobuild: async function(language: string) {
Expand All @@ -345,7 +347,8 @@ function getCodeQLForCmd(cmd: string): CodeQL {
'resolve',
'extractor',
'--format=json',
'--language=' + language
'--language=' + language,
...getExtraOptionsFromEnv(['resolve', 'extractor']),
],
{
silent: true,
Expand All @@ -363,6 +366,7 @@ function getCodeQLForCmd(cmd: string): CodeQL {
await exec.exec(cmd, [
'database',
'trace-command',
...getExtraOptionsFromEnv(['database', 'trace-command']),
databasePath,
'--',
traceCommand
Expand All @@ -372,6 +376,7 @@ function getCodeQLForCmd(cmd: string): CodeQL {
await exec.exec(cmd, [
'database',
'finalize',
...getExtraOptionsFromEnv(['database', 'finalize']),
databasePath
]);
},
Expand All @@ -380,7 +385,8 @@ function getCodeQLForCmd(cmd: string): CodeQL {
'resolve',
'queries',
...queries,
'--format=bylanguage'
'--format=bylanguage',
...getExtraOptionsFromEnv(['resolve', 'queries'])
];
if (extraSearchPath !== undefined) {
codeqlArgs.push('--search-path', extraSearchPath);
Expand All @@ -406,6 +412,7 @@ function getCodeQLForCmd(cmd: string): CodeQL {
'--format=sarif-latest',
'--output=' + sarifFile,
'--no-sarif-add-snippets',
...getExtraOptionsFromEnv(['database', 'analyze']),
querySuite
]);
}
Expand All @@ -419,3 +426,60 @@ export function isTracedLanguage(language: string): boolean {
export function isScannedLanguage(language: string): boolean {
return !isTracedLanguage(language);
}

/**
* Gets the options for `path` of `options` as an array of extra option strings.
*/
function getExtraOptionsFromEnv(path: string[]) {
let options: ExtraOptions = util.getExtraOptionsEnvParam();
return getExtraOptions(options, path, []);
}

/**
* Gets the options for `path` of `options` as an array of extra option strings.
*
* - the special terminal step name '*' in `options` matches all path steps
* - throws an exception if this conversion is impossible.
*/
export /* exported for testing */ function getExtraOptions(
options: any,
path: string[],
pathInfo: string[]): string[] {
/**
* Gets `options` as an array of extra option strings.
*
* - throws an exception mentioning `pathInfo` if this conversion is impossible.
*/
function asExtraOptions(options: any, pathInfo: string[]): string[] {
if (options === undefined) {
return [];
}
if (!Array.isArray(options)) {
const msg =
'The extra options for `' +
pathInfo.join('.') +
'` (`' +
JSON.stringify(options) +
'`) are not in an array.';
throw new Error(msg);
}
return options.map(o => {
const t = typeof o;
if (t !== 'string' && t !== 'number' && t !== 'boolean') {
const msg =
'The extra option for `' +
pathInfo.join('.') +
'` (`' +
JSON.stringify(o) +
'`) is not a primitive value.';
throw new Error(msg);
}
return o + '';
});
}
let all = asExtraOptions(options?.['*'], pathInfo.concat('*'));
let specific = path.length === 0 ?
asExtraOptions(options, pathInfo) :
getExtraOptions(options?.[path[0]], path?.slice(1), pathInfo.concat(path[0]));
return all.concat(specific);
}

0 comments on commit 288f49e

Please sign in to comment.