heidi 0.0.1 → 0.0.2

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/Gemfile CHANGED
@@ -2,6 +2,8 @@ source "http://rubygems.org"
2
2
 
3
3
  gem "thin"
4
4
  gem "sinatra"
5
+ # gem 'sinatra-assetpack'
6
+ gem 'sinatra-assetpack', :require => 'sinatra/assetpack', :git => 'git://github.com/rstacruz/sinatra-assetpack.git'
5
7
  gem "simple_shell"
6
8
 
7
9
  group :development do
data/Gemfile.lock CHANGED
@@ -1,3 +1,13 @@
1
+ GIT
2
+ remote: git://github.com/rstacruz/sinatra-assetpack.git
3
+ revision: ab2a413026099492807bd19affd60bd3d3bc1cca
4
+ specs:
5
+ sinatra-assetpack (0.0.10)
6
+ jsmin
7
+ rack-test
8
+ sinatra
9
+ tilt (>= 1.3.0)
10
+
1
11
  GEM
2
12
  remote: http://rubygems.org/
3
13
  specs:
@@ -10,10 +20,13 @@ GEM
10
20
  git (>= 1.2.5)
11
21
  rake
12
22
  rdoc
23
+ jsmin (1.0.1)
13
24
  json (1.6.5)
14
25
  rack (1.4.1)
15
26
  rack-protection (1.2.0)
16
27
  rack
28
+ rack-test (0.6.1)
29
+ rack (>= 1.0)
17
30
  rake (0.9.2.2)
18
31
  rcov (0.9.10)
19
32
  rdoc (3.12)
@@ -26,7 +39,7 @@ GEM
26
39
  rspec-expectations (2.8.0)
27
40
  diff-lcs (~> 1.1.2)
28
41
  rspec-mocks (2.8.0)
29
- simple_shell (1.0.0)
42
+ simple_shell (1.0.1)
30
43
  sinatra (1.3.2)
31
44
  rack (~> 1.3, >= 1.3.6)
32
45
  rack-protection (~> 1.2)
@@ -48,4 +61,5 @@ DEPENDENCIES
48
61
  rspec (~> 2.8.0)
49
62
  simple_shell
50
63
  sinatra
64
+ sinatra-assetpack!
51
65
  thin
data/README.rdoc CHANGED
@@ -1,9 +1,14 @@
1
- = heidi
1
+ = Heidi
2
2
 
3
- Description goes here.
3
+ A Continious Integration thingy. Naive, and therefor called Heidi.
4
+
5
+ http://www.tv-nostalgie.de/sound/Heidi2.jpg
6
+
7
+ Heidi is still taking form and is/will-be used to do CI at OrganisedMinds.com
8
+ (http://organisedminds.com) - Why don't you sign up there? It's free!
4
9
 
5
10
  == Contributing to heidi
6
-
11
+
7
12
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
13
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
14
  * Fork the project.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/bin/heidi CHANGED
@@ -1,70 +1,74 @@
1
- #!/bin/sh
1
+ #!/usr/bin/env ruby
2
2
 
3
- command=$1
4
- for_a=$2
3
+ require 'simple_shell'
4
+ require 'heidi'
5
5
 
6
- check_heidi_root()
7
- {
8
- if [ ! -e ./projects ] && [ ! -d ./projects ]
9
- then
10
- echo "You're not inside Heidi" >&2
6
+ cmd = ARGV.shift
7
+ for_a = ARGV.shift
8
+
9
+ shell = SimpleShell.new
10
+
11
+ def check_heidi_root()
12
+ if !File.exists?("./projects") && File.directory?("./projects")
13
+ $stderr.puts "You're not inside Heidi"
11
14
  exit 1
12
- fi
13
- }
15
+ end
16
+ end
14
17
 
15
- case $command in
16
- new)
17
- echo "creating $for_a"
18
- echo "creating $for_a/projects"
19
- mkdir -p $for_a/projects
20
- echo "creating $for_a/bin"
21
- mkdir -p $for_a/bin
22
- ;;
18
+ case cmd
19
+ when "new"
20
+ puts "creating #{for_a}"
21
+ puts "creating #{for_a}/projects"
22
+ shell.mkdir %W(-p #{for_a}/projects)
23
+ puts "creating #{for_a}/bin"
24
+ shell.mkdir %W(-p #{for_a}/bin)
23
25
 
24
- project)
25
- check_heidi_root
26
+ when "project"
27
+ check_heidi_root
26
28
 
27
- # create a logs dir
28
- echo "creating projects/$for_a"
29
- echo "creating projects/$for_a/logs"
30
- mkdir -p projects/$for_a/logs
29
+ # create a logs dir
30
+ puts "creating projects/#{for_a}"
31
+ puts "creating projects/#{for_a}/logs"
32
+ shell.mkdir %W(-p projects/#{for_a}/logs)
31
33
 
32
- echo "creating projects/$for_a/hooks/build"
33
- echo "creating projects/$for_a/hooks/tests"
34
- mkdir -p projects/$for_a/hooks/build
35
- mkdir -p projects/$for_a/hooks/tests
34
+ %w(build tests failure success before).each do |hook|
35
+ puts "creating projects/#{for_a}/hooks/#{hook}"
36
+ shell.mkdir %W(-p projects/#{for_a}/hooks/#{hook})
37
+ end
36
38
 
37
- # make a clone
38
- cd projects/$for_a
39
- echo "filling $for_a cache"
40
- git clone $3 cached
41
- cd cached
39
+ # make a clone
40
+ shell.in("projects/#{for_a}") do |sh|
41
+ puts "filling #{for_a} cache"
42
+ repo = ARGV.shift
43
+ puts "git clone #{repo}"
44
+ sh.git %W(clone #{repo} cached)
42
45
 
43
- echo "setting the name of the project to: $for_a"
44
- git config heidi.name $for_a
45
- ;;
46
+ sh.in("cached") do |cached|
47
+ puts "setting the name of the project to: #{for_a}"
48
+ cached.git %W(config heidi.name #{for_a})
49
+ end
50
+ end
51
+ puts "\n"
52
+ puts "Now define some hooks in projects/#{for_a}/hooks/tests"
46
53
 
47
- drop)
48
- check_heidi_root
54
+ when "drop"
55
+ check_heidi_root
49
56
 
50
- # remove build and cache dir, expose logs directly
51
- echo "removing build dir"
52
- rm -r projects/$for_a/build
53
- echo "removing cache (preserving project config)"
54
- cp -pr projects/$for_a/cached/.git/config projects/$for_a
55
- rm -r projects/$for_a/cached
56
- echo "exposing builds"
57
- mv projects/$for_a/logs/* projects/$for_a/
58
- rm -r projects/$for_a/logs
59
- ;;
60
- web)
61
- check_heidi_root
57
+ # remove build and cache dir, expose logs directly
58
+ puts "removing build dir"
59
+ shell.rm %W(-r projects/#{for_a}/build)
60
+ puts "removing cache (preserving project config)"
61
+ shell.cp %W(-pr projects/#{for_a}/cached/.git/config projects/#{for_a})
62
+ shell.rm %W(-r projects/#{for_a}/cached)
63
+ puts "exposing builds"
64
+ shell.mv %W(projects/#{for_a}/logs/* projects/#{for_a}/)
65
+ shell.rm %W(-r projects/#{for_a}/logs)
62
66
 
63
- heidi_web
64
- ;;
65
- console)
66
- check_heidi_root
67
+ when "integrate"
68
+ heidi = Heidi.new
69
+ heidi.projects.each do |project|
70
+ next if !for_a.nil? && project.name != for_a
71
+ project.fetch && project.integrate
72
+ end
67
73
 
68
- heidi_console
69
- ;;
70
- esac
74
+ end
data/bin/heidi_web CHANGED
@@ -2,11 +2,7 @@
2
2
  #
3
3
  # hartog/20120131: Heidi, the CI mistress
4
4
 
5
- require 'sinatra'
6
- require 'heidi'
7
- require 'heidi/web'
8
5
 
9
- $heidi = Heidi.new
6
+ require 'heidi/web'
7
+ Heidi::Web.start
10
8
 
11
- # modular setup with all the freebees of a non modular setup.
12
- include Heidi::Web::Routes
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.0.1"
8
+ s.version = "0.0.2"
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-01"
12
+ s.date = "2012-02-06"
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"]
@@ -40,9 +40,12 @@ Gem::Specification.new do |s|
40
40
  "lib/heidi/project.rb",
41
41
  "lib/heidi/tester.rb",
42
42
  "lib/heidi/web.rb",
43
- "lib/heidi/web/routes.rb",
44
- "lib/heidi/web/routes/home.rb",
45
- "lib/heidi/web/routes/projects.rb",
43
+ "lib/heidi/web/public/css/screen.css",
44
+ "lib/heidi/web/public/images/heidi.jpeg",
45
+ "lib/heidi/web/views/build.erb",
46
+ "lib/heidi/web/views/home.erb",
47
+ "lib/heidi/web/views/layout.erb",
48
+ "lib/heidi/web/views/project.erb",
46
49
  "spec/heidi/build_spec.rb",
47
50
  "spec/heidi/builder_spec.rb",
48
51
  "spec/heidi/git_spec.rb",
@@ -66,6 +69,7 @@ Gem::Specification.new do |s|
66
69
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
67
70
  s.add_runtime_dependency(%q<thin>, [">= 0"])
68
71
  s.add_runtime_dependency(%q<sinatra>, [">= 0"])
72
+ s.add_runtime_dependency(%q<sinatra-assetpack>, [">= 0"])
69
73
  s.add_runtime_dependency(%q<simple_shell>, [">= 0"])
70
74
  s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
71
75
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
@@ -75,6 +79,7 @@ Gem::Specification.new do |s|
75
79
  else
76
80
  s.add_dependency(%q<thin>, [">= 0"])
77
81
  s.add_dependency(%q<sinatra>, [">= 0"])
82
+ s.add_dependency(%q<sinatra-assetpack>, [">= 0"])
78
83
  s.add_dependency(%q<simple_shell>, [">= 0"])
79
84
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
80
85
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
@@ -85,6 +90,7 @@ Gem::Specification.new do |s|
85
90
  else
86
91
  s.add_dependency(%q<thin>, [">= 0"])
87
92
  s.add_dependency(%q<sinatra>, [">= 0"])
93
+ s.add_dependency(%q<sinatra-assetpack>, [">= 0"])
88
94
  s.add_dependency(%q<simple_shell>, [">= 0"])
89
95
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
90
96
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
data/lib/heidi/build.rb CHANGED
@@ -8,40 +8,46 @@ class Heidi
8
8
  # A build is tied to a commit
9
9
  #
10
10
  class Build
11
- attr_reader :project, :commit, :root, :shell, :hooks
11
+ attr_reader :project, :commit, :root, :log_root, :build_root, :shell,
12
+ :hooks, :logs
12
13
 
13
14
  def initialize(project, commit=project.commit)
14
15
  @project = project
15
16
  @commit = commit
16
- @root = File.join(project.root, "logs", commit)
17
+
18
+ @root = File.join(project.root, "logs", commit)
19
+ @log_root = File.join(@root, "logs")
20
+ @build_root = File.join(@root, "build")
17
21
 
18
22
  if !File.exists? @root
19
23
  SimpleShell.new(project.root).mkdir %W(-p #{@root})
20
24
  end
21
-
22
25
  @shell = SimpleShell.new(@root)
26
+
27
+ @shell.mkdir %W(-p #{@log_root}) unless File.exists?(@log_root)
28
+ @logs = Logs.new(@log_root)
23
29
  end
24
30
 
25
31
  def load_hooks
26
32
  log :info, "Loading hooks"
27
33
  @hooks = {
28
- :build => [],
29
- :tests => [],
30
- :before => [],
31
- :after => [],
32
- :failed => [],
34
+ :build => [],
35
+ :tests => [],
36
+ :before => [],
37
+ :success => [],
38
+ :failure => [],
33
39
  }
34
40
 
35
41
  @hooks.keys.each do |key|
36
42
  log :debug, "Loading #{key} hooks"
37
43
 
38
- Dir[File.join(project.root, "hooks", key.to_s, "*")].each do |hook|
44
+ Dir[File.join(project.root, "hooks", key.to_s, "*")].sort.each do |hook|
39
45
  next if File.directory? hook
40
46
  next unless File.executable? hook
41
47
 
42
48
  log :debug, "Loaded hook: #{hook}"
43
49
 
44
- @hooks[key] << Heidi::Hook.new(self.project, hook)
50
+ @hooks[key] << Heidi::Hook.new(self, hook)
45
51
  end
46
52
  end
47
53
 
@@ -49,13 +55,26 @@ class Heidi
49
55
  end
50
56
 
51
57
  def clean
52
- %w(heidi.info heidi.errors test.log builder.log build).each do |inode|
58
+ 1.downto(0) do |i|
59
+ if File.exists? "#{@log_root}.#{i}"
60
+ if i - 1 < 0
61
+ shell.mv %W(#{@log_root}.#{i} #{@log_root}.#{i+1})
62
+ else
63
+ shell.rm %W(-rf #{@log_root}.#{i})
64
+ end
65
+ end
66
+ end
67
+
68
+ if File.exists? "#{@log_root}"
69
+ shell.mv %W(#{@log_root} #{@log_root}.0)
70
+ end
71
+
72
+ %w(build/ SUCCESS FAILURE).each do |inode|
53
73
  shell.rm("-r", "-f", inode) if File.exists? File.join(@root, inode)
54
74
  end
55
- end
56
75
 
57
- def build_root
58
- File.join(@root, "build")
76
+ # re-instate the logs
77
+ @shell.mkdir %W(-p #{@log_root})
59
78
  end
60
79
 
61
80
  def log(type, msg)
@@ -66,12 +85,7 @@ class Heidi
66
85
  "heidi.#{type}"
67
86
  end
68
87
 
69
- File.open(
70
- File.join(@root, name),
71
- File::CREAT|File::WRONLY|File::APPEND
72
- ) do |f|
73
- f.puts "%s\t%s" % [ Time.now.strftime("%c"), msg ]
74
- end
88
+ logs[name].write(msg)
75
89
  end
76
90
 
77
91
  def lock_file
@@ -134,14 +148,56 @@ class Heidi
134
148
  "DNF"
135
149
  end
136
150
 
137
- def logs(what)
138
- File.read(File.join(@root, what))
139
- rescue
140
- ""
141
- end
142
-
143
151
  def create_tar_ball
144
152
  # TODO
145
153
  end
154
+
155
+ class Logs
156
+ def initialize(log_root)
157
+ @log_root = log_root
158
+ @logs = []
159
+
160
+ Dir[File.join(@log_root, "*")].each do |file|
161
+ @logs << Log.new(file)
162
+ end
163
+ end
164
+
165
+ def [](key)
166
+ log = @logs.select { |log| log.file_name == "#{key}" }.first
167
+ if log.nil?
168
+ @logs << ( log = Log.new( File.join(@log_root, "#{key}") ) )
169
+ end
170
+
171
+ return log
172
+ end
173
+
174
+ def each(&block)
175
+ @logs.each(&block)
176
+ end
177
+
178
+ class Log
179
+ attr_reader :file_name, :contents
180
+ def initialize(file)
181
+ @file = file
182
+ @file_name = File.basename(file)
183
+ @contents = File.read(file) rescue ""
184
+ end
185
+
186
+ def write(msg,fmt=true)
187
+ File.open(@file, File::CREAT|File::APPEND|File::WRONLY) do |f|
188
+ if fmt == true
189
+ f.puts "%s\t%s" % [ Time.now.strftime("%c"), msg ]
190
+ else
191
+ f.puts msg
192
+ end
193
+ end
194
+ end
195
+
196
+ def raw(msg)
197
+ write(msg, false)
198
+ end
199
+ end
200
+ end
201
+
146
202
  end
147
- end
203
+ end
data/lib/heidi/builder.rb CHANGED
@@ -21,12 +21,12 @@ class Heidi
21
21
  res = hook.perform(build.build_root)
22
22
  if res.S?.to_i != 0
23
23
  log("--- Build hook #{hook.name} failed ---")
24
- log(res.err)
24
+ log(res.err.empty? ? "no error message given" : res.err)
25
25
  build_failed = true
26
26
  break
27
27
 
28
28
  else
29
- log(res.out)
29
+ log(res.out) unless res.out.empty?
30
30
  end
31
31
  end
32
32
 
@@ -83,12 +83,7 @@ class Heidi
83
83
 
84
84
 
85
85
  def log(string)
86
- File.open(
87
- File.join(project.log_root, "builder.log"),
88
- File::CREAT|File::WRONLY|File::APPEND
89
- ) do |f|
90
- f.puts string
91
- end
86
+ build.logs["builder.log"].raw(string)
92
87
  end
93
88
 
94
89
  end
data/lib/heidi/hook.rb CHANGED
@@ -2,13 +2,19 @@ require 'simple_shell'
2
2
 
3
3
  class Heidi
4
4
  class Hook
5
- def initialize(project, script)
6
- @project = project
7
- @script = script
5
+ attr_reader :build
6
+ def initialize(build, script)
7
+ @build = build
8
+ @script = script
8
9
  end
9
10
 
10
- def perform(where)
11
- shell = SimpleShell.new(where)
11
+ def perform(where=build.build_root)
12
+ env = {
13
+ 'HEIDI_LOG_DIR' => build.log_root,
14
+ 'HEIDI_BUILD_DIR' => build.build_root,
15
+ }
16
+
17
+ shell = SimpleShell.new(where, env)
12
18
  res = shell.do @script
13
19
  return res
14
20
  end
data/lib/heidi/tester.rb CHANGED
@@ -24,14 +24,14 @@ class Heidi
24
24
 
25
25
  if res.S?.to_i != 0
26
26
  log "--- test #{hook.name} failed ---"
27
- log res.err
27
+ log(res.err.empty? ? "No error message given" : res.err)
28
28
 
29
29
  @message = "tests failed"
30
30
  tests_failed = true
31
31
  break
32
32
 
33
33
  else
34
- log res.out
34
+ log(res.out) unless res.out.empty?
35
35
  end
36
36
  end
37
37
 
@@ -39,12 +39,7 @@ class Heidi
39
39
  end
40
40
 
41
41
  def log(string)
42
- File.open(
43
- File.join(build.root, "test.log"),
44
- File::CREAT|File::WRONLY|File::APPEND
45
- ) do |f|
46
- f.puts string
47
- end
42
+ build.logs["test.log"].raw(string)
48
43
  end
49
44
 
50
45
 
@@ -0,0 +1,93 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ }
5
+
6
+ html, body {
7
+ height: 100%;
8
+ }
9
+
10
+ body {
11
+ background-color: white;
12
+ font: 13.34px helvetica, arial, clean, sans-serif;
13
+ *font-size: small;
14
+ text-align: center;
15
+ }
16
+
17
+ h1, h2, h3 {
18
+ margin-bottom: 1em;
19
+ }
20
+
21
+ h1 a {
22
+ text-decoration: none;
23
+ color: #000;
24
+ }
25
+
26
+ .failed, .color31 {
27
+ color: red !important;
28
+ }
29
+
30
+ .passed, .worked, .color32 {
31
+ color: green !important;
32
+ }
33
+
34
+ .errored, .color33 {
35
+ color: yellow !important;
36
+ }
37
+
38
+ p {
39
+ margin: 1em 0;
40
+ }
41
+
42
+ a {
43
+ color: #00a;
44
+ }
45
+
46
+ a:hover {
47
+ color: black;
48
+ }
49
+
50
+ a:visited {
51
+ color: #a0a;
52
+ }
53
+
54
+ table {
55
+ font-size: inherit;
56
+ font: 100%;
57
+ }
58
+
59
+
60
+ .container {
61
+ width: 80%;
62
+ text-align: justify;
63
+ margin: 2em auto;
64
+ }
65
+
66
+ pre.terminal {
67
+ font-family: 'Bitstream Vera Sans Mono', 'Courier', monospace;
68
+ border: 1px solid black;
69
+ background-color: #333;
70
+ color: white;
71
+ padding: 5px;
72
+ overflow: auto;
73
+ word-wrap: break-word;
74
+ margin-bottom: 1em;
75
+ clear: both;
76
+ }
77
+
78
+ ul {
79
+ margin-left: 3em;
80
+ }
81
+
82
+ .top {
83
+ float: left;
84
+ padding-left: 2em;
85
+ }
86
+
87
+ .log {
88
+ float: left;
89
+ }
90
+
91
+ .clear {
92
+ clear: both;
93
+ }
@@ -0,0 +1,20 @@
1
+ <h1><%= project.name %></h1>
2
+
3
+ <a href="/projects/<%= project.name %>"><< back</a>
4
+ <br /><br />
5
+
6
+ <h2 class="<%= build.status %>"><%= build.commit %></h2>
7
+
8
+ | <% build.logs.each do |log| %>
9
+ <a href="#<%= log.file_name %>"><%= log.file_name %></a> |
10
+ <% end %>
11
+ <br class="clear" />
12
+ <br />
13
+ <br />
14
+
15
+ <% build.logs.each do |log| %>
16
+ <h3 class="log"><%= log.file_name %></h3>
17
+ <a name="<%= log.file_name %>" href="#top" class="top">top</a>
18
+ <pre class="terminal"><%= ansi_color_codes(log.contents) %></pre>
19
+ <% end %>
20
+ <br /><br />
@@ -0,0 +1,7 @@
1
+ <br />
2
+ <img src='/images/heidi.jpeg' />
3
+
4
+ <h1>Projects</h1>
5
+ <ul><% projects.each do |project| %>
6
+ <li><a href="/projects/<%= project.name %>"><%= project.name %></a> - <%= project.build_status %></li>
7
+ <% end %></ul>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" media="screen" href="/css/screen.css" />
5
+ <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
6
+ <title>Heidi!</title>
7
+ </head>
8
+ <body>
9
+ <div class="container">
10
+ <%= yield %>
11
+ </div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,11 @@
1
+ <h1><%= project.name %></h1>
2
+
3
+ <h2 class="<%= project.build_status %>"><%= project.build_status %></h2>
4
+
5
+ <h2>Build history</h2>
6
+
7
+ <ul>
8
+ <% project.builds.each do |build| %>
9
+ <li class="<%= build.status %>"><a href='/projects/<%= project.name %>/build/<%= build.commit %>'><%= build.commit %></a> - <%= build.status %></li>
10
+ <% end %>
11
+ </ul>
data/lib/heidi/web.rb CHANGED
@@ -1,8 +1,75 @@
1
- require 'sinatra'
2
- require 'heidi/web/routes'
1
+ require 'sinatra/base'
2
+ require 'heidi'
3
+ require 'simple_shell'
3
4
 
4
5
  class Heidi
5
- module Web
6
- SimpleShell.noisy = true
6
+ class Web < Sinatra::Base
7
+
8
+ def self.start(host="0.0.0.0", port="4567", project_path=Dir.pwd)
9
+ @project_path = project_path
10
+ Heidi::Web.run! :host => host, :port => port
11
+ end
12
+
13
+ def self.project_path
14
+ @project_path
15
+ end
16
+
17
+ before {
18
+ @heidi = Heidi.new(self.class.project_path)
19
+ }
20
+
21
+ dir = File.dirname(File.expand_path(__FILE__))
22
+ $stderr.puts dir
23
+
24
+ set :sessions, true
25
+
26
+ set :views, "#{dir}/web/views"
27
+ set :public_folder, "#{dir}/web/public"
28
+ set :root, dir
29
+
30
+ get '/' do
31
+ redirect '/projects', 302
32
+ end
33
+
34
+ get '/projects' do
35
+ erb(:home, { :locals => { :projects => @heidi.projects }})
36
+ end
37
+
38
+ get '/projects/:name' do
39
+ project = @heidi[params[:name]]
40
+ if project.nil?
41
+ return "no project by that name: #{params[:name]}"
42
+ end
43
+
44
+ erb(:project, { :locals => { :project => project }})
45
+ end
46
+
47
+ get '/projects/:name/build/:commit' do
48
+ project = @heidi[params[:name]]
49
+ if project.nil?
50
+ return "no project by that name: #{params[:name]}"
51
+ end
52
+
53
+ # load build of project
54
+ build = Heidi::Build.new(project, params[:commit])
55
+ erb(:build, { :locals => { :build => build, :project => project }})
56
+ end
57
+
58
+ put '/projects/:name/build' do
59
+ project = $heidi[params[:name]]
60
+ if project.nil?
61
+ return "no project by that name: #{params[:name]}"
62
+ end
63
+
64
+ project.integrate
65
+ end
66
+
67
+
68
+ helpers do
69
+ def ansi_color_codes(string)
70
+ string.gsub("\e[0m", '</span>').
71
+ gsub(/\e\[(\d+)m/, "<span class=\"color\\1\">")
72
+ end
73
+ end
7
74
  end
8
75
  end
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.0.1
4
+ version: 0.0.2
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-01 00:00:00.000000000Z
12
+ date: 2012-02-06 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thin
16
- requirement: &85728350 !ruby/object:Gem::Requirement
16
+ requirement: &78955270 !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: *85728350
24
+ version_requirements: *78955270
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sinatra
27
- requirement: &85728090 !ruby/object:Gem::Requirement
27
+ requirement: &78955000 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *85728090
35
+ version_requirements: *78955000
36
+ - !ruby/object:Gem::Dependency
37
+ name: sinatra-assetpack
38
+ requirement: &78954750 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *78954750
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: simple_shell
38
- requirement: &85727850 !ruby/object:Gem::Requirement
49
+ requirement: &78954490 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :runtime
45
56
  prerelease: false
46
- version_requirements: *85727850
57
+ version_requirements: *78954490
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: rspec
49
- requirement: &85727610 !ruby/object:Gem::Requirement
60
+ requirement: &78954240 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 2.8.0
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *85727610
68
+ version_requirements: *78954240
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rdoc
60
- requirement: &85727370 !ruby/object:Gem::Requirement
71
+ requirement: &78950220 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ~>
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '3.12'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *85727370
79
+ version_requirements: *78950220
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: bundler
71
- requirement: &85727130 !ruby/object:Gem::Requirement
82
+ requirement: &78949910 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ~>
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: 1.0.0
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *85727130
90
+ version_requirements: *78949910
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: jeweler
82
- requirement: &85726860 !ruby/object:Gem::Requirement
93
+ requirement: &78949650 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ~>
@@ -87,10 +98,10 @@ dependencies:
87
98
  version: 1.8.3
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *85726860
101
+ version_requirements: *78949650
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: rcov
93
- requirement: &85726580 !ruby/object:Gem::Requirement
104
+ requirement: &78949400 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ! '>='
@@ -98,7 +109,7 @@ dependencies:
98
109
  version: '0'
99
110
  type: :development
100
111
  prerelease: false
101
- version_requirements: *85726580
112
+ version_requirements: *78949400
102
113
  description: CI-Joe alike CI system called Heidi.
103
114
  email: hartog@organisedminds.com
104
115
  executables:
@@ -133,9 +144,12 @@ files:
133
144
  - lib/heidi/project.rb
134
145
  - lib/heidi/tester.rb
135
146
  - lib/heidi/web.rb
136
- - lib/heidi/web/routes.rb
137
- - lib/heidi/web/routes/home.rb
138
- - lib/heidi/web/routes/projects.rb
147
+ - lib/heidi/web/public/css/screen.css
148
+ - lib/heidi/web/public/images/heidi.jpeg
149
+ - lib/heidi/web/views/build.erb
150
+ - lib/heidi/web/views/home.erb
151
+ - lib/heidi/web/views/layout.erb
152
+ - lib/heidi/web/views/project.erb
139
153
  - spec/heidi/build_spec.rb
140
154
  - spec/heidi/builder_spec.rb
141
155
  - spec/heidi/git_spec.rb
@@ -161,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
175
  version: '0'
162
176
  segments:
163
177
  - 0
164
- hash: 899278159
178
+ hash: 785079379
165
179
  required_rubygems_version: !ruby/object:Gem::Requirement
166
180
  none: false
167
181
  requirements:
@@ -1,9 +0,0 @@
1
- class Heidi; module Web; module Routes
2
-
3
- module Home
4
- get '/' do
5
- '<h1>Welcome to Heidi!</h1>Psst. Want to see my <a href="/projects">projects</a>?'
6
- end
7
- end
8
-
9
- end; end; end
@@ -1,61 +0,0 @@
1
- class Heidi; module Web; module Routes
2
-
3
- module Projects
4
- get '/projects' do
5
- output = ""
6
- $heidi.projects.each do |project|
7
- output += "<a href='/projects/#{project.name}'>#{project.name}</a><br />"
8
- end
9
-
10
- output
11
- end
12
-
13
- get '/projects/:name' do
14
- project = $heidi[params[:name]]
15
- if project.nil?
16
- return "no project by that name: #{params[:name]}"
17
- end
18
-
19
- output = "<h1>#{project.name}</h1>"
20
- output += "Build status: #{project.build_status}"
21
- output += "<br /><br /><h2>Build history</h2>"
22
- project.builds.each do |build|
23
- output += %Q{<a href="/projects/#{project.name}/build/#{build.commit}">#{build.commit}</a> - #{build.status}<br />}
24
- end
25
-
26
- output
27
- end
28
-
29
- get '/projects/:name/build/:commit' do
30
- project = $heidi[params[:name]]
31
- if project.nil?
32
- return "no project by that name: #{params[:name]}"
33
- end
34
-
35
- # load build of project
36
- build = Heidi::Build.new(project, params[:commit])
37
- output = "<h1>#{project.name}</h1>"
38
- output += "<h2>Build: #{build.commit} - #{build.status}<h2>"
39
-
40
- %w(heidi.info heidi.errors build.log test.log).each do |log_file|
41
- log = build.logs(log_file)
42
- if (!log.nil? and !log.empty?)
43
- output += "<h3>#{log_file}</h3>"
44
- output += "<pre>#{log}</pre>"
45
- end
46
- end
47
-
48
- output
49
- end
50
-
51
- put '/projects/:name/build' do
52
- project = $heidi[params[:name]]
53
- if project.nil?
54
- return "no project by that name: #{params[:name]}"
55
- end
56
-
57
- project.integrate
58
- end
59
- end
60
-
61
- end; end; end
@@ -1,13 +0,0 @@
1
- require 'heidi/web/routes/projects'
2
- require 'heidi/web/routes/home'
3
-
4
- class Heidi
5
- module Web
6
- module Routes
7
- def self.included(base)
8
- base.extend Routes::Home
9
- base.extend Routes::Projects
10
- end
11
- end
12
- end
13
- end