UNPKG

grading

Version:

Grading of student submissions, in particular programming tests.

90 lines 5.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.cmdPrepareAsPrevious = void 0; const path_1 = __importDefault(require("path")); const fsUtil_1 = require("../fsUtil"); const cliUtil_1 = require("./cliUtil"); const cmdCheck_1 = require("./cmdCheck"); async function cmdPrepareAsPrevious(zipFile, options) { (0, cliUtil_1.verbosity)(options); (0, cliUtil_1.log)("Prepare submissions to be used as previous submissions in plagiary tool"); try { zipFile = await (0, cliUtil_1.retrieveZipFile)(zipFile, options); await (0, fsUtil_1.ensureFileExists)(zipFile, "Check zip file."); const dry = options.dry; const prevProjectsDir = options.prevProjectsDir; if (!prevProjectsDir) { program.error(`prevProjectsDir must be provided.`); } const prepareSubmissionCmd = (0, cmdCheck_1.parsePrepareSubmissionCmd)(options.prepareSubmissionCmd); if (!prepareSubmissionCmd) { program.error(`prepareSubmissionCmd must be provided.`); } const projectFile = options.projectFile; const ignoredDirs = options.ignoredDirs; const submissionsDir = (0, cliUtil_1.substituteVariables)(prevProjectsDir, { zip: zipFile }); (0, cliUtil_1.verb)(`Extract submissions to ${submissionsDir}`); if (await (0, fsUtil_1.folderExists)(submissionsDir, 'submissionsDir')) { (0, cliUtil_1.verb)(`Remove submissions folder ${submissionsDir} (clean).`); await (0, fsUtil_1.rmDir)(submissionsDir); } await (0, fsUtil_1.unzip)(zipFile, submissionsDir); // we always unzip the big file const submissionDirs = await (0, fsUtil_1.readDir)(submissionsDir, 'dir', false, 'Check submissions folder.'); if (submissionDirs.length == 0) { program.error(`No submissions found in ${submissionsDir}`); } let name = "", subId = ""; // define here for catch block for (let counter = 0; counter < submissionDirs.length; counter++) { try { const subDir = submissionDirs[counter]; ({ name, submissionId: subId } = (0, cliUtil_1.parseSubmitter)(subDir)); const absSubDir = path_1.default.join(submissionsDir, subDir); (0, cliUtil_1.log)(SEP); (0, cliUtil_1.log)(`\nProcessing submission ${counter + 1} of ${submissionDirs.length}: ${subId} ${name}\n`, options.colorSection); // find the submitted zip file: let submittedFiles = await (0, fsUtil_1.readDir)(absSubDir, 'file'); if (submittedFiles.length != 1) { (0, cliUtil_1.log)(`Warning: ${name} submitted ${submittedFiles.length} files`); if (submittedFiles.length > 1) { submittedFiles = submittedFiles.filter(f => f.endsWith('.zip')); if (submittedFiles.length != 1) { (0, cliUtil_1.log)(`Warning: ${name} submitted ${submittedFiles.length} zip-files, take first one.`); } submittedFiles = [submittedFiles[0]]; } if (submittedFiles.length != 1) { (0, cliUtil_1.log)(`Warning: Skipping submission of ${name}.`); continue; } } // unzip the submitted zip file const wsDir = path_1.default.join(submissionsDir, subDir, 'ws' + (name ? "_" + name.replace(/ /g, '_') : "")); if (await (0, fsUtil_1.folderExists)(wsDir)) { (0, cliUtil_1.log)(`Remove workspace folder ${wsDir}.`); await (0, fsUtil_1.rmDir)(wsDir); } await (0, fsUtil_1.createDir)(wsDir); const subZip = path_1.default.join(absSubDir, submittedFiles[0]); await (0, fsUtil_1.unzip)(subZip, wsDir); // find project folder, usually the one folder contained in the submission const projectDir = await (0, fsUtil_1.findDirContainingFile)(wsDir, projectFile, ignoredDirs); // usually git reset --hard await (0, fsUtil_1.execShell)(prepareSubmissionCmd.cmd, prepareSubmissionCmd.args, { ...options, colored: options.colored || false, colorStandard: options.colorPre }, { indent: false, prefix: 'pre: ', cwd: projectDir }); } catch (err) { const msg = `${name}: ${err instanceof Error ? err.message : err}`; (0, cliUtil_1.error)(`${msg}`); (0, cliUtil_1.error)(`Continue with next submission.`); } } } catch (err) { (0, cliUtil_1.error)(`${SEP}`); program.error(String(err)); } } exports.cmdPrepareAsPrevious = cmdPrepareAsPrevious; //# sourceMappingURL=cmdPrepareAsPrevious.js.map