
























@@ -88,6 +88,16 @@ case "$command_name" in
8888 if [[ "\${HDIUTIL_DETACH_FAIL:-0}" == "1" ]]; then
8989 exit 9
9090 fi
91+ detach_attempts_file="\${HDIUTIL_LOG}.detach-attempts"
92+ detach_attempts=0
93+ if [[ -f "$detach_attempts_file" ]]; then
94+ detach_attempts="$(cat "$detach_attempts_file")"
95+ fi
96+ detach_attempts=$((detach_attempts + 1))
97+ printf '%s' "$detach_attempts" > "$detach_attempts_file"
98+ if (( detach_attempts <= \${HDIUTIL_DETACH_FAIL_COUNT:-0} )); then
99+ exit 9
100+ fi
91101 ;;
92102 resize)
93103 if [[ "\${1:-}" == "-limits" ]]; then
@@ -300,6 +310,28 @@ describe.runIf(process.platform === "darwin")("create-dmg ownership boundaries",
300310rmSync(path.dirname(mountPoint as string), { recursive: true, force: true });
301311});
302312313+it("retries a delayed DMG detach before finalizing the artifact", () => {
314+const app = makeValidApp();
315+const outputDir = mkdtempSync(path.join(tmpdir(), "openclaw-create-dmg-output-"));
316+tempDirs.push(outputDir);
317+const output = path.join(outputDir, "OpenClaw.dmg");
318+const tools = makeFakeDmgTools();
319+320+const result = runScript([app, output], {
321+ ...tools.env,
322+HDIUTIL_DETACH_FAIL_COUNT: "6",
323+});
324+325+expect(result.status).toBe(0);
326+expect(readFileSync(output, "utf8")).toBe("converted");
327+const log = readFileSync(tools.hdiutilLog, "utf8");
328+expect(log.match(/^detach /gm)).toHaveLength(7);
329+expect(log).toContain("detach ");
330+expect(log).toContain("-force");
331+expect(log).toContain("resize");
332+expect(log).toContain("convert ");
333+});
334+303335it("styles the private mount without closing unrelated Finder windows", () => {
304336const app = makeValidApp();
305337const outputDir = mkdtempSync(path.join(tmpdir(), "openclaw-create-dmg-output-"));
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。