From f98a715ed7277ca3a1d70aa49e233ef13d062cad Mon Sep 17 00:00:00 2001 From: cnc Date: Wed, 3 Jun 2026 11:11:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E8=80=83=E6=89=80=E6=9C=89=E5=88=86?= =?UTF-8?q?=E7=BB=84=EF=BC=9A=E6=9B=BF=E6=8D=A2=E9=99=88=E6=97=A7OPFS?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:按 LinuxCNC rs274ngc_pre.cc save_parameters() 先 unlink 旧 .bak 再 link 当前参数文件的语义,浏览器 OPFS 成功保存时总是用解析前主参数文件刷新 .bak;未扩展 smoke 解析行为。 验证:./test-native.sh;./test-linuxcnc-source-link.sh;./test-web-wasm-browser-smoke.sh。 --- web/src/wasm-core.js | 2 +- ...st-browser-wasm-smoke-opfs-parameter-sections.js | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/web/src/wasm-core.js b/web/src/wasm-core.js index 339cf3d..612e3a6 100644 --- a/web/src/wasm-core.js +++ b/web/src/wasm-core.js @@ -713,7 +713,7 @@ export async function createWasmSimulator(moduleOptions = {}) { // through the WASM mirror, so preserve the loaded OPFS file here. if (previousParameterFile === null) { await opfs.removeFile(`${parameterPath}.bak`); - } else if (!(await opfs.exists(`${parameterPath}.bak`))) { + } else { await opfs.writeFile(`${parameterPath}.bak`, previousParameterFile); } return events; diff --git a/web/test-browser-wasm-smoke-opfs-parameter-sections.js b/web/test-browser-wasm-smoke-opfs-parameter-sections.js index b3e0300..e486809 100644 --- a/web/test-browser-wasm-smoke-opfs-parameter-sections.js +++ b/web/test-browser-wasm-smoke-opfs-parameter-sections.js @@ -93,9 +93,10 @@ export async function runBrowserOpfsParameterSections(context, simulator) { await runSection("opfs parameter backup after existing save", async () => { await simulator.fs.opfs.writeFile("parameters/existing-save.var", "5161\t3.000000\n"); - // LinuxCNC source basis: rs274ngc_pre.cc save_parameters() - // unlinks filename + ".bak", links the current parameter file to - // filename + ".bak", then renames filename + ".new" over filename. + await simulator.fs.opfs.writeFile("parameters/existing-save.var.bak", "stale previous backup\n"); + // LinuxCNC source basis: rs274ngc_pre.cc save_parameters() unlinks + // filename + ".bak", links the current parameter file to it, + // then renames filename + ".new" over filename. await simulator.parseWithParameterFile( "G21 G90\nG0 X4\nG28.1\nM30\n", "parameters/existing-save.var", @@ -103,11 +104,9 @@ export async function runBrowserOpfsParameterSections(context, simulator) { backend, ); const existingSaveParameterFile = await readOpfsText(simulator, "parameters/existing-save.var"); - expectIncludes(existingSaveParameterFile, "5161\t4.000000", - "LinuxCNC existing OPFS parameter file was not replaced after save"); + expectIncludes(existingSaveParameterFile, "5161\t4.000000", "LinuxCNC existing OPFS parameter file was not replaced after save"); const existingSaveParameterBackup = await readOpfsText(simulator, "parameters/existing-save.var.bak"); - expectIncludes(existingSaveParameterBackup, "5161\t3.000000", - "LinuxCNC existing OPFS parameter backup did not preserve the previous file"); + expectIncludes(existingSaveParameterBackup, "5161\t3.000000", "LinuxCNC existing OPFS parameter backup did not replace the stale backup with the previous file"); await expectMissingOpfsFile( () => simulator.fs.opfs.readFile("parameters/existing-save.var.new"), "LinuxCNC existing OPFS parameter temporary file remained after save",