damagecontrol 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +75 -0
- data/README.license +5 -0
- data/Rakefile +111 -0
- data/app/controllers/admin_controller.rb +10 -0
- data/app/controllers/application.rb +163 -0
- data/app/controllers/files_controller.rb +19 -0
- data/app/controllers/project_controller.rb +284 -0
- data/app/controllers/scm_controller.rb +49 -0
- data/app/helpers/admin_helper.rb +2 -0
- data/app/helpers/application_helper.rb +3 -0
- data/app/helpers/project_helper.rb +2 -0
- data/app/views/dhtml_sites.txt +6 -0
- data/app/views/files/list.rhtml +4 -0
- data/app/views/layouts/rscm.rhtml +79 -0
- data/app/views/project/_bugzilla.rhtml +13 -0
- data/app/views/project/_changesets_list.rhtml +52 -0
- data/app/views/project/_cvs.rhtml +171 -0
- data/app/views/project/_jira.rhtml +19 -0
- data/app/views/project/_mooky.rhtml +23 -0
- data/app/views/project/_null.rhtml +0 -0
- data/app/views/project/_project.rhtml +36 -0
- data/app/views/project/_rubyforge.rhtml +19 -0
- data/app/views/project/_scarab.rhtml +19 -0
- data/app/views/project/_scms.rhtml +15 -0
- data/app/views/project/_sourceforge.rhtml +19 -0
- data/app/views/project/_starteam.rhtml +43 -0
- data/app/views/project/_svn.rhtml +22 -0
- data/app/views/project/_trac.rhtml +13 -0
- data/app/views/project/_trackers.rhtml +18 -0
- data/app/views/project/changesets.rhtml +31 -0
- data/app/views/project/index.rhtml +23 -0
- data/app/views/project/view.rhtml +70 -0
- data/app/views/scm/checkout_status.rhtml +44 -0
- data/app/views/scm/diff.rhtml +1 -0
- data/app/views/scm/scroll.html +27 -0
- data/bin/damagecontrol +7 -0
- data/bin/damagecontrol-webrick +2 -0
- data/config/database.yml +20 -0
- data/config/environment.rb +60 -0
- data/config/environments/development.rb +3 -0
- data/config/environments/production.rb +2 -0
- data/config/environments/test.rb +3 -0
- data/lib/damagecontrol/app.rb +74 -0
- data/lib/damagecontrol/build.rb +104 -0
- data/lib/damagecontrol/diff_htmlizer.rb +82 -0
- data/lib/damagecontrol/diff_parser.rb +153 -0
- data/lib/damagecontrol/directories.rb +126 -0
- data/lib/damagecontrol/poller.rb +72 -0
- data/lib/damagecontrol/project.rb +213 -0
- data/lib/damagecontrol/project_dependencies.rb +8 -0
- data/lib/damagecontrol/scm_web.rb +50 -0
- data/lib/damagecontrol/standard_persister.rb +49 -0
- data/lib/damagecontrol/tracker.rb +164 -0
- data/lib/damagecontrol/visitor/build_executor.rb +32 -0
- data/lib/damagecontrol/visitor/diff_persister.rb +41 -0
- data/lib/damagecontrol/visitor/rss_writer.rb +43 -0
- data/lib/damagecontrol/visitor/yaml_persister.rb +71 -0
- data/public/404.html +6 -0
- data/public/500.html +6 -0
- data/public/dispatch.cgi +10 -0
- data/public/dispatch.fcgi +7 -0
- data/public/dispatch.rb +10 -0
- data/public/images/16x16/about.png +0 -0
- data/public/images/16x16/bug_green.png +0 -0
- data/public/images/16x16/bug_red.png +0 -0
- data/public/images/16x16/bug_yellow.png +0 -0
- data/public/images/16x16/component.png +0 -0
- data/public/images/16x16/console.png +0 -0
- data/public/images/16x16/console_error.png +0 -0
- data/public/images/16x16/document_add.png +0 -0
- data/public/images/16x16/document_delete.png +0 -0
- data/public/images/16x16/document_edit.png +0 -0
- data/public/images/16x16/document_exchange.png +0 -0
- data/public/images/16x16/document_new.png +0 -0
- data/public/images/16x16/document_warning.png +0 -0
- data/public/images/16x16/safe.png +0 -0
- data/public/images/16x16/scroll_information.png +0 -0
- data/public/images/16x16/wrench.png +0 -0
- data/public/images/24x24/box_delete.png +0 -0
- data/public/images/24x24/box_into.png +0 -0
- data/public/images/24x24/box_new.png +0 -0
- data/public/images/24x24/console_network.png +0 -0
- data/public/images/24x24/document_edit.png +0 -0
- data/public/images/24x24/find.png +0 -0
- data/public/images/24x24/folders.png +0 -0
- data/public/images/24x24/garbage.png +0 -0
- data/public/images/24x24/gear_connection.png +0 -0
- data/public/images/24x24/gear_delete.png +0 -0
- data/public/images/24x24/gears_run.png +0 -0
- data/public/images/24x24/home.png +0 -0
- data/public/images/24x24/navigate_left.png +0 -0
- data/public/images/24x24/navigate_right.png +0 -0
- data/public/images/24x24/package_new.png +0 -0
- data/public/images/24x24/safe.png +0 -0
- data/public/images/24x24/safe_new.png +0 -0
- data/public/images/24x24/safe_out.png +0 -0
- data/public/images/24x24/scroll_information.png +0 -0
- data/public/images/24x24/stop.png +0 -0
- data/public/images/24x24/wrench.png +0 -0
- data/public/images/README.license +2 -0
- data/public/images/blue-16.gif +0 -0
- data/public/images/blue-32.gif +0 -0
- data/public/images/bugzilla.png +0 -0
- data/public/images/cvs.png +0 -0
- data/public/images/footer.gif +0 -0
- data/public/images/green-128.gif +0 -0
- data/public/images/green-16.gif +0 -0
- data/public/images/green-32.gif +0 -0
- data/public/images/grey-16.gif +0 -0
- data/public/images/grey-32.gif +0 -0
- data/public/images/jira.gif +0 -0
- data/public/images/red-16.gif +0 -0
- data/public/images/red-32.gif +0 -0
- data/public/images/red-pulse-32.gif +0 -0
- data/public/images/rss.gif +0 -0
- data/public/images/rubyforge.png +0 -0
- data/public/images/scarab.gif +0 -0
- data/public/images/sourceforge.gif +0 -0
- data/public/images/starteam.png +0 -0
- data/public/images/svnlogo64.png +0 -0
- data/public/images/trac.png +0 -0
- data/public/index.html +1 -0
- data/public/javascripts/dw_event.js +34 -0
- data/public/javascripts/dw_tooltip.js +86 -0
- data/public/javascripts/dw_viewport.js +55 -0
- data/public/javascripts/pngfix.js +29 -0
- data/public/javascripts/toggle_diff.js +25 -0
- data/public/licenses/DAMAGECONTROL.license +28 -0
- data/public/licenses/INCORS.license +32 -0
- data/public/stylesheets/diff.css +23 -0
- data/public/stylesheets/style.css +307 -0
- data/script/breakpointer +5 -0
- data/script/console +30 -0
- data/script/generate +70 -0
- data/script/server +61 -0
- data/test/damagecontrol/a_program.rb +3 -0
- data/test/damagecontrol/a_slow_program.rb +3 -0
- data/test/damagecontrol/build_test.rb +59 -0
- data/test/damagecontrol/diff_htmlizer_test.rb +31 -0
- data/test/damagecontrol/diff_parser_test.rb +61 -0
- data/test/damagecontrol/file_ext.rb +12 -0
- data/test/damagecontrol/poller_test.rb +56 -0
- data/test/damagecontrol/project_test.rb +144 -0
- data/test/damagecontrol/scm_web_test.rb +22 -0
- data/test/damagecontrol/test.diff +38 -0
- data/test/damagecontrol/test.html +40 -0
- data/test/damagecontrol/tracker_test.rb +48 -0
- data/test/damagecontrol/visitor/changesets.rss +34 -0
- data/test/damagecontrol/visitor/diff_persister_test.rb +49 -0
- data/test/damagecontrol/visitor/rss_writer_test.rb +40 -0
- data/test/damagecontrol/visitor/yaml_persister_test.rb +40 -0
- data/test/functional/admin_controller_test.rb +17 -0
- data/test/functional/project_controller_test.rb +17 -0
- data/test/test_helper.rb +14 -0
- metadata +245 -0
@@ -0,0 +1,86 @@
|
|
1
|
+
/*************************************************************************
|
2
|
+
|
3
|
+
dw_tooltip.js
|
4
|
+
version date: Nov 2003
|
5
|
+
requires: dw_event.js and dw_viewport.js
|
6
|
+
|
7
|
+
This code is from Dynamic Web Coding at http://www.dyn-web.com/
|
8
|
+
Copyright 2003 by Sharon Paine
|
9
|
+
See Terms of Use at http://www.dyn-web.com/bus/terms.html
|
10
|
+
regarding conditions under which you may use this code.
|
11
|
+
This notice must be retained in the code as is!
|
12
|
+
|
13
|
+
*************************************************************************/
|
14
|
+
|
15
|
+
var Tooltip = {
|
16
|
+
followMouse: true,
|
17
|
+
offX: 8,
|
18
|
+
offY: 12,
|
19
|
+
|
20
|
+
ready: false,
|
21
|
+
t1: null,
|
22
|
+
t2: null,
|
23
|
+
tipID: "tipDiv",
|
24
|
+
tip: null,
|
25
|
+
|
26
|
+
init: function() {
|
27
|
+
if ( document.createElement && document.body && typeof document.body.appendChild != "undefined" ) {
|
28
|
+
var el = document.createElement("DIV");
|
29
|
+
el.className = "tooltip";
|
30
|
+
el.id = this.tipID;
|
31
|
+
document.body.appendChild(el);
|
32
|
+
this.ready = true;
|
33
|
+
}
|
34
|
+
},
|
35
|
+
|
36
|
+
show: function(e, msg) {
|
37
|
+
if (this.t1) clearTimeout(this.t1);
|
38
|
+
if (this.t2) clearTimeout(this.t2);
|
39
|
+
this.tip = document.getElementById( this.tipID );
|
40
|
+
// set up mousemove
|
41
|
+
if (this.followMouse)
|
42
|
+
dw_event.add( document, "mousemove", this.trackMouse, true );
|
43
|
+
this.writeTip(""); // for mac ie
|
44
|
+
this.writeTip(msg);
|
45
|
+
viewport.getAll();
|
46
|
+
this.positionTip(e);
|
47
|
+
this.t1 = setTimeout("document.getElementById('" + Tooltip.tipID + "').style.visibility = 'visible'",200);
|
48
|
+
},
|
49
|
+
|
50
|
+
writeTip: function(msg) {
|
51
|
+
if ( this.tip && typeof this.tip.innerHTML != "undefined" ) this.tip.innerHTML = msg;
|
52
|
+
},
|
53
|
+
|
54
|
+
positionTip: function(e) {
|
55
|
+
var x = e.pageX? e.pageX: e.clientX + viewport.scrollX;
|
56
|
+
var y = e.pageY? e.pageY: e.clientY + viewport.scrollY;
|
57
|
+
|
58
|
+
if ( x + this.tip.offsetWidth + this.offX > viewport.width + viewport.scrollX )
|
59
|
+
x = x - this.tip.offsetWidth - this.offX;
|
60
|
+
else x = x + this.offX;
|
61
|
+
|
62
|
+
if ( y + this.tip.offsetHeight + this.offY > viewport.height + viewport.scrollY )
|
63
|
+
y = ( y - this.tip.offsetHeight - this.offY > viewport.scrollY )? y - this.tip.offsetHeight - this.offY : viewport.height + viewport.scrollY - this.tip.offsetHeight;
|
64
|
+
else y = y + this.offY;
|
65
|
+
|
66
|
+
this.tip.style.left = x + "px"; this.tip.style.top = y + "px";
|
67
|
+
},
|
68
|
+
|
69
|
+
hide: function() {
|
70
|
+
if (this.t1) clearTimeout(this.t1);
|
71
|
+
if (this.t2) clearTimeout(this.t2);
|
72
|
+
this.t2 = setTimeout("document.getElementById('" + this.tipID + "').style.visibility = 'hidden'",200);
|
73
|
+
// release mousemove
|
74
|
+
if (this.followMouse)
|
75
|
+
dw_event.remove( document, "mousemove", this.trackMouse, true );
|
76
|
+
this.tip = null;
|
77
|
+
},
|
78
|
+
|
79
|
+
trackMouse: function(e) {
|
80
|
+
e = dw_event.DOMit(e);
|
81
|
+
Tooltip.positionTip(e);
|
82
|
+
}
|
83
|
+
|
84
|
+
}
|
85
|
+
|
86
|
+
Tooltip.init();
|
@@ -0,0 +1,55 @@
|
|
1
|
+
/*************************************************************************
|
2
|
+
dw_viewport.js version date Nov 2003
|
3
|
+
|
4
|
+
This code is from Dynamic Web Coding at http://www.dyn-web.com/
|
5
|
+
Copyright 2003 by Sharon Paine
|
6
|
+
See Terms of Use at http://www.dyn-web.com/bus/terms.html
|
7
|
+
regarding conditions under which you may use this code.
|
8
|
+
This notice must be retained in the code as is!
|
9
|
+
*************************************************************************/
|
10
|
+
|
11
|
+
viewport = {
|
12
|
+
getWinWidth: function () {
|
13
|
+
this.width = 0;
|
14
|
+
if (window.innerWidth) this.width = window.innerWidth - 18;
|
15
|
+
else if (document.documentElement && document.documentElement.clientWidth)
|
16
|
+
this.width = document.documentElement.clientWidth;
|
17
|
+
else if (document.body && document.body.clientWidth)
|
18
|
+
this.width = document.body.clientWidth;
|
19
|
+
},
|
20
|
+
|
21
|
+
getWinHeight: function () {
|
22
|
+
this.height = 0;
|
23
|
+
if (window.innerHeight) this.height = window.innerHeight - 18;
|
24
|
+
else if (document.documentElement && document.documentElement.clientHeight)
|
25
|
+
this.height = document.documentElement.clientHeight;
|
26
|
+
else if (document.body && document.body.clientHeight)
|
27
|
+
this.height = document.body.clientHeight;
|
28
|
+
},
|
29
|
+
|
30
|
+
getScrollX: function () {
|
31
|
+
this.scrollX = 0;
|
32
|
+
if (typeof window.pageXOffset == "number") this.scrollX = window.pageXOffset;
|
33
|
+
else if (document.documentElement && document.documentElement.scrollLeft)
|
34
|
+
this.scrollX = document.documentElement.scrollLeft;
|
35
|
+
else if (document.body && document.body.scrollLeft)
|
36
|
+
this.scrollX = document.body.scrollLeft;
|
37
|
+
else if (window.scrollX) this.scrollX = window.scrollX;
|
38
|
+
},
|
39
|
+
|
40
|
+
getScrollY: function () {
|
41
|
+
this.scrollY = 0;
|
42
|
+
if (typeof window.pageYOffset == "number") this.scrollY = window.pageYOffset;
|
43
|
+
else if (document.documentElement && document.documentElement.scrollTop)
|
44
|
+
this.scrollY = document.documentElement.scrollTop;
|
45
|
+
else if (document.body && document.body.scrollTop)
|
46
|
+
this.scrollY = document.body.scrollTop;
|
47
|
+
else if (window.scrollY) this.scrollY = window.scrollY;
|
48
|
+
},
|
49
|
+
|
50
|
+
getAll: function () {
|
51
|
+
this.getWinWidth(); this.getWinHeight();
|
52
|
+
this.getScrollX(); this.getScrollY();
|
53
|
+
}
|
54
|
+
|
55
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
// Correctly handle PNG transparency in Win IE 5.5 or higher.
|
3
|
+
// http://homepage.ntlworld.com/bobosola. Updated 02-March-2004
|
4
|
+
|
5
|
+
function correctPNG()
|
6
|
+
{
|
7
|
+
for(var i=0; i<document.images.length; i++)
|
8
|
+
{
|
9
|
+
var img = document.images[i]
|
10
|
+
var imgName = img.src.toUpperCase()
|
11
|
+
if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
|
12
|
+
{
|
13
|
+
var imgID = (img.id) ? "id='" + img.id + "' " : ""
|
14
|
+
var imgClass = (img.className) ? "class='" + img.className + "' " : ""
|
15
|
+
var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
|
16
|
+
var imgStyle = "display:inline-block;" + img.style.cssText
|
17
|
+
if (img.align == "left") imgStyle = "float:left;" + imgStyle
|
18
|
+
if (img.align == "right") imgStyle = "float:right;" + imgStyle
|
19
|
+
if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
|
20
|
+
var strNewHTML = "<span " + imgID + imgClass + imgTitle
|
21
|
+
+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
|
22
|
+
+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
|
23
|
+
+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
|
24
|
+
img.outerHTML = strNewHTML
|
25
|
+
i = i-1
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
window.attachEvent("onload", correctPNG);
|
@@ -0,0 +1,25 @@
|
|
1
|
+
function popupCode( url ) {
|
2
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
3
|
+
}
|
4
|
+
|
5
|
+
function toggleCode( id ) {
|
6
|
+
if ( document.getElementById )
|
7
|
+
elem = document.getElementById( id );
|
8
|
+
else if ( document.all )
|
9
|
+
elem = eval( "document.all." + id );
|
10
|
+
else
|
11
|
+
return false;
|
12
|
+
elemStyle = elem.style;
|
13
|
+
|
14
|
+
if ( elemStyle.display != "block" ) {
|
15
|
+
elemStyle.display = "block"
|
16
|
+
} else {
|
17
|
+
elemStyle.display = "none"
|
18
|
+
}
|
19
|
+
|
20
|
+
return true;
|
21
|
+
}
|
22
|
+
|
23
|
+
// Make codeblocks hidden by default
|
24
|
+
document.writeln( "<style type=\"text/css\">div.diff { display: none }</style>" )
|
25
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Copyright (c) 2004, DamageControl Organization, Jon Tirsen and Aslak Hellesoy
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
Neither the name of the DamageControl Organization nor the names of its
|
15
|
+
contributors may be used to endorse or promote products derived from this
|
16
|
+
software without specific prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
22
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
23
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
24
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
26
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
27
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
28
|
+
POSSIBILITY OF SUCH DAMAGE.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
License Agreement
|
2
|
+
|
3
|
+
|
4
|
+
This is a legal agreement between You, the purchaser, and INCORS GmbH
|
5
|
+
("INCORS"). By downloading any icons from this website, you agree to be bound
|
6
|
+
by the terms of this agreement.
|
7
|
+
|
8
|
+
All ownership and copyright of the licensed icons remain the property of
|
9
|
+
INCORS. INCORS grants to you a nonexclusive, non-sublicensable right to use
|
10
|
+
the icons royalty-free according to the license terms for any commercial or
|
11
|
+
personal design and software projects. You may also display the icon in
|
12
|
+
related documentation, help files, and advertising materials.
|
13
|
+
|
14
|
+
You may modifiy the icons is shape, color, and/or file format and use the
|
15
|
+
modified icons royalty-free according to the license terms for any commercial
|
16
|
+
or personal design and software projects. You may also display the modified
|
17
|
+
icon in related documentation, help files, and advertising materials.
|
18
|
+
|
19
|
+
You may not lease, license or sub-license the icons, or a subset of the icons,
|
20
|
+
or any modified icons to any third party unless they are incorporated into
|
21
|
+
your own software or design products, which do not compete directly with the
|
22
|
+
IconExperience icon collections.
|
23
|
+
|
24
|
+
All icon files are provided "As is" without warranties of merchantability and
|
25
|
+
fitness for a particular purpose. You agree to hold INCORS harmless for any
|
26
|
+
result that may occur during the course of using the licensed icons.
|
27
|
+
|
28
|
+
This License Agreement shall be governed and construed in accordance with the
|
29
|
+
laws of Germany. No choice of law rules of any jurisdiction will apply. If any
|
30
|
+
provision of this License Agreement is held to be unenforceable, this License
|
31
|
+
Agreement will remain in effect with the provision omitted.
|
32
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
body {background-color:#ffffff;}
|
2
|
+
.file {border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;}
|
3
|
+
.pathname {font-family:monospace; float:right;}
|
4
|
+
.fileheader {margin-bottom:.5em;}
|
5
|
+
.diff {margin:0;}
|
6
|
+
.tasklist {padding:4px;border:1px dashed #000000;margin-top:1em;}
|
7
|
+
.tasklist ul {margin-top:0;margin-bottom:0;}
|
8
|
+
tr.alt {background-color:#eeeeee}
|
9
|
+
#added {background-color:#ddffdd;}
|
10
|
+
#addedchars {background-color:#99ff99;font-weight:bolder;}
|
11
|
+
tr.alt #added {background-color:#ccf7cc;}
|
12
|
+
#removed {background-color:#ffdddd;}
|
13
|
+
#removedchars {background-color:#ff9999;font-weight:bolder;}
|
14
|
+
tr.alt #removed {background-color:#f7cccc;}
|
15
|
+
#info {color:#888888;}
|
16
|
+
#context {background-color:#eeeeee;}
|
17
|
+
td {padding-left:.3em;padding-right:.3em;}
|
18
|
+
tr.head {border-bottom-width:1px;border-bottom-style:solid;}
|
19
|
+
tr.head td {padding:0;padding-top:.2em;}
|
20
|
+
.code_task {background-color:#ffff00;}
|
21
|
+
.comment {padding:4px;border:1px dashed #000000;background-color:#ffffdd}
|
22
|
+
.error {color:red;}
|
23
|
+
hr {border-width:0px;height:2px;background:black;}
|
@@ -0,0 +1,307 @@
|
|
1
|
+
body {
|
2
|
+
margin: 0;
|
3
|
+
padding: 0;
|
4
|
+
background: white;
|
5
|
+
}
|
6
|
+
|
7
|
+
body, table, form, input, td, th, p, textarea, select
|
8
|
+
{
|
9
|
+
font-family: Verdana, Helvetica, sans serif;
|
10
|
+
font-size: 11px;
|
11
|
+
}
|
12
|
+
|
13
|
+
td {
|
14
|
+
vertical-align: top;
|
15
|
+
}
|
16
|
+
|
17
|
+
#main-table {
|
18
|
+
padding: 0;
|
19
|
+
border-collapse: collapse;
|
20
|
+
}
|
21
|
+
|
22
|
+
#top-panel {
|
23
|
+
padding-bottom: 3pt;
|
24
|
+
margin-bottom: 3pt;
|
25
|
+
background: #6c0;
|
26
|
+
}
|
27
|
+
|
28
|
+
#left-top-nav {
|
29
|
+
text-align: left;
|
30
|
+
border-top: 1px solid #090;
|
31
|
+
border-bottom: 1px solid #090;
|
32
|
+
background: #090;
|
33
|
+
padding: 4px;
|
34
|
+
color: white;
|
35
|
+
}
|
36
|
+
|
37
|
+
#left-top-nav a, #right-top-nav a {
|
38
|
+
color: white;
|
39
|
+
}
|
40
|
+
|
41
|
+
#right-top-nav {
|
42
|
+
text-align: right;
|
43
|
+
border-top: 1px solid #090;
|
44
|
+
border-bottom: 1px solid #090;
|
45
|
+
background: #090;
|
46
|
+
padding: 4px;
|
47
|
+
}
|
48
|
+
|
49
|
+
#main-panel {
|
50
|
+
padding: 10px;
|
51
|
+
}
|
52
|
+
|
53
|
+
#side-panel {
|
54
|
+
padding: 4px;
|
55
|
+
width: 220px;
|
56
|
+
border-right: 1px solid #090;
|
57
|
+
background: #eed;
|
58
|
+
}
|
59
|
+
|
60
|
+
#footer {
|
61
|
+
text-align: center;
|
62
|
+
font-size: 8pt;
|
63
|
+
margin-top: 10em;
|
64
|
+
padding: 10px;
|
65
|
+
background-image: @url("images/footer_grad.gif");
|
66
|
+
border-top: 1px solid #090;
|
67
|
+
}
|
68
|
+
|
69
|
+
#tasks {
|
70
|
+
padding: 4px;
|
71
|
+
}
|
72
|
+
|
73
|
+
a.link {
|
74
|
+
text-decoration: underline;
|
75
|
+
}
|
76
|
+
|
77
|
+
a.hover {
|
78
|
+
text-decoration: underline;
|
79
|
+
}
|
80
|
+
|
81
|
+
/* tip - anchors of class info */
|
82
|
+
a.tip {
|
83
|
+
position:relative;
|
84
|
+
z-index:24;
|
85
|
+
text-decoration: underline;
|
86
|
+
}
|
87
|
+
|
88
|
+
a.tip:hover {
|
89
|
+
z-index:25;
|
90
|
+
}
|
91
|
+
|
92
|
+
a.tip span {
|
93
|
+
display: none
|
94
|
+
}
|
95
|
+
|
96
|
+
a.tip:hover span {
|
97
|
+
display:block;
|
98
|
+
position:absolute;
|
99
|
+
top:2em;
|
100
|
+
left:2em;
|
101
|
+
width:400px;
|
102
|
+
border:1px solid #bbbbbb;
|
103
|
+
background-color:#fffff0;
|
104
|
+
color:#000;
|
105
|
+
text-align: left
|
106
|
+
}
|
107
|
+
|
108
|
+
#top-nav .a {
|
109
|
+
color: white;
|
110
|
+
}
|
111
|
+
|
112
|
+
img {
|
113
|
+
vertical-align: middle;
|
114
|
+
border: 0;
|
115
|
+
}
|
116
|
+
|
117
|
+
table.tab {
|
118
|
+
border-collapse: collapse;
|
119
|
+
}
|
120
|
+
|
121
|
+
td.selected_tab {
|
122
|
+
vertical-align: middle;
|
123
|
+
border: 1px #090 solid;
|
124
|
+
background: #ffffff;
|
125
|
+
}
|
126
|
+
|
127
|
+
td.tab_filler {
|
128
|
+
background: #ffffff;
|
129
|
+
border-bottom: 1px #090 solid;
|
130
|
+
}
|
131
|
+
|
132
|
+
td.tab {
|
133
|
+
vertical-align: middle;
|
134
|
+
border: 1px #090 solid;
|
135
|
+
background: #f0f0f0;
|
136
|
+
}
|
137
|
+
|
138
|
+
table.progress-bar {
|
139
|
+
border-collapse: collapse;
|
140
|
+
border: 1px solid #ddc;
|
141
|
+
}
|
142
|
+
|
143
|
+
td.progress-bar-done {
|
144
|
+
background-color: #009900;
|
145
|
+
}
|
146
|
+
|
147
|
+
td.progress-bar-left {
|
148
|
+
background-color: #cc0000;
|
149
|
+
}
|
150
|
+
|
151
|
+
.dashboard td {
|
152
|
+
padding: 4px 4px 4px 4px;
|
153
|
+
}
|
154
|
+
|
155
|
+
pre.console {
|
156
|
+
overflow: auto;
|
157
|
+
}
|
158
|
+
|
159
|
+
.setting-name {
|
160
|
+
}
|
161
|
+
|
162
|
+
.setting-input {
|
163
|
+
width: 100%;
|
164
|
+
}
|
165
|
+
|
166
|
+
.setting-description {
|
167
|
+
font-size: 0.8em;
|
168
|
+
margin-top: 0;
|
169
|
+
padding-top: 0;
|
170
|
+
}
|
171
|
+
|
172
|
+
.setting-warning {
|
173
|
+
font-size: 1em;
|
174
|
+
margin-top: 0;
|
175
|
+
padding-top: 0;
|
176
|
+
|
177
|
+
}
|
178
|
+
|
179
|
+
.setting-warning:before {
|
180
|
+
content: "Warning: ";
|
181
|
+
color: red;
|
182
|
+
font-weight:bold;
|
183
|
+
}
|
184
|
+
|
185
|
+
.build-row {
|
186
|
+
padding: 3px 4px 3px 4px;
|
187
|
+
}
|
188
|
+
|
189
|
+
.build-rss-cell {
|
190
|
+
text-align: right;
|
191
|
+
}
|
192
|
+
|
193
|
+
.task-header {
|
194
|
+
display: block;
|
195
|
+
border-bottom: 1px #090 solid;
|
196
|
+
font-weight: bold;
|
197
|
+
font-size: 12pt;
|
198
|
+
}
|
199
|
+
|
200
|
+
.main-table {
|
201
|
+
}
|
202
|
+
|
203
|
+
table.dashboard {
|
204
|
+
width: 100%;
|
205
|
+
}
|
206
|
+
|
207
|
+
.pane {
|
208
|
+
margin-top: 4px;
|
209
|
+
}
|
210
|
+
.pane td {
|
211
|
+
padding: 4px 4px 3px 4px;
|
212
|
+
}
|
213
|
+
|
214
|
+
table.pane {
|
215
|
+
width: 100%;
|
216
|
+
background-color: #ffffff;
|
217
|
+
border-collapse: collapse;
|
218
|
+
border: 1px #bbb solid;
|
219
|
+
}
|
220
|
+
|
221
|
+
td.pane {
|
222
|
+
border: 1px #bbb solid;
|
223
|
+
background-color: #ffffff;
|
224
|
+
padding: 3px 4px 3px 4px;
|
225
|
+
vertical-align: middle;
|
226
|
+
}
|
227
|
+
|
228
|
+
td.pane-header {
|
229
|
+
border: 1px #bbb solid;
|
230
|
+
background-color: #f0f0f0;
|
231
|
+
font-weight: bold;
|
232
|
+
}
|
233
|
+
|
234
|
+
th.pane {
|
235
|
+
border: 1px #bbb solid;
|
236
|
+
font-weight: bold;
|
237
|
+
}
|
238
|
+
|
239
|
+
#projectstatus th {
|
240
|
+
font-weight: bold;
|
241
|
+
background-color: #f0f0f0;
|
242
|
+
padding: 3px 4px 3px 4px;
|
243
|
+
}
|
244
|
+
|
245
|
+
#projectstatus tr {
|
246
|
+
border: 1px solid #bbb;
|
247
|
+
padding: 3px 4px 3px 4px;
|
248
|
+
}
|
249
|
+
|
250
|
+
#projectstatus td {
|
251
|
+
vertical-align: middle;
|
252
|
+
padding: 3px 4px 3px 4px;
|
253
|
+
}
|
254
|
+
|
255
|
+
.smallfont {
|
256
|
+
font-size: 9px;
|
257
|
+
}
|
258
|
+
|
259
|
+
#foldertab {
|
260
|
+
padding: 4px 0;
|
261
|
+
margin-left: 0;
|
262
|
+
border-bottom: 1px solid #090;
|
263
|
+
font: bold 12px Verdana, sans-serif;
|
264
|
+
}
|
265
|
+
|
266
|
+
#foldertab li {
|
267
|
+
list-style: none;
|
268
|
+
margin: 0;
|
269
|
+
display: inline;
|
270
|
+
}
|
271
|
+
|
272
|
+
#foldertab li a {
|
273
|
+
padding: 4px 0.5em;
|
274
|
+
margin-left: 3px;
|
275
|
+
border: 1px solid #090;
|
276
|
+
border-bottom: none;
|
277
|
+
background: #090;
|
278
|
+
text-decoration: none;
|
279
|
+
}
|
280
|
+
|
281
|
+
#foldertab li a:link { color: white; }
|
282
|
+
#foldertab li a:visited { color: white; }
|
283
|
+
|
284
|
+
#foldertab li a:hover {
|
285
|
+
color: white;
|
286
|
+
background: #6c0;
|
287
|
+
border-color: #6c0;
|
288
|
+
}
|
289
|
+
|
290
|
+
#foldertab li a#current {
|
291
|
+
background: white;
|
292
|
+
border-bottom: 1px solid white;
|
293
|
+
color: black;
|
294
|
+
}
|
295
|
+
|
296
|
+
.highlighted-build {
|
297
|
+
/*border: 1px solid #ddc;*/
|
298
|
+
background: #ffe;
|
299
|
+
padding: 3px;
|
300
|
+
margin-left: -4px;
|
301
|
+
}
|
302
|
+
|
303
|
+
.changeset-message {
|
304
|
+
border: 1px solid #ccb;
|
305
|
+
background: #eed;
|
306
|
+
padding: 4px;
|
307
|
+
}
|
data/script/breakpointer
ADDED
data/script/console
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if ARGV[0]
|
4
|
+
ENV['RAILS_ENV'] = ARGV[0]
|
5
|
+
puts "Loading environment..."
|
6
|
+
exec "irb -r config/environment.rb -r irb/completion --noinspect"
|
7
|
+
else
|
8
|
+
puts <<-HELP
|
9
|
+
|
10
|
+
NAME
|
11
|
+
console - interact with the domain model through a environment console (on IRB)
|
12
|
+
|
13
|
+
SYNOPSIS
|
14
|
+
console [environment]
|
15
|
+
|
16
|
+
DESCRIPTION
|
17
|
+
Starts an environment console using IRB that lets you manipulate and interrogate
|
18
|
+
the domain model or even trigger controller actions. The database connection and
|
19
|
+
configuration available to the web application is already setup.
|
20
|
+
|
21
|
+
Tab completion is available to see classes and methods on individual objects.
|
22
|
+
|
23
|
+
EXAMPLE
|
24
|
+
console production
|
25
|
+
|
26
|
+
This will initialize the production environment (as setup in config/database.yml
|
27
|
+
and config/environments/production.rb). You would now be ready to start requiring
|
28
|
+
models using require_dependency.
|
29
|
+
HELP
|
30
|
+
end
|
data/script/generate
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../config/environment'
|
4
|
+
require 'rails_generator'
|
5
|
+
|
6
|
+
ARGV.shift unless ARGV.empty? or not ['--help', '-h'].include?(ARGV[0])
|
7
|
+
|
8
|
+
def find_synonyms(word)
|
9
|
+
require 'open-uri'
|
10
|
+
uri = "http://wordnet.princeton.edu/cgi-bin/webwn2.0?stage=2" +
|
11
|
+
"&word=%s&posnumber=1&searchtypenumber=2&senses=&showglosses=1"
|
12
|
+
|
13
|
+
open(uri % word) do |stream|
|
14
|
+
data = stream.read.gsub(" ", " ").gsub("<BR>", "")
|
15
|
+
data.scan(/^Sense \d+\n.+?\n\n/m)
|
16
|
+
end
|
17
|
+
rescue Exception
|
18
|
+
return nil
|
19
|
+
end
|
20
|
+
|
21
|
+
unless ARGV.empty?
|
22
|
+
begin
|
23
|
+
name = ARGV.shift
|
24
|
+
generator = Rails::Generator.instance(name, ARGV)
|
25
|
+
|
26
|
+
if msg = generator.collision_with_builtin? then
|
27
|
+
$stderr.puts msg
|
28
|
+
|
29
|
+
if synonyms = find_synonyms(generator.class_name) then
|
30
|
+
$stderr.puts(
|
31
|
+
"", "Here are a few synonyms from WordNet. Maybe they will help you find an alternative name.",
|
32
|
+
"", synonyms
|
33
|
+
)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
generator.generate
|
37
|
+
end
|
38
|
+
rescue Rails::Generator::UsageError => e
|
39
|
+
puts e.message
|
40
|
+
end
|
41
|
+
else
|
42
|
+
builtin_generators = Rails::Generator.builtin_generators.join(', ')
|
43
|
+
contrib_generators = Rails::Generator.contrib_generators.join(', ')
|
44
|
+
|
45
|
+
$stderr.puts <<end_usage
|
46
|
+
#{$0} generator [args]
|
47
|
+
|
48
|
+
Rails comes with #{builtin_generators} generators.
|
49
|
+
#{$0} controller Login login logout
|
50
|
+
#{$0} model Account
|
51
|
+
#{$0} mailer AccountMailer
|
52
|
+
#{$0} scaffold Account action another_action
|
53
|
+
|
54
|
+
end_usage
|
55
|
+
|
56
|
+
unless contrib_generators.empty?
|
57
|
+
$stderr.puts " Installed generators (in #{RAILS_ROOT}/script/generators):"
|
58
|
+
$stderr.puts " #{contrib_generators}"
|
59
|
+
$stderr.puts
|
60
|
+
end
|
61
|
+
|
62
|
+
$stderr.puts <<end_usage
|
63
|
+
More generators are available at http://rubyonrails.org/show/Generators
|
64
|
+
1. Download, for example, login_generator.tar.gz
|
65
|
+
2. Unzip to directory #{RAILS_ROOT}/script/generators/login
|
66
|
+
3. Generate without args for usage information
|
67
|
+
#{$0} login
|
68
|
+
end_usage
|
69
|
+
exit 0
|
70
|
+
end
|