aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/sbbuilder/Sbb.qml
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/modules/sbbuilder/Sbb.qml')
-rw-r--r--desktop/modules/sbbuilder/Sbb.qml24
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}`);
}
}