summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-25 21:26:31 +0300
committerPaul Buetow <paul@buetow.org>2026-05-25 21:26:31 +0300
commit578b0f747d8cf773c0e5ba9394bcf8436d6b0a01 (patch)
tree066f52745e761f76b0cd8eca9f1add47843b432b
parentc315cc0d9a89984ea43a6f7f59f0e5cd9560e7c9 (diff)
fix(prefixed_output): add flush to prevent losing final unterminated line
PrefixedOutput#print buffers partial lines until a newline is received. When the last chunk from a stream does not end with \n (common with Open3 popen2e EOF), that chunk was discarded. Add #flush to emit the remaining buffer with the prefix, and call it at the end of all streaming loops in SshRunner and WireGuardSetup.
-rw-r--r--lib/hyperstack/ssh_runner.rb1
-rw-r--r--lib/hyperstack/state.rb7
-rw-r--r--lib/hyperstack/wireguard_setup.rb1
3 files changed, 9 insertions, 0 deletions
diff --git a/lib/hyperstack/ssh_runner.rb b/lib/hyperstack/ssh_runner.rb
index e4440b6..1384109 100644
--- a/lib/hyperstack/ssh_runner.rb
+++ b/lib/hyperstack/ssh_runner.rb
@@ -25,6 +25,7 @@ module HyperstackVM
combined << line
@out.print(line)
end
+ @out.flush
return [combined, wait_thr.value]
end
end
diff --git a/lib/hyperstack/state.rb b/lib/hyperstack/state.rb
index 0ce2687..a52b057 100644
--- a/lib/hyperstack/state.rb
+++ b/lib/hyperstack/state.rb
@@ -53,5 +53,12 @@ module HyperstackVM
@mutex.synchronize { @delegate.print("#{@prefix}#{line}") }
end
end
+
+ def flush
+ return if @buffer.empty?
+
+ @mutex.synchronize { @delegate.print("#{@prefix}#{@buffer}") }
+ @buffer = +''
+ end
end
end
diff --git a/lib/hyperstack/wireguard_setup.rb b/lib/hyperstack/wireguard_setup.rb
index 82a9dba..b2b7ec1 100644
--- a/lib/hyperstack/wireguard_setup.rb
+++ b/lib/hyperstack/wireguard_setup.rb
@@ -68,6 +68,7 @@ module HyperstackVM
stdin.puts
stdin.close
output.each { |line| @out.print(line) }
+ @out.flush
wait_thr.value
end
end