UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

103 lines 4.63 kB
"use strict"; 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; } /** * The core function for the 'flowr stats' script. */ async function flowrScriptGetStats(options, config) { 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 }), config); } } } //# sourceMappingURL=statistics-core.js.map