From e593ebd87957421ceac7b31c9ecb69e3f9f3449f Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 6 Dec 2020 12:40:45 +0800 Subject: [PATCH] core: syzoj: testdata_download --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/cases.ts | 17 ++++++------ packages/hydrojudge/src/checkers.ts | 1 - packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/import.syzoj.ts | 28 +++++++++++--------- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index d346f57ef..dfa11886c 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.1.29", + "version": "2.1.30", "main": "package.json", "author": "masnn", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/cases.ts b/packages/hydrojudge/src/cases.ts index 8807fef14..29c75c5e4 100644 --- a/packages/hydrojudge/src/cases.ts +++ b/packages/hydrojudge/src/cases.ts @@ -165,14 +165,13 @@ async function read1(folder: string, files: string[], checkFile) { } async function readAutoCases(folder, { next }) { - const - config = { - checker_type: 'default', - count: 0, - subtasks: [], - judge_extra_files: [], - user_extra_files: [], - }; + const config = { + checker_type: 'default', + count: 0, + subtasks: [], + judge_extra_files: [], + user_extra_files: [], + }; const checkFile = ensureFile(folder); try { const files = await fs.readdir(folder); @@ -187,7 +186,7 @@ async function readAutoCases(folder, { next }) { let result = await read0(folder, files, checkFile); if (!result.count) result = await read1(folder, files, checkFile); Object.assign(config, result); - next({ message: { message: 'Found {0} testcases.', params: config.count } }); + next({ message: { message: 'Found {0} testcases.', params: [config.count] } }); } catch (e) { throw new SystemError('Cannot parse testdata.', [e]); } diff --git a/packages/hydrojudge/src/checkers.ts b/packages/hydrojudge/src/checkers.ts index 04555fa9a..2e58e0d8b 100644 --- a/packages/hydrojudge/src/checkers.ts +++ b/packages/hydrojudge/src/checkers.ts @@ -160,7 +160,6 @@ const checkers: Record = { }, async testlib(config) { - console.log(config); const { stderr, status } = await run('${dir}/checker ${dir}/in ${dir}/user_out ${dir}/answer', { copyIn: { in: { src: config.input }, diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index f0b500954..02a2d91b5 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.14.0", + "version": "2.14.1", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/import.syzoj.ts b/packages/hydrooj/src/handler/import.syzoj.ts index 11276f0d3..39aa36ea0 100644 --- a/packages/hydrooj/src/handler/import.syzoj.ts +++ b/packages/hydrooj/src/handler/import.syzoj.ts @@ -4,6 +4,7 @@ import os from 'os'; import assert from 'assert'; import superagent from 'superagent'; import { filter } from 'lodash'; +import { PassThrough } from 'stream'; import AdmZip from 'adm-zip'; import { ValidationError, RemoteOnlineJudgeError } from '../error'; import { streamToBuffer } from '../utils'; @@ -86,25 +87,28 @@ class ProblemImportSYZOJHandler extends Handler { filenameList: result.body.testData.map((node) => node.filename), }); const urls = {}; + if (r.body.error) return; for (const t of r.body.downloadInfo) urls[t.filename] = t.downloadUrl; const zip = new AdmZip(); for (const f of result.body.testData) { + const p = new PassThrough(); + superagent.get(urls[f.filename]).pipe(p); // eslint-disable-next-line no-await-in-loop - const c = await superagent.get(urls[f.filename]); - // eslint-disable-next-line no-await-in-loop - zip.addFile(f.filename, await streamToBuffer(c)); + zip.addFile(f.filename, await streamToBuffer(p)); } await problem.setTestdata(domainId, docId, zip.toBuffer()); - await problem.edit(domainId, docId, { - config: { - time: `${judge.timeLimit}ms`, - memory: `${judge.memoryLimit}m`, - // TODO other config - }, - }); + if (judge) { + await problem.edit(domainId, docId, { + config: { + time: `${judge.timeLimit}ms`, + memory: `${judge.memoryLimit}m`, + // TODO other config + }, + }); + } })().catch(logger.error); - this.response.body = { pid: pid || docId }; - this.response.redirect = this.url('problem_settings', { pid: pid || docId }); + this.response.body = { pid: docId }; + this.response.redirect = this.url('problem_settings', { pid: docId }); } else { const res = await superagent.get(`${url}export`); assert(res.status === 200, new RemoteOnlineJudgeError('Cannot connect to target server'));