From 7f2e4c815cb75d4a59dbca08fdead96ddb6c6444 Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Sun, 12 Nov 2023 18:14:13 -0500 Subject: [PATCH] [web] Create CSharp repos --- web/src/routes/admin/contests/util.ts | 66 ++++++++++++++++--- web/templates/csharp/.gitignore | 3 + web/templates/csharp/problem/problem.cs | 7 ++ web/templates/csharp/problem/problem.csproj | 10 +++ .../java/problem/{Main.java => problem.java} | 0 5 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 web/templates/csharp/.gitignore create mode 100644 web/templates/csharp/problem/problem.cs create mode 100644 web/templates/csharp/problem/problem.csproj rename web/templates/java/problem/{Main.java => problem.java} (100%) diff --git a/web/src/routes/admin/contests/util.ts b/web/src/routes/admin/contests/util.ts index 05913ea..28ea36d 100644 --- a/web/src/routes/admin/contests/util.ts +++ b/web/src/routes/admin/contests/util.ts @@ -7,6 +7,52 @@ import { dirname } from 'path'; import { fileURLToPath } from 'url'; import http from 'isomorphic-git/http/node'; +async function addProblemsJava(opts: { + fs: memfs.IFs; + templateDir: string; + dir: string; + contest: { problems: { pascalName: string }[] }; +}) { + const template = hostFs + .readFileSync(join(opts.templateDir, 'java/problem/problem.java')) + .toString(); + + opts.contest.problems.forEach((problem) => { + opts.fs.mkdirSync(join(opts.dir, problem.pascalName)); + const filledTemplate = template.replaceAll('%%pascalName%%', problem.pascalName); + opts.fs.writeFileSync( + join(opts.dir, problem.pascalName, `${problem.pascalName}.java`), + filledTemplate + ); + }); +} + +async function addProblemsCSharp(opts: { + fs: memfs.IFs; + templateDir: string; + dir: string; + contest: { problems: { pascalName: string }[] }; +}) { + const project = hostFs + .readFileSync(join(opts.templateDir, 'csharp/problem/problem.csproj')) + .toString(); + const template = hostFs + .readFileSync(join(opts.templateDir, 'csharp/problem/problem.cs')) + .toString(); + opts.contest.problems.forEach((problem) => { + opts.fs.mkdirSync(join(opts.dir, problem.pascalName)); + opts.fs.writeFileSync( + join(opts.dir, problem.pascalName, `${problem.pascalName}.csproj`), + project + ); + const filledTemplate = template.replaceAll('%%pascalName%%', problem.pascalName); + opts.fs.writeFileSync( + join(opts.dir, problem.pascalName, `${problem.pascalName}.cs`), + filledTemplate + ); + }); +} + export async function createRepos(contestId: number) { const vol = new memfs.Volume(); const fs = createFsFromVolume(vol); @@ -22,19 +68,19 @@ export async function createRepos(contestId: number) { const templateDir = join(dirname(fileURLToPath(import.meta.url)), '../../../../templates'); - const template = hostFs.readFileSync(join(templateDir, 'java/problem/Main.java')).toString(); - 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() }); - contest.problems.forEach((problem) => { - fs.mkdirSync(join(team.id.toString(), problem.pascalName)); - const filledTemplate = template.replaceAll('%%pascalName%%', problem.pascalName); - fs.writeFileSync( - join(team.id.toString(), problem.pascalName, `${problem.pascalName}.java`), - filledTemplate - ); - }); + if (team.language === 'Java') { + addProblemsJava({ fs, templateDir, dir: team.id.toString(), contest }); + } else if (team.language === 'CSharp') { + addProblemsCSharp({ fs, templateDir, dir: team.id.toString(), contest }); + const gitignore = hostFs.readFileSync(join(templateDir, 'csharp/.gitignore')).toString(); + fs.writeFileSync(join(team.id.toString(), '.gitignore'), gitignore); + } else { + console.error('Language not supported'); + return; + } await git.add({ fs: fs, dir: team.id.toString(), filepath: '.' }); await git.commit({ fs: fs, diff --git a/web/templates/csharp/.gitignore b/web/templates/csharp/.gitignore new file mode 100644 index 0000000..d2fb573 --- /dev/null +++ b/web/templates/csharp/.gitignore @@ -0,0 +1,3 @@ +*.sln +**/bin +**/obj \ No newline at end of file diff --git a/web/templates/csharp/problem/problem.cs b/web/templates/csharp/problem/problem.cs new file mode 100644 index 0000000..ab329bc --- /dev/null +++ b/web/templates/csharp/problem/problem.cs @@ -0,0 +1,7 @@ +public class %%pascalName%% +{ + static void Main(string[] args) + { + Console.WriteLine("Hello %%pascalName%%!"); + } +} \ No newline at end of file diff --git a/web/templates/csharp/problem/problem.csproj b/web/templates/csharp/problem/problem.csproj new file mode 100644 index 0000000..d832f00 --- /dev/null +++ b/web/templates/csharp/problem/problem.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + \ No newline at end of file diff --git a/web/templates/java/problem/Main.java b/web/templates/java/problem/problem.java similarity index 100% rename from web/templates/java/problem/Main.java rename to web/templates/java/problem/problem.java