wwtd 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -1
- data/lib/wwtd.rb +31 -74
- data/lib/wwtd/cli.rb +1 -1
- data/lib/wwtd/ruby.rb +16 -10
- data/lib/wwtd/run.rb +87 -0
- data/lib/wwtd/version.rb +1 -1
- metadata +3 -16
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaf173c438b057ddc0fde8ff1b335f076f2ffdcf
|
4
|
+
data.tar.gz: de324a6c925e15d68c9710236e8d23f20a9af746
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 401234f4b9e42a343b34ef6c44f115f84bb247c8977fbfba06b2096773ccb015627bc4a16db5f6a24d7cedc6077b8b1202e9dce0e96b41498f94dca9dafe1e45
|
7
|
+
data.tar.gz: dae16e6defcbbea3e9aba080565a0aaed888b8d53f03068c59935b6d053780a8702fed63ce8b27d686b882f40ffeef1c11a38446c5ef1d52416e818fc932cc4f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
*dvͺ��)�%HK���.��lg����_oǹ�k�����
|
2
|
+
��ӈy"M�"P�|.J��y&�V
|
data/lib/wwtd.rb
CHANGED
@@ -2,11 +2,12 @@ require "wwtd/version"
|
|
2
2
|
require "optparse"
|
3
3
|
require "yaml"
|
4
4
|
require "shellwords"
|
5
|
-
require "parallel"
|
6
5
|
require "tempfile"
|
7
6
|
require "tmpdir"
|
8
7
|
require "wwtd/ruby"
|
8
|
+
require "wwtd/run"
|
9
9
|
require "wwtd/cli"
|
10
|
+
require "open3"
|
10
11
|
|
11
12
|
module WWTD
|
12
13
|
CONFIG = ".travis.yml"
|
@@ -23,37 +24,24 @@ module WWTD
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def run(matrix, options, &block)
|
26
|
-
run_in_parallel(matrix, options) do |config, lock|
|
27
|
-
state = if Ruby.available?(config["rvm"])
|
28
|
-
yield(:start, config, matrix)
|
29
|
-
result = run_config(config, lock)
|
30
|
-
result ? :success : :failure
|
31
|
-
else
|
32
|
-
:missing
|
33
|
-
end
|
34
|
-
|
35
|
-
yield(state, config)
|
36
|
-
|
37
|
-
[state, config]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def run_in_parallel(matrix, options)
|
44
27
|
results = nil
|
45
28
|
with_clean_dot_bundle do
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
29
|
+
with_clean_env do
|
30
|
+
Dir.mktmpdir do |lock| # does not return values in ruby 1.8
|
31
|
+
results = in_multiple_threads(matrix.each_with_index, options[:parallel]) do |config, i|
|
32
|
+
# set env as parallel_tests does to reuse existing infrastructure
|
33
|
+
env = {}
|
34
|
+
env["TEST_ENV_NUMBER"] = (i == 0 ? "" : (i + 1).to_s) if options[:parallel]
|
35
|
+
Run.new(config, env, lock).execute(&block)
|
36
|
+
end
|
51
37
|
end
|
52
38
|
end
|
53
39
|
end
|
54
40
|
results
|
55
41
|
end
|
56
42
|
|
43
|
+
private
|
44
|
+
|
57
45
|
def with_clean_dot_bundle
|
58
46
|
had_old = File.exist?(".bundle")
|
59
47
|
Dir.mktmpdir do |dir|
|
@@ -84,61 +72,16 @@ module WWTD
|
|
84
72
|
matrix.map! { |c| config.merge(c) }
|
85
73
|
end
|
86
74
|
|
87
|
-
def run_config(config, lock)
|
88
|
-
with_clean_env do
|
89
|
-
Shellwords.split(config["env"] || "").each do |part|
|
90
|
-
name, value = part.split("=", 2)
|
91
|
-
ENV[name] = value
|
92
|
-
end
|
93
|
-
|
94
|
-
if gemfile = config["gemfile"]
|
95
|
-
ENV["BUNDLE_GEMFILE"] = gemfile
|
96
|
-
end
|
97
|
-
wants_bundle = gemfile || File.exist?(DEFAULT_GEMFILE)
|
98
|
-
|
99
|
-
switch_ruby = Ruby.switch_statement(config["rvm"])
|
100
|
-
|
101
|
-
if wants_bundle
|
102
|
-
flock("#{lock}/#{config["rvm"] || "rvm"}") do
|
103
|
-
default_bundler_args = "--deployment --path #{Dir.pwd}/vendor/bundle" if committed?("#{gemfile || DEFAULT_GEMFILE}.lock")
|
104
|
-
bundle_command = "#{switch_ruby}bundle install #{config["bundler_args"] || default_bundler_args}"
|
105
|
-
return false unless sh "#{bundle_command.strip} --quiet"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
default_command = (wants_bundle ? "bundle exec rake" : "rake")
|
110
|
-
command = config["script"] || default_command
|
111
|
-
command = "#{switch_ruby}#{command}"
|
112
|
-
|
113
|
-
sh(command)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def committed?(file)
|
118
|
-
@committed_files ||= (File.exist?(".git") && `git ls-files`.split("\n")) || []
|
119
|
-
@committed_files.include?(file)
|
120
|
-
end
|
121
|
-
|
122
|
-
def flock(file)
|
123
|
-
File.open(file, "w") do |f|
|
124
|
-
begin
|
125
|
-
f.flock(File::LOCK_EX)
|
126
|
-
yield
|
127
|
-
ensure
|
128
|
-
f.flock(File::LOCK_UN)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
75
|
# http://grosser.it/2010/12/11/sh-without-rake/
|
134
|
-
def sh(cmd)
|
76
|
+
def sh(env, cmd=nil)
|
77
|
+
cmd, env = env, {} unless cmd
|
135
78
|
puts cmd
|
136
|
-
|
137
|
-
while str =
|
79
|
+
Open3.popen2(env, cmd) do |stdin, stdout, wait|
|
80
|
+
while str = stdout.gets
|
138
81
|
puts str
|
139
82
|
end
|
83
|
+
wait.value.success?
|
140
84
|
end
|
141
|
-
$?.success?
|
142
85
|
end
|
143
86
|
|
144
87
|
def with_clean_env(&block)
|
@@ -148,5 +91,19 @@ module WWTD
|
|
148
91
|
yield
|
149
92
|
end
|
150
93
|
end
|
94
|
+
|
95
|
+
def in_multiple_threads(data, count)
|
96
|
+
data = data.to_a.dup
|
97
|
+
threads = [count || 1, data.size].min
|
98
|
+
results = []
|
99
|
+
(0...threads).to_a.map do
|
100
|
+
Thread.new do
|
101
|
+
while slice = data.shift
|
102
|
+
results << yield(slice)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end.each(&:join)
|
106
|
+
results
|
107
|
+
end
|
151
108
|
end
|
152
109
|
end
|
data/lib/wwtd/cli.rb
CHANGED
@@ -37,7 +37,7 @@ module WWTD
|
|
37
37
|
|
38
38
|
Options:
|
39
39
|
BANNER
|
40
|
-
opts.on("-p", "--parallel [
|
40
|
+
opts.on("-p", "--parallel [COUNT]", Integer, "Run in parallel") { |c| options[:parallel] = c || 4 }
|
41
41
|
opts.on("-h", "--help", "Show this.") { puts opts; exit }
|
42
42
|
opts.on("-v", "--version", "Show Version"){ puts WWTD::VERSION; exit}
|
43
43
|
end.parse!(argv)
|
data/lib/wwtd/ruby.rb
CHANGED
@@ -5,6 +5,9 @@ module WWTD
|
|
5
5
|
!version || switch_statement(version)
|
6
6
|
end
|
7
7
|
|
8
|
+
# - rvm: "rvm xxx do"
|
9
|
+
# - others: env hash
|
10
|
+
# - unknown: nil
|
8
11
|
def switch_statement(version)
|
9
12
|
return unless version
|
10
13
|
version = normalize_ruby_version(version)
|
@@ -13,23 +16,25 @@ module WWTD
|
|
13
16
|
command if cache_command("#{command} ruby -v")
|
14
17
|
else
|
15
18
|
if ruby_root = ENV["RUBY_ROOT"] # chruby or RUBY_ROOT set
|
16
|
-
|
19
|
+
switch_via_env(File.dirname(ruby_root), version)
|
17
20
|
elsif rbenv_executable
|
18
21
|
rubies_root = cache_command("which rbenv").sub(%r{/(\.?rbenv)/.*}, "/\\1") + "/versions"
|
19
|
-
|
22
|
+
switch_via_env(rubies_root, version)
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
24
27
|
private
|
25
28
|
|
26
|
-
def
|
27
|
-
extract_jruby_rbenv_options!(version)
|
29
|
+
def switch_via_env(rubies_root, version)
|
30
|
+
base = extract_jruby_rbenv_options!(version)
|
28
31
|
if ruby_root = ruby_root(rubies_root, version)
|
29
32
|
gem_home = Dir["#{ruby_root}/lib/ruby/gems/*"].first
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
base.merge(
|
34
|
+
"PATH" => "#{ruby_root}/bin:#{ENV["PATH"]}",
|
35
|
+
"GEM_HOME" => gem_home,
|
36
|
+
"GEM_PATH" => gem_home
|
37
|
+
)
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
@@ -64,11 +69,12 @@ module WWTD
|
|
64
69
|
|
65
70
|
# set ruby-opts for jruby flavors
|
66
71
|
def extract_jruby_rbenv_options!(version)
|
67
|
-
if version.sub!("-d19", "")
|
68
|
-
|
72
|
+
flag = if version.sub!("-d19", "")
|
73
|
+
"--1.9"
|
69
74
|
elsif version.sub!("-d18", "")
|
70
|
-
|
75
|
+
"--1.8"
|
71
76
|
end
|
77
|
+
{ "JRUBY_OPTS" => flag }
|
72
78
|
end
|
73
79
|
|
74
80
|
def capture(command)
|
data/lib/wwtd/run.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
module WWTD
|
2
|
+
class Run
|
3
|
+
def initialize(config, env, lock)
|
4
|
+
@config, @env, @lock = config, env, lock
|
5
|
+
add_env_from_config
|
6
|
+
@switch = build_switch_statement
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute(&block)
|
10
|
+
state = if Ruby.available?(config["rvm"])
|
11
|
+
yield(:start, config)
|
12
|
+
success? ? :success : :failure
|
13
|
+
else
|
14
|
+
:missing
|
15
|
+
end
|
16
|
+
|
17
|
+
yield(state, config)
|
18
|
+
|
19
|
+
[state, config]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :config, :env, :lock, :switch
|
25
|
+
|
26
|
+
def success?
|
27
|
+
if wants_bundle?
|
28
|
+
flock File.join(lock, config["rvm"] || "rvm") do
|
29
|
+
default_bundler_args = "--deployment --path #{Dir.pwd}/vendor/bundle" if committed?("#{gemfile || DEFAULT_GEMFILE}.lock")
|
30
|
+
bundle_command = "#{switch}bundle install #{config["bundler_args"] || default_bundler_args}"
|
31
|
+
return false unless sh(env, "#{bundle_command.strip} --quiet")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
default_command = (wants_bundle? ? "bundle exec rake" : "rake")
|
36
|
+
command = config["script"] || default_command
|
37
|
+
command = "#{switch}#{command}"
|
38
|
+
|
39
|
+
sh(env, command)
|
40
|
+
end
|
41
|
+
|
42
|
+
def wants_bundle?
|
43
|
+
gemfile || File.exist?(DEFAULT_GEMFILE)
|
44
|
+
end
|
45
|
+
|
46
|
+
def gemfile
|
47
|
+
config["gemfile"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def build_switch_statement
|
51
|
+
switch_ruby = Ruby.switch_statement(config["rvm"])
|
52
|
+
if switch_ruby.is_a?(Hash)
|
53
|
+
env.merge!(switch_ruby)
|
54
|
+
switch_ruby = nil
|
55
|
+
end
|
56
|
+
switch_ruby
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_env_from_config
|
60
|
+
Shellwords.split(config["env"] || "").each do |part|
|
61
|
+
name, value = part.split("=", 2)
|
62
|
+
env[name] = value
|
63
|
+
end
|
64
|
+
env["BUNDLE_GEMFILE"] = gemfile if gemfile
|
65
|
+
end
|
66
|
+
|
67
|
+
def committed?(file)
|
68
|
+
@committed_files ||= (File.exist?(".git") && `git ls-files`.split("\n")) || []
|
69
|
+
@committed_files.include?(file)
|
70
|
+
end
|
71
|
+
|
72
|
+
def flock(file)
|
73
|
+
File.open(file, "w") do |f|
|
74
|
+
begin
|
75
|
+
f.flock(File::LOCK_EX)
|
76
|
+
yield
|
77
|
+
ensure
|
78
|
+
f.flock(File::LOCK_UN)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def sh(*args)
|
84
|
+
::WWTD.send(:sh, *args)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/lib/wwtd/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wwtd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
@@ -30,21 +30,7 @@ cert_chain:
|
|
30
30
|
ycwMXfl0
|
31
31
|
-----END CERTIFICATE-----
|
32
32
|
date: 2013-11-23 00:00:00.000000000 Z
|
33
|
-
dependencies:
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: parallel
|
36
|
-
requirement: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - '>='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
type: :runtime
|
42
|
-
prerelease: false
|
43
|
-
version_requirements: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - '>='
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
33
|
+
dependencies: []
|
48
34
|
description:
|
49
35
|
email: michael@grosser.it
|
50
36
|
executables:
|
@@ -56,6 +42,7 @@ files:
|
|
56
42
|
- lib/wwtd.rb
|
57
43
|
- lib/wwtd/cli.rb
|
58
44
|
- lib/wwtd/ruby.rb
|
45
|
+
- lib/wwtd/run.rb
|
59
46
|
- lib/wwtd/tasks.rb
|
60
47
|
- lib/wwtd/version.rb
|
61
48
|
homepage: http://github.com/grosser/wwtd
|
metadata.gz.sig
CHANGED
Binary file
|