bwrap 1.1.0 → 1.1.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +5 -0
- data/lib/bwrap/execution/execute.rb +7 -0
- data/lib/bwrap/execution/execution.rb +21 -2
- data/lib/bwrap/execution/popen2e.rb +87 -0
- data/lib/bwrap/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 352b23610ac14344695cc17c4bcdaeaf7307b3742983f520581251b4bb7f85a5
|
4
|
+
data.tar.gz: e4cfa7fb8ca749e5dfddf11f6eb030fd82af1bd2a15dad5062d9ba4fd9be72fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb7feb42474faa52ab6cce4cafd66daabf20f8490519a0f950885b1347332d38a6c335de40d6db4c7371e9eb0a0a722352d6e4613db3e3df193688ae896c584e
|
7
|
+
data.tar.gz: 90892a26e8efddc5112c4fa22bd1b95e8380f1860df1680031549f0addf485b4229fcdd11d786a63d476bf151483db60eba7682d045d35b08dfccea88e6b5f44
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -40,6 +40,13 @@ class Bwrap::Execution::Execute
|
|
40
40
|
|
41
41
|
# @return formatted command.
|
42
42
|
def self.format_command command, rootcmd:
|
43
|
+
# Flatten the command if required, so nils can be converted in more of cases.
|
44
|
+
# Flattenization is also done in executions, but they also take in account
|
45
|
+
# for example rootcmd, so they probably should be done in addition to this one.
|
46
|
+
if command.respond_to? :flatten!
|
47
|
+
command.flatten!
|
48
|
+
end
|
49
|
+
|
43
50
|
replace_nils command
|
44
51
|
return command if rootcmd.nil?
|
45
52
|
|
@@ -5,6 +5,7 @@ require "bwrap/output"
|
|
5
5
|
require_relative "exceptions"
|
6
6
|
require_relative "execute"
|
7
7
|
require_relative "path"
|
8
|
+
require_relative "popen2e"
|
8
9
|
|
9
10
|
# Provides methods to execute commands and handle its output.
|
10
11
|
#
|
@@ -78,9 +79,27 @@ module Bwrap::Execution
|
|
78
79
|
end
|
79
80
|
|
80
81
|
# Works similarly to {Open3.popen2e}.
|
81
|
-
|
82
|
-
|
82
|
+
#
|
83
|
+
# TODO: If there will be any difference to input syntax, document those differences here.
|
84
|
+
# For now, rootcmd option has been implemented.
|
85
|
+
#
|
86
|
+
# A block is accepted, as does {Open3.popen2e}. For now, at least.
|
87
|
+
#
|
88
|
+
# TODO: Implement this so that this uses same execution things as other things here.
|
89
|
+
# This way bwrap actually can be integrated to this...
|
90
|
+
#
|
91
|
+
# TODO: Verify default log_callback is correct
|
92
|
+
#
|
93
|
+
# @warning Only array style commands are accepted. For example, `ls /`
|
94
|
+
# is not ok, but `ls` or `%w{ ls / }` is ok.
|
95
|
+
def popen2e *cmd, rootcmd: nil, log_callback: 1, log: true, &block
|
96
|
+
popen = Bwrap::Execution::Popen2e.new
|
97
|
+
popen.dry_run = @dry_run
|
98
|
+
popen.popen2e(*cmd, rootcmd: rootcmd, log_callback: log_callback, log: log, &block)
|
99
|
+
ensure
|
100
|
+
@last_status = $CHILD_STATUS
|
83
101
|
end
|
102
|
+
module_function :popen2e
|
84
103
|
|
85
104
|
# Returns Process::Status instance of last execution.
|
86
105
|
#
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @see {Bwrap::Execution.popen2e}
|
4
|
+
class Bwrap::Execution::Popen2e
|
5
|
+
attr_writer :dry_run
|
6
|
+
|
7
|
+
# @see {Bwrap::Execution.popen2e}
|
8
|
+
# TODO: Add a test for this (does Ruby have anything I could use here?).
|
9
|
+
#
|
10
|
+
# @note Also options accepted by {Open3.popen2e} are accepted
|
11
|
+
# here, in addition to those specified here.
|
12
|
+
def popen2e *cmd, rootcmd: nil, log_callback: 1, log: true, &block
|
13
|
+
@rootcmd = rootcmd
|
14
|
+
@log_callback = log_callback + 1 # Passing to another method, so need to add one more.
|
15
|
+
@log = log
|
16
|
+
self.opts_from_input = cmd
|
17
|
+
|
18
|
+
resolve_actual_command cmd
|
19
|
+
|
20
|
+
return if @dry_run || Bwrap::Execution::Execute.dry_run
|
21
|
+
|
22
|
+
open_pipes
|
23
|
+
popen_run(@actual_command, [ @in_read, @out_write ], [ @in_write, @out_read ], &block)
|
24
|
+
ensure
|
25
|
+
if block
|
26
|
+
@in_read.close
|
27
|
+
@in_write.close
|
28
|
+
@out_read.close
|
29
|
+
@out_write.close
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets @opts from `cmd` given to {#popen2e}, if any extra options have been given.
|
34
|
+
private def opts_from_input= cmd
|
35
|
+
@opts = cmd.last.is_a?(Hash) && cmd.pop.dup || {}
|
36
|
+
end
|
37
|
+
|
38
|
+
private def open_pipes
|
39
|
+
@in_read, @in_write = IO.pipe
|
40
|
+
@opts[:in] = @in_read
|
41
|
+
@in_write.sync = true
|
42
|
+
|
43
|
+
@out_read, @out_write = IO.pipe
|
44
|
+
@opts[[ :out, :err ]] = @out_write
|
45
|
+
end
|
46
|
+
|
47
|
+
# First element may be optional environment variables.
|
48
|
+
private def resolve_actual_command cmd
|
49
|
+
temp_cmd = cmd.dup
|
50
|
+
|
51
|
+
# Delete environment hash.
|
52
|
+
env_hash = temp_cmd.shift if temp_cmd.first.is_a? Hash
|
53
|
+
|
54
|
+
# Delete option hash.
|
55
|
+
option_hash = temp_cmd.pop if temp_cmd.last.is_a? Hash
|
56
|
+
|
57
|
+
temp_cmd = Bwrap::Execution::Execute.format_command temp_cmd, rootcmd: @rootcmd
|
58
|
+
Bwrap::Execution::Execute.handle_logging temp_cmd, log_callback: @log_callback, log: @log, dry_run: @dry_run
|
59
|
+
|
60
|
+
temp_cmd.unshift env_hash if env_hash
|
61
|
+
temp_cmd.push option_hash if option_hash
|
62
|
+
|
63
|
+
# If command is an array, there can’t be arrays inside the array (hashes are preserved).
|
64
|
+
# For convenience, the array is flattened here, so callers can construct commands more easily.
|
65
|
+
temp_cmd.flatten!
|
66
|
+
|
67
|
+
@actual_command = temp_cmd
|
68
|
+
end
|
69
|
+
|
70
|
+
private def popen_run cmd, child_io, parent_io
|
71
|
+
pid = spawn(*cmd, @opts)
|
72
|
+
wait_thr = Process.detach(pid)
|
73
|
+
child_io.each(&:close)
|
74
|
+
result = [ *parent_io, wait_thr ]
|
75
|
+
|
76
|
+
if defined? yield
|
77
|
+
begin
|
78
|
+
return yield(*result)
|
79
|
+
ensure
|
80
|
+
parent_io.each(&:close)
|
81
|
+
wait_thr.join
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
result
|
86
|
+
end
|
87
|
+
end
|
data/lib/bwrap/version.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bwrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samu Voutilainen
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
X4ioQwEn1/9tHs19VO1CLF58451HgEo1BXd7eWLmV1V5cqw0YWok1ly4L/Su/Phf
|
35
35
|
MRxVMHiVAqY=
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2022-06-
|
37
|
+
date: 2022-06-07 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: bundler
|
@@ -172,6 +172,7 @@ files:
|
|
172
172
|
- lib/bwrap/execution/execution.rb
|
173
173
|
- lib/bwrap/execution/labels.rb
|
174
174
|
- lib/bwrap/execution/path.rb
|
175
|
+
- lib/bwrap/execution/popen2e.rb
|
175
176
|
- lib/bwrap/output.rb
|
176
177
|
- lib/bwrap/output/colors.rb
|
177
178
|
- lib/bwrap/output/levels.rb
|
metadata.gz.sig
CHANGED
Binary file
|