Replace -beta sidecar and .OLD backup with DB snapshots
Beta deploys used to rename foo.gsc -> foo.OLD and write beta bytes to a foo-beta.gsc sidecar, forcing the mod loader to know the naming convention. Now the beta content lives at the actual target filename (same as configs already did) and the pre-beta bytes are captured in a new beta_file_snapshots table for rollback. - schema.sql: new beta_file_snapshots(beta_id, server, rel_path, prior_content BLOB, prior_sha256, prior_size). Handles scripts, plugins, and the composed dedicated_sp.cfg uniformly. - db/index.ts: assertSnapshotSchemeSafe boot guard refuses to start if a legacy running/ready-promote beta is present on first upgrade. A settings sentinel (snapshots_v1) makes it one-shot. - beta.ts openBeta: read prior bytes, insert snapshot, overwrite target directly. - beta.ts rollbackBeta: restore from snapshot if had_original, else delete the fresh file. Drop snapshot rows after restore. - beta.ts promoteBeta: no more rm -beta / rm .OLD calls, pull prior content from the snapshot table for the deployment audit, drop snapshots after promote. - files.ts: delete betaFile() and oldFile(). - drift.ts: docstring updated; no special-casing needed since beta bytes and inventory now agree on the target rel_path. - servers/[name]/+page.svelte: drop dead -beta/.OLD row filters. - tests: plugin write asserts the target filename; unused betaFile/oldFile tests removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -466,13 +466,13 @@
|
||||
</section>
|
||||
|
||||
<section class="panel">
|
||||
<h2>Scripts on this server ({inventory.filter((f) => !f.relPath.endsWith('.OLD') && !/-beta\./.test(f.relPath)).length})</h2>
|
||||
<h2>Scripts on this server ({inventory.length})</h2>
|
||||
{#if inventory.length === 0}
|
||||
<p class="empty">no scripts tracked — upload one from the Scripts page and open a beta to deploy it here</p>
|
||||
{:else}
|
||||
<div class="inv-list">
|
||||
{#each inventory as f (f.relPath)}
|
||||
<div class="inv-row inv-{f.relPath.endsWith('.OLD') ? 'old' : /-beta\./.test(f.relPath) ? 'beta' : 'live'}">
|
||||
<div class="inv-row">
|
||||
<span class="rel mono">{f.relPath}</span>
|
||||
<span class="size mono">{f.size}B</span>
|
||||
<span class="src mono">{f.source ?? '—'}</span>
|
||||
@@ -910,9 +910,7 @@
|
||||
font-size: var(--text-mono-sm);
|
||||
align-items: center;
|
||||
}
|
||||
.inv-row.inv-old { opacity: 0.55; border-left: 3px solid var(--ink-500); }
|
||||
.inv-row.inv-beta { border-left: 3px solid var(--amber-500); }
|
||||
.inv-row.inv-live { border-left: 3px solid var(--spark-500); }
|
||||
.inv-row { border-left: 3px solid var(--spark-500); }
|
||||
.inv-row .rel { color: var(--cream); word-break: break-all; }
|
||||
.inv-row .size, .inv-row .src, .inv-row .sha { color: var(--ink-500); }
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user