@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
100 lines • 4.56 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.flowrScriptGetStats = flowrScriptGetStats;
const path_1 = __importDefault(require("path"));
const parallel_1 = require("../../util/parallel");
const files_1 = require("../../util/files");
const features_1 = require("../common/features");
const fs_1 = __importDefault(require("fs"));
const statistics_file_1 = require("../../statistics/output/statistics-file");
const json_1 = require("../../util/json");
const log_1 = require("../../util/log");
const statistics_helper_core_1 = require("./statistics-helper-core");
const command_line_args_1 = __importDefault(require("command-line-args"));
const scripts_info_1 = require("../common/scripts-info");
const ansi_1 = require("../../util/text/ansi");
const testRegex = /[^/]*\/test/i;
const exampleRegex = /[^/]*\/example/i;
function getPrefixForFile(file) {
if (testRegex.test(file)) {
return 'test-';
}
else if (exampleRegex.test(file)) {
return 'example-';
}
else {
return '';
}
}
function getSuffixForFile(base, file) {
const subpath = path_1.default.relative(base, file);
return '--' + subpath.replace(/\//g, '/');
}
async function collectFileArguments(options, verboseAdd, dumpJson, features) {
const files = [];
let counter = 0;
let presentSteps = 5000;
let skipped = 0;
for await (const f of (0, files_1.allRFilesFrom)(options.input)) {
const outputDir = path_1.default.join(options['output-dir'], `${getPrefixForFile(f.content)}${getSuffixForFile(options.input.length === 1 ? options.input[0] : '', f.content)}`);
const target = (0, features_1.retrieveArchiveName)(outputDir);
if (fs_1.default.existsSync(target)) {
console.log(`Archive ${target} exists. Skip.`);
skipped++;
continue;
}
files.push(['--input', f.content, '--output-dir', outputDir, '--compress', '--root-dir', options.input.length === 1 ? options.input[0] : '""', ...verboseAdd, ...features, ...dumpJson]);
if (++counter % presentSteps === 0) {
console.log(`Collected ${counter} files`);
if (counter >= 10 * presentSteps) {
presentSteps *= 5;
}
}
}
console.log(`Total: ${counter} files (${skipped} skipped with archive existing)`);
return files;
}
async function flowrScriptGetStats(options) {
if (options.input.length === 0) {
console.error('No input files given. Nothing to do. See \'--help\' if this is an error.');
process.exit(0);
}
if (options['no-ansi']) {
log_1.log.info('disabling ansi colors');
(0, ansi_1.setFormatter)(ansi_1.voidFormatter);
}
const processedFeatures = (0, features_1.validateFeatures)(options.features);
(0, statistics_file_1.initFileProvider)(options['output-dir']);
console.log(`Processing features: ${JSON.stringify(processedFeatures, json_1.jsonReplacer)}`);
console.log(`Using ${options.parallel} parallel executors`);
const verboseAdd = options.verbose ? ['--verbose'] : [];
const features = [...processedFeatures].flatMap(s => ['--features', s]);
const dumpJson = options['dump-json'] ? ['--dump-json'] : [];
// we do not use the limit argument to be able to pick the limit randomly
const args = await collectFileArguments(options, verboseAdd, dumpJson, features);
if (options.limit) {
console.log('Shuffle...');
log_1.log.info(`limiting to ${options.limit} files`);
// shuffle and limit
args.sort(() => Math.random() - 0.5);
}
console.log('Prepare Pool...');
const limit = options.limit ?? args.length;
if (options.parallel > 0) {
const pool = new parallel_1.LimitedThreadPool(`${__dirname}/statistics-helper-app`, args, limit, options.parallel);
console.log('Run Pool...');
await pool.run();
const stats = pool.getStats();
console.log(`Processed ${stats.counter} files, skipped ${stats.skipped.length} files due to errors`);
}
else {
console.log('Run Sequentially as parallel <= 0...');
for (const arg of args) {
await (0, statistics_helper_core_1.getStatsForSingleFile)((0, command_line_args_1.default)(scripts_info_1.scripts['stats-helper'].options, { argv: arg }));
}
}
}
//# sourceMappingURL=statistics-core.js.map