diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 17102c9bb..d5a8c9bbd 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.3.5", + "version": "2.3.6", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index a88bdbb42..041afdf87 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -29,6 +29,7 @@ class JudgeTask { lang: string; code: string; tmpdir: string; + input?: string; clean: Function[]; data: any[]; folder: string; @@ -57,6 +58,7 @@ class JudgeTask { this.lang = this.request.lang; this.code = this.request.code; this.config = this.request.config; + this.input = this.request.input; this.data = this.request.data; this.tmpdir = path.resolve(getConfig('tmp_dir'), this.host, this.rid); this.clean = []; @@ -64,9 +66,8 @@ class JudgeTask { tmpfs.mount(this.tmpdir, '512m'); log.info('Submission: %s/%s/%s pid=%s', this.host, this.domainId, this.rid, this.pid); try { - if (this.type === 'judge') await this.doSubmission(); - else if (this.type === 1) await this.doPretest(); - else throw new SystemError(`Unsupported type: ${this.type}`); + if (this.input) await this.doPretest(); + else await this.doSubmission(); } catch (e) { if (e instanceof CompileError) { this.next({ compiler_text: compilerText(e.stdout, e.stderr) }); diff --git a/packages/hydrojudge/src/judge/run.ts b/packages/hydrojudge/src/judge/run.ts index 8cc478334..e54c79d0b 100644 --- a/packages/hydrojudge/src/judge/run.ts +++ b/packages/hydrojudge/src/judge/run.ts @@ -55,10 +55,10 @@ export const judge = async (ctx) => { ctx.next({ status: STATUS.STATUS_JUDGING, progress: 0 }); const copyIn = { ...ctx.execute.copyIn }; const { filename } = ctx.config; - if (filename) copyIn[`${filename}.in`] = { content: ctx.config.input }; + if (filename) copyIn[`${filename}.in`] = { content: ctx.input }; const copyOut = filename ? [`${filename}.out`] : []; const stdin = path.resolve(ctx.tmpdir, '0.in'); - await fs.writeFile(stdin, ctx.config.input || ''); + await fs.writeFile(stdin, ctx.input || ''); const stdout = path.resolve(ctx.tmpdir, '0.out'); const stderr = path.resolve(ctx.tmpdir, '0.err'); const res = await run( diff --git a/packages/hydrojudge/src/service.ts b/packages/hydrojudge/src/service.ts index ff4ddcacc..08d79452b 100644 --- a/packages/hydrojudge/src/service.ts +++ b/packages/hydrojudge/src/service.ts @@ -155,6 +155,7 @@ async function postInit() { code: string; data: any[]; config: any; + input?: string; next: (data: any, id?: number) => void; end: (data: any) => void; tmpdir: string; @@ -178,6 +179,7 @@ async function postInit() { this.code = this.request.code; this.data = this.request.data; this.config = this.request.config; + this.input = this.request.input; this.next = getNext(this); this.end = getEnd(this.domainId, this.rid); this.tmpdir = path.resolve(getConfig('tmp_dir'), this.rid); @@ -185,8 +187,7 @@ async function postInit() { fs.ensureDirSync(this.tmpdir); tmpfs.mount(this.tmpdir, getConfig('tmpfs_size')); logger.info(`Submission: ${this.rid}`, { pid: this.pid }); - if (this.config.input) await this.run(); - else if (this.config.hack) await this.hack(); + if (typeof this.input === 'string') await this.run(); else await this.submission(); } catch (e) { if (e instanceof CompileError) { @@ -226,19 +227,6 @@ async function postInit() { await judge[this.config.type || 'default'].judge(this); } - async hack() { - this.stat.cache_start = new Date(); - this.folder = await cacheOpen(this.domainId, this.pid, this.data); - this.stat.read_cases = new Date(); - this.config = await readYamlCases( - this.folder, - this.config, - { next: this.next }, - ); - this.stat.judge = new Date(); - await judge.hack.judge(this); - } - async run() { this.stat.judge = new Date(); await judge.run.judge(this); diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 969b94d19..c62e036f8 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.17.11", + "version": "2.17.12", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index bbd3a4501..5356cab7b 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -16,6 +16,7 @@ import { const logger = new Logger('judge'); async function _postJudge(rdoc: Rdoc) { + if (typeof rdoc.input === 'string') return; const accept = rdoc.status === builtin.STATUS.STATUS_ACCEPTED; const tasks = []; if (rdoc.contest) { diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index eacfff316..c2e16204e 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -226,18 +226,6 @@ export interface TestCase { message: string, } -export interface HackConfig { - hack: string, -} - -export interface PretestConfig { - time?: string, - memory?: string, - input: string, -} - -export type RunConfig = HackConfig | PretestConfig; - export interface ContestInfo { type: 30 | 60, tid: ObjectID, @@ -262,7 +250,7 @@ export interface Rdoc { status: number, hidden: boolean, progress?: number, - config?: RunConfig, + input?: string, contest?: ContestInfo, } diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 9094c594e..d7151e59e 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -7,7 +7,7 @@ import { STATUS } from './builtin'; import * as task from './task'; import * as problem from './problem'; import { - Rdoc, TestCase, RunConfig, ContestInfo, ProblemConfig, + Rdoc, TestCase, ContestInfo, ProblemConfig, } from '../interface'; import { Time } from '../utils'; import * as bus from '../service/bus'; @@ -94,7 +94,7 @@ export async function judge(domainId: string, rid: ObjectID, priority = 1) { export async function add( domainId: string, pid: number, uid: number, - lang: string, code: string, addTask: boolean, contestOrConfig?: ContestInfo | RunConfig, + lang: string, code: string, addTask: boolean, contestOrConfig?: ContestInfo | string, ) { const data: Rdoc = { status: STATUS.STATUS_WAITING, @@ -115,14 +115,11 @@ export async function add( judgeAt: null, rejudged: false, }; - if (contestOrConfig) { - if ((contestOrConfig as ContestInfo).type) { - data.contest = contestOrConfig as ContestInfo; - } else { - data.config = contestOrConfig as RunConfig; - data.hidden = true; - } - } + if (typeof contestOrConfig === 'string') { + // is Run + data.input = contestOrConfig; + data.hidden = true; + } else data.contest = contestOrConfig; const res = await coll.insertOne(data); if (addTask) await judge(domainId, res.insertedId); return res.insertedId;