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
data/script/server
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'webrick'
|
|
4
|
+
require 'optparse'
|
|
5
|
+
|
|
6
|
+
OPTIONS = {
|
|
7
|
+
:port => 4712,
|
|
8
|
+
:ip => "127.0.0.1",
|
|
9
|
+
:environment => "development",
|
|
10
|
+
:server_root => File.expand_path(File.dirname(__FILE__) + "/../public/"),
|
|
11
|
+
:server_type => WEBrick::SimpleServer,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
ARGV.options do |opts|
|
|
15
|
+
script_name = File.basename($0)
|
|
16
|
+
opts.banner = "Usage: ruby #{script_name} [options]"
|
|
17
|
+
|
|
18
|
+
opts.separator ""
|
|
19
|
+
|
|
20
|
+
opts.on("-p", "--port=port", Integer,
|
|
21
|
+
"Runs Rails on the specified port.",
|
|
22
|
+
"Default: 3000") { |OPTIONS[:port]| }
|
|
23
|
+
opts.on("-b", "--binding=ip", String,
|
|
24
|
+
"Binds Rails to the specified ip.",
|
|
25
|
+
"Default: 127.0.0.1") { |OPTIONS[:ip]| }
|
|
26
|
+
opts.on("-i", "--index=controller", String,
|
|
27
|
+
"Specifies an index controller that requests for root will go to (instead of congratulations screen)."
|
|
28
|
+
) { |OPTIONS[:index_controller]| }
|
|
29
|
+
opts.on("-e", "--environment=name", String,
|
|
30
|
+
"Specifies the environment to run this server under (test/development/production).",
|
|
31
|
+
"Default: development") { |OPTIONS[:environment]| }
|
|
32
|
+
opts.on("-d", "--daemon",
|
|
33
|
+
"Make Rails run as a Daemon (only works if fork is available -- meaning on *nix)."
|
|
34
|
+
) { OPTIONS[:server_type] = WEBrick::Daemon }
|
|
35
|
+
|
|
36
|
+
opts.separator ""
|
|
37
|
+
|
|
38
|
+
opts.on("-h", "--help",
|
|
39
|
+
"Show this help message.") { puts opts; exit }
|
|
40
|
+
|
|
41
|
+
opts.parse!
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
ENV["RAILS_ENV"] = OPTIONS[:environment]
|
|
45
|
+
require File.dirname(__FILE__) + "/../config/environment"
|
|
46
|
+
require 'webrick_server'
|
|
47
|
+
|
|
48
|
+
# Get rid of annoying trailing slash in original webrick_server's impl.
|
|
49
|
+
class DispatchServlet
|
|
50
|
+
def handle_index(req, res)
|
|
51
|
+
if req.request_uri.path == "/"
|
|
52
|
+
res.set_redirect WEBrick::HTTPStatus::MovedPermanently, "/project"
|
|
53
|
+
return true
|
|
54
|
+
else
|
|
55
|
+
return false
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
puts "=> Rails application started on http://#{OPTIONS[:ip]}:#{OPTIONS[:port]}"
|
|
61
|
+
DispatchServlet.dispatch(OPTIONS)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'rscm/mockit'
|
|
3
|
+
require 'rscm/tempdir'
|
|
4
|
+
require 'damagecontrol/build'
|
|
5
|
+
|
|
6
|
+
module DamageControl
|
|
7
|
+
class BuildTest < Test::Unit::TestCase
|
|
8
|
+
include MockIt
|
|
9
|
+
|
|
10
|
+
def test_should_write_stderr_and_stdout_to_files_on_execute
|
|
11
|
+
home = RSCM.new_temp_dir("successful_execute")
|
|
12
|
+
|
|
13
|
+
ENV["DAMAGECONTROL_HOME"] = home
|
|
14
|
+
t = Time.utc(1971, 2, 28, 23, 45, 00)
|
|
15
|
+
build = Build.new("mooky", "some_rev", t)
|
|
16
|
+
a_program = File.expand_path(File.dirname(__FILE__) + "/a_program.rb")
|
|
17
|
+
build.execute("ruby #{a_program} 0", {'foo' => 'zap'})
|
|
18
|
+
stderr = "#{home}/mooky/changesets/some_rev/builds/19710228234500/stderr.log"
|
|
19
|
+
assert_equal("this\nis\nstderr\nzap", File.read(stderr))
|
|
20
|
+
stdout = "#{home}/mooky/changesets/some_rev/builds/19710228234500/stdout.log"
|
|
21
|
+
assert_equal("this\nis\nstdout\n0", File.read(stdout))
|
|
22
|
+
assert_equal(0, build.exit_code)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_should_persist_failure
|
|
26
|
+
home = RSCM.new_temp_dir("failed_execute")
|
|
27
|
+
|
|
28
|
+
ENV["DAMAGECONTROL_HOME"] = home
|
|
29
|
+
t = Time.utc(1971, 2, 28, 23, 45, 00)
|
|
30
|
+
build = Build.new("mooky", "some_rev", t)
|
|
31
|
+
a_program = File.expand_path(File.dirname(__FILE__) + "/a_program.rb")
|
|
32
|
+
build.execute("ruby #{a_program} 44", {'foo' => 'bar'})
|
|
33
|
+
stderr = "#{home}/mooky/changesets/some_rev/builds/19710228234500/stderr.log"
|
|
34
|
+
assert_equal("this\nis\nstderr\nbar", File.read(stderr))
|
|
35
|
+
stdout = "#{home}/mooky/changesets/some_rev/builds/19710228234500/stdout.log"
|
|
36
|
+
assert_equal("this\nis\nstdout\n44", File.read(stdout))
|
|
37
|
+
assert_equal(44, build.exit_code)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def Xtest_should_kill_long_running_build
|
|
41
|
+
home = RSCM.new_temp_dir("killing")
|
|
42
|
+
|
|
43
|
+
ENV["DAMAGECONTROL_HOME"] = home
|
|
44
|
+
t = Time.utc(1971, 2, 28, 23, 45, 00)
|
|
45
|
+
build = Build.new("mooky", "some_rev", t)
|
|
46
|
+
a_program = File.expand_path(File.dirname(__FILE__) + "/a_slow_program.rb")
|
|
47
|
+
t = Thread.new do
|
|
48
|
+
build.execute("ruby #{a_program} 55", {'foo' => 'mooky'})
|
|
49
|
+
end
|
|
50
|
+
# make sure it's running
|
|
51
|
+
sleep(2)
|
|
52
|
+
build.kill
|
|
53
|
+
stdout = "#{home}/mooky/changesets/some_rev/builds/19710228234500/stdout.log"
|
|
54
|
+
assert_equal("this\nis\nstdout\n44", File.read(stdout))
|
|
55
|
+
assert_equal(nil, build.exit_code)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'rscm/tempdir'
|
|
3
|
+
require 'damagecontrol/diff_parser'
|
|
4
|
+
require 'damagecontrol/diff_htmlizer'
|
|
5
|
+
require 'damagecontrol/file_ext.rb'
|
|
6
|
+
|
|
7
|
+
module DamageControl
|
|
8
|
+
class DiffHtmlizerTest < Test::Unit::TestCase
|
|
9
|
+
def test_should_parse_diff_to_object_model
|
|
10
|
+
p = DiffParser.new
|
|
11
|
+
|
|
12
|
+
html_file = "#{RSCM.new_temp_dir}/diff.html"
|
|
13
|
+
File.open(File.dirname(__FILE__) + "/test.diff") do |diff|
|
|
14
|
+
diffs = p.parse_diffs(diff)
|
|
15
|
+
File.open(html_file,"w") do |html|
|
|
16
|
+
hd = DiffHtmlizer.new(html)
|
|
17
|
+
html << "<html>\n"
|
|
18
|
+
html << "<head>\n"
|
|
19
|
+
html << "<link type='text/css' rel='stylesheet' href='../../public/stylesheets/diff.css'>\n"
|
|
20
|
+
html << "</head>\n"
|
|
21
|
+
html << "<body>\n"
|
|
22
|
+
diffs.accept(hd)
|
|
23
|
+
html << "</body>\n"
|
|
24
|
+
html << "</html>\n"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
expected = File.open(File.dirname(__FILE__) + "/test.html")
|
|
28
|
+
assert_equal(expected.read_fix_nl, File.open(html_file).read_fix_nl)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'rscm/tempdir'
|
|
3
|
+
require 'rscm/path_converter'
|
|
4
|
+
require 'damagecontrol/diff_parser'
|
|
5
|
+
|
|
6
|
+
# TODO: how do we make this work cross platform in a nicer way?
|
|
7
|
+
# Play more with $/, $\ and such
|
|
8
|
+
if(WINDOWS)
|
|
9
|
+
NL = "\n"
|
|
10
|
+
else
|
|
11
|
+
NL = "\r\n"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module DamageControl
|
|
15
|
+
class DiffParserTest < Test::Unit::TestCase
|
|
16
|
+
def test_should_parse_diff_to_object_model
|
|
17
|
+
p = DiffParser.new
|
|
18
|
+
|
|
19
|
+
File.open(File.dirname(__FILE__) + "/test.diff") do |diff|
|
|
20
|
+
diffs = p.parse_diffs(diff)
|
|
21
|
+
assert_equal(3, diffs.length)
|
|
22
|
+
assert_equal(7, diffs[1].nplus)
|
|
23
|
+
|
|
24
|
+
assert_equal(10, diffs[0].line_count)
|
|
25
|
+
assert_equal(8, diffs[1].line_count)
|
|
26
|
+
assert_equal(9, diffs[2].line_count)
|
|
27
|
+
|
|
28
|
+
assert(!diffs[0][0].removed?)
|
|
29
|
+
assert(!diffs[0][0].added?)
|
|
30
|
+
assert(!diffs[0][1].removed?)
|
|
31
|
+
assert(!diffs[0][1].added?)
|
|
32
|
+
assert( diffs[0][2].removed?)
|
|
33
|
+
assert(!diffs[0][2].added?)
|
|
34
|
+
assert(!diffs[0][3].removed?)
|
|
35
|
+
assert( diffs[0][3].added?)
|
|
36
|
+
|
|
37
|
+
assert_equal(" package org.picocontainer.sample.tulip;#{NL}", diffs[0][0])
|
|
38
|
+
assert_equal("#{NL}", diffs[0][1])
|
|
39
|
+
# 0 0 0 6 0 6 0
|
|
40
|
+
assert_equal("-import org.picocontainer.lifecycle.Startable;#{NL}", diffs[0][2])
|
|
41
|
+
assert_equal(26..35, diffs[0][2].removed_range)
|
|
42
|
+
assert_equal(nil, diffs[0][2].added_range)
|
|
43
|
+
assert_equal("+import org.picocontainer.Startable;#{NL}", diffs[0][3])
|
|
44
|
+
assert_equal("#{NL}", diffs[0][4])
|
|
45
|
+
assert_equal("-import org.boo.Fillable;#{NL}", diffs[0][5])
|
|
46
|
+
assert_equal(nil, diffs[0][5].removed_range)
|
|
47
|
+
assert_equal(nil, diffs[0][5].added_range)
|
|
48
|
+
assert_equal("+import org.boo.foooooo.Fillable;#{NL}", diffs[0][6])
|
|
49
|
+
assert_equal(nil, diffs[0][6].removed_range)
|
|
50
|
+
assert_equal(16..23, diffs[0][6].added_range)
|
|
51
|
+
|
|
52
|
+
assert_equal("- * @version $Revision: 1.1 $#{NL}", diffs[1][3])
|
|
53
|
+
assert_equal(26..26, diffs[1][3].removed_range)
|
|
54
|
+
assert_equal(nil, diffs[1][3].added_range)
|
|
55
|
+
assert_equal("+ * @version $Revision: 1.2 $#{NL}", diffs[1][4])
|
|
56
|
+
assert_equal(nil, diffs[1][4].removed_range)
|
|
57
|
+
assert_equal(26..26, diffs[1][4].added_range)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'rscm/mockit'
|
|
3
|
+
require 'damagecontrol/project'
|
|
4
|
+
require 'damagecontrol/poller'
|
|
5
|
+
|
|
6
|
+
module DamageControl
|
|
7
|
+
class PollerTest < Test::Unit::TestCase
|
|
8
|
+
include MockIt
|
|
9
|
+
|
|
10
|
+
def test_should_not_add_projects_twice
|
|
11
|
+
s = Poller.new
|
|
12
|
+
a1 = Project.new; a1.name = "jalla"
|
|
13
|
+
s.add_project(a1)
|
|
14
|
+
assert_equal([a1], s.projects)
|
|
15
|
+
|
|
16
|
+
a2 = Project.new; a2.name = "jalla"
|
|
17
|
+
s.add_project(a2)
|
|
18
|
+
assert_equal([a2], s.projects)
|
|
19
|
+
|
|
20
|
+
b = Project.new; b.name = "mooky"
|
|
21
|
+
s.add_project(b)
|
|
22
|
+
assert_equal([a2, b], s.projects)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_yields_project_and_changesets_for_each_project_with_changesets
|
|
26
|
+
p1 = Project.new; p1.name = "p2"
|
|
27
|
+
p1.scm = new_mock
|
|
28
|
+
p1.scm.__expect(:exists?) {true}
|
|
29
|
+
p1.scm.__expect(:changesets) {"some fake changesets"}
|
|
30
|
+
p1.scm.__expect(:transactional?) {true}
|
|
31
|
+
|
|
32
|
+
p2 = Project.new; p2.name = "p1"
|
|
33
|
+
p2.scm = new_mock
|
|
34
|
+
p2.scm.__expect(:exists?) {true}
|
|
35
|
+
p2.scm.__expect(:changesets) {"some other fake changesets"}
|
|
36
|
+
p2.scm.__expect(:transactional?) {true}
|
|
37
|
+
|
|
38
|
+
projects = []
|
|
39
|
+
changesets_ = []
|
|
40
|
+
s = Poller.new do |project, changesets|
|
|
41
|
+
projects << project
|
|
42
|
+
changesets_ << changesets
|
|
43
|
+
end
|
|
44
|
+
s.add_project(p1)
|
|
45
|
+
s.add_project(p2)
|
|
46
|
+
|
|
47
|
+
s.poll
|
|
48
|
+
|
|
49
|
+
assert_same(p1, projects[0])
|
|
50
|
+
assert_same(p2, projects[1])
|
|
51
|
+
assert_equal("some fake changesets", changesets_[0])
|
|
52
|
+
assert_equal("some other fake changesets", changesets_[1])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'rscm/tempdir'
|
|
3
|
+
require 'rscm/mockit'
|
|
4
|
+
require 'rscm/changes'
|
|
5
|
+
require 'damagecontrol/project'
|
|
6
|
+
|
|
7
|
+
module DamageControl
|
|
8
|
+
class ProjectTest < Test::Unit::TestCase
|
|
9
|
+
include MockIt
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
MockIt::setup
|
|
13
|
+
@p = Project.new
|
|
14
|
+
@p.description = "bla bla"
|
|
15
|
+
@p.name = "blabla"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_poll_should_get_changesets_from_epoch_if_last_change_time_unknown
|
|
19
|
+
ENV["DAMAGECONTROL_HOME"] = RSCM.new_temp_dir("epoch")
|
|
20
|
+
@p.scm = new_mock
|
|
21
|
+
changesets = new_mock
|
|
22
|
+
changesets.__expect(:empty?) {true}
|
|
23
|
+
@p.scm.__expect(:changesets) do |checkout_dir, from|
|
|
24
|
+
assert_equal(Time.epoch, from)
|
|
25
|
+
changesets
|
|
26
|
+
end
|
|
27
|
+
@p.poll do |cs|
|
|
28
|
+
assert_equal(changesets, cs)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_poll_should_poll_until_quiet_period_elapsed
|
|
33
|
+
ENV["DAMAGECONTROL_HOME"] = RSCM.new_temp_dir("quiet_period")
|
|
34
|
+
|
|
35
|
+
@p.quiet_period = 0
|
|
36
|
+
@p.scm = new_mock
|
|
37
|
+
@p.scm.__setup(:name) {"mooky"}
|
|
38
|
+
@p.scm.__expect(:changesets) do |checkout_dir, from|
|
|
39
|
+
assert_equal(Time.epoch, from)
|
|
40
|
+
"foo"
|
|
41
|
+
end
|
|
42
|
+
@p.scm.__expect(:transactional?) {false}
|
|
43
|
+
@p.scm.__expect(:changesets) do |checkout_dir, from|
|
|
44
|
+
assert_equal(Time.epoch, from)
|
|
45
|
+
"bar"
|
|
46
|
+
end
|
|
47
|
+
@p.scm.__expect(:changesets) do |checkout_dir, from|
|
|
48
|
+
assert_equal(Time.epoch, from)
|
|
49
|
+
"bar"
|
|
50
|
+
end
|
|
51
|
+
@p.poll do |cs|
|
|
52
|
+
assert_equal("bar", cs)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_poll_should_get_changesets_from_last_change_time_if_known
|
|
57
|
+
ENV["DAMAGECONTROL_HOME"] = RSCM.new_temp_dir("last")
|
|
58
|
+
|
|
59
|
+
a = Time.new.utc
|
|
60
|
+
FileUtils.mkdir_p("#{@p.changesets_dir}/#{a.ymdHMS}")
|
|
61
|
+
File.open("#{@p.changesets_dir}/#{a.ymdHMS}/changeset.yaml", "w") do |io|
|
|
62
|
+
cs = RSCM::ChangeSet.new
|
|
63
|
+
cs << RSCM::Change.new("path", "aslak", "hello", "55", Time.new.utc)
|
|
64
|
+
YAML::dump(cs, io)
|
|
65
|
+
end
|
|
66
|
+
@p.scm = new_mock
|
|
67
|
+
changesets = new_mock
|
|
68
|
+
changesets.__expect(:empty?) {false}
|
|
69
|
+
@p.scm.__expect(:changesets) do |checkout_dir, from|
|
|
70
|
+
assert_equal(a+1, from)
|
|
71
|
+
changesets
|
|
72
|
+
end
|
|
73
|
+
@p.scm.__expect(:transactional?) {true}
|
|
74
|
+
@p.poll do |cs|
|
|
75
|
+
assert_equal(changesets, cs)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_should_look_at_folders_to_determine_next_changeset_time
|
|
80
|
+
changesets_dir = RSCM.new_temp_dir("folders")
|
|
81
|
+
ENV["DAMAGECONTROL_HOME"] = changesets_dir
|
|
82
|
+
|
|
83
|
+
a = Time.new.utc
|
|
84
|
+
b = a + 1
|
|
85
|
+
c = b + 1
|
|
86
|
+
FileUtils.mkdir_p("#{changesets_dir}/#{a.ymdHMS}")
|
|
87
|
+
FileUtils.touch("#{changesets_dir}/#{a.ymdHMS}/changeset.yaml")
|
|
88
|
+
FileUtils.mkdir_p("#{changesets_dir}/#{c.ymdHMS}")
|
|
89
|
+
FileUtils.touch("#{changesets_dir}/#{c.ymdHMS}/changeset.yaml")
|
|
90
|
+
FileUtils.mkdir_p("#{changesets_dir}/#{b.ymdHMS}")
|
|
91
|
+
FileUtils.touch("#{changesets_dir}/#{b.ymdHMS}/changeset.yaml")
|
|
92
|
+
|
|
93
|
+
assert_equal(c+1, @p.next_changeset_identifier(changesets_dir))
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_should_checkout_from_changeset_identifier_and_execute_build
|
|
97
|
+
home = RSCM.new_temp_dir("execute")
|
|
98
|
+
ENV["DAMAGECONTROL_HOME"] = home
|
|
99
|
+
|
|
100
|
+
p = Project.new("mooky")
|
|
101
|
+
p.scm = new_mock
|
|
102
|
+
p.scm.__expect(:checkout) do |checkout_dir, changeset_identifier|
|
|
103
|
+
assert_equal("boo", changeset_identifier)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
before = Time.new
|
|
107
|
+
p.build("boo") do |build|
|
|
108
|
+
now = Time.new
|
|
109
|
+
assert(before <= build.time)
|
|
110
|
+
assert(build.time <= now)
|
|
111
|
+
build.execute("some command")
|
|
112
|
+
|
|
113
|
+
assert_equal("some command", File.open("#{home}/mooky/changesets/boo/builds/#{build.time.to_s}/command").read)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_should_load_persisted_builds_that_are_frozen
|
|
119
|
+
p = Project.new("mooky")
|
|
120
|
+
home = RSCM.new_temp_dir("load_builds")
|
|
121
|
+
ENV["DAMAGECONTROL_HOME"] = home
|
|
122
|
+
|
|
123
|
+
changeset_identifier = Time.new.utc
|
|
124
|
+
build_1_time = changeset_identifier + 10
|
|
125
|
+
build_2_time = changeset_identifier + 20
|
|
126
|
+
FileUtils.mkdir_p("#{home}/mooky/changesets/#{changeset_identifier.ymdHMS}/builds/#{build_1_time.ymdHMS}")
|
|
127
|
+
FileUtils.touch("#{home}/mooky/changesets/#{changeset_identifier.ymdHMS}/builds/#{build_1_time.ymdHMS}/command")
|
|
128
|
+
FileUtils.mkdir_p("#{home}/mooky/changesets/#{changeset_identifier.ymdHMS}/builds/#{build_2_time.ymdHMS}")
|
|
129
|
+
|
|
130
|
+
builds = p.builds(changeset_identifier)
|
|
131
|
+
assert_equal(2, builds.length)
|
|
132
|
+
assert_equal(build_1_time, builds[0].time)
|
|
133
|
+
assert_equal(build_2_time, builds[1].time)
|
|
134
|
+
assert_raises(BuildException, "shouldn't be able to execute persisted build") do
|
|
135
|
+
builds[0].execute("this should fail because command file exists")
|
|
136
|
+
end
|
|
137
|
+
builds[1].execute("this should pass since command doesn't exist")
|
|
138
|
+
assert_raises(BuildException, "shouldn't be able to execute persisted build") do
|
|
139
|
+
builds[1].execute("this should fail because command file exists")
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
require 'rscm/changes'
|
|
4
|
+
require 'damagecontrol/scm_web'
|
|
5
|
+
|
|
6
|
+
module DamageControl
|
|
7
|
+
module SCMWeb
|
|
8
|
+
|
|
9
|
+
class SCMWebTest < Test::Unit::TestCase
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
@change = RSCM::Change.new("path/one", "aslak", "Fixed CATCH-22", "2.4", Time.utc(2004,7,5,12,0,2))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_view_cvs
|
|
16
|
+
view_cvs = ViewCVS.new("http://cvs.damagecontrol.codehaus.org/")
|
|
17
|
+
assert_equal("http://cvs.damagecontrol.codehaus.org/path/one?rev=2.4&r=2.4", view_cvs.change_url(@change))
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
Index: src/test/org/picocontainer/sample/tulip/FlowerMarketGui.java
|
|
2
|
+
===================================================================
|
|
3
|
+
RCS file: /home/projects/picocontainer/scm/sample/src/test/org/picocontainer/sample/tulip/FlowerMarketGui.java,v
|
|
4
|
+
retrieving revision 1.1
|
|
5
|
+
retrieving revision 1.2
|
|
6
|
+
diff -u -r1.1 -r1.2
|
|
7
|
+
--- src/test/org/picocontainer/sample/tulip/FlowerMarketGui.java 25 Nov 2003 22:07:59 -0000 1.1
|
|
8
|
+
+++ src/test/org/picocontainer/sample/tulip/FlowerMarketGui.java 5 Jun 2004 19:27:45 -0000 1.2
|
|
9
|
+
@@ -1,6 +1,6 @@
|
|
10
|
+
package org.picocontainer.sample.tulip;
|
|
11
|
+
|
|
12
|
+
-import org.picocontainer.lifecycle.Startable;
|
|
13
|
+
+import org.picocontainer.Startable;
|
|
14
|
+
|
|
15
|
+
-import org.boo.Fillable;
|
|
16
|
+
+import org.boo.foooooo.Fillable;
|
|
17
|
+
|
|
18
|
+
import javax.swing.*;
|
|
19
|
+
import javax.swing.table.DefaultTableModel;
|
|
20
|
+
@@ -9,7 +9,7 @@
|
|
21
|
+
/**
|
|
22
|
+
* @author Aslak Hellesøy
|
|
23
|
+
* @author Jon Tirsén
|
|
24
|
+
- * @version $Revision: 1.1 $
|
|
25
|
+
+ * @version $Revision: 1.2 $
|
|
26
|
+
*/
|
|
27
|
+
public class FlowerMarketGui extends FlowerMarketStub implements Startable {
|
|
28
|
+
private DefaultTableModel bidsTableModel;
|
|
29
|
+
@@ -26,6 +26,9 @@
|
|
30
|
+
frame.pack();
|
|
31
|
+
frame.setBounds(700, 100, 300, 600);
|
|
32
|
+
frame.show();
|
|
33
|
+
+ }
|
|
34
|
+
+
|
|
35
|
+
+ public void stop() {
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public void sellBid(String flower) {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<link type='text/css' rel='stylesheet' href='../../public/stylesheets/diff.css'>
|
|
4
|
+
</head>
|
|
5
|
+
<body>
|
|
6
|
+
<div>
|
|
7
|
+
<pre class='diff' id='context'> package org.picocontainer.sample.tulip;
|
|
8
|
+
</pre><pre class='diff' id='context'>
|
|
9
|
+
</pre><pre class='diff' id='removed'>-import org.picocontainer.<span id='removedchars'>lifecycle.</span>Startable;
|
|
10
|
+
</pre><pre class='diff' id='added'>+import org.picocontainer.Startable;
|
|
11
|
+
</pre><pre class='diff' id='context'>
|
|
12
|
+
</pre><pre class='diff' id='removed'>-import org.boo.Fillable;
|
|
13
|
+
</pre><pre class='diff' id='added'>+import org.boo.<span id='addedchars'>foooooo.</span>Fillable;
|
|
14
|
+
</pre><pre class='diff' id='context'>
|
|
15
|
+
</pre><pre class='diff' id='context'> import javax.swing.*;
|
|
16
|
+
</pre><pre class='diff' id='context'> import javax.swing.table.DefaultTableModel;
|
|
17
|
+
</pre></div>
|
|
18
|
+
<div>
|
|
19
|
+
<pre class='diff' id='context'> /**
|
|
20
|
+
</pre><pre class='diff' id='context'> * @author Aslak Helles&oslash;y
|
|
21
|
+
</pre><pre class='diff' id='context'> * @author Jon Tirs&eacute;n
|
|
22
|
+
</pre><pre class='diff' id='removed'>- * @version $Revision: 1.<span id='removedchars'>1</span> $
|
|
23
|
+
</pre><pre class='diff' id='added'>+ * @version $Revision: 1.<span id='addedchars'>2</span> $
|
|
24
|
+
</pre><pre class='diff' id='context'> */
|
|
25
|
+
</pre><pre class='diff' id='context'> public class FlowerMarketGui extends FlowerMarketStub implements Startable {
|
|
26
|
+
</pre><pre class='diff' id='context'> private DefaultTableModel bidsTableModel;
|
|
27
|
+
</pre></div>
|
|
28
|
+
<div>
|
|
29
|
+
<pre class='diff' id='context'> frame.pack();
|
|
30
|
+
</pre><pre class='diff' id='context'> frame.setBounds(700, 100, 300, 600);
|
|
31
|
+
</pre><pre class='diff' id='context'> frame.show();
|
|
32
|
+
</pre><pre class='diff' id='added'>+ }
|
|
33
|
+
</pre><pre class='diff' id='added'>+
|
|
34
|
+
</pre><pre class='diff' id='added'>+ public void stop() {
|
|
35
|
+
</pre><pre class='diff' id='context'> }
|
|
36
|
+
</pre><pre class='diff' id='context'>
|
|
37
|
+
</pre><pre class='diff' id='context'> public void sellBid(String flower) {
|
|
38
|
+
</pre></div>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'damagecontrol/tracker'
|
|
3
|
+
|
|
4
|
+
module DamageControl
|
|
5
|
+
module Tracker
|
|
6
|
+
class TrackerTest < Test::Unit::TestCase
|
|
7
|
+
|
|
8
|
+
def test_bugzilla
|
|
9
|
+
bugzilla = Bugzilla.new("http://bugzilla.org")
|
|
10
|
+
assert_equal('', bugzilla.highlight(''))
|
|
11
|
+
assert_equal('catch <a href="http://bugzilla.org/show_bug.cgi?id=22">#22</a>', bugzilla.highlight('catch #22'))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_jira
|
|
15
|
+
jira = JIRA.new("http://jira.codehaus.org", "DC")
|
|
16
|
+
|
|
17
|
+
assert_equal('', jira.highlight(''))
|
|
18
|
+
assert_equal('<a href="http://jira.codehaus.org/browse/DC-148">DC-148</a>', jira.highlight('DC-148'))
|
|
19
|
+
assert_equal('x<a href="http://jira.codehaus.org/browse/DC-148">DC-148</a>', jira.highlight('xDC-148'))
|
|
20
|
+
assert_equal('<a href="http://jira.codehaus.org/browse/DC-148">DC-148</a>:bla', jira.highlight('DC-148:bla'))
|
|
21
|
+
assert_equal('fixed <a href="http://jira.codehaus.org/browse/DC-148">DC-148</a>.', jira.highlight('fixed DC-148.'))
|
|
22
|
+
assert_equal('Fixed <a href="http://jira.codehaus.org/browse/CATCH-22">CATCH-22</a>', jira.highlight('Fixed CATCH-22'))
|
|
23
|
+
assert_equal('blahblah\nblah\nblah <a href="http://jira.codehaus.org/browse/DC-148">DC-148</a>', jira.highlight('blahblah\nblah\nblah DC-148'))
|
|
24
|
+
assert_equal('ABCABCABCABCABCABCABCABCABCABCABCABC <a href="http://jira.codehaus.org/browse/DC-148">DC-148</a> ABCABCABCABCABCABCABCABCABCABCABCABC', jira.highlight('ABCABCABCABCABCABCABCABCABCABCABCABC DC-148 ABCABCABCABCABCABCABCABCABCABCABCABC'))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_ruby_forge
|
|
28
|
+
rf = RubyForge.new("333", "444")
|
|
29
|
+
|
|
30
|
+
assert_equal('catch <a href="http://rubyforge.org/tracker/index.php?func=detail&aid=22&group_id=333&atid=444">#22</a>', rf.highlight('catch #22'))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_source_forge
|
|
34
|
+
sf = SourceForge.new("333", "444")
|
|
35
|
+
|
|
36
|
+
assert_equal('catch <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=22&group_id=333&atid=444">#22</a>', sf.highlight('catch #22'))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_scarab
|
|
40
|
+
scarab = Scarab.new("http://scarab.org", "dc")
|
|
41
|
+
|
|
42
|
+
assert_equal('catch #22', scarab.highlight('catch #22'))
|
|
43
|
+
assert_equal('catch <a href="http://scarab.org/issues/id/dc22">dc22</a>', scarab.highlight('catch dc22'))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<rss version="2.0"
|
|
3
|
+
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
|
|
4
|
+
<channel>
|
|
5
|
+
<title>Mooky</title>
|
|
6
|
+
<link>http://damagecontrol.codehaus.org/</link>
|
|
7
|
+
<description>This feed contains SCM changes for the DamageControl project</description>
|
|
8
|
+
<item>
|
|
9
|
+
<title>Fixed CATCH-22</title>
|
|
10
|
+
<link>http://cvs.damagecontrol.codehaus.org/</link>
|
|
11
|
+
<description><b>jon</b><br/>
|
|
12
|
+
Fixed <a href="http://jira.codehaus.org/browse/CATCH-22">CATCH-22</a><p/>
|
|
13
|
+
<a href="http://cvs.damagecontrol.codehaus.org/path/one?rev=1.1&r=1.1">path/one</a><br/>
|
|
14
|
+
<a href="http://cvs.damagecontrol.codehaus.org/path/two?rev=1.2&r=1.2">path/two</a><br/>
|
|
15
|
+
</description>
|
|
16
|
+
<author>jon</author>
|
|
17
|
+
<pubDate>Mon, 05 Jul 2004 12:00:04 -0000</pubDate>
|
|
18
|
+
</item>
|
|
19
|
+
<item>
|
|
20
|
+
<title>hipp hurra</title>
|
|
21
|
+
<link>http://cvs.damagecontrol.codehaus.org/</link>
|
|
22
|
+
<description><b>jon</b><br/>
|
|
23
|
+
hipp hurra<p/>
|
|
24
|
+
<a href="http://cvs.damagecontrol.codehaus.org/path/three?rev=1.3&r=1.3">path/three</a><br/>
|
|
25
|
+
</description>
|
|
26
|
+
<author>jon</author>
|
|
27
|
+
<pubDate>Mon, 05 Jul 2004 12:00:06 -0000</pubDate>
|
|
28
|
+
</item>
|
|
29
|
+
|
|
30
|
+
<generator>RSCM - Ruby Source Control Management</generator>
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
</channel>
|
|
34
|
+
</rss>
|