fix(plugins): detect install root rebinding · openclaw/openclaw@5a23032
steipete
·
2026-04-28
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -218,7 +218,7 @@ describe("installPackageDir", () => {
|
218 | 218 | installBaseDir, |
219 | 219 | preservedDir: preservedInstallRoot, |
220 | 220 | outsideTarget: outsideInstallRoot, |
221 | | -rebindAtCall: 3, |
| 221 | +rebindAtCall: 4, |
222 | 222 | run: async () => { |
223 | 223 | await expect( |
224 | 224 | installPackageDir({ |
@@ -259,7 +259,7 @@ describe("installPackageDir", () => {
|
259 | 259 | installBaseDir, |
260 | 260 | preservedDir: preservedInstallRoot, |
261 | 261 | outsideTarget: outsideInstallRoot, |
262 | | -rebindAtCall: 7, |
| 262 | +rebindAtCall: 8, |
263 | 263 | run: async () => |
264 | 264 | await installPackageDir({ |
265 | 265 | sourceDir, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -170,19 +170,31 @@ export async function installPackageDir(params: {
|
170 | 170 | }): Promise<{ ok: true } | { ok: false; error: string; code?: string }> { |
171 | 171 | params.logger?.info?.(`Installing to ${params.targetDir}…`); |
172 | 172 | const installBaseDir = path.dirname(params.targetDir); |
173 | | -await fs.mkdir(installBaseDir, { recursive: true }); |
174 | | -await assertInstallBoundaryPaths({ |
175 | | - installBaseDir, |
176 | | -candidatePaths: [params.targetDir], |
177 | | -}); |
| 173 | +let initialInstallBaseRealPath: string; |
| 174 | +try { |
| 175 | +await fs.mkdir(installBaseDir, { recursive: true }); |
| 176 | +initialInstallBaseRealPath = await fs.realpath(installBaseDir); |
| 177 | +await assertInstallBoundaryPaths({ |
| 178 | + installBaseDir, |
| 179 | +candidatePaths: [params.targetDir], |
| 180 | +}); |
| 181 | +} catch (err) { |
| 182 | +return { ok: false, error: `${params.copyErrorPrefix}: ${String(err)}` }; |
| 183 | +} |
178 | 184 | let installBaseRealPath: string; |
179 | 185 | let canonicalTargetDir: string; |
180 | 186 | try { |
181 | 187 | ({ installBaseRealPath, canonicalTargetDir } = await resolveInstallPublishTarget({ |
182 | 188 | installBaseDir, |
183 | 189 | targetDir: params.targetDir, |
184 | 190 | })); |
| 191 | +if (installBaseRealPath !== initialInstallBaseRealPath) { |
| 192 | +throw new Error(INSTALL_BASE_CHANGED_ERROR_MESSAGE); |
| 193 | +} |
185 | 194 | } catch (err) { |
| 195 | +if (isInstallBaseChangedError(err)) { |
| 196 | +params.logger?.warn?.(INSTALL_BASE_CHANGED_ABORT_WARNING); |
| 197 | +} |
186 | 198 | return { ok: false, error: `${params.copyErrorPrefix}: ${String(err)}` }; |
187 | 199 | } |
188 | 200 | |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。