mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 19:10:45 +00:00
[codex] Extract filesystem safety primitives (#77918)
* refactor: extract filesystem safety primitives * refactor: use fs-safe for file access helpers * refactor: reuse fs-safe for media reads * refactor: use fs-safe for image reads * refactor: reuse fs-safe in qqbot media opener * refactor: reuse fs-safe for local media checks * refactor: consume cleaner fs-safe api * refactor: align fs-safe json option names * fix: preserve fs-safe migration contracts * refactor: use fs-safe primitive subpaths * refactor: use grouped fs-safe subpaths * refactor: align fs-safe api usage * refactor: adapt private state store api * chore: refresh proof gate * refactor: follow fs-safe json api split * refactor: follow reduced fs-safe surface * build: default fs-safe python helper off * fix: preserve fs-safe plugin sdk aliases * refactor: consolidate fs-safe usage * refactor: unify fs-safe store usage * refactor: trim fs-safe temp workspace usage * refactor: hide low-level fs-safe primitives * build: use published fs-safe package * fix: preserve outbound recovery durability after rebase * chore: refresh pr checks
This commit is contained in:
committed by
GitHub
parent
61481eb34f
commit
538605ff44
@@ -1,7 +1,8 @@
|
||||
import "../infra/fs-safe-defaults.js";
|
||||
import { createHash } from "node:crypto";
|
||||
import fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import { withTempDir } from "../infra/install-source-utils.js";
|
||||
import { replaceDirectoryAtomic } from "../infra/replace-file.js";
|
||||
import {
|
||||
createSafeNpmInstallArgs,
|
||||
createSafeNpmInstallEnv,
|
||||
@@ -192,34 +193,12 @@ async function replaceManagedGitRepo(params: {
|
||||
stagedRepoDir: string;
|
||||
persistentRepoDir: string;
|
||||
}): Promise<{ ok: true } | { ok: false; error: string }> {
|
||||
const parentDir = path.dirname(params.persistentRepoDir);
|
||||
const backupDir = path.join(parentDir, `.repo-backup-${process.pid}-${Date.now()}`);
|
||||
let backupCreated = false;
|
||||
|
||||
try {
|
||||
await fs.mkdir(parentDir, { recursive: true });
|
||||
try {
|
||||
await fs.rename(params.persistentRepoDir, backupDir);
|
||||
backupCreated = true;
|
||||
} catch (err) {
|
||||
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
await fs.rename(params.stagedRepoDir, params.persistentRepoDir);
|
||||
} catch (err) {
|
||||
if (backupCreated) {
|
||||
await fs.rename(backupDir, params.persistentRepoDir);
|
||||
backupCreated = false;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (backupCreated) {
|
||||
await fs.rm(backupDir, { recursive: true, force: true });
|
||||
}
|
||||
await replaceDirectoryAtomic({
|
||||
stagedDir: params.stagedRepoDir,
|
||||
targetDir: params.persistentRepoDir,
|
||||
backupPrefix: ".repo-backup-",
|
||||
});
|
||||
return { ok: true };
|
||||
} catch (err) {
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user