diff --git a/server/.github/test.conf.json5 b/server/.github/test.conf.json5 index 5c854318e..3f7c251f9 100644 --- a/server/.github/test.conf.json5 +++ b/server/.github/test.conf.json5 @@ -21,7 +21,6 @@ ARC_AUTH_TOKEN: "unused", ENABLE_SERVER_HTTPS: false, OUR_URL: "https://example.com", - SEEDS_URL: null, INVITE_CODE_CONFIG: { BATCH_SIZE: 2, INVITE_CAP: 100, diff --git a/server/src/lib/database-seeds/repo.ts b/server/src/lib/database-seeds/repo.ts index 5989a8fc9..7f40309b6 100644 --- a/server/src/lib/database-seeds/repo.ts +++ b/server/src/lib/database-seeds/repo.ts @@ -89,6 +89,29 @@ export class DatabaseSeedsRepo { return this.WriteCollection(collectionName, newData); } + /** + * Provide authentication so that CommitChangesBack can do its job. + */ + #AuthenticateWithGitServer() { + if (!ServerConfig.SEEDS_CONFIG) { + // Shouldn't be possible. Ever, since SEEDS_CONFIG must be deffed in order + // to run PullDBSeeds + throw new Error(`Cannot commit changes back. SEEDS_CONFIG is not set.`); + } + + if (!ServerConfig.SEEDS_CONFIG.USER_NAME || !ServerConfig.SEEDS_CONFIG.USER_EMAIL) { + throw new Error( + `Cannot commit changes back if SEEDS_CONFIG.USER_NAME/SEEDS_CONFIG.USER_EMAIL aren't defined.` + ); + } + + return asyncExec( + `git config user.name "${ServerConfig.SEEDS_CONFIG.USER_NAME}" || exit 3; + git config user.email "${ServerConfig.SEEDS_CONFIG.USER_EMAIL}" || exit 4; + git config credential.helper '!f() { sleep 1; echo "username=\${GIT_USER}"; echo "password=\${GIT_PASSWORD}"; }; f' || exit 5;` + ); + } + /** * Checks for any diffs in the seeds repository we cloned. If there are any, commit them back * to the repository. @@ -123,7 +146,9 @@ export class DatabaseSeedsRepo { // throw err; // } - this.logger.info(`Changes. Committing changes back.`); + this.logger.info(`Changes detected. Authenticating with Github.`); + + await this.#AuthenticateWithGitServer(); const { stdout: commitOut } = await asyncExec( `cd "${this.baseDir}" || exit 2; @@ -146,8 +171,8 @@ export class DatabaseSeedsRepo { * Pulls the database seeds from github, returns an object that can be used to manipulate them. */ export async function PullDatabaseSeeds() { - if (!ServerConfig.SEEDS_URL) { - throw new Error(`SEEDS_URL was null. You cannot pull a seeds repo.`); + if (!ServerConfig.SEEDS_CONFIG) { + throw new Error(`SEEDS_CONFIG was not defined. You cannot pull a seeds repo.`); } const seedsDir = await fs.mkdtemp(path.join(os.tmpdir(), "tachi-database-seeds-")); @@ -161,7 +186,7 @@ export async function PullDatabaseSeeds() { // stdout is for errors. // there were expletives below this comment, but I have removed them. const { stdout } = await asyncExec( - `git clone "${ServerConfig.SEEDS_URL}" -b "${ + `git clone "${ServerConfig.SEEDS_CONFIG.REPO_URL}" -b "${ Environment.nodeEnv === "production" ? "production" : "develop" }" --depth=1 '${seedsDir}'` ); diff --git a/server/src/lib/jobs/backsync-bms-pms-data.ts b/server/src/lib/jobs/backsync-bms-pms-data.ts index 13474c5f8..d4a9c1809 100644 --- a/server/src/lib/jobs/backsync-bms-pms-data.ts +++ b/server/src/lib/jobs/backsync-bms-pms-data.ts @@ -6,7 +6,7 @@ import CreateLogCtx from "lib/logger/logger"; const logger = CreateLogCtx(__filename); /** - * The tachi-server may have its BMS database update. It needs to sync this + * The tachi-server may have its BMS or PMS database update. It needs to sync this * information back with the seeds. */ export async function BacksyncBMSPMSSongsAndCharts() { diff --git a/server/src/lib/setup/config.ts b/server/src/lib/setup/config.ts index e0e0fa13a..0e3dcb227 100644 --- a/server/src/lib/setup/config.ts +++ b/server/src/lib/setup/config.ts @@ -70,7 +70,11 @@ export interface TachiServerConfig { OPTIONS_ALWAYS_SUCCEEDS?: boolean; USE_EXTERNAL_SCORE_IMPORT_WORKER: boolean; EXTERNAL_SCORE_IMPORT_WORKER_CONCURRENCY?: integer; - SEEDS_URL: string | null; + SEEDS_CONFIG?: { + REPO_URL: string; + USER_NAME: string | null; + USER_EMAIL: string | null; + }; EMAIL_CONFIG?: { FROM: string; DKIM?: SendMailOptions["dkim"]; @@ -205,7 +209,11 @@ const err = p(config, { } ), }, - SEEDS_URL: "?string", + SEEDS_CONFIG: p.optional({ + REPO_URL: "string", + USER_NAME: "?string", + USER_EMAIL: "?string", + }), }); if (err) {