36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
|
|
import fs from "node:fs";
|
||
|
|
import path from "node:path";
|
||
|
|
import { BACKUPS_DIR, ensureDirs } from "./paths.js";
|
||
|
|
import { timestampSlug, getAppVersion } from "./version.js";
|
||
|
|
|
||
|
|
const KEEP_BACKUPS = 5;
|
||
|
|
|
||
|
|
export function makeBackupDir(label) {
|
||
|
|
ensureDirs();
|
||
|
|
const ver = getAppVersion();
|
||
|
|
const slug = `${label}-${ver}-${timestampSlug()}`;
|
||
|
|
const dir = path.join(BACKUPS_DIR, slug);
|
||
|
|
fs.mkdirSync(dir, { recursive: true });
|
||
|
|
return dir;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function backupFile(srcPath, destDir, destName = null) {
|
||
|
|
if (!fs.existsSync(srcPath)) return null;
|
||
|
|
const name = destName || path.basename(srcPath);
|
||
|
|
const dest = path.join(destDir, name);
|
||
|
|
fs.copyFileSync(srcPath, dest);
|
||
|
|
return dest;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function pruneOldBackups() {
|
||
|
|
if (!fs.existsSync(BACKUPS_DIR)) return;
|
||
|
|
const entries = fs.readdirSync(BACKUPS_DIR, { withFileTypes: true })
|
||
|
|
.filter((e) => e.isDirectory())
|
||
|
|
.map((e) => ({ name: e.name, full: path.join(BACKUPS_DIR, e.name), mtime: fs.statSync(path.join(BACKUPS_DIR, e.name)).mtimeMs }))
|
||
|
|
.sort((a, b) => b.mtime - a.mtime);
|
||
|
|
|
||
|
|
for (const old of entries.slice(KEEP_BACKUPS)) {
|
||
|
|
try { fs.rmSync(old.full, { recursive: true, force: true }); } catch {}
|
||
|
|
}
|
||
|
|
}
|