damagecontrol 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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
|