grading
Version:
Grading of student submissions, in particular programming tests.
90 lines • 5.1 kB
JavaScript
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
;