heidi 0.1.2 → 0.2.0
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/VERSION +1 -1
- data/bin/heidi +1 -1
- data/heidi.gemspec +2 -2
- data/lib/heidi/build.rb +13 -4
- data/lib/heidi/builder.rb +2 -27
- data/lib/heidi/git.rb +18 -0
- data/lib/heidi/hook.rb +33 -5
- data/lib/heidi/integrator.rb +16 -8
- data/lib/heidi/project.rb +21 -8
- data/lib/heidi/tester.rb +1 -24
- data/lib/heidi/web/public/css/screen.css +6 -6
- data/lib/heidi/web/views/project.erb +11 -11
- metadata +19 -19
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/heidi
CHANGED
data/heidi.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "heidi"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Hartog C. de Mik"]
|
12
|
-
s.date = "2012-02-
|
12
|
+
s.date = "2012-02-09"
|
13
13
|
s.description = "CI-Joe alike CI system called Heidi."
|
14
14
|
s.email = "hartog@organisedminds.com"
|
15
15
|
s.executables = ["heidi", "heidi_console", "heidi_cron", "heidi_web"]
|
data/lib/heidi/build.rb
CHANGED
@@ -4,7 +4,7 @@ require 'time'
|
|
4
4
|
class Heidi
|
5
5
|
# An integration is called a build.
|
6
6
|
# The collections of builds is the log of the project.
|
7
|
-
# A single build lives in $project/
|
7
|
+
# A single build lives in $project/
|
8
8
|
# A build is tied to a commit
|
9
9
|
#
|
10
10
|
class Build
|
@@ -28,6 +28,14 @@ class Heidi
|
|
28
28
|
@logs = Logs.new(@log_root)
|
29
29
|
end
|
30
30
|
|
31
|
+
def author
|
32
|
+
project.author(@commit)
|
33
|
+
end
|
34
|
+
|
35
|
+
def date
|
36
|
+
project.date(@commit)
|
37
|
+
end
|
38
|
+
|
31
39
|
def load_hooks
|
32
40
|
log :info, "Loading hooks"
|
33
41
|
@hooks = {
|
@@ -77,7 +85,7 @@ class Heidi
|
|
77
85
|
@shell.mkdir %W(-p #{@log_root})
|
78
86
|
end
|
79
87
|
|
80
|
-
def log(type, msg)
|
88
|
+
def log(type, msg, raw=false)
|
81
89
|
name = case type
|
82
90
|
when :error
|
83
91
|
"heidi.errors"
|
@@ -85,7 +93,7 @@ class Heidi
|
|
85
93
|
"heidi.#{type}"
|
86
94
|
end
|
87
95
|
|
88
|
-
logs[name].write
|
96
|
+
logs[name].send(raw == false ? :write : :raw, msg)
|
89
97
|
end
|
90
98
|
|
91
99
|
def lock_file
|
@@ -177,7 +185,8 @@ class Heidi
|
|
177
185
|
end
|
178
186
|
|
179
187
|
def each(&block)
|
180
|
-
@logs.
|
188
|
+
heidi = @logs.select { |l| l.file_name =~ /heidi/ }
|
189
|
+
(heidi + (@logs - heidi)).each(&block)
|
181
190
|
end
|
182
191
|
|
183
192
|
class Log
|
data/lib/heidi/builder.rb
CHANGED
@@ -11,32 +11,7 @@ class Heidi
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def build!
|
14
|
-
return
|
15
|
-
|
16
|
-
if build.hooks[:build].any?
|
17
|
-
build_failed = false
|
18
|
-
build.hooks[:build].each do |hook|
|
19
|
-
next if build_failed == true
|
20
|
-
|
21
|
-
res = hook.perform(build.build_root)
|
22
|
-
if res.S?.to_i != 0
|
23
|
-
log("--- Build hook #{hook.name} failed ---")
|
24
|
-
log(res.err.empty? ? "no error message given" : res.err)
|
25
|
-
build_failed = true
|
26
|
-
break
|
27
|
-
|
28
|
-
else
|
29
|
-
log(res.out) unless res.out.empty?
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
if build_failed == true
|
34
|
-
build.log :error, "Build failed, revert to build.log for details"
|
35
|
-
return false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
return true
|
14
|
+
return self.setup_build_dir
|
40
15
|
end
|
41
16
|
|
42
17
|
def setup_build_dir
|
@@ -83,7 +58,7 @@ class Heidi
|
|
83
58
|
def create_tar_ball
|
84
59
|
shell = SimpleShell.new(build.root)
|
85
60
|
shell.mv %W(build #{build.commit})
|
86
|
-
tar = shell.tar %W(-cjf #{build.commit}.tar.bz2 #{build.commit})
|
61
|
+
tar = shell.tar %W(--exclude .git -cjf #{build.commit}.tar.bz2 #{build.commit})
|
87
62
|
if tar.S?.to_i == 0
|
88
63
|
shell.rm %W(-rf #{build.commit}/)
|
89
64
|
else
|
data/lib/heidi/git.rb
CHANGED
@@ -100,6 +100,24 @@ class Heidi
|
|
100
100
|
@shell.system(*command)
|
101
101
|
end
|
102
102
|
|
103
|
+
def log(amount, format=nil, commit=nil)
|
104
|
+
args = %W(log -n#{amount})
|
105
|
+
|
106
|
+
if !format.nil? && format !~ /\%/
|
107
|
+
commit = format
|
108
|
+
format = nil
|
109
|
+
end
|
110
|
+
|
111
|
+
args << "--pretty=#{format}" unless format.nil?
|
112
|
+
args << commit unless commit.nil?
|
113
|
+
|
114
|
+
@shell.git(args).out
|
115
|
+
end
|
116
|
+
|
117
|
+
def graph(amount=40)
|
118
|
+
@shell.git %W(log -n#{amount} --color --graph --pretty=oneline --abbrev-commit)
|
119
|
+
end
|
120
|
+
|
103
121
|
# git config $key $value
|
104
122
|
def []=(key, value)
|
105
123
|
@shell.system("git", "config", "heidi.#{key}", value)
|
data/lib/heidi/hook.rb
CHANGED
@@ -14,21 +14,49 @@ class Heidi
|
|
14
14
|
where = build.root
|
15
15
|
end
|
16
16
|
|
17
|
+
start = Time.now
|
17
18
|
env = {
|
18
|
-
'HEIDI_LOG_DIR'
|
19
|
-
'HEIDI_BUILD_DIR'
|
19
|
+
'HEIDI_LOG_DIR' => build.log_root,
|
20
|
+
'HEIDI_BUILD_DIR' => where,
|
21
|
+
'HEIDI_BUILD_COMMIT' => build.commit,
|
22
|
+
|
20
23
|
'RUBYOPT' => nil,
|
21
24
|
'BUNDLE_BIN_PATH' => nil,
|
22
25
|
'BUNDLE_GEMFILE' => nil,
|
26
|
+
'GEM_HOME' => nil,
|
27
|
+
'GEM_PATH' => nil,
|
23
28
|
}
|
24
29
|
|
25
30
|
shell = SimpleShell.new(where, env)
|
26
|
-
res = shell.do @script
|
27
|
-
|
31
|
+
@res = shell.do @script
|
32
|
+
|
33
|
+
return @res
|
34
|
+
end
|
35
|
+
|
36
|
+
def message
|
37
|
+
@res.err.empty? ?
|
38
|
+
@res.out.empty? ?
|
39
|
+
"No error message given" :
|
40
|
+
@res.out :
|
41
|
+
@res.err
|
42
|
+
end
|
43
|
+
|
44
|
+
def output
|
45
|
+
@res.out.empty? ?
|
46
|
+
@res.err.empty? ?
|
47
|
+
"No output" :
|
48
|
+
@res.err :
|
49
|
+
@res.out
|
50
|
+
end
|
51
|
+
|
52
|
+
def failed?
|
53
|
+
@res.S?.to_i != 0
|
54
|
+
rescue
|
55
|
+
false
|
28
56
|
end
|
29
57
|
|
30
58
|
def name
|
31
|
-
File.basename(@script)
|
59
|
+
File.join(File.basename(File.dirname(@script)), File.basename(@script))
|
32
60
|
end
|
33
61
|
end
|
34
62
|
end
|
data/lib/heidi/integrator.rb
CHANGED
@@ -43,10 +43,12 @@ class Heidi
|
|
43
43
|
return failure if !run_hooks(:before)
|
44
44
|
|
45
45
|
builder = Heidi::Builder.new(build)
|
46
|
-
tester = Heidi::Tester.new(build)
|
47
|
-
|
48
46
|
return failure if !builder.build!
|
47
|
+
return failure if !run_hooks(:build)
|
48
|
+
|
49
|
+
tester = Heidi::Tester.new(build)
|
49
50
|
return failure if !tester.test!
|
51
|
+
return failure if !run_hooks(:tests)
|
50
52
|
|
51
53
|
return failure if !run_hooks(:success)
|
52
54
|
|
@@ -62,7 +64,7 @@ class Heidi
|
|
62
64
|
return $!
|
63
65
|
|
64
66
|
ensure
|
65
|
-
run_hooks(:
|
67
|
+
run_hooks(:failure) if @failed == true
|
66
68
|
|
67
69
|
# always unlock the build root, no matter what
|
68
70
|
build.unlock
|
@@ -75,18 +77,24 @@ class Heidi
|
|
75
77
|
|
76
78
|
hooks_failed = false
|
77
79
|
build.hooks[where].each do |hook|
|
78
|
-
|
80
|
+
start = Time.now
|
81
|
+
build.log :info, "Running #{hook.name} :"
|
82
|
+
|
83
|
+
hook.perform
|
79
84
|
|
80
|
-
if
|
81
|
-
build.log :
|
82
|
-
build.log :error,
|
85
|
+
if hook.failed?
|
86
|
+
build.log :info, "\tfailed. See heidi.error"
|
87
|
+
build.log :error, "--- #{hook.name}: failed ---"
|
88
|
+
build.log :error, hook.message, true
|
83
89
|
|
84
90
|
hooks_failed = true
|
85
91
|
break
|
86
92
|
|
87
93
|
else
|
88
|
-
build.log :info,
|
94
|
+
build.log :info, "#{hook.output.lines.collect { |l| "\t#{l}" }.join("")}", true
|
89
95
|
end
|
96
|
+
|
97
|
+
build.log(:info, ("Took %.2fs" % (Time.now-start)))
|
90
98
|
end
|
91
99
|
|
92
100
|
@hooks_ran << where
|
data/lib/heidi/project.rb
CHANGED
@@ -5,14 +5,17 @@ require 'time'
|
|
5
5
|
|
6
6
|
class Heidi
|
7
7
|
class Project
|
8
|
-
attr_reader :root, :cached_root, :lock_file
|
8
|
+
attr_reader :root, :cached_root, :lock_file
|
9
9
|
|
10
10
|
def initialize(root)
|
11
11
|
@root = root
|
12
12
|
@lock_file = File.join(root, ".lock")
|
13
13
|
@cached_root = File.join(root, "cached")
|
14
14
|
@git = Heidi::Git.new(@cached_root)
|
15
|
-
|
15
|
+
end
|
16
|
+
|
17
|
+
def builds
|
18
|
+
@builds || load_builds
|
16
19
|
end
|
17
20
|
|
18
21
|
def load_builds
|
@@ -27,9 +30,11 @@ class Heidi
|
|
27
30
|
return nil unless commit.length >= 5
|
28
31
|
|
29
32
|
self.select do |build|
|
30
|
-
build.commit == commit || build.commit =~ Regexp.new(commit)
|
33
|
+
build.commit == commit || build.commit =~ Regexp.new("^#{commit}")
|
31
34
|
end.first
|
32
35
|
end
|
36
|
+
|
37
|
+
return @builds
|
33
38
|
end
|
34
39
|
|
35
40
|
def name=(name)
|
@@ -45,6 +50,14 @@ class Heidi
|
|
45
50
|
@git.commit[0..8]
|
46
51
|
end
|
47
52
|
|
53
|
+
def author(commit=self.commit)
|
54
|
+
@git.log(1, "%cN <%cE>", commit)
|
55
|
+
end
|
56
|
+
|
57
|
+
def date(commit=self.commit)
|
58
|
+
@git.log(1, "%ci", commit)
|
59
|
+
end
|
60
|
+
|
48
61
|
def last_commit
|
49
62
|
@git["commit"]
|
50
63
|
end
|
@@ -79,12 +92,13 @@ class Heidi
|
|
79
92
|
end
|
80
93
|
|
81
94
|
def integrate(forced=false)
|
82
|
-
return "locked" if locked?
|
83
95
|
return true if !forced && self.current_build == self.commit
|
96
|
+
return "locked" if locked?
|
84
97
|
|
85
98
|
status = "unknown"
|
86
99
|
|
87
100
|
self.lock do
|
101
|
+
record_current_build
|
88
102
|
res = Heidi::Integrator.new(self).integrate
|
89
103
|
if res == true
|
90
104
|
status = nil
|
@@ -115,7 +129,6 @@ class Heidi
|
|
115
129
|
# when the head has changed, update some stuff
|
116
130
|
if last_commit != self.commit
|
117
131
|
record_last_commit
|
118
|
-
record_current_build
|
119
132
|
end
|
120
133
|
end
|
121
134
|
|
@@ -131,12 +144,12 @@ class Heidi
|
|
131
144
|
end
|
132
145
|
|
133
146
|
def log
|
134
|
-
|
135
|
-
log = shell.git %W(log -n40 --color --graph --pretty=oneline --abbrev-commit)
|
147
|
+
log = @git.graph(120)
|
136
148
|
|
137
149
|
lines = []
|
138
150
|
log.out.lines.each do |line|
|
139
|
-
|
151
|
+
color_less = line.gsub(/\e\[[^m]+m/, '')
|
152
|
+
commit = color_less.scan(/^[\| \*]+ ([a-z0-9]+)/).flatten.first
|
140
153
|
lines << { :line => line, :build => builds.find(commit) }
|
141
154
|
end
|
142
155
|
|
data/lib/heidi/tester.rb
CHANGED
@@ -11,37 +11,14 @@ class Heidi
|
|
11
11
|
def test!
|
12
12
|
build.log(:info, "Starting tests")
|
13
13
|
|
14
|
-
tests_failed = false
|
15
|
-
|
16
14
|
if build.hooks[:tests].empty?
|
17
15
|
build.log(:error, "There are no test hooks")
|
18
16
|
@message = "There are no test hooks"
|
19
17
|
return false
|
20
18
|
end
|
21
19
|
|
22
|
-
|
23
|
-
res = hook.perform(build.build_root)
|
24
|
-
|
25
|
-
if res.S?.to_i != 0
|
26
|
-
log "--- test #{hook.name} failed ---"
|
27
|
-
log(res.err.empty? ? "No error message given" : res.err)
|
28
|
-
|
29
|
-
@message = "tests failed"
|
30
|
-
tests_failed = true
|
31
|
-
break
|
32
|
-
|
33
|
-
else
|
34
|
-
log(res.out) unless res.out.empty?
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
return tests_failed ? false : true
|
39
|
-
end
|
40
|
-
|
41
|
-
def log(string)
|
42
|
-
build.logs["test.log"].raw(string)
|
20
|
+
return true
|
43
21
|
end
|
44
22
|
|
45
|
-
|
46
23
|
end
|
47
24
|
end
|
@@ -39,8 +39,8 @@ h1 a {
|
|
39
39
|
text-decoration: line-through;
|
40
40
|
}
|
41
41
|
|
42
|
-
.color30 {
|
43
|
-
color:
|
42
|
+
.DNF, .color30 {
|
43
|
+
color: #333 !important;
|
44
44
|
}
|
45
45
|
|
46
46
|
.failed, .color31 {
|
@@ -63,7 +63,7 @@ h1 a {
|
|
63
63
|
color: purple !important;
|
64
64
|
}
|
65
65
|
|
66
|
-
.color36 {
|
66
|
+
.terminal .DNF, .color36 {
|
67
67
|
color: aqua !important;
|
68
68
|
}
|
69
69
|
|
@@ -102,7 +102,7 @@ h1 a {
|
|
102
102
|
}
|
103
103
|
|
104
104
|
.status {
|
105
|
-
padding-left:
|
105
|
+
padding-left: 3em;
|
106
106
|
}
|
107
107
|
|
108
108
|
p {
|
@@ -110,7 +110,7 @@ p {
|
|
110
110
|
}
|
111
111
|
|
112
112
|
a {
|
113
|
-
color: #
|
113
|
+
color: #333;
|
114
114
|
}
|
115
115
|
|
116
116
|
a:hover {
|
@@ -118,7 +118,7 @@ a:hover {
|
|
118
118
|
}
|
119
119
|
|
120
120
|
a:visited {
|
121
|
-
color: #
|
121
|
+
color: #333;
|
122
122
|
}
|
123
123
|
|
124
124
|
table {
|
@@ -9,21 +9,21 @@
|
|
9
9
|
latest = builds.select { |b| b.commit == project.latest_build }.first
|
10
10
|
%>
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
<h2>Overview</h2>
|
13
|
+
<strong class="label">Current</strong> :
|
14
|
+
<% unless current.nil? %>
|
15
15
|
<a class="<%= current.status %>" href="/projects/<%= project.name %>/build/<%= current.commit %>"><%= current.commit %></a>
|
16
|
-
|
17
|
-
|
16
|
+
<% end %>
|
17
|
+
<br />
|
18
|
+
<strong class="label">Latest successful</strong> :
|
19
|
+
<% unless latest.nil? %>
|
18
20
|
<a class="<%= latest.status %>" href="/projects/<%= project.name %>/build/<%= latest.commit %>"><%= latest == current ? "current" : latest.commit %></a>
|
19
|
-
<br />
|
20
|
-
<br />
|
21
|
-
<br />
|
22
21
|
<% end %>
|
22
|
+
<br />
|
23
|
+
<br />
|
24
|
+
<br />
|
23
25
|
|
24
26
|
<h2>Build history</h2>
|
25
|
-
<
|
26
|
-
<pre class="terminal"><% project.log.each do |line| %><% build = nil; if (build = line[:build]) %><a href="/projects/<%= project.name %>/build/<%= build.commit %>"><%= ansi_color_codes(line[:line]).chomp %></a> <span class="status">[<span class="<%= build.status %>"><%= build.status %></span>]</span>
|
27
|
+
<pre style="width: 75%" class="terminal"><% project.log.each do |line| %><% build = nil; if (build = line[:build]) %><a title="<%= build.author %>" href="/projects/<%= project.name %>/build/<%= build.commit %>"><%= ansi_color_codes(line[:line]).chomp %></a> <span class="status">[<span class="<%= build.status %>"><%= build.status %></span>] (<%= build.date %>, <%= build.author.gsub '<', '<' %>)</span>
|
27
28
|
<% else %><%= ansi_color_codes line[:line] %>
|
28
29
|
<% end %><% end %></pre>
|
29
|
-
</div>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heidi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-09 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thin
|
16
|
-
requirement: &
|
16
|
+
requirement: &85154280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *85154280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sinatra
|
27
|
-
requirement: &
|
27
|
+
requirement: &85153980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *85153980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: simple_shell
|
38
|
-
requirement: &
|
38
|
+
requirement: &85153630 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *85153630
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &85153340 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.8.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *85153340
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rdoc
|
60
|
-
requirement: &
|
60
|
+
requirement: &85153020 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '3.12'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *85153020
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
|
-
requirement: &
|
71
|
+
requirement: &85148650 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.0.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *85148650
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: jeweler
|
82
|
-
requirement: &
|
82
|
+
requirement: &85148280 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.8.3
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *85148280
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rcov
|
93
|
-
requirement: &
|
93
|
+
requirement: &85147950 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *85147950
|
102
102
|
description: CI-Joe alike CI system called Heidi.
|
103
103
|
email: hartog@organisedminds.com
|
104
104
|
executables:
|
@@ -164,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
segments:
|
166
166
|
- 0
|
167
|
-
hash: -
|
167
|
+
hash: -232203085
|
168
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
169
|
none: false
|
170
170
|
requirements:
|