specinfra 2.36.16 → 2.36.17

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
  SHA1:
3
- metadata.gz: 31f0678bd739fd583fa966de880fbaa598e472dc
4
- data.tar.gz: 1320a5fa3d67768f37014a5543b19170b3fa5edb
3
+ metadata.gz: 2d39102e5d6b60f2c4e5aa254c95e9559c4ca2f5
4
+ data.tar.gz: 47387d1f254b6e5e7f96db0d2f3eaf360882c0b2
5
5
  SHA512:
6
- metadata.gz: 369339a197697ee26e44a5bba33329a88c95aa4889f9d7f818b510bf54ed14687314fbcf003d27f60475de5ecaf5b3277acc325fb14cd437706a12a5c1404860
7
- data.tar.gz: 4f74f36d6b8cb24e53d02a045f9fee4b411a9b91c15db355709ccd7b644a9f9318265b26e4fa09058a85dd51b383e8252d3c870f70ef822b3a2fa57d9668b992
6
+ metadata.gz: bef2820b4f8a57c88a882286a8a93e6ccf0c2e552bfe7f7aa723be3b3474a848f0b302670c3bf45ab462dc40f3a4e0b3f4adfb24985159512470fe0b9fb23050
7
+ data.tar.gz: 85444779c5f8356f8f8cc0b48e717a68c1aff79f63f60bb942ff8bdc4e9faa66fcd9f313aa342d0f9ea94ca46396f050cbe620237157dd5c39e526c2f60dd63d
@@ -1,6 +1,7 @@
1
1
  require 'singleton'
2
2
  require 'fileutils'
3
3
  require 'shellwords'
4
+ require 'sfl'
4
5
 
5
6
  module Specinfra
6
7
  module Backend
@@ -8,18 +9,16 @@ module Specinfra
8
9
  def run_command(cmd, opts={})
9
10
  cmd = build_command(cmd)
10
11
  cmd = add_pre_command(cmd)
11
- stdout = with_env do
12
- `#{cmd} 2>&1`
12
+ stdout, stderr, exit_status = with_env do
13
+ spawn_command(cmd)
13
14
  end
14
- # In ruby 1.9, it is possible to use Open3.capture3, but not in 1.8
15
- # stdout, stderr, status = Open3.capture3(cmd)
16
15
 
17
16
  if @example
18
17
  @example.metadata[:command] = cmd
19
18
  @example.metadata[:stdout] = stdout
20
19
  end
21
20
 
22
- CommandResult.new :stdout => stdout, :exit_status => $?.exitstatus
21
+ CommandResult.new :stdout => stdout, :stderr => stderr, :exit_status => exit_status
23
22
  end
24
23
 
25
24
  def send_file(from, to)
@@ -44,6 +43,61 @@ module Specinfra
44
43
  end
45
44
 
46
45
  private
46
+ def spawn_command(cmd)
47
+ stdout, stderr = '', ''
48
+
49
+ begin
50
+ quit_r, quit_w = IO.pipe
51
+ out_r, out_w = IO.pipe
52
+ err_r, err_w = IO.pipe
53
+
54
+ th = Thread.new do
55
+ begin
56
+ loop do
57
+ readable_ios, = IO.select([quit_r, out_r, err_r])
58
+
59
+ if readable_ios.include?(out_r)
60
+ stdout += out_r.read_nonblock(1000)
61
+ end
62
+
63
+ if readable_ios.include?(err_r)
64
+ stderr += err_r.read_nonblock(1000)
65
+ end
66
+
67
+ if readable_ios.include?(quit_r)
68
+ break
69
+ end
70
+ end
71
+ rescue EOFError
72
+ ensure
73
+ quit_r.close unless quit_r.closed?
74
+ out_r.close unless out_r.closed?
75
+ err_r.close unless err_r.closed?
76
+ end
77
+ end
78
+
79
+ th.abort_on_exception = true
80
+
81
+ pid = spawn(cmd, :out => out_w, :err => err_w)
82
+
83
+ out_w.close
84
+ err_w.close
85
+
86
+ pid, stats = Process.waitpid2(pid)
87
+
88
+ begin
89
+ quit_w.syswrite 1
90
+ rescue Errno::EPIPE
91
+ end
92
+
93
+ th.value # wait
94
+ ensure
95
+ quit_w.close unless quit_w.closed?
96
+ end
97
+
98
+ return stdout, stderr, stats.exitstatus
99
+ end
100
+
47
101
  def with_env
48
102
  keys = %w[BUNDLER_EDITOR BUNDLE_BIN_PATH BUNDLE_GEMFILE
49
103
  RUBYOPT GEM_HOME GEM_PATH GEM_CACHE]
@@ -1,3 +1,3 @@
1
1
  module Specinfra
2
- VERSION = "2.36.16"
2
+ VERSION = "2.36.17"
3
3
  end
data/specinfra.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_runtime_dependency "net-scp"
23
23
  spec.add_runtime_dependency "net-ssh"
24
24
  spec.add_runtime_dependency "net-telnet"
25
+ spec.add_runtime_dependency "sfl"
25
26
 
26
27
  spec.add_development_dependency "bundler", "~> 1.3"
27
28
  spec.add_development_dependency "rake", "~> 10.1.1"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: specinfra
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.36.16
4
+ version: 2.36.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gosuke Miyashita
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sfl
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement