From 8344cbe2bc563c71f1a4778432004171c320acff Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Thu, 14 Mar 2024 11:24:50 -0400 Subject: [PATCH] [Web] Recreate repos for specific teams and during contest --- web/src/lib/server/repos.ts | 64 ++++++++--------- .../contests/[contestId]/+page.server.ts | 20 ++++-- .../admin/contests/[contestId]/+page.svelte | 68 ++++++++++++++++--- .../admin/contests/create/+page.server.ts | 5 +- .../admin/contests/import/+page.server.ts | 5 +- 5 files changed, 115 insertions(+), 47 deletions(-) diff --git a/web/src/lib/server/repos.ts b/web/src/lib/server/repos.ts index d869319..598c558 100644 --- a/web/src/lib/server/repos.ts +++ b/web/src/lib/server/repos.ts @@ -68,7 +68,7 @@ async function addProblemsCPP(opts: OptsAddProblems) { }); } -export async function createRepos(contestId: number) { +export async function createRepos(contestId: number, teamIds: number[]) { const vol = new memfs.Volume(); const fs = createFsFromVolume(vol); @@ -81,35 +81,37 @@ export async function createRepos(contestId: number) { return; } - contest.teams.forEach(async (team) => { - fs.mkdirSync(team.id.toString(), { recursive: true }); - await git.init({ fs: fs, bare: false, defaultBranch: 'master', dir: team.id.toString() }); - if (team.language === 'Java') { - addProblemsJava({ fs, dir: team.id.toString(), contest }); - } else if (team.language === 'CSharp') { - addProblemsCSharp({ fs, dir: team.id.toString(), contest }); - fs.writeFileSync(join(team.id.toString(), '.gitignore'), templateCSharpGitIgnore); - } else if (team.language === 'CPP') { - addProblemsCPP({ fs, dir: team.id.toString(), contest }); - fs.writeFileSync(join(team.id.toString(), '.gitignore'), templateCppGitIgnore); - } else { - console.error('Language not supported'); - return; - } - await git.add({ fs: fs, dir: team.id.toString(), filepath: '.' }); - await git.commit({ - fs: fs, - dir: team.id.toString(), - message: 'Initial', - author: { name: 'Admin' } + contest.teams + .filter((t) => teamIds.includes(t.id)) + .forEach(async (team) => { + fs.mkdirSync(team.id.toString(), { recursive: true }); + await git.init({ fs: fs, bare: false, defaultBranch: 'master', dir: team.id.toString() }); + if (team.language === 'Java') { + addProblemsJava({ fs, dir: team.id.toString(), contest }); + } else if (team.language === 'CSharp') { + addProblemsCSharp({ fs, dir: team.id.toString(), contest }); + fs.writeFileSync(join(team.id.toString(), '.gitignore'), templateCSharpGitIgnore); + } else if (team.language === 'CPP') { + addProblemsCPP({ fs, dir: team.id.toString(), contest }); + fs.writeFileSync(join(team.id.toString(), '.gitignore'), templateCppGitIgnore); + } else { + console.error('Language not supported'); + return; + } + await git.add({ fs: fs, dir: team.id.toString(), filepath: '.' }); + await git.commit({ + fs: fs, + dir: team.id.toString(), + message: 'Initial', + author: { name: 'Admin' } + }); + await git.push({ + fs: fs, + http, + dir: team.id.toString(), + url: `http://127.0.0.1:${ + process.env.GIT_PORT ?? 7006 + }/${contest.id.toString()}/${team.id.toString()}` + }); }); - await git.push({ - fs: fs, - http, - dir: team.id.toString(), - url: `http://127.0.0.1:${ - process.env.GIT_PORT ?? 7006 - }/${contest.id.toString()}/${team.id.toString()}` - }); - }); } diff --git a/web/src/routes/admin/contests/[contestId]/+page.server.ts b/web/src/routes/admin/contests/[contestId]/+page.server.ts index d0baf2a..9102ad0 100644 --- a/web/src/routes/admin/contests/[contestId]/+page.server.ts +++ b/web/src/routes/admin/contests/[contestId]/+page.server.ts @@ -96,7 +96,7 @@ export const actions = { }); return { success: true }; }, - repo: async ({ params }) => { + repo: async ({ params, request }) => { if (!params.contestId) { return { success: false }; } @@ -104,10 +104,20 @@ export const actions = { if (isNaN(contestId)) { return { success: false }; } - if (fs.existsSync(join('repo', contestId.toString()))) { - fs.removeSync(join('repo', contestId.toString())); - } - await createRepos(contestId); + const form = await request.formData(); + const formEntries = Array.from(form.entries()); + const resetTeamIds = formEntries + .filter((e) => e[0].startsWith('teamId')) + .map((e) => { + return parseInt(e[1].toString()); + }); + resetTeamIds.forEach((teamId) => { + const repoPath = join('repo', contestId.toString(), `${teamId.toString()}.git`); + if (fs.existsSync(repoPath) === true) { + fs.removeSync(repoPath); + } + }); + await createRepos(contestId, resetTeamIds); return { success: true }; }, 'freeze-time': async ({ params, request }) => { diff --git a/web/src/routes/admin/contests/[contestId]/+page.svelte b/web/src/routes/admin/contests/[contestId]/+page.svelte index 9796f5f..f53a64d 100644 --- a/web/src/routes/admin/contests/[contestId]/+page.svelte +++ b/web/src/routes/admin/contests/[contestId]/+page.svelte @@ -11,10 +11,12 @@ $: if (form) { freezeModal.hide(); + repoModal.hide(); } let confirmModal: ConfirmModal; let freezeModal: Modal; + let repoModal: Modal; function enhanceConfirm(form: HTMLFormElement, text: string) { enhance(form, async ({ cancel }) => { @@ -32,6 +34,18 @@ $: if (freezeTimeInputLocal !== undefined) { freezeTimeInput = new Date(freezeTimeInputLocal).toISOString(); } + + function repoSelectNone() { + document.querySelectorAll('.repoCheck').forEach((e) => { + e.checked = false; + }); + } + + function repoSelectAll() { + document.querySelectorAll('.repoCheck').forEach((e) => { + e.checked = true; + }); + } @@ -65,6 +79,43 @@ + +
+ + +
+
+

Contest - {data.name}

@@ -85,6 +136,13 @@ freezeModal.show(); }}>Set Freeze Time + {#if data.activeTeams === 0}
-
- -
diff --git a/web/src/routes/admin/contests/create/+page.server.ts b/web/src/routes/admin/contests/create/+page.server.ts index 833099b..02f92f6 100644 --- a/web/src/routes/admin/contests/create/+page.server.ts +++ b/web/src/routes/admin/contests/create/+page.server.ts @@ -45,7 +45,10 @@ export const actions = { include: { teams: true, problems: true } }); - await createRepos(createdContest.id); + await createRepos( + createdContest.id, + teams.map((t) => t.id) + ); return { success: true }; } diff --git a/web/src/routes/admin/contests/import/+page.server.ts b/web/src/routes/admin/contests/import/+page.server.ts index 37a6ee3..8f0ae03 100644 --- a/web/src/routes/admin/contests/import/+page.server.ts +++ b/web/src/routes/admin/contests/import/+page.server.ts @@ -153,7 +153,10 @@ export const actions = { await db.activeTeam.create({ data: { teamId: team.id, contestId: contest.id } }); }); - await createRepos(contest.id); + await createRepos( + contest.id, + fullContest.teams.map((t) => t.id) + ); } } } catch (err) {