sr-integrity 0.1.8.1

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.
Files changed (59) hide show
  1. data/README.markdown +73 -0
  2. data/Rakefile +91 -0
  3. data/VERSION.yml +4 -0
  4. data/bin/integrity +4 -0
  5. data/config/config.sample.ru +21 -0
  6. data/config/config.sample.yml +41 -0
  7. data/config/thin.sample.yml +13 -0
  8. data/integrity.gemspec +55 -0
  9. data/lib/integrity/app.rb +137 -0
  10. data/lib/integrity/author.rb +39 -0
  11. data/lib/integrity/build.rb +84 -0
  12. data/lib/integrity/commit.rb +71 -0
  13. data/lib/integrity/core_ext/object.rb +6 -0
  14. data/lib/integrity/helpers/authorization.rb +33 -0
  15. data/lib/integrity/helpers/breadcrumbs.rb +20 -0
  16. data/lib/integrity/helpers/forms.rb +28 -0
  17. data/lib/integrity/helpers/pretty_output.rb +45 -0
  18. data/lib/integrity/helpers/rendering.rb +14 -0
  19. data/lib/integrity/helpers/resources.rb +13 -0
  20. data/lib/integrity/helpers/urls.rb +49 -0
  21. data/lib/integrity/helpers.rb +16 -0
  22. data/lib/integrity/installer.rb +121 -0
  23. data/lib/integrity/migrations.rb +140 -0
  24. data/lib/integrity/notifier/base.rb +65 -0
  25. data/lib/integrity/notifier.rb +50 -0
  26. data/lib/integrity/project.rb +142 -0
  27. data/lib/integrity/project_builder.rb +56 -0
  28. data/lib/integrity/scm/git/uri.rb +57 -0
  29. data/lib/integrity/scm/git.rb +84 -0
  30. data/lib/integrity/scm.rb +19 -0
  31. data/lib/integrity.rb +80 -0
  32. data/public/buttons.css +82 -0
  33. data/public/reset.css +7 -0
  34. data/public/spinner.gif +0 -0
  35. data/test/helpers/acceptance/git_helper.rb +99 -0
  36. data/test/helpers/acceptance/textfile_notifier.rb +26 -0
  37. data/test/helpers/acceptance.rb +80 -0
  38. data/test/helpers/expectations/be_a.rb +23 -0
  39. data/test/helpers/expectations/change.rb +90 -0
  40. data/test/helpers/expectations/have.rb +105 -0
  41. data/test/helpers/expectations/have_tag.rb +128 -0
  42. data/test/helpers/expectations/predicates.rb +37 -0
  43. data/test/helpers/expectations.rb +5 -0
  44. data/test/helpers/fixtures.rb +107 -0
  45. data/test/helpers/initial_migration_fixture.sql +44 -0
  46. data/test/helpers.rb +70 -0
  47. data/views/_commit_info.haml +24 -0
  48. data/views/build.haml +2 -0
  49. data/views/error.haml +37 -0
  50. data/views/home.haml +21 -0
  51. data/views/integrity.sass +400 -0
  52. data/views/layout.haml +28 -0
  53. data/views/new.haml +51 -0
  54. data/views/not_found.haml +31 -0
  55. data/views/notifier.haml +7 -0
  56. data/views/project.builder +21 -0
  57. data/views/project.haml +30 -0
  58. data/views/unauthorized.haml +38 -0
  59. metadata +190 -0
@@ -0,0 +1,24 @@
1
+ %h1&= commit.human_readable_status
2
+
3
+ - if commit.failed?
4
+ %form{ :action => commit_path(commit, :builds), :method => :post }
5
+ %p.submit
6
+ %button{ :type => :submit, :title => "Rebuild this commit" }<
7
+ Rebuild
8
+
9
+ %blockquote
10
+ %p&= commit.message
11
+ %p.meta<
12
+ %span.who<
13
+ &== by: #{commit.author.name}
14
+ |
15
+ %span.when{ :title => commit.commited_at }<
16
+ &= pretty_date commit.committed_at
17
+ |
18
+ %span.what<
19
+ &== commit: #{commit.identifier}
20
+
21
+ %h2 Build Output:
22
+ %pre.output
23
+ :preserve
24
+ #{bash_color_codes h(commit.output)}
data/views/build.haml ADDED
@@ -0,0 +1,2 @@
1
+ #build{ :class => @commit.status }
2
+ = partial(:commit_info, :commit => @commit)
data/views/error.haml ADDED
@@ -0,0 +1,37 @@
1
+ .error
2
+ %h1
3
+ Whatever you do, DON'T PANIC!
4
+
5
+ %dl
6
+ %dt This is what happened:
7
+ %dd
8
+ %strong&= @error.message
9
+ %pre.backtrace= @error.backtrace.join("\n")
10
+ %dd
11
+ %strong Query parameters:
12
+ %pre.query_params= params.inspect
13
+
14
+ %dt What can I do?
15
+ %dd
16
+ - if @project
17
+ Is your
18
+ %a{ :href => project_url(@project, :edit) } config
19
+ ok?
20
+ Need
21
+ %a{ :href => "http://integrityapp.com/configure" } help?
22
+ Remember to restart Integrity.
23
+ If you think everything is fine,
24
+ then drop by our irc channel:
25
+ %a{ :href => "irc://irc.freenode.org:6667/integrity" } #integrity
26
+ on freenode, and we'll try to help.
27
+
28
+ %dt
29
+ What the hell is
30
+ = succeed "?" do
31
+ %strong Integrity
32
+ %dd
33
+ Integrity is your friendly
34
+ %a{ :href => "http://en.wikipedia.org/wiki/Continuous_integration" } Continuous Integration
35
+ server. If you want to know more about us, check our website at
36
+ = succeed "." do
37
+ %a{ :href => "http://integrityapp.com" } integrityapp.com
data/views/home.haml ADDED
@@ -0,0 +1,21 @@
1
+ - if @projects.empty?
2
+ .blank_slate
3
+ %p None yet, huh?
4
+ %h1
5
+ Why don't you
6
+ = succeed "?" do
7
+ %a{ :href => "/new" } create your first project
8
+ - else
9
+ %ul#projects
10
+ - @projects.each do |project|
11
+ %li{ :class => cycle("even", "odd") + ' ' + project.status.to_s }
12
+ %a{ :href => project_path(project) }&= project.name
13
+ .meta
14
+ - if project.building?
15
+ Building!
16
+ - elsif project.last_commit.nil?
17
+ Never built yet
18
+ - else
19
+ = project.human_readable_status
20
+ %p#new
21
+ %a{ :href => "/new" } Add a new project
@@ -0,0 +1,400 @@
1
+ !default_fonts = "Helvetica Neue, Helvetica, Arial, sans-serif"
2
+ !nice_fonts = "Georgia, Times New Roman, serif"
3
+ !monospace_fonts = "Monaco, Deja Vu Sans Mono, Inconsolata, Consolas, monospace"
4
+
5
+ !page_bg = #e0e0e0
6
+ !content_bg = #eee
7
+ !header_bg = #fff
8
+ !text_color = #333
9
+ !light_color = #999
10
+ !title_color = #4e4e4e
11
+ !link_color = #ed1556
12
+ !link_bg = #fff
13
+ !rule_color = #c0c0c0
14
+ !watermark = #ccc
15
+ !quote_bg = #fff
16
+ !success_bg = #bbf8aa
17
+ !success_color = #337022
18
+ !failed_bg = #fba
19
+ !failed_color = #f10
20
+
21
+ html
22
+ :background-color = !page_bg
23
+
24
+ body
25
+ :font-size 100%
26
+ :font-family = !default_fonts
27
+ :color = !text_color
28
+
29
+ a
30
+ :color = !link_color
31
+ :text-decoration none
32
+ &:hover
33
+ :color = !link_bg
34
+ :background-color = !link_color
35
+
36
+ #header, #content, #footer
37
+ :width 40em
38
+ :margin 0 auto
39
+ :background = !content_bg
40
+ :padding 0 2em
41
+ :z-index 0
42
+ :position relative
43
+ :font-size 1em
44
+
45
+ #header
46
+ :background = !header_bg
47
+ h1
48
+ :font-weight bold
49
+ :font-size 1.5em
50
+ address.watermark
51
+ :position absolute
52
+ :font-weight bold
53
+ :right 3em
54
+ :top 0
55
+ :font-size .75em
56
+ :color = !watermark
57
+ a
58
+ :color = !watermark
59
+ :font-weight bold
60
+ :font-size 2em
61
+ &:hover
62
+ :background transparent
63
+ :color = !watermark - #222
64
+
65
+ #content
66
+ :padding-top 1em
67
+ :padding-bottom 2em
68
+
69
+ strong
70
+ :font-weight bold
71
+ em
72
+ :font-style italic
73
+
74
+ h1, h2, h3, h4, h5, h6
75
+ :color = !title_color
76
+ h1
77
+ :font-size 2em
78
+ :font-weight bold
79
+ :margin-bottom .75em
80
+ :padding .25em 0
81
+ :line-height 1.2
82
+ :border-bottom = 1px solid !rule_color
83
+ h2
84
+ :font-weight bold
85
+ :font-size 1.5em
86
+ :margin 1em 0 .2em
87
+ h3
88
+ :font-weight bold
89
+ :font-size 1.25em
90
+ :margin .25em 0
91
+ h4, h5, h6
92
+ :font-weight bold
93
+ :margin-top .5em
94
+
95
+ code, pre, textarea, input
96
+ :font-family = !monospace_fonts
97
+ pre
98
+ margin .5em :0
99
+ padding .5em
100
+
101
+ form
102
+ p
103
+ :margin-top 1em
104
+ :position relative
105
+ &.checkbox label
106
+ :margin-top 0 !important
107
+ input.text, textarea
108
+ :width 30em
109
+ :padding .2em .4em
110
+ :color = !title_color
111
+ input.text
112
+ :height 1.4em
113
+ label
114
+ :float left
115
+ :display block
116
+ :margin-top .5em
117
+ :width 8em
118
+ :margin-right .75em
119
+ .with_errors
120
+ label
121
+ :background red
122
+ :color white
123
+ :position relative
124
+ :top -.7em
125
+ &.required
126
+ label
127
+ :position static
128
+ :margin-right .25em
129
+ :padding 0 .2em
130
+ input, textarea
131
+ :border 2px solid #f22
132
+ :background #fee
133
+ :color = !text_color - #111
134
+ .required
135
+ label
136
+ :float none
137
+ :display block
138
+ :width auto
139
+ :position relative
140
+ :font-weight bold
141
+ :margin-top 1em
142
+ :text-indent -.65em
143
+ &:before
144
+ :content "* "
145
+ :color = !link_color
146
+ input.text
147
+ :width 25.6em
148
+ :font-size 24px
149
+ :font-weight bold
150
+ .normal
151
+ :margin-top 2em
152
+ h2.notifier label
153
+ :float none
154
+ :width auto
155
+ :margin-right 0
156
+ .warning
157
+ :font-size .5em
158
+ :font-weight normal
159
+ :color = !light_color
160
+ fieldset
161
+ :padding-bottom 1em
162
+ :margin-left 1.35em
163
+ :border-bottom = 1px solid !rule_color
164
+ :margin-bottom 1em
165
+ h3
166
+ :margin-top 1em
167
+ :margin-bottom 0
168
+ p.normal
169
+ :margin-top 1em
170
+ p label
171
+ :width 6.7em
172
+ p.submit
173
+ :margin-top 2em
174
+ &:after
175
+ :display block
176
+ :clear both
177
+ :float none
178
+ :content "."
179
+ :text-indent -9999em
180
+ :text-align left
181
+ &.destroy, &.manual-build
182
+ button
183
+ :float none
184
+ :display inline
185
+ &.manual-build
186
+ button
187
+ :margin-right 0
188
+
189
+ #build form, #last_build form
190
+ :font-size .75em
191
+ p.submit
192
+ :margin 0
193
+ :padding 0
194
+ :position absolute
195
+ :right .5em
196
+ :top 1.25em
197
+
198
+ .blank_slate, .error
199
+ p
200
+ :position relative
201
+ :top .3em
202
+ h1
203
+ :border-width 0
204
+ :margin 0
205
+ :padding 0
206
+ button
207
+ :float none
208
+ :border 0 none
209
+ :background transparent
210
+ :display inline
211
+ :color = !link_color
212
+ :padding 0.25em 0
213
+ :margin 0
214
+ &:hover
215
+ :background = !link_color
216
+ :color = !link_bg
217
+
218
+ .error
219
+ dt
220
+ :margin
221
+ :top 1.4em
222
+ :bottom .3em
223
+ :font
224
+ :size 1.75em
225
+ :family = !nice_fonts
226
+ dd
227
+ :line-height 1.4
228
+
229
+ .backtrace
230
+ :margin 1em 0
231
+ :overflow scroll
232
+ :height 30em
233
+ :border = 1px solid !rule_color
234
+ :line-height 1.6
235
+
236
+ #projects
237
+ :margin 1em 0 2em
238
+ :border-top = 1px solid !rule_color
239
+ li
240
+ :position relative
241
+ :border-bottom = 1px solid !rule_color
242
+ &.odd
243
+ :background = !content_bg - #080808
244
+ &.building
245
+ :background transparent url(/spinner.gif) no-repeat scroll right
246
+ a
247
+ :font-size 2em
248
+ :padding .25em
249
+ :line-height 1.2
250
+ :font-weight bold
251
+ :display block
252
+ &.success
253
+ :color = !success_color
254
+ &.failed
255
+ :color = !failed_color
256
+ .meta
257
+ :position absolute
258
+ :right .6em
259
+ :top 1.5em
260
+ :font-size 0.8em
261
+ :color = !light_color
262
+ :text-align right
263
+ &.building .meta
264
+ :right 1.6em
265
+ &.success .meta
266
+ :color = !success_color
267
+ &.failed .meta
268
+ :color = !failed_color
269
+
270
+
271
+ #previous_builds
272
+ li
273
+ a
274
+ :display block
275
+ :padding .25em
276
+ :margin-bottom .25em
277
+ :border
278
+ :width 1px
279
+ :style solid
280
+ strong
281
+ :font-size 1.3em
282
+ .attribution
283
+ :font-size .9em
284
+
285
+ #projects, #previous_builds
286
+ li
287
+ &.success a
288
+ :background-color = !success_bg
289
+ :border-color = !success_bg - #222
290
+ :color = !success_color
291
+ .attribution
292
+ :color = !success_bg - #444
293
+ &:hover
294
+ :background-color = !success_bg + #222
295
+ &.failed a
296
+ :background-color = !failed_bg
297
+ :border-color = !failed_bg - #222
298
+ :color = !failed_color
299
+ .attribution
300
+ :color = !failed_bg - #444
301
+ &:hover
302
+ :background-color = !failed_bg + #222
303
+
304
+
305
+ #build, #last_build
306
+ :position relative
307
+ h1, blockquote
308
+ :border
309
+ :width 0 1px
310
+ :style solid
311
+ h1
312
+ :border-top-width 1px
313
+ blockquote
314
+ :bottom-bottom-width 1px
315
+ :line-height 1.4
316
+
317
+ &.success
318
+ h1, blockquote
319
+ :background-color = !success_bg
320
+ :border-color = (!success_bg - #222) (!success_bg + #111) (!success_bg + #111) (!success_bg - #222)
321
+ h1
322
+ :color = !success_color
323
+ .meta
324
+ :color = !success_bg - #444
325
+
326
+ &.failed
327
+ h1, blockquote
328
+ :background-color = !failed_bg
329
+ :border-color = (!failed_bg - #222) (!failed_bg + #111) (!failed_bg + #111) (!failed_bg - #222)
330
+ h1
331
+ :color = !failed_color
332
+ .meta
333
+ :color = !failed_bg - #444
334
+
335
+ h1
336
+ :margin-top .5em
337
+ :margin-bottom 0
338
+ :padding .25em
339
+ :color = !success_color
340
+
341
+ blockquote
342
+ :padding .75em
343
+ :margin-bottom 2em
344
+ .meta
345
+ :margin-top 1em
346
+ :display block
347
+ :font-size .9em
348
+
349
+ pre.output
350
+ :background #111
351
+ :color #fff
352
+ :padding .5em
353
+ :overflow auto
354
+ :max-height 50em
355
+ :font-size .825em
356
+
357
+ .color30
358
+ :color #333
359
+ .color31
360
+ :color #e33
361
+ .color32
362
+ :color #3e3
363
+ .color33
364
+ :color #ee3
365
+ .color34
366
+ :color #33e
367
+ .color35
368
+ :color #e3e
369
+ .color36
370
+ :color #3ee
371
+ .color37
372
+ :color #fff
373
+
374
+ #push_path
375
+ :display block
376
+ :margin
377
+ :top 1em
378
+ :left 2em
379
+
380
+ a
381
+ &.success
382
+ :color = !success_bg
383
+ &:hover
384
+ :background-color = !success_bg
385
+ :color white
386
+ &.failed
387
+ :color = !failed_bg
388
+ &:hover
389
+ :background-color = !failed_bg
390
+ :color white
391
+
392
+ #footer
393
+ :padding 1.5em 2.5em
394
+ :border-top 1px solid #ccc
395
+ :font-size .8em
396
+ :width 50em !important
397
+ :color #666
398
+ :text-align right
399
+ strong
400
+ :font-weight bold
data/views/layout.haml ADDED
@@ -0,0 +1,28 @@
1
+ !!! Strict
2
+ %html{ :lang => "en", :"xml:lang" => "en", :xmlns => "http://www.w3.org/1999/xhtml" }
3
+ %head
4
+ %meta{ :content => "text/html; charset=utf-8", :"http-equiv" => "Content-Type" }
5
+ %meta{ :content => "en", :"http-equiv" => "Content-Language" }
6
+ %title= "#{@title.last} | integrity"
7
+ %link{ :media => "screen", :type => "text/css", :href => "/reset.css", :rel => "stylesheet" }
8
+ %link{ :media => "screen", :type => "text/css", :href => "/buttons.css", :rel => "stylesheet" }
9
+ %link{ :media => "screen", :type => "text/css", :href => "/integrity.css", :rel => "stylesheet" }
10
+ - unless @project.nil?
11
+ %link{ :rel => "alternate", :type => "application/atom+xml", :title => "Build history Atom", :href => "#{project_path(@project)}.atom"}
12
+
13
+ %body
14
+ #header
15
+ %h1= @title.join(" / ")
16
+ %address.watermark
17
+ checked with
18
+ %a{ :href => "http://integrityapp.com", :title => "The fun continuous integration server" } integrity
19
+ #content= yield
20
+ - if Integrity.config && Integrity.config[:use_basic_auth]
21
+ #footer
22
+ - if authorized?
23
+ Oh, hello
24
+ %strong&= current_user
25
+ - else
26
+ Hey there!
27
+ %a{ :href => "/login" } Log In
28
+ if you have a user
data/views/new.haml ADDED
@@ -0,0 +1,51 @@
1
+ %form{ :method => "post", :action => (@project.new_record? ? "/" : project_path(@project)) }
2
+ - unless @project.new_record?
3
+ .hidden
4
+ %input{ :name => "_method", :type => "hidden", :value => "put" }
5
+
6
+ %p.required{ :class => error_class(@project, :name) }
7
+ %label{ :for => "project_name" }<
8
+ &== Name #{errors_on @project, :name}
9
+ %input.text#project_name{ :name => "project_data[name]", :type => "text", :value => h(@project.name) }
10
+
11
+ %p.required{ :class => error_class(@project, :uri) }
12
+ %label{ :for => "project_repository" }<
13
+ &== Git repository #{errors_on @project, :uri}
14
+ %input.text#project_repository{ :name => "project_data[uri]", :type => "text", :value => h(@project.uri) }
15
+
16
+ %p.normal{ :class => error_class(@project, :branch) }
17
+ %label{ :for => "project_branch" }<
18
+ &== Branch to track #{errors_on @project, :branch}
19
+ %input.text#project_branch{ :name => "project_data[branch]", :type => "text", :value => "master", :value => h(@project.branch) }
20
+
21
+ %p.normal{ :class => error_class(@project, :command) }
22
+ %label{ :for => "project_build_script" }
23
+ &== Build script #{errors_on @project, :command}
24
+ %textarea#project_build_script{ :name => "project_data[command]", :cols => 40, :rows => 2 }
25
+ &== #{@project.command.to_s}
26
+
27
+ %p.normal.checkbox
28
+ %label{ :for => "project_public" } Public project
29
+ %input.hidden{ :name => "project_data[public]", :value => "0", :type => "hidden" }
30
+ %input.checkbox#project_public{ checkbox("project_data[public]", @project.public?) }
31
+
32
+ - Integrity::Notifier.available.each do |notifier|
33
+ = notifier_form(notifier)
34
+
35
+ %p.submit
36
+ %button.positive{ :type => "submit" }= @project.new_record? ? "Create Project" : "Update Project"
37
+
38
+ - unless @project.new_record?
39
+ %h2 Push URL
40
+ %p
41
+ You can use this Push URL with your GitHub project to enable automated continuous integration.
42
+ %p
43
+ %code#push_url= push_url_for(@project)
44
+
45
+ %form{ :method => "post", :action => project_path(@project) }
46
+ .hidden
47
+ %input{ :name => "_method", :type => "hidden", :value => "delete" }
48
+ %h2 Delete this project
49
+ %p.submit.destroy
50
+ This will delete the project and all the builds in the system
51
+ %button.negative{ :type => "submit" } Yes, I'm sure, nuke it
@@ -0,0 +1,31 @@
1
+ .error
2
+ %h1
3
+ Ehm, you seem a bit lost, sir. Maybe going to the
4
+ %a{ :href => "/", :rel => "home" } list of projects
5
+ will help?
6
+ %dl
7
+ %dt Ouch. This is a 404 error-thingie, right?
8
+ %dd Yeah, you browsed to a page that doesn't exist in this server.
9
+
10
+ %dt What can I do?
11
+ %dd
12
+ As a very good book says on its cover:
13
+ = succeed "." do
14
+ %strong DON'T PANIC
15
+ / if you didn't get the reference you aren't as nerd as you should be
16
+ You should probably just go back to
17
+ %a{ :href => "/", :rel => "home" } the projects list
18
+ or, alternatively, go
19
+ = succeed "." do
20
+ %a{ :href => request.referer } back from whence you came
21
+
22
+ %dt
23
+ What the hell is
24
+ = succeed "?" do
25
+ %strong Integrity
26
+ %dd
27
+ Integrity is your friendly
28
+ %a{ :href => "http://en.wikipedia.org/wiki/Continuous_integration" } Continuous Integration
29
+ server. If you want to know more about us, check our website at
30
+ = succeed "." do
31
+ %a{ :href => "http://integrityapp.com" } integrityapp.com
@@ -0,0 +1,7 @@
1
+ %h2.notifier
2
+ %label
3
+ %input.checkbox{ checkbox("enabled_notifiers[]", enabled, :value => notifier, :id => "enabled_notifiers_#{notifier.downcase}") }
4
+ == #{notifier} Notifications
5
+ %span.warning be aware that no validation will be made on these fields
6
+ %fieldset{ :id => "#{notifier.downcase}_config" }
7
+ = yield
@@ -0,0 +1,21 @@
1
+ xml.instruct!
2
+ xml.feed :xmlns => "http://www.w3.org/2005/Atom" do
3
+ xml.title "Build history for #{@project.name}"
4
+ xml.subtitle @project.uri
5
+ xml.updated @project.last_commit.updated_at
6
+ xml.link :href => "#{project_url(@project)}.atom", :rel => "self"
7
+ xml.id "#{project_url(@project)}.atom"
8
+
9
+ @project.commits.each do |commit|
10
+ xml.entry do
11
+ xml.id commit_url(commit)
12
+ xml.link :href => commit_url(commit), :rel => "alternate", :type => "text/html"
13
+ xml.updated commit.created_at
14
+ xml.published commit.created_at
15
+
16
+ xml.title commit.human_readable_status
17
+ xml.author { xml.name(commit.author.name) }
18
+ xml.content("<div>#{partial(:commit_info, :commit => commit)}</div>", :type => "html")
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ #administrative
2
+ %a{ :href => project_path(@project, :edit) } Edit Project
3
+
4
+ - if @project.commits.empty?
5
+ %form.blank_slate{ :action => project_path(@project, :builds), :method => :post }
6
+ %p No builds for this project, buddy
7
+ %h1
8
+ You can request a
9
+ %button{ :type => :submit } manual build
10
+ - else
11
+ - @commit = @project.last_commit
12
+ #last_build{ :class => @commit.status }
13
+ = partial(:commit_info, :commit => @commit)
14
+
15
+ %form{ :action => project_path(@project, :builds), :method => :post }
16
+ %p.submit.manual-build
17
+ %button{ :type => :submit, :title => "Fetch the last commit and build it" }<
18
+ Build the last commit
19
+ in the repository (or rebuild the latest)
20
+
21
+ - unless @project.previous_commits.empty?
22
+ %h2 Previous builds
23
+ %ul#previous_builds
24
+ - @project.previous_commits.each do |commit|
25
+ %li{ :class => commit.status }
26
+ %a{ :href => commit_path(commit) }
27
+ %strong.build<
28
+ &== Build #{commit.short_identifier}
29
+ %span.attribution<
30
+ == by #{commit.author.name}, #{pretty_date commit.committed_at}
@@ -0,0 +1,38 @@
1
+ .error
2
+ %h1
3
+ So... you don't know the password? Hmm... You can
4
+ %a{ :href => "/login" } try again
5
+ or
6
+ = succeed "." do
7
+ %a{ :href => "/", :rel => "home" } go back
8
+
9
+ %dl
10
+ %dt Er... So... I'm trying to login without a password...
11
+ %dd
12
+ Hey pal, sorry, but I can't let in anyone that isn't
13
+ = succeed "." do
14
+ %strong on the list
15
+ I could lose my job you know? You'll have to come up with
16
+ a valid password :-(
17
+
18
+ %dt What can I do?
19
+ %dd
20
+ This just means that you can't access some part of this Integrity
21
+ server, but that shouldn't let you out of some of the
22
+ %a{ :href => "/" } awesome projects
23
+ hosted here. If this was just a misunderstanding and you
24
+ %strong do
25
+ have a password, then
26
+ = succeed "." do
27
+ %a{ :href => "/login" } click here to try again
28
+
29
+ %dt
30
+ So what the hell is
31
+ = succeed "?" do
32
+ %strong Integrity
33
+ %dd
34
+ Integrity is your friendly
35
+ %a{ :href => "http://en.wikipedia.org/wiki/Continuous_integration" } Continuous Integration
36
+ server. If you want to know more about us, check our website at
37
+ = succeed "." do
38
+ %a{ :href => "http://integrityapp.com" } integrityapp.com