Skip to content

Commit 00ef217

Browse files
benchmark: refactor args parsing code (#2971)
1 parent c581573 commit 00ef217

File tree

1 file changed

+40
-47
lines changed

1 file changed

+40
-47
lines changed

benchmark/benchmark.js

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ const maxTime = 5;
1414
// The minimum sample size required to perform statistical analysis.
1515
const minSamples = 5;
1616

17+
// Get the revisions and make things happen!
18+
if (require.main === module) {
19+
const { benchmarks, revisions } = getArguments(process.argv.slice(2));
20+
const benchmarkProjects = prepareBenchmarkProjects(revisions);
21+
22+
runBenchmarks(benchmarks, benchmarkProjects).catch((error) => {
23+
console.error(error);
24+
process.exit(1);
25+
});
26+
}
27+
1728
function localDir(...paths) {
1829
return path.join(__dirname, '..', ...paths);
1930
}
@@ -31,17 +42,16 @@ function exec(command, options = {}) {
3142
// and returns path to its 'dist' directory.
3243
function prepareBenchmarkProjects(revisionList) {
3344
const tmpDir = path.join(os.tmpdir(), 'graphql-js-benchmark');
34-
fs.rmdirSync(tmpDir, { recursive: true, force: true });
45+
fs.rmSync(tmpDir, { recursive: true, force: true });
3546
fs.mkdirSync(tmpDir);
3647

3748
const setupDir = path.join(tmpDir, 'setup');
38-
fs.rmdirSync(setupDir, { recursive: true, force: true });
3949
fs.mkdirSync(setupDir);
4050

4151
return revisionList.map((revision) => {
4252
console.log(`🍳 Preparing ${revision}...`);
4353
const projectPath = path.join(setupDir, revision);
44-
fs.rmdirSync(projectPath, { recursive: true });
54+
fs.rmSync(projectPath, { recursive: true, force: true });
4555
fs.mkdirSync(projectPath);
4656

4757
fs.writeFileSync(
@@ -73,12 +83,12 @@ function prepareBenchmarkProjects(revisionList) {
7383
}
7484

7585
const repoDir = path.join(tmpDir, hash);
76-
fs.rmdirSync(repoDir, { recursive: true, force: true });
86+
fs.rmSync(repoDir, { recursive: true, force: true });
7787
fs.mkdirSync(repoDir);
7888
exec(`git archive "${hash}" | tar -xC "${repoDir}"`);
7989
exec('npm --quiet ci', { cwd: repoDir });
8090
fs.renameSync(buildNPMArchive(repoDir), archivePath);
81-
fs.rmdirSync(repoDir, { recursive: true, force: true });
91+
fs.rmSync(repoDir, { recursive: true });
8292
return archivePath;
8393
}
8494

@@ -230,9 +240,7 @@ function maxBy(array, fn) {
230240
}
231241

232242
// Prepare all revisions and run benchmarks matching a pattern against them.
233-
async function runBenchmarks(benchmarks, revisions) {
234-
const benchmarkProjects = prepareBenchmarkProjects(revisions);
235-
243+
async function runBenchmarks(benchmarks, benchmarkProjects) {
236244
for (const benchmark of benchmarks) {
237245
const results = [];
238246
for (let i = 0; i < benchmarkProjects.length; ++i) {
@@ -266,31 +274,36 @@ async function runBenchmarks(benchmarks, revisions) {
266274

267275
function getArguments(argv) {
268276
const revsIdx = argv.indexOf('--revs');
269-
const revsArgs = revsIdx === -1 ? [] : argv.slice(revsIdx + 1);
270-
const specificBenchmarks = revsIdx === -1 ? argv : argv.slice(0, revsIdx);
271-
let assumeArgs;
272-
let revisions;
273-
switch (revsArgs.length) {
277+
const revisions = revsIdx === -1 ? [] : argv.slice(revsIdx + 1);
278+
const benchmarks = revsIdx === -1 ? argv : argv.slice(0, revsIdx);
279+
280+
switch (revisions.length) {
274281
case 0:
275-
assumeArgs = [...specificBenchmarks, '--revs', 'local', 'HEAD'];
276-
revisions = [LOCAL, 'HEAD'];
277-
break;
278-
case 1:
279-
assumeArgs = [...specificBenchmarks, '--revs', 'local', revsArgs[0]];
280-
revisions = [LOCAL, revsArgs[0]];
281-
break;
282-
default:
283-
revisions = revsArgs;
282+
revisions.unshift('HEAD');
283+
// fall through
284+
case 1: {
285+
revisions.unshift('local');
286+
287+
const assumeArgv = ['benchmark', ...benchmarks, '--revs', ...revisions];
288+
console.warn('Assuming you meant: ' + bold(assumeArgv.join(' ')));
284289
break;
290+
}
285291
}
286292

287-
if (assumeArgs) {
288-
console.warn(
289-
'Assuming you meant: ' + bold('benchmark ' + assumeArgs.join(' ')),
290-
);
293+
if (benchmarks.length === 0) {
294+
benchmarks.push(...findAllBenchmarks());
291295
}
292296

293-
return { specificBenchmarks, revisions };
297+
return { benchmarks, revisions };
298+
}
299+
300+
function findAllBenchmarks() {
301+
return fs
302+
.readdirSync(localDir('benchmark'), { withFileTypes: true })
303+
.filter((dirent) => dirent.isFile())
304+
.map((dirent) => dirent.name)
305+
.filter((name) => name.endsWith('-benchmark.js'))
306+
.map((name) => path.join('benchmark', name));
294307
}
295308

296309
function bold(str) {
@@ -317,26 +330,6 @@ function grey(str) {
317330
return '\u001b[90m' + str + '\u001b[0m';
318331
}
319332

320-
function findAllBenchmarks() {
321-
return fs
322-
.readdirSync(localDir('benchmark'), { withFileTypes: true })
323-
.filter((dirent) => dirent.isFile())
324-
.map((dirent) => dirent.name)
325-
.filter((name) => name.endsWith('-benchmark.js'))
326-
.map((name) => path.join('benchmark', name));
327-
}
328-
329-
// Get the revisions and make things happen!
330-
if (require.main === module) {
331-
const { specificBenchmarks, revisions } = getArguments(process.argv.slice(2));
332-
const benchmarks =
333-
specificBenchmarks.length > 0 ? specificBenchmarks : findAllBenchmarks();
334-
runBenchmarks(benchmarks, revisions).catch((error) => {
335-
console.error(error);
336-
process.exit(1);
337-
});
338-
}
339-
340333
function sampleModule(modulePath) {
341334
const sampleCode = `
342335
const assert = require('assert');

0 commit comments

Comments
 (0)