damagecontrol 0.5.0 → 0.5.0.1391
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/README +67 -11
- data/Rakefile +15 -6
- data/app/controllers/admin_controller.rb +0 -3
- data/app/controllers/application.rb +42 -163
- data/app/controllers/build_controller.rb +33 -0
- data/app/controllers/files_controller.rb +1 -1
- data/app/controllers/project_controller.rb +23 -65
- data/app/controllers/rails_ext.rb +247 -0
- data/app/controllers/rscm_ext.rb +52 -0
- data/app/helpers/build_helper.rb +2 -0
- data/app/views/build/email.rhtml +18 -0
- data/app/views/build/status.rhtml +20 -0
- data/app/views/build/tests.rhtml +2 -0
- data/app/views/layouts/{rscm.rhtml → default.rhtml} +10 -4
- data/app/views/project/_changesets_list.rhtml +2 -2
- data/app/views/project/_cvs.rhtml +4 -5
- data/app/views/project/_project.rhtml +9 -9
- data/app/views/project/_select_pane.rhtml +26 -0
- data/app/views/project/_tab_pane.rhtml +23 -0
- data/app/views/project/changeset.rhtml +35 -0
- data/app/views/project/view.rhtml +18 -32
- data/app/views/setup/welcome.rhtml +118 -0
- data/config/database.yml +20 -20
- data/config/environment.rb +66 -60
- data/config/environments/development.rb +3 -2
- data/config/environments/production.rb +3 -2
- data/config/environments/test.rb +3 -2
- data/config/routes.rb +15 -0
- data/lib/damagecontrol/app.rb +11 -40
- data/lib/damagecontrol/build.rb +50 -8
- data/lib/damagecontrol/directories.rb +7 -6
- data/lib/damagecontrol/poller.rb +11 -20
- data/lib/damagecontrol/project.rb +83 -16
- data/lib/damagecontrol/publisher/ambient_orb.rb +16 -0
- data/lib/damagecontrol/publisher/archive.rb +16 -0
- data/lib/damagecontrol/publisher/base.rb +25 -0
- data/lib/damagecontrol/publisher/build_duration.rb +16 -0
- data/lib/damagecontrol/publisher/email.rb +59 -0
- data/lib/damagecontrol/publisher/execute.rb +49 -0
- data/lib/damagecontrol/publisher/ftp.rb +16 -0
- data/lib/damagecontrol/publisher/growl.rb +44 -0
- data/lib/damagecontrol/publisher/irc.rb +31 -0
- data/lib/damagecontrol/publisher/jabber.rb +68 -0
- data/lib/damagecontrol/publisher/scp.rb +16 -0
- data/lib/damagecontrol/publisher/x10cm11a.rb +17 -0
- data/lib/damagecontrol/publisher/x10cm17a.rb +17 -0
- data/lib/damagecontrol/publisher/yahoo.rb +16 -0
- data/lib/damagecontrol/standard_persister.rb +2 -2
- data/lib/damagecontrol/tracker.rb +48 -6
- data/lib/damagecontrol/visitor/rss_writer.rb +1 -1
- data/lib/damagecontrol/visitor/yaml_persister.rb +10 -1
- data/public/404.html +5 -5
- data/public/500.html +5 -5
- data/public/dispatch.cgi +2 -2
- data/public/dispatch.fcgi +1 -1
- data/public/dispatch.rb +2 -2
- data/public/images/growlicon.png +0 -0
- data/public/images/megaphone.png +0 -0
- data/public/images/monotone-logo.png +0 -0
- data/public/images/publisher/ambient_orb.png +0 -0
- data/public/images/publisher/build_duration.png +0 -0
- data/public/images/publisher/email.png +0 -0
- data/public/images/publisher/execute.png +0 -0
- data/public/images/publisher/growl.png +0 -0
- data/public/images/publisher/irc.png +0 -0
- data/public/images/publisher/jabber.png +0 -0
- data/public/images/publisher/x10cm11a.png +0 -0
- data/public/images/publisher/x10cm17a.png +0 -0
- data/public/images/publisher/yahoo.png +0 -0
- data/public/index.html +70 -1
- data/public/javascripts/dateFormat.js +283 -0
- data/public/javascripts/jscalendar/ChangeLog +500 -0
- data/public/javascripts/jscalendar/README +33 -0
- data/public/javascripts/jscalendar/bugtest-hidden-selects.html +108 -0
- data/public/javascripts/jscalendar/calendar-blue.css +231 -0
- data/public/javascripts/jscalendar/calendar-blue2.css +235 -0
- data/public/javascripts/jscalendar/calendar-brown.css +224 -0
- data/public/javascripts/jscalendar/calendar-green.css +228 -0
- data/public/javascripts/jscalendar/calendar-setup.js +181 -0
- data/public/javascripts/jscalendar/calendar-setup_stripped.js +21 -0
- data/public/javascripts/jscalendar/calendar-system.css +250 -0
- data/public/javascripts/jscalendar/calendar-tas.css +238 -0
- data/public/javascripts/jscalendar/calendar-win2k-1.css +270 -0
- data/public/javascripts/jscalendar/calendar-win2k-2.css +270 -0
- data/public/javascripts/jscalendar/calendar-win2k-cold-1.css +264 -0
- data/public/javascripts/jscalendar/calendar-win2k-cold-2.css +270 -0
- data/public/javascripts/jscalendar/calendar.js +1715 -0
- data/public/javascripts/jscalendar/calendar.php +119 -0
- data/public/javascripts/jscalendar/calendar_stripped.js +12 -0
- data/public/javascripts/jscalendar/doc/html/reference-Z-S.css +0 -0
- data/public/javascripts/jscalendar/doc/html/reference.css +34 -0
- data/public/javascripts/jscalendar/doc/html/reference.html +1316 -0
- data/public/javascripts/jscalendar/doc/reference.pdf +0 -0
- data/public/javascripts/jscalendar/img.gif +0 -0
- data/public/javascripts/jscalendar/index.html +333 -0
- data/public/javascripts/jscalendar/lang/calendar-af.js +39 -0
- data/public/javascripts/jscalendar/lang/calendar-br.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-ca.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-cs-win.js +34 -0
- data/public/javascripts/jscalendar/lang/calendar-da.js +63 -0
- data/public/javascripts/jscalendar/lang/calendar-de.js +100 -0
- data/public/javascripts/jscalendar/lang/calendar-du.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-el.js +89 -0
- data/public/javascripts/jscalendar/lang/calendar-en.js +123 -0
- data/public/javascripts/jscalendar/lang/calendar-es.js +114 -0
- data/public/javascripts/jscalendar/lang/calendar-fi.js +98 -0
- data/public/javascripts/jscalendar/lang/calendar-fr.js +86 -0
- data/public/javascripts/jscalendar/lang/calendar-hr-utf8.js +49 -0
- data/public/javascripts/jscalendar/lang/calendar-hr.js +0 -0
- data/public/javascripts/jscalendar/lang/calendar-hu.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-it.js +79 -0
- data/public/javascripts/jscalendar/lang/calendar-jp.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-ko-utf8.js +120 -0
- data/public/javascripts/jscalendar/lang/calendar-ko.js +120 -0
- data/public/javascripts/jscalendar/lang/calendar-lt-utf8.js +114 -0
- data/public/javascripts/jscalendar/lang/calendar-lt.js +114 -0
- data/public/javascripts/jscalendar/lang/calendar-nl.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-no.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-pl-utf8.js +93 -0
- data/public/javascripts/jscalendar/lang/calendar-pl.js +56 -0
- data/public/javascripts/jscalendar/lang/calendar-pt.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-ro.js +66 -0
- data/public/javascripts/jscalendar/lang/calendar-ru.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-si.js +94 -0
- data/public/javascripts/jscalendar/lang/calendar-sk.js +99 -0
- data/public/javascripts/jscalendar/lang/calendar-sp.js +63 -0
- data/public/javascripts/jscalendar/lang/calendar-sv.js +93 -0
- data/public/javascripts/jscalendar/lang/calendar-tr.js +58 -0
- data/public/javascripts/jscalendar/lang/calendar-zh.js +45 -0
- data/public/javascripts/jscalendar/menuarrow.gif +0 -0
- data/public/javascripts/jscalendar/menuarrow2.gif +0 -0
- data/public/javascripts/jscalendar/release-notes.html +334 -0
- data/public/javascripts/jscalendar/simple-1.html +244 -0
- data/public/javascripts/jscalendar/simple-2.html +108 -0
- data/public/javascripts/jscalendar/simple-3.html +130 -0
- data/public/javascripts/jscalendar/test-position.html +40 -0
- data/public/javascripts/jscalendar/test.php +116 -0
- data/public/javascripts/toggle_div.js +18 -0
- data/public/stylesheets/niceones.txt +1 -0
- data/public/stylesheets/style.css +8 -1
- data/script/breakpointer +4 -5
- data/script/console +19 -27
- data/script/console_sandbox.rb +7 -0
- data/script/destroy +5 -0
- data/script/generate +3 -68
- data/script/server +6 -16
- data/test/damagecontrol/build_test.rb +8 -8
- data/test/damagecontrol/poller_test.rb +10 -18
- data/test/damagecontrol/project_test.rb +49 -13
- data/test/damagecontrol/publisher/base_test.rb +26 -0
- data/test/damagecontrol/publisher/build/email.rhtml +0 -0
- data/test/damagecontrol/publisher/email_test.rb +26 -0
- data/test/damagecontrol/publisher/fixture.rb +34 -0
- data/test/damagecontrol/publisher/growl_test.rb +15 -0
- data/test/damagecontrol/publisher/jabber_test.rb +15 -0
- data/test/damagecontrol/scm_web_test.rb +1 -1
- data/test/damagecontrol/visitor/changesets.rss +1 -1
- data/test/damagecontrol/visitor/diff_persister_test.rb +4 -4
- data/test/functional/build_controller_test.rb +17 -0
- data/test/test_helper.rb +13 -13
- metadata +185 -24
- data/app/views/project/_bugzilla.rhtml +0 -13
- data/app/views/project/_jira.rhtml +0 -19
- data/app/views/project/_mooky.rhtml +0 -23
- data/app/views/project/_rubyforge.rhtml +0 -19
- data/app/views/project/_scarab.rhtml +0 -19
- data/app/views/project/_scms.rhtml +0 -15
- data/app/views/project/_sourceforge.rhtml +0 -19
- data/app/views/project/_starteam.rhtml +0 -43
- data/app/views/project/_svn.rhtml +0 -22
- data/app/views/project/_trac.rhtml +0 -13
- data/app/views/project/_trackers.rhtml +0 -18
- data/app/views/project/changesets.rhtml +0 -31
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
require 'rscm/annotations'
|
|
2
|
+
|
|
3
|
+
class ActionController::Base
|
|
4
|
+
|
|
5
|
+
# Instantiates an Array of object from +class_name_2_attr_hash_hash+
|
|
6
|
+
# which should be a hash where the keys are class names and the values
|
|
7
|
+
# a Hash containing {attr_name => attr_value} pairs.
|
|
8
|
+
def instantiate_array_from_hashes(class_name_2_attr_hash_hash)
|
|
9
|
+
result = []
|
|
10
|
+
class_name_2_attr_hash_hash.each do |class_name, attr_hash|
|
|
11
|
+
result << instantiate_from_hash(eval(class_name), attr_hash)
|
|
12
|
+
end
|
|
13
|
+
result
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def instantiate_from_hash(clazz, attr_hash)
|
|
17
|
+
object = clazz.new
|
|
18
|
+
attr_hash.each do |attr_name, attr_value|
|
|
19
|
+
setter = attr_name[1..-1] + "="
|
|
20
|
+
object.__send__(setter.to_sym, attr_value) if object.respond_to?(setter.to_sym)
|
|
21
|
+
end
|
|
22
|
+
object
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Returns the selected object from a select_pane and defines
|
|
26
|
+
# the selected? method on it to return true (so that define_selected
|
|
27
|
+
# will work properly
|
|
28
|
+
#
|
|
29
|
+
def find_selected(name)
|
|
30
|
+
array = instantiate_array_from_hashes(@params[name])
|
|
31
|
+
selected = @params["#{name}_selected"]
|
|
32
|
+
selected_object = array.find { |o| o.class.name == selected }
|
|
33
|
+
def selected_object.selected?
|
|
34
|
+
true
|
|
35
|
+
end
|
|
36
|
+
selected_object
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
# Override so we can get rid of the Content-Disposition
|
|
42
|
+
# headers by specifying :no_disposition => true in options
|
|
43
|
+
# This is needed when we want to send big files that are
|
|
44
|
+
# *not* intended to pop up a save-as dialog in the browser,
|
|
45
|
+
# such as content to display in iframes (logs and files)
|
|
46
|
+
def send_file_headers!(options)
|
|
47
|
+
options.update(DEFAULT_SEND_FILE_OPTIONS.merge(options))
|
|
48
|
+
[:length, :type, :disposition].each do |arg|
|
|
49
|
+
raise ArgumentError, ":#{arg} option required" if options[arg].nil?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
headers = {
|
|
53
|
+
'Content-Length' => options[:length],
|
|
54
|
+
'Content-Type' => options[:type]
|
|
55
|
+
}
|
|
56
|
+
unless(options[:no_disposition])
|
|
57
|
+
disposition = options[:disposition].dup || 'attachment'
|
|
58
|
+
disposition <<= %(; filename="#{options[:filename]}") if options[:filename]
|
|
59
|
+
headers.merge!(
|
|
60
|
+
'Content-Disposition' => disposition,
|
|
61
|
+
'Content-Transfer-Encoding' => 'binary'
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@headers.update(headers);
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
module ActionView
|
|
71
|
+
module Helpers
|
|
72
|
+
module UrlHelper
|
|
73
|
+
# Modify the original behaviour of +link_to+ so that the link
|
|
74
|
+
# includes the client's timezone as URL param +timezone+ in the request.
|
|
75
|
+
# Can be used by server to adjust formatting of UTC dates so they match the client's time zone.
|
|
76
|
+
def convert_confirm_option_to_javascript!(html_options)
|
|
77
|
+
# We're adding this JS call to add the timezone info as a URL param.
|
|
78
|
+
html_options["onclick"] = "intercept(this);"
|
|
79
|
+
if html_options.include?(:confirm)
|
|
80
|
+
html_options["onclick"] += "return confirm('#{html_options[:confirm]}');"
|
|
81
|
+
html_options.delete(:confirm)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
class Base
|
|
88
|
+
include Inflector
|
|
89
|
+
|
|
90
|
+
def breadcrumbs
|
|
91
|
+
link_to_unless_current("Dashboard", :controller => "project", :action => "index")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Renders plain text (if +input+ is true) or a text field if not.
|
|
95
|
+
def text_or_input(input, options)
|
|
96
|
+
if(input)
|
|
97
|
+
options[:class] = "setting-input" unless options[:class]
|
|
98
|
+
tag("input", options)
|
|
99
|
+
elsif(options[:value] =~ /^http?:\/\//)
|
|
100
|
+
content_tag("a", options[:value], "href" => options[:value] ? options[:value] : "")
|
|
101
|
+
else
|
|
102
|
+
options[:value] ? options[:value] : ""
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Renders an editable or read-only element describing a boolean value.
|
|
107
|
+
#
|
|
108
|
+
# Options:
|
|
109
|
+
# * <tt>:name</tt> - The name of the variable/attribute.
|
|
110
|
+
# * <tt>:value</tt> - True or False
|
|
111
|
+
# * <tt>:editable</tt> - True or False
|
|
112
|
+
def text_or_checkbox(options)
|
|
113
|
+
value = options.delete(:value)
|
|
114
|
+
if(options.delete(:editable))
|
|
115
|
+
options[:type] = "checkbox"
|
|
116
|
+
options[:value] = "true"
|
|
117
|
+
options[:checked] = "true" if value
|
|
118
|
+
tag("input", options)
|
|
119
|
+
else
|
|
120
|
+
value ? "on" : "off"
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def text_or_select(input, options)
|
|
125
|
+
values = options.delete(:values)
|
|
126
|
+
if(input)
|
|
127
|
+
#options[:class] = "setting-input" unless options[:class]
|
|
128
|
+
|
|
129
|
+
option_tags = "\n"
|
|
130
|
+
values.each do |value|
|
|
131
|
+
option_attrs = {:value => value.class.name}
|
|
132
|
+
option_attrs[:selected] = "true" if value.selected?
|
|
133
|
+
option_tag = content_tag("option", value.name, option_attrs)
|
|
134
|
+
option_tags << option_tag << "\n"
|
|
135
|
+
end
|
|
136
|
+
content_tag("select", option_tags, options)
|
|
137
|
+
else
|
|
138
|
+
values.find {|v| v.selected?}.name
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Renders a tab pane where each tab contains rendered objects
|
|
143
|
+
def tab_pane(name, array)
|
|
144
|
+
define_selected!(array)
|
|
145
|
+
$pane_name = name
|
|
146
|
+
def array.name
|
|
147
|
+
$pane_name
|
|
148
|
+
end
|
|
149
|
+
render_partial("tab_pane", array)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Renders a pane (div) with a combo (select) that will
|
|
153
|
+
# Show one of the objects in the array (which are rendered with render_object).
|
|
154
|
+
# If one of the objects in the array respond to selected? and return true,
|
|
155
|
+
# it is preselected in the combo.
|
|
156
|
+
def select_pane(description, name, array)
|
|
157
|
+
define_selected!(array)
|
|
158
|
+
$pane_name = name
|
|
159
|
+
$pane_description = description
|
|
160
|
+
def array.name
|
|
161
|
+
$pane_name
|
|
162
|
+
end
|
|
163
|
+
def array.description
|
|
164
|
+
$pane_description
|
|
165
|
+
end
|
|
166
|
+
render_partial("select_pane", array)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# defines selected? => false on each object that doesn't already have selected? defined.
|
|
170
|
+
def define_selected!(array)
|
|
171
|
+
array.each do |o|
|
|
172
|
+
unless(o.respond_to?(:selected?))
|
|
173
|
+
def o.selected?
|
|
174
|
+
false
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Creates a table rendering +o+'s attributes.
|
|
181
|
+
# Uses a default rendering, but a custom template
|
|
182
|
+
# will be used if there is a "_<underscored_class_name>.rhtml"
|
|
183
|
+
# under the project directory
|
|
184
|
+
def render_object(o, collection_name, edit)
|
|
185
|
+
underscored_name = underscore(demodulize(o.class.name))
|
|
186
|
+
template = File.expand_path(File.dirname(__FILE__) + "/../views/project/_#{underscored_name}.rhtml")
|
|
187
|
+
if(File.exist?(template))
|
|
188
|
+
render_partial(underscored_name, o)
|
|
189
|
+
else
|
|
190
|
+
r = "<table>\n"
|
|
191
|
+
o.instance_variables.each do |attr_name|
|
|
192
|
+
attr_anns = o.class.send(attr_name[1..-1])
|
|
193
|
+
if(attr_anns && attr_anns[:description])
|
|
194
|
+
# Only render attributes with :description annotations
|
|
195
|
+
attr_value = o.instance_variable_get(attr_name)
|
|
196
|
+
r << " <tr>\n"
|
|
197
|
+
r << " <td width='25%'>#{attr_anns[:description]}</td>\n"
|
|
198
|
+
html_value = text_or_input(edit, :name => "#{collection_name}[#{o.class.name}][#{attr_name}]", :value => attr_value)
|
|
199
|
+
r << " <td width='75%'>#{html_value}</td>\n"
|
|
200
|
+
r << " </tr>\n"
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
r << "</table>"
|
|
204
|
+
r
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Creates an image with a tooltip that will show on mouseover.
|
|
209
|
+
#
|
|
210
|
+
# Options:
|
|
211
|
+
# * <tt>:txt</tt> - The text to put in the tooltip. Can be HTML.
|
|
212
|
+
# * <tt>:img</tt> - The image to display on the page. Defaults to '/images/16x16/about.png'
|
|
213
|
+
def tip(options)
|
|
214
|
+
tip = options.delete(:txt)
|
|
215
|
+
options[:src] = options.delete(:img) || "/images/16x16/about.png"
|
|
216
|
+
options[:onmouseover] = "Tooltip.show(event,#{tip})"
|
|
217
|
+
options[:onmouseout] = "Tooltip.hide()"
|
|
218
|
+
|
|
219
|
+
tag("img", options)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Renders a Calendar widget
|
|
223
|
+
# The view (or layout) must load the jscalendar and dateFormat javascripts
|
|
224
|
+
# Note that the value is posted back as a ymdHMS string
|
|
225
|
+
#
|
|
226
|
+
# * <tt>:name</tt> - The name of the (hidden) field containing the date
|
|
227
|
+
# * <tt>:time</tt> - The time to initialise the widget with
|
|
228
|
+
# * <tt>:editable</tt> - Whether or not to make the widget editable
|
|
229
|
+
def calendar(options)
|
|
230
|
+
t = options[:time]
|
|
231
|
+
name = options[:name]
|
|
232
|
+
js_function = "change" + name.gsub(/:/, '_').gsub(/@/, '_').gsub(/\[/, '_').gsub(/\]/, '_')
|
|
233
|
+
js_format = "format('%yyyy%%mm%%dd%%hh%%nn%%ss%')"
|
|
234
|
+
js_date = "new Date(#{t.year}, #{t.month - 1}, #{t.day}, #{t.hour}, #{t.min}, #{t.sec})"
|
|
235
|
+
<<EOF
|
|
236
|
+
<input type="hidden" id="#{options[:name]}" name="#{options[:name]}" value="">
|
|
237
|
+
<div id="#{options[:name]}_calendar"></div>
|
|
238
|
+
<script type="text/javascript">
|
|
239
|
+
document.getElementById('#{options[:name]}').value = #{js_date}.#{js_format}
|
|
240
|
+
function #{js_function}(calendar) {
|
|
241
|
if (calendar.dateClicked) {
|
|
1
242
|
document.getElementById('#{options[:name]}').value = calendar.date.#{js_format};
|
|
243
|
+
}
|
|
2
244
|
};
|
|
3
245
|
Calendar.setup(
|
|
4
246
|
{
|
|
5
247
|
flat : "#{options[:name]}_calendar", // ID of the parent element
|
|
6
248
|
flatCallback : #{js_function}, // our callback function
|
|
249
|
+
showsTime : true,
|
|
250
|
+
date : #{js_date}
|
|
7
251
|
}
|
|
8
252
|
);
|
|
253
|
+
EOF
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'rscm'
|
|
2
|
+
require 'damagecontrol/tracker'
|
|
3
|
+
|
|
4
|
+
module DamageControl
|
|
5
|
+
|
|
6
|
+
class Build
|
|
7
|
+
def small_image
|
|
8
|
+
exit_code == 0 ? "/images/green-16.gif" : "/images/red-16.gif"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Add some generic web capabilities to the RSCM classes
|
|
13
|
+
module Web
|
|
14
|
+
module Configuration
|
|
15
|
+
|
|
16
|
+
def selected?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Returns the short lowercase name. Used for javascript and render_partial.
|
|
21
|
+
def short
|
|
22
|
+
$1.downcase if self.class.name =~ /.*::(.*)/
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class RSCM::AbstractSCM
|
|
30
|
+
include DamageControl::Web::Configuration
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class DamageControl::Tracker::Base
|
|
34
|
+
include DamageControl::Web::Configuration
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class DamageControl::Project
|
|
38
|
+
include DamageControl::Web::Configuration
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class RSCM::Change
|
|
42
|
+
ICONS = {
|
|
43
|
+
MODIFIED => "/images/16x16/document_edit.png",
|
|
44
|
+
DELETED => "/images/16x16/document_delete.png",
|
|
45
|
+
ADDED => "/images/16x16/document_add.png",
|
|
46
|
+
MOVED => "/images/16x16/document_exchange.png",
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
def icon
|
|
50
|
+
ICONS[@status] || "/images/16x16/document_warning.png"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<%
|
|
3
|
+
message = nil
|
|
4
|
+
if(@build.successful?)
|
|
5
|
+
message = "#{@build.project.name}: #{@build.status_message} build (by #{@build.changeset.developer})"
|
|
6
|
+
else
|
|
7
|
+
message = "#{@build.project.name}: #{@build.changeset.developer} broke the build"
|
|
8
|
+
end
|
|
9
|
+
%>
|
|
10
|
+
<h1><%= message %></h1>
|
|
11
|
+
<h2>Changed files:</h2>
|
|
12
|
+
<ul>
|
|
13
|
+
<% @build.
|
|
14
|
+
changeset.each do |change| %>
|
|
15
|
+
<li><%= change.path %></li>
|
|
16
|
+
<% end %>
|
|
17
|
+
</ul>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!--div class="simplebox">
|
|
2
|
+
<h4 class="simpleboxhead"><img src="/images/16x16/component.png" align="absmiddle"> Artifacts</h4>
|
|
3
|
+
<img src="/images/16x16/bug_green.png" align="absmiddle">
|
|
4
|
+
<a href="#">foo.jar</a>
|
|
5
|
+
<br>
|
|
6
|
+
<img src="/images/16x16/bug_green.png" align="absmiddle">
|
|
7
|
+
<a href="#">bababa.jar</a>
|
|
8
|
+
<br>
|
|
9
|
+
</div-->
|
|
10
|
+
|
|
11
|
+
<div id="stdout" class="console">
|
|
12
|
+
Standard out
|
|
13
|
+
<iframe src="<%= url_for(:action => "stdout", :id => @params["id"], :params => {"changeset" => @params["changeset"], "build" => @params["build"]}) %>" width="100%" height="400"></iframe>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div id="stderr" class="console">
|
|
17
|
+
Standard err
|
|
18
|
+
<iframe src="<%= url_for(:action => "stderr", :id => @params["id"], :params => {"changeset" => @params["changeset"], "build" => @params["build"]}) %>" width="100%" height="400"></iframe>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
<html>
|
|
2
2
|
<head>
|
|
3
|
-
<title>
|
|
4
|
-
<script src="/javascripts/toggle_diff.js"
|
|
3
|
+
<title>DamageControl</title>
|
|
4
|
+
<script type="text/javascript" src="/javascripts/toggle_diff.js"></script>
|
|
5
|
+
<script type="text/javascript" src="/javascripts/toggle_div.js"></script>
|
|
6
|
+
<script type="text/javascript" src="/javascripts/dateFormat.js"></script>
|
|
7
|
+
|
|
8
|
+
<script type="text/javascript" src="/javascripts/jscalendar/calendar.js"></script>
|
|
5
9
|
<script type="text/javascript" src="/javascripts/jscalendar/lang/calendar-en.js"></script>
|
|
6
10
|
<script type="text/javascript" src="/javascripts/jscalendar/calendar-setup.js"></script>
|
|
11
|
+
<link type="text/css" rel="stylesheet" href="/javascripts/jscalendar/calendar-win2k-2.css">
|
|
12
|
+
|
|
7
13
|
<link type="text/css" rel="stylesheet" href="/stylesheets/style.css">
|
|
8
14
|
<link type="text/css" rel="stylesheet" href="/stylesheets/diff.css">
|
|
9
15
|
<script>
|
|
@@ -18,12 +24,12 @@ function intercept(a) {
|
|
|
18
24
|
<table id="header" cellpadding="0" cellspacing="0" width="100%" border="0">
|
|
19
25
|
<tr id="top-panel">
|
|
20
26
|
<td>
|
|
21
|
-
<a href="http://damagecontrol.codehaus.org/"
|
|
27
|
+
<a href="http://damagecontrol.codehaus.org/"><!--img class="logo" src="images/damagecontrol-logo.gif"/--></a>
|
|
22
28
|
</td>
|
|
23
29
|
</tr>
|
|
24
30
|
<tr id="top-nav">
|
|
25
31
|
<td id="left-top-nav">
|
|
26
|
-
<%=
|
|
32
|
+
<%= breadcrumbs %>
|
|
27
33
|
</td>
|
|
28
34
|
</tr>
|
|
29
35
|
</table>
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
%>
|
|
18
18
|
<tr class="build-row">
|
|
19
19
|
<td nowrap="nowrap">
|
|
20
|
-
<%= link_to("#{changeset.identifier} (#{changeset.developer})", :action => "
|
|
20
|
+
<%= link_to("#{changeset.identifier} (#{changeset.developer})", :action => "changeset", :id => @project.name, :params => {"changeset" => changeset.identifier}) %>
|
|
21
21
|
</td>
|
|
22
22
|
<td width="100%">
|
|
23
23
|
<% @project.builds(changeset.identifier).each do |build| %>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<% if(!@select_changeset_identifiers.empty?) %>
|
|
31
31
|
<tr class="build-row">
|
|
32
32
|
<td class="build-cell-even">
|
|
33
|
-
<form method="get" action="<%= url_for(:action => "
|
|
33
|
+
<form method="get" action="<%= url_for(:action => "changeset", :id => @project.name) %>">
|
|
34
34
|
<input type="hidden" name="project_name" value="<%= "bar" %>" />
|
|
35
35
|
<select name="changeset" onchange="submit()">
|
|
36
36
|
|
|
@@ -104,7 +104,6 @@ function enableOrDisableCvsFields() {
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
var scm_password_tip = "<div class='tp1'><b>Warning!</b> Password will be shown in cleartext in configuration files.</div>";
|
|
108
107
|
var cvs_protocol_tip = "<div class='tp1'>If you specify :local: DamageControl can create the repository for you after you save (unless the repository already exists).</div>";
|
|
109
108
|
// not displayed yet - not appropriate for rscm...
|
|
110
109
|
var cvs_mod_tip = "<div class='tp1'>Note that you can't use trigged build if you are using DC to build multiple branches for the same project, use polling instead.</div>";
|
|
@@ -115,7 +114,7 @@ var cvs_mod_tip = "<div class='tp1'>Note that you can't use trigged build if yo
|
|
|
115
114
|
<tr>
|
|
116
115
|
<td width="25%" class="setting-name">CVSROOT</td>
|
|
117
116
|
<td> </td>
|
|
118
|
-
<td width="75%"><%= text_or_input(@edit, :name => "RSCM::
|
|
117
|
+
<td width="75%"><%= text_or_input(@edit, :name => "scms[RSCM::Cvs][@root]", :value => cvs.root, :onKeyUp => "cvs_init()", :id => "cvsroot") %></td>
|
|
119
118
|
</tr>
|
|
120
119
|
<% if(@edit) %>
|
|
121
120
|
<tr>
|
|
@@ -138,7 +137,7 @@ var cvs_mod_tip = "<div class='tp1'>Note that you can't use trigged build if yo
|
|
|
138
137
|
<tr>
|
|
139
138
|
<td>Password</td>
|
|
140
139
|
<td><%= tip(:txt => 'scm_password_tip') %></td>
|
|
141
|
-
<td width="75%"><%= text_or_input(@edit, :name => "RSCM::
|
|
140
|
+
<td width="75%"><%= text_or_input(@edit, :name => "scms[RSCM::Cvs][@password]", :onKeyUp => "updateCvsRootField()", :id => "cvspassword") %></td>
|
|
142
141
|
</tr>
|
|
143
142
|
<tr>
|
|
144
143
|
<td>Server</td>
|
|
@@ -159,12 +158,12 @@ var cvs_mod_tip = "<div class='tp1'>Note that you can't use trigged build if yo
|
|
|
159
158
|
<tr>
|
|
160
159
|
<td>Module</td>
|
|
161
160
|
<td> </td>
|
|
162
|
-
<td width="75%"><%= text_or_input(@edit, :name => "RSCM::
|
|
161
|
+
<td width="75%"><%= text_or_input(@edit, :name => "scms[RSCM::Cvs][@mod]", :value => cvs.mod, :id => "cvsmodule") %></td>
|
|
163
162
|
</tr>
|
|
164
163
|
<tr>
|
|
165
164
|
<td>Branch</td>
|
|
166
165
|
<td> </td>
|
|
167
|
-
<td width="75%"><%= text_or_input(@edit, :name => "RSCM::
|
|
166
|
+
<td width="75%"><%= text_or_input(@edit, :name => "scms[RSCM::Cvs][@branch]", :value => cvs.branch, :id => "cvsmodule") %></td>
|
|
168
167
|
</tr>
|
|
169
168
|
</table>
|
|
170
169
|
|