diff options
Diffstat (limited to 'desktop/modules/sbbuilder/Sbb.qml')
| -rw-r--r-- | desktop/modules/sbbuilder/Sbb.qml | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/desktop/modules/sbbuilder/Sbb.qml b/desktop/modules/sbbuilder/Sbb.qml index d623423..a34c967 100644 --- a/desktop/modules/sbbuilder/Sbb.qml +++ b/desktop/modules/sbbuilder/Sbb.qml @@ -55,10 +55,7 @@ Singleton { return ["ssh", "-o", "BatchMode=yes", "-o", "ConnectTimeout=5", ...o, r, "sbb-remote", cmd]; } - function refresh() { - fv.reload(); - root.fetch(false); - } + function reloadDesktop() { fv.reload(); } function saveDesktop() { const d = root.desktop; @@ -77,7 +74,9 @@ Singleton { root.fetch(true); } + // One ssh at a time: a second refresh, or one during a save, is dropped. function fetch(thenSave) { + if (root.busy) return; get.thenSave = thenSave; root.busy = true; get.running = false; @@ -117,13 +116,17 @@ Singleton { root.vm.defaults = { "": top, manifests: defs.manifests || {} }; root.vmPath = d.path; root.reachable = true; - if (!get.thenSave) { root.busy = false; root.vm.loaded(d.text); return; } - if (d.text !== root.vm.base) { + root.vm.error = ""; + if (!get.thenSave) { root.busy = false; root.vm.loaded(d.text ?? ""); return; } + if ((d.text ?? "") !== root.vm.base) { root.busy = false; - root.vm.text = d.text; + root.vm.text = d.text ?? ""; root.vm.error = "changed on the VM: Discard to load it, then redo"; return; } + // The draft as sent: typing while the save runs must not be + // recorded as saved. + put.sent = root.vm.draft; put.running = false; put.running = true; } @@ -131,19 +134,20 @@ Singleton { Process { id: put + property string sent: "" command: root.ssh("config-set") stdinEnabled: true stdout: StdioCollector { id: putOut } stderr: StdioCollector { id: putErr } - onStarted: { put.write(root.vm.draft); put.stdinEnabled = false; } + onStarted: { put.write(put.sent); put.stdinEnabled = false; } onExited: code => { root.busy = false; put.stdinEnabled = true; let d = null; try { d = JSON.parse(putOut.text); } catch (e) {} if (code === 0 && d && d.error === undefined) { - root.vm.text = root.vm.draft; - root.vm.base = root.vm.draft; + root.vm.text = put.sent; + root.vm.base = put.sent; } else root.vm.error = d && d.error ? d.error : (putErr.text.trim() || `ssh exited ${code}`); } } |
