engineyard-serverside 1.6.0.pre5 → 1.6.3
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.
- data/lib/engineyard-serverside.rb +1 -3
- data/lib/engineyard-serverside/cli.rb +38 -73
- data/lib/engineyard-serverside/configuration.rb +12 -38
- data/lib/engineyard-serverside/deploy.rb +54 -63
- data/lib/engineyard-serverside/deploy_hook.rb +18 -21
- data/lib/engineyard-serverside/deprecation.rb +17 -9
- data/lib/engineyard-serverside/lockfile_parser.rb +1 -1
- data/lib/engineyard-serverside/logged_output.rb +91 -0
- data/lib/engineyard-serverside/rails_asset_support.rb +5 -5
- data/lib/engineyard-serverside/server.rb +11 -8
- data/lib/engineyard-serverside/strategies/git.rb +15 -12
- data/lib/engineyard-serverside/task.rb +8 -29
- data/lib/engineyard-serverside/version.rb +1 -1
- data/lib/vendor/systemu/LICENSE +3 -0
- data/lib/vendor/systemu/lib/systemu.rb +363 -0
- data/lib/vendor/systemu/systemu.gemspec +45 -0
- data/spec/basic_deploy_spec.rb +9 -9
- data/spec/bundler_deploy_spec.rb +1 -1
- data/spec/custom_deploy_spec.rb +4 -63
- data/spec/deploy_hook_spec.rb +78 -77
- data/spec/deprecation_spec.rb +26 -4
- data/spec/git_strategy_spec.rb +2 -6
- data/spec/logged_output_spec.rb +55 -0
- data/spec/nodejs_deploy_spec.rb +2 -2
- data/spec/services_deploy_spec.rb +10 -11
- data/spec/spec_helper.rb +25 -48
- data/spec/sqlite3_deploy_spec.rb +2 -1
- data/spec/support/integration.rb +14 -2
- metadata +79 -94
- data/lib/engineyard-serverside/shell.rb +0 -102
- data/lib/engineyard-serverside/shell/formatter.rb +0 -73
- data/lib/engineyard-serverside/shell/helpers.rb +0 -29
- data/lib/vendor/open4/lib/open4.rb +0 -432
- data/spec/shell_spec.rb +0 -50
data/spec/spec_helper.rb
CHANGED
@@ -17,10 +17,24 @@ module EY
|
|
17
17
|
@node = nil
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
def
|
22
|
-
|
23
|
-
|
20
|
+
module LoggedOutput
|
21
|
+
def self.enable_actual_info!
|
22
|
+
@use_actual_info = true
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.disable_actual_info!
|
26
|
+
@use_actual_info = false
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.use_actual_info?
|
30
|
+
@use_actual_info
|
31
|
+
end
|
32
|
+
|
33
|
+
alias old_info info
|
34
|
+
def info(*args)
|
35
|
+
if EY::Serverside::LoggedOutput.use_actual_info?
|
36
|
+
old_info(*args)
|
37
|
+
end
|
24
38
|
end
|
25
39
|
end
|
26
40
|
|
@@ -37,7 +51,8 @@ FileUtils.rm_rf GITREPO_DIR if File.exists? GITREPO_DIR
|
|
37
51
|
Kernel.system "tar xzf #{GITREPO_DIR}.tar.gz -C #{FIXTURES_DIR}"
|
38
52
|
|
39
53
|
Spec::Runner.configure do |config|
|
40
|
-
|
54
|
+
`which npm 2>&1`
|
55
|
+
$NPM_INSTALLED = ($? == 0)
|
41
56
|
unless $NPM_INSTALLED
|
42
57
|
$stderr.puts "npm not found; skipping Node.js specs."
|
43
58
|
end
|
@@ -48,46 +63,10 @@ Spec::Runner.configure do |config|
|
|
48
63
|
EY::Serverside.dna_json = {}.to_json
|
49
64
|
end
|
50
65
|
|
51
|
-
class VerboseStringIO < StringIO
|
52
|
-
def <<(str)
|
53
|
-
if ENV['VERBOSE'] || ENV['DEBUG']
|
54
|
-
$stderr << str
|
55
|
-
end
|
56
|
-
super
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def stdout
|
61
|
-
@stdout ||= VerboseStringIO.new
|
62
|
-
end
|
63
|
-
|
64
|
-
def stderr
|
65
|
-
@stderr ||= VerboseStringIO.new
|
66
|
-
end
|
67
|
-
|
68
|
-
def read_stdout
|
69
|
-
stdout.rewind
|
70
|
-
stdout.read
|
71
|
-
end
|
72
|
-
|
73
|
-
def read_stderr
|
74
|
-
stderr.rewind
|
75
|
-
stderr.read
|
76
|
-
end
|
77
|
-
|
78
|
-
def read_output
|
79
|
-
read_stdout + "\n" + read_stderr
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_shell
|
83
|
-
log_path = Pathname.new(Dir.tmpdir).join("serverside-deploy-#{Time.now.to_i}-#{$$}.log")
|
84
|
-
EY::Serverside::Shell.new(:verbose => true, :log_path => log_path, :stdout => stdout, :stderr => stderr)
|
85
|
-
end
|
86
|
-
|
87
66
|
def deploy_test_application(assets_enabled = true, &block)
|
88
67
|
$DISABLE_GEMFILE = false
|
89
68
|
$DISABLE_LOCKFILE = false
|
90
|
-
@deploy_dir =
|
69
|
+
@deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
|
91
70
|
|
92
71
|
# set up EY::Serverside::Server like we're on a solo
|
93
72
|
EY::Serverside::Server.reset
|
@@ -96,27 +75,25 @@ Spec::Runner.configure do |config|
|
|
96
75
|
# run a deploy
|
97
76
|
@config = EY::Serverside::Deploy::Configuration.new({
|
98
77
|
"strategy" => "IntegrationSpec",
|
99
|
-
"deploy_to" => @deploy_dir
|
78
|
+
"deploy_to" => @deploy_dir,
|
100
79
|
"group" => `id -gn`.strip,
|
101
80
|
"stack" => 'nginx_passenger',
|
102
81
|
"migrate" => "ruby -e 'puts ENV[\"PATH\"]' > #{@deploy_dir}/path-when-migrating",
|
103
82
|
'app' => 'rails31',
|
104
|
-
'environment' => 'env',
|
105
|
-
'account' => 'acc',
|
106
83
|
'framework_env' => 'staging'
|
107
84
|
})
|
108
85
|
|
109
86
|
# pretend there is a shared bundled_gems directory
|
110
|
-
|
87
|
+
FileUtils.mkdir_p(File.join(@deploy_dir, 'shared', 'bundled_gems'))
|
111
88
|
%w(RUBY_VERSION SYSTEM_VERSION).each do |name|
|
112
|
-
|
89
|
+
File.open(File.join(@deploy_dir, 'shared', 'bundled_gems', name), "w") { |f| f.write("old\n") }
|
113
90
|
end
|
114
91
|
|
115
92
|
# Set up the application directory to have the requested asset options.
|
116
93
|
prepare_rails31_app(assets_enabled)
|
117
94
|
|
118
95
|
@binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
|
119
|
-
@deployer = FullTestDeploy.new(@config
|
96
|
+
@deployer = FullTestDeploy.new(@config)
|
120
97
|
@deployer.deploy(&block)
|
121
98
|
end
|
122
99
|
|
data/spec/sqlite3_deploy_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "Deploying an application with sqlite3 as the only DB adapter in the Gemfile.lock" do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@release_path = nil
|
6
6
|
@shared_path = nil
|
7
7
|
@framework_env = nil
|
@@ -17,6 +17,7 @@ describe "Deploying an application with sqlite3 as the only DB adapter in the Ge
|
|
17
17
|
@framework_env = deployer.framework_env
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
20
21
|
|
21
22
|
it 'should symlink database.sqlite3.yml' do
|
22
23
|
File.exist?(File.join(@release_path, 'config', 'database.yml')).should be_true
|
data/spec/support/integration.rb
CHANGED
@@ -1,13 +1,25 @@
|
|
1
1
|
class FullTestDeploy < EY::Serverside::Deploy
|
2
|
-
attr_reader :commands
|
2
|
+
attr_reader :infos, :debugs, :commands
|
3
3
|
|
4
4
|
def initialize(*)
|
5
5
|
super
|
6
|
+
@infos = []
|
7
|
+
@debugs = []
|
6
8
|
@commands = []
|
7
9
|
@gemfile_contents = nil
|
8
10
|
@lockfile_contents = nil
|
9
11
|
end
|
10
12
|
|
13
|
+
# stfu
|
14
|
+
def info(msg)
|
15
|
+
@infos << msg
|
16
|
+
end
|
17
|
+
|
18
|
+
# no really, stfu
|
19
|
+
def debug(msg)
|
20
|
+
@debugs << msg
|
21
|
+
end
|
22
|
+
|
11
23
|
# passwordless sudo is neither guaranteed nor desired
|
12
24
|
def sudo(cmd)
|
13
25
|
run(cmd)
|
@@ -201,7 +213,7 @@ module EY::Serverside::Strategies::NodeIntegrationSpec
|
|
201
213
|
"name": "node-example",
|
202
214
|
"version": "0.0.1",
|
203
215
|
"dependencies": {
|
204
|
-
"express": "2.
|
216
|
+
"express": "2.5.8"
|
205
217
|
}
|
206
218
|
}
|
207
219
|
EOF
|
metadata
CHANGED
@@ -1,94 +1,87 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard-serverside
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 6
|
9
|
-
- 0
|
10
|
-
- pre
|
11
|
-
- 5
|
12
|
-
version: 1.6.0.pre5
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.6.3
|
5
|
+
prerelease:
|
13
6
|
platform: ruby
|
14
|
-
authors:
|
7
|
+
authors:
|
15
8
|
- EY Cloud Team
|
16
9
|
autorequire:
|
17
10
|
bindir: bin
|
18
11
|
cert_chain: []
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-03-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
23
15
|
name: rspec
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
26
17
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
hash: 31
|
31
|
-
segments:
|
32
|
-
- 1
|
33
|
-
- 3
|
34
|
-
- 2
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
35
21
|
version: 1.3.2
|
36
22
|
type: :development
|
37
|
-
version_requirements: *id001
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: rake
|
40
23
|
prerelease: false
|
41
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
25
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.3.2
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
52
37
|
version: 0.9.2.2
|
53
38
|
type: :development
|
54
|
-
version_requirements: *id002
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rdoc
|
57
39
|
prerelease: false
|
58
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.2.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rdoc
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
59
49
|
none: false
|
60
|
-
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
|
64
|
-
segments:
|
65
|
-
- 0
|
66
|
-
version: "0"
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
67
54
|
type: :development
|
68
|
-
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: timecop
|
71
55
|
prerelease: false
|
72
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
57
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: timecop
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
81
70
|
type: :development
|
82
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
83
78
|
description:
|
84
79
|
email: cloud@engineyard.com
|
85
|
-
executables:
|
80
|
+
executables:
|
86
81
|
- engineyard-serverside
|
87
82
|
extensions: []
|
88
|
-
|
89
83
|
extra_rdoc_files: []
|
90
|
-
|
91
|
-
files:
|
84
|
+
files:
|
92
85
|
- bin/engineyard-serverside
|
93
86
|
- lib/engineyard-serverside/cli.rb
|
94
87
|
- lib/engineyard-serverside/configuration.rb
|
@@ -100,11 +93,9 @@ files:
|
|
100
93
|
- lib/engineyard-serverside/futures/celluloid.rb
|
101
94
|
- lib/engineyard-serverside/futures/dataflow.rb
|
102
95
|
- lib/engineyard-serverside/lockfile_parser.rb
|
96
|
+
- lib/engineyard-serverside/logged_output.rb
|
103
97
|
- lib/engineyard-serverside/rails_asset_support.rb
|
104
98
|
- lib/engineyard-serverside/server.rb
|
105
|
-
- lib/engineyard-serverside/shell/formatter.rb
|
106
|
-
- lib/engineyard-serverside/shell/helpers.rb
|
107
|
-
- lib/engineyard-serverside/shell.rb
|
108
99
|
- lib/engineyard-serverside/strategies/git.rb
|
109
100
|
- lib/engineyard-serverside/task.rb
|
110
101
|
- lib/engineyard-serverside/version.rb
|
@@ -288,7 +279,9 @@ files:
|
|
288
279
|
- lib/vendor/json_pure/tools/fuzz.rb
|
289
280
|
- lib/vendor/json_pure/tools/server.rb
|
290
281
|
- lib/vendor/json_pure/VERSION
|
291
|
-
- lib/vendor/
|
282
|
+
- lib/vendor/systemu/lib/systemu.rb
|
283
|
+
- lib/vendor/systemu/LICENSE
|
284
|
+
- lib/vendor/systemu/systemu.gemspec
|
292
285
|
- lib/vendor/thor/bin/rake2thor
|
293
286
|
- lib/vendor/thor/bin/thor
|
294
287
|
- lib/vendor/thor/CHANGELOG.rdoc
|
@@ -351,51 +344,43 @@ files:
|
|
351
344
|
- spec/fixtures/valid_hook.rb
|
352
345
|
- spec/git_strategy_spec.rb
|
353
346
|
- spec/lockfile_parser_spec.rb
|
347
|
+
- spec/logged_output_spec.rb
|
354
348
|
- spec/nodejs_deploy_spec.rb
|
355
349
|
- spec/rails31_deploy_spec.rb
|
356
350
|
- spec/restart_spec.rb
|
357
351
|
- spec/server_spec.rb
|
358
352
|
- spec/services_deploy_spec.rb
|
359
|
-
- spec/shell_spec.rb
|
360
353
|
- spec/spec_helper.rb
|
361
354
|
- spec/sqlite3_deploy_spec.rb
|
362
355
|
- spec/support/integration.rb
|
363
356
|
homepage: http://github.com/engineyard/engineyard-serverside
|
364
357
|
licenses: []
|
365
|
-
|
366
358
|
post_install_message:
|
367
359
|
rdoc_options: []
|
368
|
-
|
369
|
-
require_paths:
|
360
|
+
require_paths:
|
370
361
|
- lib
|
371
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
362
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
372
363
|
none: false
|
373
|
-
requirements:
|
374
|
-
- -
|
375
|
-
- !ruby/object:Gem::Version
|
376
|
-
|
377
|
-
segments:
|
364
|
+
requirements:
|
365
|
+
- - ! '>='
|
366
|
+
- !ruby/object:Gem::Version
|
367
|
+
version: '0'
|
368
|
+
segments:
|
378
369
|
- 0
|
379
|
-
|
380
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
370
|
+
hash: -2108879952767088363
|
371
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
381
372
|
none: false
|
382
|
-
requirements:
|
383
|
-
- -
|
384
|
-
- !ruby/object:Gem::Version
|
385
|
-
hash: 23
|
386
|
-
segments:
|
387
|
-
- 1
|
388
|
-
- 3
|
389
|
-
- 6
|
373
|
+
requirements:
|
374
|
+
- - ! '>='
|
375
|
+
- !ruby/object:Gem::Version
|
390
376
|
version: 1.3.6
|
391
377
|
requirements: []
|
392
|
-
|
393
378
|
rubyforge_project:
|
394
|
-
rubygems_version: 1.8.
|
379
|
+
rubygems_version: 1.8.19
|
395
380
|
signing_key:
|
396
381
|
specification_version: 3
|
397
382
|
summary: A gem that deploys ruby applications on EY Cloud instances
|
398
|
-
test_files:
|
383
|
+
test_files:
|
399
384
|
- spec/basic_deploy_spec.rb
|
400
385
|
- spec/bundler_deploy_spec.rb
|
401
386
|
- spec/custom_deploy_spec.rb
|
@@ -423,12 +408,12 @@ test_files:
|
|
423
408
|
- spec/fixtures/valid_hook.rb
|
424
409
|
- spec/git_strategy_spec.rb
|
425
410
|
- spec/lockfile_parser_spec.rb
|
411
|
+
- spec/logged_output_spec.rb
|
426
412
|
- spec/nodejs_deploy_spec.rb
|
427
413
|
- spec/rails31_deploy_spec.rb
|
428
414
|
- spec/restart_spec.rb
|
429
415
|
- spec/server_spec.rb
|
430
416
|
- spec/services_deploy_spec.rb
|
431
|
-
- spec/shell_spec.rb
|
432
417
|
- spec/spec_helper.rb
|
433
418
|
- spec/sqlite3_deploy_spec.rb
|
434
419
|
- spec/support/integration.rb
|
@@ -1,102 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'pathname'
|
3
|
-
require 'open4'
|
4
|
-
require 'engineyard-serverside/shell/formatter'
|
5
|
-
|
6
|
-
module EY
|
7
|
-
module Serverside
|
8
|
-
class Shell
|
9
|
-
class YieldIO
|
10
|
-
def initialize(&block)
|
11
|
-
@block = block
|
12
|
-
end
|
13
|
-
def <<(str)
|
14
|
-
@block.call str
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
attr_reader :logger
|
19
|
-
|
20
|
-
def initialize(options)
|
21
|
-
@start_time = options[:start_time]
|
22
|
-
@verbose = options[:verbose]
|
23
|
-
|
24
|
-
|
25
|
-
@stdout = options[:stdout] || $stdout
|
26
|
-
@stderr = options[:stderr] || $stderr
|
27
|
-
|
28
|
-
log_pathname = Pathname.new(options[:log_path])
|
29
|
-
log_pathname.unlink if log_pathname.exist? # start fresh
|
30
|
-
@logger = Logger.new(log_pathname.to_s)
|
31
|
-
@logger.level = Logger::DEBUG # Always log to the file at debug, formatter hides debug for non-verbose
|
32
|
-
@logger.formatter = EY::Serverside::Shell::Formatter.new(@stdout, @stderr, start_time, @verbose)
|
33
|
-
end
|
34
|
-
|
35
|
-
def start_time
|
36
|
-
@start_time ||= Time.now
|
37
|
-
end
|
38
|
-
|
39
|
-
# a nice info outputter that prepends spermy operators for some reason.
|
40
|
-
def status(msg)
|
41
|
-
info msg.gsub(/^/, '~> ')
|
42
|
-
end
|
43
|
-
|
44
|
-
def substatus(msg)
|
45
|
-
debug msg.gsub(/^/, ' ~ ')
|
46
|
-
end
|
47
|
-
|
48
|
-
# a debug outputter that displays a command being run
|
49
|
-
# Formatis like this:
|
50
|
-
# $ cmd blah do \
|
51
|
-
# > something more
|
52
|
-
# > end
|
53
|
-
def show_command(cmd)
|
54
|
-
debug cmd.gsub(/^/, ' > ').sub(/>/, '$')
|
55
|
-
end
|
56
|
-
|
57
|
-
def command_stdout(msg)
|
58
|
-
debug msg.gsub(/^/,' ')
|
59
|
-
end
|
60
|
-
|
61
|
-
def command_stderr(msg)
|
62
|
-
unknown msg.gsub(/^/,' ')
|
63
|
-
end
|
64
|
-
|
65
|
-
def fatal(msg) logger.fatal "FATAL: #{msg}" end
|
66
|
-
def error(msg) logger.error "ERROR: #{msg}" end
|
67
|
-
def warning(msg) logger.warn "WARNING: #{msg}" end
|
68
|
-
def notice(msg) logger.warn msg end
|
69
|
-
def info(msg) logger.info msg end
|
70
|
-
def debug(msg) logger.debug msg end
|
71
|
-
def unknown(msg) logger.unknown msg end
|
72
|
-
|
73
|
-
# Return an IO that outputs to stdout or not according to the verbosity settings
|
74
|
-
# debug is hidden in non-verbose mode
|
75
|
-
def out
|
76
|
-
YieldIO.new { |msg| command_stdout(msg) }
|
77
|
-
end
|
78
|
-
|
79
|
-
# Return an IO that outputs to stderr
|
80
|
-
# unknown always shows, but without a severity title
|
81
|
-
def err
|
82
|
-
YieldIO.new { |msg| command_stderr(msg) }
|
83
|
-
end
|
84
|
-
|
85
|
-
def logged_system(cmd)
|
86
|
-
show_command(cmd)
|
87
|
-
spawn_process(cmd, out, err)
|
88
|
-
end
|
89
|
-
|
90
|
-
protected
|
91
|
-
|
92
|
-
# spawn_process is a separate utility method so tests can override just the meat
|
93
|
-
# of the process spawning and not couple the tests too tightly with the implementation.
|
94
|
-
# we do this because Open4 LOVES to segfault in CI. FUN!
|
95
|
-
def spawn_process(cmd, cmd_stdout, cmd_stderr)
|
96
|
-
# :quiet means don't raise an error on nonzero exit status
|
97
|
-
result = Open4.spawn cmd, 0 => '', 1 => cmd_stdout, 2 => cmd_stderr, :quiet => true
|
98
|
-
result.exitstatus == 0
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|