mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-27 19:35:13 +01:00
Repair stale worktree provision configs
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
3a15727dc7
commit
85351a2c9a
2 files changed
+173
-1
No files matched your search
@@ -80,6 +80,84 @@ paperclipai_command_available() {
|
||||
return 1
|
||||
}
|
||||
|
||||
existing_worktree_config_is_usable() {
|
||||
WORKTREE_CONFIG_PATH="$worktree_config_path" \
|
||||
WORKTREE_ENV_PATH="$worktree_env_path" \
|
||||
node <<'EOF'
|
||||
const fs = require("node:fs");
|
||||
const os = require("node:os");
|
||||
const path = require("node:path");
|
||||
|
||||
function expandHomePrefix(value) {
|
||||
if (!value) return value;
|
||||
if (value === "~") return os.homedir();
|
||||
if (value.startsWith("~/")) return path.resolve(os.homedir(), value.slice(2));
|
||||
return value;
|
||||
}
|
||||
|
||||
function parseEnvFile(contents) {
|
||||
const entries = {};
|
||||
for (const rawLine of contents.split(/\r?\n/)) {
|
||||
const line = rawLine.trim();
|
||||
if (!line || line.startsWith("#")) continue;
|
||||
const match = rawLine.match(/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/);
|
||||
if (!match) continue;
|
||||
const [, key, rawValue] = match;
|
||||
const value = rawValue.trim();
|
||||
if (
|
||||
(value.startsWith("\"") && value.endsWith("\"")) ||
|
||||
(value.startsWith("'") && value.endsWith("'"))
|
||||
) {
|
||||
entries[key] = value.slice(1, -1);
|
||||
continue;
|
||||
}
|
||||
entries[key] = value.replace(/\s+#.*$/, "").trim();
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
function fail(reason) {
|
||||
console.error(reason);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const configPath = path.resolve(process.env.WORKTREE_CONFIG_PATH);
|
||||
const envPath = path.resolve(process.env.WORKTREE_ENV_PATH);
|
||||
const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
||||
const env = parseEnvFile(fs.readFileSync(envPath, "utf8"));
|
||||
const envConfigPath = expandHomePrefix(env.PAPERCLIP_CONFIG);
|
||||
if (envConfigPath && path.resolve(envConfigPath) !== configPath) {
|
||||
fail(`existing worktree env points at ${envConfigPath}, not ${configPath}`);
|
||||
}
|
||||
|
||||
const homeDir = expandHomePrefix(env.PAPERCLIP_HOME);
|
||||
const instanceId = env.PAPERCLIP_INSTANCE_ID;
|
||||
if (!homeDir || !instanceId) {
|
||||
fail("existing worktree env is missing PAPERCLIP_HOME or PAPERCLIP_INSTANCE_ID");
|
||||
}
|
||||
if (!fs.existsSync(homeDir)) {
|
||||
fail(`existing worktree home does not exist on this host: ${homeDir}`);
|
||||
}
|
||||
|
||||
const instanceRoot = path.resolve(homeDir, "instances", instanceId);
|
||||
const runtimePaths = [
|
||||
config.database?.embeddedPostgresDataDir,
|
||||
config.database?.backup?.dir,
|
||||
config.logging?.logDir,
|
||||
config.storage?.localDisk?.baseDir,
|
||||
config.secrets?.localEncrypted?.keyFilePath,
|
||||
].filter((value) => typeof value === "string" && value.length > 0);
|
||||
|
||||
for (const rawValue of runtimePaths) {
|
||||
const resolved = path.resolve(expandHomePrefix(rawValue));
|
||||
const relative = path.relative(instanceRoot, resolved);
|
||||
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
||||
fail(`existing worktree config path is outside ${instanceRoot}: ${resolved}`);
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
write_fallback_worktree_config() {
|
||||
WORKTREE_NAME="$worktree_name" \
|
||||
BASE_CWD="$base_cwd" \
|
||||
@@ -332,9 +410,12 @@ main().catch((error) => {
|
||||
EOF
|
||||
}
|
||||
|
||||
if [[ -e "$worktree_config_path" && -e "$worktree_env_path" ]]; then
|
||||
if [[ -e "$worktree_config_path" && -e "$worktree_env_path" ]] && existing_worktree_config_is_usable; then
|
||||
echo "Reusing existing isolated Paperclip worktree config at $worktree_config_path" >&2
|
||||
else
|
||||
if [[ -e "$worktree_config_path" || -e "$worktree_env_path" ]]; then
|
||||
echo "Existing isolated Paperclip worktree config is stale for this host; regenerating." >&2
|
||||
fi
|
||||
if paperclipai_command_available; then
|
||||
run_isolated_worktree_init
|
||||
else
|
||||
|
||||
Reference in new issue
Block a user