pdk 1.11.1 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46888ff531aa661b8dd817436aa36c538ad768a2ff5bdab0faac0297fa099ab7
4
- data.tar.gz: 2a5965d847c138c5a23e0a09d12ba6535ece44f655d0cad81b5d936a29308a39
3
+ metadata.gz: 9b3de42650b7bdd05b69c6bb9ee6b0150f628c6e6eb9fb22ff938fcf095cd6f2
4
+ data.tar.gz: 13c89a19fb58166b235d75259d72e391e66cf3a86269cbaf8257bfdd69761b64
5
5
  SHA512:
6
- metadata.gz: 63006870c08a97822390e2602f143c8c907126d13dd80b54ecfc69918f6d20dba91f98040a33430d7ecbed446f62dfc22112d5043f99944f787f947a2dfe90b0
7
- data.tar.gz: 06f26931e79e3467770db297e5bd6c922457f4fa62030607c25db3dba98a185c8dd596a459dd590c9c3cb634af41229a3d109af7210a9f4225651e456f58b5eb
6
+ metadata.gz: 150e3a0047aaca9f19ee203bda23b07e49b177b91f266bfd63a159bac0772c1888a161a671b7b57d3eccbacbad5aec21f794d4eccd175a0ef0717714d322e81c
7
+ data.tar.gz: a146f216b223a1f93c362dd646d145cdc6149753981ec266fc78f72b181dd34e1279775d317d9eae5e801e6d94d1094f12f07234e2340cadda675774797966a4
@@ -4,6 +4,39 @@ All changes to this repo will be documented in this file.
4
4
  See the [release notes](https://puppet.com/docs/pdk/latest/release_notes.html) for a high-level summary.
5
5
 
6
6
 
7
+ ## [v1.12.0](https://github.com/puppetlabs/pdk/tree/v1.12.0) (2019-07-31)
8
+ [Full Changelog](https://github.com/puppetlabs/pdk/compare/v1.11.1...v1.12.0)
9
+
10
+ **Implemented enhancements:**
11
+
12
+ - \(PDK-421\) Validate EPP syntax [\#680](https://github.com/puppetlabs/pdk/pull/680) ([raphink](https://github.com/raphink))
13
+ - \(FM-8081\) pdk new transport [\#666](https://github.com/puppetlabs/pdk/pull/666) ([DavidS](https://github.com/DavidS))
14
+
15
+ **Fixed bugs:**
16
+
17
+ - Checking Ruby code style fails [\#697](https://github.com/puppetlabs/pdk/issues/697)
18
+ - template-url does not properly match ssh URI [\#653](https://github.com/puppetlabs/pdk/issues/653)
19
+ - pdk build should fix file + directory rights for tar file [\#618](https://github.com/puppetlabs/pdk/issues/618)
20
+
21
+ **Merged pull requests:**
22
+
23
+ - \(FIXUP\) Bypass shell invocation for PDK::CLI::Exec::InteractiveCommand [\#717](https://github.com/puppetlabs/pdk/pull/717) ([scotje](https://github.com/scotje))
24
+ - \(maint\) Expect pdk test unit to run more than 1 test [\#714](https://github.com/puppetlabs/pdk/pull/714) ([rodjek](https://github.com/rodjek))
25
+ - \(PDK-1309\) Ensure file modes in built modules are sane [\#713](https://github.com/puppetlabs/pdk/pull/713) ([rodjek](https://github.com/rodjek))
26
+ - \(PDK-641\) Make `pdk bundle` fully interactive [\#712](https://github.com/puppetlabs/pdk/pull/712) ([scotje](https://github.com/scotje))
27
+ - \(PDK-1366\) Update default operatingsystem versions [\#711](https://github.com/puppetlabs/pdk/pull/711) ([rodjek](https://github.com/rodjek))
28
+ - \(PDK-421\) Update acceptance tests for EPP Validation [\#709](https://github.com/puppetlabs/pdk/pull/709) ([glennsarti](https://github.com/glennsarti))
29
+ - \(PDK-1434\) Gracefully handle unparsable bolt analytics config [\#705](https://github.com/puppetlabs/pdk/pull/705) ([rodjek](https://github.com/rodjek))
30
+ - \(MAINT\) Add debug logging of yaml files being validated [\#704](https://github.com/puppetlabs/pdk/pull/704) ([npwalker](https://github.com/npwalker))
31
+ - \(maint\) Fix typo in gitignore [\#700](https://github.com/puppetlabs/pdk/pull/700) ([glennsarti](https://github.com/glennsarti))
32
+ - \(PDK-1333\) Fix command\_spec rake task for newer CRI versions [\#699](https://github.com/puppetlabs/pdk/pull/699) ([glennsarti](https://github.com/glennsarti))
33
+ - \(PDK-1429\) Bump version to 1.11.2.pre [\#698](https://github.com/puppetlabs/pdk/pull/698) ([scotje](https://github.com/scotje))
34
+ - \(FM-8081\) pdk new transport [\#696](https://github.com/puppetlabs/pdk/pull/696) ([DavidS](https://github.com/DavidS))
35
+ - \(maint\) Update beaker in package tests [\#695](https://github.com/puppetlabs/pdk/pull/695) ([rodjek](https://github.com/rodjek))
36
+ - Revert "Merge pull request \#666 from DavidS/fm-8081-pdk-new-transport" [\#693](https://github.com/puppetlabs/pdk/pull/693) ([DavidS](https://github.com/DavidS))
37
+ - \(maint\) Message and string fixes [\#676](https://github.com/puppetlabs/pdk/pull/676) ([DavidS](https://github.com/DavidS))
38
+ - \(PDK-1333\) command\_spec rake task [\#644](https://github.com/puppetlabs/pdk/pull/644) ([rodjek](https://github.com/rodjek))
39
+
7
40
  ## [v1.11.1](https://github.com/puppetlabs/pdk/tree/v1.11.1) (2019-07-01)
8
41
  [Full Changelog](https://github.com/puppetlabs/pdk/compare/v1.11.0...v1.11.1)
9
42
 
@@ -13,6 +46,7 @@ See the [release notes](https://puppet.com/docs/pdk/latest/release_notes.html) f
13
46
 
14
47
  **Merged pull requests:**
15
48
 
49
+ - \(PDK-1423\) Release 1.11.1 [\#692](https://github.com/puppetlabs/pdk/pull/692) ([rodjek](https://github.com/rodjek))
16
50
  - \(PDK-1415\) Allow analytics opt-out prompt to be disabled via ENV [\#691](https://github.com/puppetlabs/pdk/pull/691) ([scotje](https://github.com/scotje))
17
51
  - \(PDK-1414\) Detect common CI environments and set non-interactive [\#689](https://github.com/puppetlabs/pdk/pull/689) ([glennsarti](https://github.com/glennsarti))
18
52
  - \(PDK-1409\) Bump PDK version to 1.11.1.pre [\#688](https://github.com/puppetlabs/pdk/pull/688) ([rodjek](https://github.com/rodjek))
@@ -39,7 +39,7 @@ module PDK
39
39
 
40
40
  def screen_view(screen, **kwargs)
41
41
  custom_dimensions = walk_keys(kwargs) do |k|
42
- CUSTOM_DIMENSIONS[k] || raise("Unknown analytics key '#{k}'")
42
+ CUSTOM_DIMENSIONS[k] || raise(_("Unknown analytics key '%{key}'") % { key: k })
43
43
  end
44
44
 
45
45
  screen_view_params = {
@@ -54,7 +54,7 @@ module PDK
54
54
 
55
55
  def event(category, action, label: nil, value: nil, **kwargs)
56
56
  custom_dimensions = walk_keys(kwargs) do |k|
57
- CUSTOM_DIMENSIONS[k] || raise("Unknown analytics key '#{k}'")
57
+ CUSTOM_DIMENSIONS[k] || raise(_("Unknown analytics key '%{key}'") % { key: k })
58
58
  end
59
59
 
60
60
  event_params = {
@@ -6,8 +6,6 @@ module PDK::CLI
6
6
  description _(<<-EOF
7
7
  [experimental] For advanced users, pdk bundle runs arbitrary commands in the bundler environment that pdk manages.
8
8
  Careless use of this command can lead to errors that pdk can't help recover from.
9
-
10
- Note that for PowerShell the '--' needs to be escaped using a backtick: '`--' to avoid it being parsed by the shell.
11
9
  EOF
12
10
  )
13
11
  skip_option_parsing
@@ -27,16 +25,13 @@ EOF
27
25
 
28
26
  gemfile_env = PDK::Util::Bundler::BundleHelper.gemfile_env(puppet_env[:gemset])
29
27
 
30
- command = PDK::CLI::Exec::Command.new(PDK::CLI::Exec.bundle_bin, *args).tap do |c|
28
+ command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, *args).tap do |c|
31
29
  c.context = :pwd
32
30
  c.update_environment(gemfile_env)
33
31
  end
34
32
 
35
33
  result = command.execute!
36
34
 
37
- $stderr.puts result[:stdout]
38
- $stderr.puts result[:stderr]
39
-
40
35
  exit result[:exit_code]
41
36
  end
42
37
  end
@@ -1,5 +1,6 @@
1
1
  require 'bundler'
2
2
  require 'childprocess'
3
+ require 'English'
3
4
  require 'tempfile'
4
5
  require 'tty-spinner'
5
6
  require 'tty-which'
@@ -11,6 +12,9 @@ require 'pdk/util/ruby_version'
11
12
  module PDK
12
13
  module CLI
13
14
  module Exec
15
+ require 'pdk/cli/exec/command'
16
+ require 'pdk/cli/exec/interactive_command'
17
+
14
18
  def self.execute(*cmd)
15
19
  Command.new(*cmd).execute!
16
20
  end
@@ -19,6 +23,14 @@ module PDK
19
23
  Command.new(*cmd).tap { |c| c.environment = env }.execute!
20
24
  end
21
25
 
26
+ def self.execute_interactive(*cmd)
27
+ InteractiveCommand.new(*cmd).execute!
28
+ end
29
+
30
+ def self.execute_interactive_with_env(env, *cmd)
31
+ InteractiveCommand.new(*cmd).tap { |c| c.environment = env }.execute!
32
+ end
33
+
22
34
  def self.ensure_bin_present!(bin_path, bin_name)
23
35
  message = _('Unable to find `%{name}`. Check that it is installed and try again.') % {
24
36
  name: bin_name,
@@ -61,213 +73,6 @@ module PDK
61
73
  PDK.logger.debug(_("Using '%{vendored_bin}' from PDK package.") % { vendored_bin: vendored_bin_full_path })
62
74
  vendored_bin_full_path
63
75
  end
64
-
65
- # TODO: decide how/when to connect stdin to child process for things like pry
66
- # TODO: need a way to set callbacks on new stdout/stderr data
67
- class Command
68
- attr_reader :argv
69
- attr_reader :context
70
- attr_accessor :timeout
71
- attr_accessor :environment
72
- attr_writer :exec_group
73
-
74
- def initialize(*argv)
75
- @argv = argv
76
-
77
- @process = ChildProcess.build(*@argv)
78
- @process.leader = true
79
-
80
- @stdout = Tempfile.new('stdout').tap { |io| io.sync = true }
81
- @stderr = Tempfile.new('stderr').tap { |io| io.sync = true }
82
-
83
- @process.io.stdout = @stdout
84
- @process.io.stderr = @stderr
85
-
86
- # Default to running things in the system context.
87
- @context = :system
88
-
89
- # Extra environment vars to add to base set.
90
- @environment = {}
91
-
92
- # Register the ExecGroup when running in parallel
93
- @exec_group = nil
94
- end
95
-
96
- def context=(new_context)
97
- unless [:system, :module, :pwd].include?(new_context)
98
- raise ArgumentError, _("Expected execution context to be :system or :module but got '%{context}'.") % { context: new_context }
99
- end
100
-
101
- @context = new_context
102
- end
103
-
104
- def register_spinner(spinner, opts = {})
105
- return unless PDK::CLI::Util.interactive?
106
- @success_message = opts.delete(:success)
107
- @failure_message = opts.delete(:failure)
108
-
109
- @spinner = spinner
110
- end
111
-
112
- def add_spinner(message, opts = {})
113
- return unless PDK::CLI::Util.interactive?
114
- @success_message = opts.delete(:success)
115
- @failure_message = opts.delete(:failure)
116
-
117
- @spinner = TTY::Spinner.new("[:spinner] #{message}", opts.merge(PDK::CLI::Util.spinner_opts_for_platform))
118
- end
119
-
120
- def update_environment(additional_env)
121
- @environment.merge!(additional_env)
122
- end
123
-
124
- def check_for_legacy_env_vars
125
- if ENV['PUPPET_GEM_VERSION']
126
- PDK.logger.warn_once _(
127
- 'PUPPET_GEM_VERSION is not supported by PDK. ' \
128
- 'Please use the --puppet-version option on your PDK command ' \
129
- 'or set the PDK_PUPPET_VERSION environment variable instead',
130
- )
131
- @process.environment['PUPPET_GEM_VERSION'] = nil
132
- end
133
-
134
- %w[FACTER HIERA].each do |gem|
135
- if ENV["#{gem}_GEM_VERSION"]
136
- PDK.logger.warn_once _("#{gem}_GEM_VERSION is not supported by PDK.")
137
- @process.environment["#{gem}_GEM_VERSION"] = nil
138
- end
139
- end
140
- end
141
-
142
- def execute!
143
- # Start spinning if configured.
144
- @spinner.auto_spin if @spinner
145
-
146
- # Add custom env vars.
147
- @environment.each do |k, v|
148
- @process.environment[k] = v
149
- end
150
-
151
- check_for_legacy_env_vars
152
-
153
- @process.environment['BUNDLE_IGNORE_CONFIG'] = '1'
154
-
155
- if [:module, :pwd].include?(context)
156
- @process.environment['GEM_HOME'] = PDK::Util::RubyVersion.gem_home
157
- @process.environment['GEM_PATH'] = PDK::Util::RubyVersion.gem_path
158
-
159
- # Make sure invocation of Ruby prefers our private installation.
160
- package_binpath = PDK::Util.package_install? ? File.join(PDK::Util.pdk_package_basedir, 'bin') : nil
161
- @process.environment['PATH'] = [
162
- PDK::Util::RubyVersion.bin_path,
163
- File.join(@process.environment['GEM_HOME'], 'bin'),
164
- PDK::Util::RubyVersion.gem_paths_raw.map { |gem_path| File.join(gem_path, 'bin') },
165
- package_binpath,
166
- PDK::Util.package_install? ? PDK::Util::Git.git_paths : nil,
167
- ENV['PATH'],
168
- ].compact.flatten.join(File::PATH_SEPARATOR)
169
-
170
- mod_root = PDK::Util.module_root
171
-
172
- unless mod_root
173
- @spinner.error if @spinner
174
-
175
- raise PDK::CLI::FatalError, _('Current working directory is not part of a module. (No metadata.json was found.)')
176
- end
177
-
178
- if Dir.pwd == mod_root || context == :pwd
179
- run_process_in_clean_env!
180
- else
181
- Dir.chdir(mod_root) do
182
- run_process_in_clean_env!
183
- end
184
- end
185
- else
186
- run_process!
187
- end
188
-
189
- # Stop spinning when done (if configured).
190
- stop_spinner
191
-
192
- @stdout.rewind
193
- @stderr.rewind
194
-
195
- process_data = {
196
- stdout: @stdout.read,
197
- stderr: @stderr.read,
198
- exit_code: @process.exit_code,
199
- duration: @duration,
200
- }
201
-
202
- PDK.logger.debug _('STDOUT: %{output}') % {
203
- output: process_data[:stdout].empty? ? 'N/A' : "\n#{process_data[:stdout]}",
204
- }
205
- PDK.logger.debug _('STDERR: %{output}') % {
206
- output: process_data[:stderr].empty? ? 'N/A' : "\n#{process_data[:stderr]}",
207
- }
208
-
209
- process_data
210
- ensure
211
- @stdout.close
212
- @stderr.close
213
- end
214
-
215
- protected
216
-
217
- def stop_spinner
218
- return unless @spinner
219
-
220
- # If it is a single spinner, we need to send it a success/error message
221
- if @process.exit_code.zero?
222
- @spinner.success(@success_message || '')
223
- else
224
- @spinner.error(@failure_message || '')
225
- end
226
- end
227
-
228
- def run_process_in_clean_env!
229
- ::Bundler.with_clean_env do
230
- run_process!
231
- end
232
- end
233
-
234
- def run_process!
235
- command_string = argv.join(' ')
236
-
237
- PDK.logger.debug(_("Executing '%{command}'") % { command: command_string })
238
-
239
- if context == :module
240
- PDK.logger.debug(_('Command environment:'))
241
- @process.environment.each do |var, val|
242
- PDK.logger.debug(" #{var}: #{val}")
243
- end
244
- end
245
-
246
- start_time = Time.now
247
-
248
- begin
249
- @process.start
250
- rescue ChildProcess::LaunchError => e
251
- raise PDK::CLI::FatalError, _("Failed to execute '%{command}': %{message}") % { command: command_string, message: e.message }
252
- end
253
-
254
- if timeout
255
- begin
256
- @process.poll_for_exit(timeout)
257
- rescue ChildProcess::TimeoutError
258
- @process.stop # tries increasingly harsher methods to kill the process.
259
- end
260
- else
261
- # Wait indfinitely if no timeout set.
262
- @process.wait
263
- end
264
-
265
- @duration = Time.now - start_time
266
-
267
- PDK.logger.debug(_("Execution of '%{command}' complete (duration: %{duration_in_seconds}s; exit code: %{exit_code})") %
268
- { command: command_string, duration_in_seconds: @duration, exit_code: @process.exit_code })
269
- end
270
- end
271
76
  end
272
77
  end
273
78
  end
@@ -0,0 +1,233 @@
1
+ require 'bundler'
2
+ require 'childprocess'
3
+ require 'English'
4
+ require 'tempfile'
5
+ require 'tty-spinner'
6
+ require 'tty-which'
7
+
8
+ require 'pdk/util'
9
+ require 'pdk/util/git'
10
+ require 'pdk/util/ruby_version'
11
+
12
+ module PDK
13
+ module CLI
14
+ module Exec
15
+ class Command
16
+ attr_reader :argv
17
+ attr_reader :context
18
+ attr_accessor :timeout
19
+ attr_accessor :environment
20
+ attr_writer :exec_group
21
+
22
+ def initialize(*argv)
23
+ @argv = argv
24
+
25
+ @process = ChildProcess.build(*@argv)
26
+ @process.leader = true
27
+
28
+ @stdout = Tempfile.new('stdout').tap { |io| io.sync = true }
29
+ @stderr = Tempfile.new('stderr').tap { |io| io.sync = true }
30
+
31
+ @process.io.stdout = @stdout
32
+ @process.io.stderr = @stderr
33
+
34
+ # Default to running things in the system context.
35
+ @context = :system
36
+
37
+ # Extra environment vars to add to base set.
38
+ @environment = {}
39
+
40
+ # Register the ExecGroup when running in parallel
41
+ @exec_group = nil
42
+ end
43
+
44
+ def context=(new_context)
45
+ unless [:system, :module, :pwd].include?(new_context)
46
+ raise ArgumentError, _("Expected execution context to be :system or :module but got '%{context}'.") % { context: new_context }
47
+ end
48
+
49
+ @context = new_context
50
+ end
51
+
52
+ def register_spinner(spinner, opts = {})
53
+ return unless PDK::CLI::Util.interactive?
54
+ @success_message = opts.delete(:success)
55
+ @failure_message = opts.delete(:failure)
56
+
57
+ @spinner = spinner
58
+ end
59
+
60
+ def add_spinner(message, opts = {})
61
+ return unless PDK::CLI::Util.interactive?
62
+ @success_message = opts.delete(:success)
63
+ @failure_message = opts.delete(:failure)
64
+
65
+ @spinner = TTY::Spinner.new("[:spinner] #{message}", opts.merge(PDK::CLI::Util.spinner_opts_for_platform))
66
+ end
67
+
68
+ def update_environment(additional_env)
69
+ @environment.merge!(additional_env)
70
+ end
71
+
72
+ def execute!
73
+ # Start spinning if configured.
74
+ @spinner.auto_spin if @spinner
75
+
76
+ # Set env for child process
77
+ resolved_env_for_command.each { |k, v| @process.environment[k] = v }
78
+
79
+ if [:module, :pwd].include?(context)
80
+ mod_root = PDK::Util.module_root
81
+
82
+ unless mod_root
83
+ @spinner.error if @spinner
84
+
85
+ raise PDK::CLI::FatalError, _('Current working directory is not part of a module. (No metadata.json was found.)')
86
+ end
87
+
88
+ if Dir.pwd == mod_root || context == :pwd
89
+ run_process_in_clean_env!
90
+ else
91
+ Dir.chdir(mod_root) do
92
+ run_process_in_clean_env!
93
+ end
94
+ end
95
+ else
96
+ run_process!
97
+ end
98
+
99
+ # Stop spinning when done (if configured).
100
+ stop_spinner
101
+
102
+ @stdout.rewind
103
+ @stderr.rewind
104
+
105
+ process_data = {
106
+ stdout: @stdout.read,
107
+ stderr: @stderr.read,
108
+ exit_code: @process.exit_code,
109
+ duration: @duration,
110
+ }
111
+
112
+ PDK.logger.debug _('STDOUT: %{output}') % {
113
+ output: process_data[:stdout].empty? ? 'N/A' : "\n#{process_data[:stdout]}",
114
+ }
115
+ PDK.logger.debug _('STDERR: %{output}') % {
116
+ output: process_data[:stderr].empty? ? 'N/A' : "\n#{process_data[:stderr]}",
117
+ }
118
+
119
+ process_data
120
+ ensure
121
+ @stdout.close
122
+ @stderr.close
123
+ end
124
+
125
+ protected
126
+
127
+ def warn_on_legacy_env_vars!
128
+ if ENV['PUPPET_GEM_VERSION']
129
+ PDK.logger.warn_once _(
130
+ 'PUPPET_GEM_VERSION is not supported by PDK. ' \
131
+ 'Use the --puppet-version option on your PDK command ' \
132
+ 'or set the PDK_PUPPET_VERSION environment variable instead',
133
+ )
134
+ end
135
+
136
+ %w[FACTER HIERA].each do |gem|
137
+ if ENV["#{gem}_GEM_VERSION"]
138
+ PDK.logger.warn_once _('%{varname} is not supported by PDK.') % { varname: "#{gem}_GEM_VERSION" }
139
+ end
140
+ end
141
+ end
142
+
143
+ def resolved_env_for_command
144
+ warn_on_legacy_env_vars!
145
+
146
+ resolved_env = {}
147
+
148
+ resolved_env['TERM'] = ENV['TERM']
149
+ resolved_env['PUPPET_GEM_VERSION'] = nil
150
+ resolved_env['FACTER_GEM_VERSION'] = nil
151
+ resolved_env['HIERA_GEM_VERSION'] = nil
152
+
153
+ resolved_env.merge!(@environment.dup)
154
+
155
+ resolved_env['BUNDLE_IGNORE_CONFIG'] = '1'
156
+
157
+ if [:module, :pwd].include?(context)
158
+ resolved_env['GEM_HOME'] = PDK::Util::RubyVersion.gem_home
159
+ resolved_env['GEM_PATH'] = PDK::Util::RubyVersion.gem_path
160
+
161
+ # Make sure invocation of Ruby prefers our private installation.
162
+ package_binpath = PDK::Util.package_install? ? File.join(PDK::Util.pdk_package_basedir, 'bin') : nil
163
+
164
+ resolved_env['PATH'] = [
165
+ PDK::Util::RubyVersion.bin_path,
166
+ File.join(resolved_env['GEM_HOME'], 'bin'),
167
+ PDK::Util::RubyVersion.gem_paths_raw.map { |gem_path| File.join(gem_path, 'bin') },
168
+ package_binpath,
169
+ PDK::Util.package_install? ? PDK::Util::Git.git_paths : nil,
170
+ ENV['PATH'],
171
+ ].compact.flatten.join(File::PATH_SEPARATOR)
172
+ end
173
+
174
+ resolved_env
175
+ end
176
+
177
+ def stop_spinner
178
+ return unless @spinner
179
+
180
+ # If it is a single spinner, we need to send it a success/error message
181
+ if @process.exit_code.zero?
182
+ @spinner.success(@success_message || '')
183
+ else
184
+ @spinner.error(@failure_message || '')
185
+ end
186
+ end
187
+
188
+ def run_process_in_clean_env!
189
+ ::Bundler.with_clean_env do
190
+ run_process!
191
+ end
192
+ end
193
+
194
+ def run_process!
195
+ command_string = argv.join(' ')
196
+
197
+ PDK.logger.debug(_("Executing '%{command}'") % { command: command_string })
198
+
199
+ if context == :module
200
+ PDK.logger.debug(_('Command environment:'))
201
+ @process.environment.each do |var, val|
202
+ PDK.logger.debug(" #{var}: #{val}")
203
+ end
204
+ end
205
+
206
+ start_time = Time.now
207
+
208
+ begin
209
+ @process.start
210
+ rescue ChildProcess::LaunchError => e
211
+ raise PDK::CLI::FatalError, _("Failed to execute '%{command}': %{message}") % { command: command_string, message: e.message }
212
+ end
213
+
214
+ if timeout
215
+ begin
216
+ @process.poll_for_exit(timeout)
217
+ rescue ChildProcess::TimeoutError
218
+ @process.stop # tries increasingly harsher methods to kill the process.
219
+ end
220
+ else
221
+ # Wait indfinitely if no timeout set.
222
+ @process.wait
223
+ end
224
+
225
+ @duration = Time.now - start_time
226
+
227
+ PDK.logger.debug(_("Execution of '%{command}' complete (duration: %{duration_in_seconds}s; exit code: %{exit_code})") %
228
+ { command: command_string, duration_in_seconds: @duration, exit_code: @process.exit_code })
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end