feat: ignore missing gitea repo in provision
This commit is contained in:
@@ -28,6 +28,7 @@ type Derived = {
|
||||
templateOwner: string;
|
||||
templateRepo: string;
|
||||
cloneUrl: string;
|
||||
templateCloneUrl: string;
|
||||
};
|
||||
|
||||
type ProvisionReport = {
|
||||
@@ -70,8 +71,8 @@ export async function provision(
|
||||
throw new Error(`Local root path does not exist: ${env.WP_LOCAL_ROOT_PATH}`);
|
||||
}
|
||||
|
||||
await ensureGiteaRepo(context, env, slug, derived, report);
|
||||
await ensureSiteDirectory(context, env, slug, derived, report);
|
||||
const repoAvailable = await ensureGiteaRepo(context, env, slug, derived, report);
|
||||
await ensureSiteDirectory(context, env, derived, repoAvailable, report);
|
||||
await checkGitFreshness(context, derived.sitePath);
|
||||
await ensureDatabase(context, derived.dbName, report);
|
||||
await ensureCore(context, env, derived.sitePath, report);
|
||||
@@ -102,6 +103,7 @@ function resolveDerived(env: ProvisionEnv, slug: string): Derived {
|
||||
templateOwner,
|
||||
templateRepo,
|
||||
cloneUrl: `ssh://${env.WPOP_GITEA_SSH_USER}@${host}:${env.WPOP_GITEA_SSH_PORT}/${env.WPOP_GITEA_OWNER}/${slug}.git`,
|
||||
templateCloneUrl: `ssh://${env.WPOP_GITEA_SSH_USER}@${host}:${env.WPOP_GITEA_SSH_PORT}/${templateOwner}/${templateRepo}.git`,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -144,24 +146,30 @@ async function confirm(context: WPopContext, slug: string, derived: Derived): Pr
|
||||
return Boolean(response.confirmed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the per-site Gitea repo exists. Returns `true` when the repo is
|
||||
* available to clone from (it already existed or was just created), `false`
|
||||
* when the user declined creation — in which case the caller falls back to
|
||||
* cloning the template directly so the local site is still provisioned.
|
||||
*/
|
||||
async function ensureGiteaRepo(
|
||||
context: WPopContext,
|
||||
env: ProvisionEnv,
|
||||
slug: string,
|
||||
derived: Derived,
|
||||
report: ProvisionReport,
|
||||
): Promise<void> {
|
||||
): Promise<boolean> {
|
||||
if (context.dryRun) {
|
||||
consola.info(
|
||||
`[dry-run] Would ensure Gitea repo ${derived.owner}/${slug} exists (create from ${env.WPOP_GITEA_TEMPLATE} if missing)`,
|
||||
);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
const exists = await giteaRepoExists(env.giteaBaseUrl, env.giteaToken, derived.owner, slug);
|
||||
if (exists) {
|
||||
consola.info(`Gitea repo ${derived.owner}/${slug} already exists`);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!context.yes) {
|
||||
@@ -172,7 +180,11 @@ async function ensureGiteaRepo(
|
||||
initial: true,
|
||||
});
|
||||
if (!response.confirmed) {
|
||||
throw new Error(`Gitea repo ${derived.owner}/${slug} is required but was not created`);
|
||||
consola.warn(
|
||||
`Skipping Gitea repo ${derived.owner}/${slug}; provisioning local site from template ${env.WPOP_GITEA_TEMPLATE}`,
|
||||
);
|
||||
report.steps.push("gitea:skip");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,13 +196,14 @@ async function ensureGiteaRepo(
|
||||
name: slug,
|
||||
});
|
||||
report.steps.push("gitea:create");
|
||||
return true;
|
||||
}
|
||||
|
||||
async function ensureSiteDirectory(
|
||||
context: WPopContext,
|
||||
env: ProvisionEnv,
|
||||
slug: string,
|
||||
derived: Derived,
|
||||
repoAvailable: boolean,
|
||||
report: ProvisionReport,
|
||||
): Promise<void> {
|
||||
if (!context.dryRun && existsSync(derived.sitePath)) {
|
||||
@@ -202,11 +215,22 @@ async function ensureSiteDirectory(
|
||||
return;
|
||||
}
|
||||
|
||||
consola.info(`Cloning ${derived.cloneUrl} into ${derived.sitePath}`);
|
||||
await run(context, "git", ["clone", derived.cloneUrl, derived.sitePath], {
|
||||
const cloneUrl = repoAvailable ? derived.cloneUrl : derived.templateCloneUrl;
|
||||
consola.info(`Cloning ${cloneUrl} into ${derived.sitePath}`);
|
||||
await run(context, "git", ["clone", cloneUrl, derived.sitePath], {
|
||||
cwd: env.WP_LOCAL_ROOT_PATH,
|
||||
});
|
||||
report.steps.push("git:clone");
|
||||
|
||||
// When provisioning from the template (the per-site repo was not created),
|
||||
// drop the origin remote so the clone is not tied to the template repo.
|
||||
if (!repoAvailable) {
|
||||
await run(context, "git", ["remote", "remove", "origin"], {
|
||||
cwd: derived.sitePath,
|
||||
reject: false,
|
||||
});
|
||||
report.steps.push("git:detach-template");
|
||||
}
|
||||
}
|
||||
|
||||
async function checkGitFreshness(context: WPopContext, sitePath: string): Promise<void> {
|
||||
|
||||
Reference in New Issue
Block a user