kamal-backup 0.3.0.beta14 → 0.3.0.beta16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 78dad6331e7a06890125c303e9631e8701d6a1aeffe953134905456910a9e445
4
- data.tar.gz: af988f114c9449b3f5d6fe8fecb6b09ecddddf20887aadf7d98700b8f2023c5d
3
+ metadata.gz: 4459cc1c5b400de2e07ab808a8788c3364965bf5f332cc45fafe8388e04e2d59
4
+ data.tar.gz: 1fc19515ad7da4d62f21b8437e58f70e4af65954cdcb2953e5e820c298935476
5
5
  SHA512:
6
- metadata.gz: 7af73531536f8179425f95ebd4b5a9d3522e4fe0e2a109564795a4da318e73b9b85e26427bb4d7ee7b388cea94deb9f1670b9ca18c7b5a4592d8906182b9c794
7
- data.tar.gz: 4b32db0463641ca0f51dc35f23cb5b6d00bc36ac09518921efec1636d0517bc39624d1ef36fc1f86ad53efb554dd880c583dd5e9e5f4ff6c9efe39a3b5888d75
6
+ metadata.gz: cb97e1c203a0078a1023e30e2f0206a28fd1020edee11108bd88ac081fb35909eb8637d616e1e81b0390ad54905573534147d3e57a660695c033b129113fbaec
7
+ data.tar.gz: aa521cc3dc479d4b37cb9447b7ff2985b96c68323c586d060911d94b445edd1bf680b7094ab88b4a2cca0ebf6f6e0424f0e941d85155a14e7085db114ef9a22b
@@ -1,4 +1,5 @@
1
1
  require "open3"
2
+ require "pty"
2
3
  require "securerandom"
3
4
  require "shellwords"
4
5
  require_relative "errors"
@@ -250,6 +251,39 @@ module KamalBackup
250
251
  raise command_not_found(spec, e)
251
252
  end
252
253
 
254
+ def capture_pty(spec, redactor:, tee_stdout: nil)
255
+ output = +""
256
+ tee_buffer = +""
257
+ result = nil
258
+
259
+ PTY.spawn(spec.env, *spec.argv) do |reader, writer, pid|
260
+ writer.close
261
+
262
+ begin
263
+ loop do
264
+ chunk = reader.readpartial(16 * 1024)
265
+ output << chunk
266
+ tee_buffer = tee_stream(tee_stdout, redactor, tee_buffer, chunk) if tee_stdout
267
+ end
268
+ rescue EOFError, Errno::EIO
269
+ flush_tee_stream(tee_stdout, redactor, tee_buffer) if tee_stdout
270
+ ensure
271
+ reader.close unless reader.closed?
272
+ end
273
+
274
+ _, status = Process.wait2(pid)
275
+ result = CommandResult.new(stdout: output, stderr: "", status: status.exitstatus, streamed: !!tee_stdout)
276
+
277
+ unless status.success?
278
+ raise command_failure(spec, status.exitstatus, output, output, redactor)
279
+ end
280
+ end
281
+
282
+ result
283
+ rescue Errno::ENOENT => e
284
+ raise command_not_found(spec, e)
285
+ end
286
+
253
287
  def collect_stream(io, command_output: self.output, context: nil, stream: :stdout, log_output: true, tee_io: nil, redactor: nil)
254
288
  captured_output = +""
255
289
  tee_buffer = +""
@@ -219,7 +219,7 @@ module KamalBackup
219
219
  argv
220
220
  end
221
221
 
222
- def capture_kamal(argv, stream: false, log: !stream, stdout: @stdout, stderr: @stderr)
222
+ def capture_kamal(argv, stream: false, log: !stream, stdout: @stdout, stderr: @stderr, pty: false)
223
223
  spec = CommandSpec.new(argv: argv, env: kamal_stream_env(stream))
224
224
  options = {
225
225
  redactor: @redactor,
@@ -230,7 +230,15 @@ module KamalBackup
230
230
  }
231
231
 
232
232
  if defined?(Bundler)
233
- Bundler.with_unbundled_env { Command.capture(spec, **options) }
233
+ Bundler.with_unbundled_env { capture_command(spec, options, pty: pty) }
234
+ else
235
+ capture_command(spec, options, pty: pty)
236
+ end
237
+ end
238
+
239
+ def capture_command(spec, options, pty:)
240
+ if pty
241
+ Command.capture_pty(spec, redactor: options.fetch(:redactor), tee_stdout: options[:tee_stdout])
234
242
  else
235
243
  Command.capture(spec, **options)
236
244
  end
@@ -249,7 +257,8 @@ module KamalBackup
249
257
  kamal_exec_argv(accessory_name, command, interactive: true),
250
258
  stream: true,
251
259
  log: false,
252
- stdout: filtered_interactive_stdout
260
+ stdout: filtered_interactive_stdout,
261
+ pty: true
253
262
  )
254
263
  Command.output&.command_exit(context, result.status) if context
255
264
  result
@@ -260,7 +269,8 @@ module KamalBackup
260
269
 
261
270
  def filtered_interactive_stdout
262
271
  FilteringIO.new(@stdout) do |output|
263
- output == "Launching interactive command via SSH from existing container...\n"
272
+ stripped = output.to_s.gsub(/\e\[[0-9;]*m/, "").delete("\r").strip
273
+ stripped == "Launching interactive command via SSH from existing container..."
264
274
  end
265
275
  end
266
276
 
@@ -283,7 +293,11 @@ module KamalBackup
283
293
  normalized_hosts(fetch(accessory_config, :hosts))
284
294
  end
285
295
 
286
- hosts.first if hosts.size == 1
296
+ return hosts.first if hosts.size == 1
297
+ return if hosts.any?
298
+
299
+ all_hosts = normalized_hosts(fetch(config, :hosts))
300
+ all_hosts.first if all_hosts.size == 1
287
301
  end
288
302
 
289
303
  def normalized_hosts(value)
@@ -299,9 +313,20 @@ module KamalBackup
299
313
 
300
314
  def default_accessory_service_name(accessory_name)
301
315
  service = fetch(config, :service).to_s
316
+ service = service_from_rendered_config if service.empty?
302
317
  "#{service}-#{accessory_name}" unless service.empty?
303
318
  end
304
319
 
320
+ def service_from_rendered_config
321
+ service_with_version = fetch(config, :service_with_version).to_s
322
+ version = fetch(config, :version).to_s
323
+ suffix = "-#{version}"
324
+
325
+ if !service_with_version.empty? && !version.empty? && service_with_version.end_with?(suffix)
326
+ service_with_version.delete_suffix(suffix)
327
+ end
328
+ end
329
+
305
330
  class FilteringIO
306
331
  def initialize(io, &reject)
307
332
  @io = io
@@ -1,3 +1,3 @@
1
1
  module KamalBackup
2
- VERSION = "0.3.0.beta14"
2
+ VERSION = "0.3.0.beta16"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamal-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.beta14
4
+ version: 0.3.0.beta16
5
5
  platform: ruby
6
6
  authors:
7
7
  - crmne