BuildMaster 0.9.1 → 1.0.6
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/bin/svnfix.rb +3 -0
- data/lib/buildmaster/ci/server.rb +55 -0
- data/lib/buildmaster/common.rb +3 -0
- data/lib/buildmaster/common/properties.rb +28 -0
- data/lib/buildmaster/{tree_to_object.rb → common/tree_to_object.rb} +0 -0
- data/lib/buildmaster/cotta.rb +1 -1
- data/lib/buildmaster/cotta/command_error.rb +6 -1
- data/lib/buildmaster/cotta/command_interface.rb +44 -0
- data/lib/buildmaster/cotta/command_runner.rb +39 -0
- data/lib/buildmaster/cotta/cotta.rb +40 -3
- data/lib/buildmaster/cotta/cotta_dir.rb +28 -7
- data/lib/buildmaster/cotta/cotta_file.rb +14 -2
- data/lib/buildmaster/cotta/cotta_pathname.rb +9 -0
- data/lib/buildmaster/cotta/in_memory_system.rb +20 -9
- data/lib/buildmaster/cotta/physical_system.rb +4 -8
- data/lib/buildmaster/project.rb +10 -0
- data/lib/buildmaster/{ant_driver.rb → project/ant_driver.rb} +0 -0
- data/lib/buildmaster/project/build.rb +3 -0
- data/lib/buildmaster/{build_number_file.rb → project/build_number_file.rb} +4 -0
- data/lib/buildmaster/project/ci.rb +3 -0
- data/lib/buildmaster/{cvs_driver.rb → project/cvs_driver.rb} +0 -0
- data/lib/buildmaster/project/ftp_driver.rb +64 -0
- data/lib/buildmaster/{java_manifest.rb → project/java_manifest.rb} +0 -0
- data/lib/buildmaster/project/pscp_driver.rb +17 -0
- data/lib/buildmaster/project/release.rb +67 -0
- data/lib/buildmaster/project/ruby_forge_project.rb +26 -0
- data/lib/buildmaster/{run_ant.rb → project/run_ant.rb} +0 -0
- data/lib/buildmaster/project/server_manager.rb +64 -0
- data/lib/buildmaster/project/svn_admin_driver.rb +20 -0
- data/lib/buildmaster/project/svn_driver.rb +94 -0
- data/lib/buildmaster/project/svn_helper.rb +113 -0
- data/lib/buildmaster/project/svn_status_info.rb +54 -0
- data/lib/buildmaster/{try.rb → project/try.rb} +0 -0
- data/lib/buildmaster/project/version_number_file.rb +45 -0
- data/lib/buildmaster/{windows → project/windows}/iis_driver.rb +4 -4
- data/lib/buildmaster/{windows → project/windows}/sql_server_driver.rb +0 -0
- data/lib/buildmaster/site.rb +5 -0
- data/lib/buildmaster/site/about_handler.rb +43 -0
- data/lib/buildmaster/site/content_engine_repository.rb +83 -0
- data/lib/buildmaster/site/element_processor_by_name.rb +18 -0
- data/lib/buildmaster/site/file_processor.rb +59 -0
- data/lib/buildmaster/site/site.rb +29 -6
- data/lib/buildmaster/site/site_server.rb +56 -0
- data/lib/buildmaster/{site_spec.rb → site/site_spec.rb} +63 -38
- data/lib/buildmaster/{site_tester.rb → site/site_tester.rb} +0 -0
- data/lib/buildmaster/site/source_content.rb +12 -0
- data/lib/buildmaster/{source_file_handler.rb → site/source_file_handler.rb} +13 -27
- data/lib/buildmaster/site/template_builder.rb +4 -0
- data/lib/buildmaster/site/template_error.rb +18 -0
- data/lib/buildmaster/{template_runner.rb → site/template_runner.rb} +6 -16
- data/lib/buildmaster/{templatelets.rb → site/templatelets.rb} +3 -1
- data/lib/buildmaster/site/templatelets/attribute.rb +21 -0
- data/lib/buildmaster/site/templatelets/code.rb +82 -0
- data/lib/buildmaster/{templatelets → site/templatelets}/each.rb +7 -5
- data/lib/buildmaster/{templatelets → site/templatelets}/href.rb +1 -1
- data/lib/buildmaster/{templatelets → site/templatelets}/include.rb +0 -0
- data/lib/buildmaster/{templatelets → site/templatelets}/link.rb +2 -3
- data/lib/buildmaster/{templatelets → site/templatelets}/text.rb +1 -1
- data/lib/buildmaster/{templatelets → site/templatelets}/when.rb +4 -7
- data/lib/buildmaster/site/templates/buildmaster/content/border_bottom.gif +0 -0
- data/lib/buildmaster/site/templates/buildmaster/content/buildmaster.css +370 -0
- data/lib/buildmaster/site/templates/buildmaster/content/logo.gif +0 -0
- data/lib/buildmaster/site/templates/buildmaster/content/news-rss2.xml +4 -0
- data/lib/buildmaster/site/templates/buildmaster/content/print.css +65 -0
- data/lib/buildmaster/site/templates/buildmaster/content/ruby.css +14 -0
- data/lib/buildmaster/site/templates/buildmaster/template.html +121 -0
- data/lib/buildmaster/site/templates/cotta/content/border_bottom.gif +0 -0
- data/lib/buildmaster/site/templates/cotta/content/cotta.css +363 -0
- data/lib/buildmaster/site/templates/cotta/content/cotta.gif +0 -0
- data/lib/buildmaster/site/templates/cotta/content/news-rss2.xml +2 -0
- data/lib/buildmaster/site/templates/cotta/template.html +106 -0
- data/lib/buildmaster/site/xtemplate.rb +26 -0
- data/lib/buildmaster/version +1 -0
- data/test/buildmaster/common/tc_properties.rb +24 -0
- data/test/buildmaster/{tc_tree_to_object.rb → common/tc_tree_to_object.rb} +18 -18
- data/test/buildmaster/cotta/cotta_specifications.rb +88 -64
- data/test/buildmaster/cotta/physical_system_stub.rb +3 -3
- data/test/buildmaster/cotta/system_file_specifications.rb +38 -47
- data/test/buildmaster/cotta/tc_command_interface.rb +46 -0
- data/test/buildmaster/cotta/tc_command_runner.rb +28 -0
- data/test/buildmaster/cotta/tc_cotta.rb +35 -9
- data/test/buildmaster/cotta/tc_cotta_dir_in_memory.rb +10 -5
- data/test/buildmaster/cotta/tc_cotta_file_in_memory.rb +3 -3
- data/test/buildmaster/cotta/tc_in_memory_system.rb +7 -2
- data/test/buildmaster/cotta/tc_pathname.rb +22 -0
- data/test/buildmaster/cotta/tc_physical_system.rb +12 -2
- data/test/buildmaster/{build.xml → project/build.xml} +0 -0
- data/test/buildmaster/{manifest.mf → project/manifest.mf} +0 -0
- data/test/buildmaster/{tc_ant_driver.rb → project/tc_ant_driver.rb} +3 -3
- data/test/buildmaster/{tc_build_number_file.rb → project/tc_build_number_file.rb} +7 -7
- data/test/buildmaster/{tc_cvs_driver.rb → project/tc_cvs_driver.rb} +14 -14
- data/test/buildmaster/{tc_java_manifest.rb → project/tc_java_manifest.rb} +7 -7
- data/test/buildmaster/project/tc_release.rb +61 -0
- data/test/buildmaster/project/tc_server_manager.rb +70 -0
- data/test/buildmaster/project/tc_svn_driver.rb +104 -0
- data/test/buildmaster/project/tc_svn_status_info.rb +37 -0
- data/test/buildmaster/project/tc_version_number_file.rb +46 -0
- data/test/buildmaster/{windows → project/windows}/tc_iis_driver.rb +5 -4
- data/test/buildmaster/{windows → project/windows}/tc_sql_server_driver.rb +4 -4
- data/test/buildmaster/site/content/tc_content_engine_repository.rb +63 -0
- data/test/buildmaster/site/tc_element_processor_by_name.rb +29 -0
- data/test/buildmaster/site/tc_file_processor.rb +141 -0
- data/test/buildmaster/site/tc_site.rb +42 -11
- data/test/buildmaster/site/tc_site_server.rb +43 -0
- data/test/buildmaster/{tc_site_spec.rb → site/tc_site_spec.rb} +9 -9
- data/test/buildmaster/{tc_source_file_handler.rb → site/tc_source_file_handler.rb} +10 -9
- data/test/buildmaster/site/tc_template_builder.rb +23 -23
- data/test/buildmaster/site/tc_template_error.rb +15 -0
- data/test/buildmaster/{tc_template_runner.rb → site/tc_template_runner.rb} +22 -17
- data/test/buildmaster/site/tc_templatelets.rb +37 -0
- data/test/buildmaster/{tc_xtemplate.rb → site/tc_xtemplate.rb} +14 -15
- data/test/buildmaster/{template.xhtml → site/template.xhtml} +0 -0
- data/test/buildmaster/{templatelets → site/templatelets}/common_templatelet_test.rb +11 -7
- data/test/buildmaster/{templatelets → site/templatelets}/tc_attribute.rb +14 -10
- data/test/buildmaster/site/templatelets/tc_code.rb +132 -0
- data/test/buildmaster/{templatelets → site/templatelets}/tc_each.rb +25 -12
- data/test/buildmaster/{templatelets → site/templatelets}/tc_href.rb +6 -8
- data/test/buildmaster/{templatelets → site/templatelets}/tc_include.rb +3 -12
- data/test/buildmaster/{templatelets → site/templatelets}/tc_link.rb +11 -18
- data/test/buildmaster/{templatelets → site/templatelets}/tc_text.rb +2 -9
- data/test/buildmaster/{templatelets → site/templatelets}/tc_when.rb +8 -15
- data/test/manual/bms.rb +10 -0
- data/test/tmp/svn_test/repository/README.txt +5 -0
- data/test/tmp/svn_test/repository/conf/authz +21 -0
- data/test/tmp/svn_test/repository/conf/passwd +8 -0
- data/test/tmp/svn_test/repository/conf/svnserve.conf +30 -0
- data/test/tmp/svn_test/repository/db/current +1 -0
- data/test/tmp/svn_test/repository/db/format +1 -0
- data/test/tmp/svn_test/repository/db/fs-type +1 -0
- data/test/tmp/svn_test/repository/db/revprops/0 +5 -0
- data/test/tmp/svn_test/repository/db/revprops/1 +13 -0
- data/test/tmp/svn_test/repository/db/revprops/2 +13 -0
- data/test/tmp/svn_test/repository/db/revprops/3 +13 -0
- data/test/tmp/svn_test/repository/db/revprops/4 +13 -0
- data/test/tmp/svn_test/repository/db/revs/0 +11 -0
- data/test/tmp/svn_test/repository/db/revs/1 +25 -0
- data/test/tmp/svn_test/repository/db/revs/2 +29 -0
- data/test/tmp/svn_test/repository/db/revs/3 +33 -0
- data/test/tmp/svn_test/repository/db/revs/4 +0 -0
- data/test/tmp/svn_test/repository/db/uuid +1 -0
- data/test/tmp/svn_test/repository/db/write-lock +0 -0
- data/test/tmp/svn_test/repository/format +1 -0
- data/test/tmp/svn_test/repository/hooks/post-commit.tmpl +51 -0
- data/test/tmp/svn_test/repository/hooks/post-lock.tmpl +44 -0
- data/test/tmp/svn_test/repository/hooks/post-revprop-change.tmpl +56 -0
- data/test/tmp/svn_test/repository/hooks/post-unlock.tmpl +42 -0
- data/test/tmp/svn_test/repository/hooks/pre-commit.tmpl +70 -0
- data/test/tmp/svn_test/repository/hooks/pre-lock.tmpl +64 -0
- data/test/tmp/svn_test/repository/hooks/pre-revprop-change.tmpl +66 -0
- data/test/tmp/svn_test/repository/hooks/pre-unlock.tmpl +60 -0
- data/test/tmp/svn_test/repository/hooks/start-commit.tmpl +54 -0
- data/test/tmp/svn_test/repository/locks/db-logs.lock +3 -0
- data/test/tmp/svn_test/repository/locks/db.lock +3 -0
- data/test/tmp/svn_test/second/test.txt +1 -0
- data/test/tmp/svn_test/workdir/test.txt +1 -0
- data/test/ts_buildmaster.rb +0 -1
- metadata +168 -69
- data/lib/buildmaster.rb +0 -10
- data/lib/buildmaster/build_file.rb +0 -11
- data/lib/buildmaster/buildnumber +0 -1
- data/lib/buildmaster/file_processor.rb +0 -138
- data/lib/buildmaster/site_server.rb +0 -33
- data/lib/buildmaster/source_content.rb +0 -11
- data/lib/buildmaster/svn_driver.rb +0 -78
- data/lib/buildmaster/template_error.rb +0 -8
- data/lib/buildmaster/templatelets/attribute.rb +0 -16
- data/lib/buildmaster/xtemplate.rb +0 -27
- data/lib/mock.rb +0 -3
- data/lib/mock/mock_base.rb +0 -24
- data/test/buildmaster/tc_file_processor.rb +0 -125
- data/test/buildmaster/tc_svn_driver.rb +0 -81
- data/test/tmp/output/index.html +0 -8
- data/test/tmp/output/markdown.html +0 -8
- data/test/tmp/output/textile.html +0 -8
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'rexml/document'
|
|
2
|
+
require 'pathname'
|
|
3
|
+
|
|
4
|
+
module BuildMaster
|
|
5
|
+
|
|
6
|
+
class SvnStatusInfo
|
|
7
|
+
def initialize
|
|
8
|
+
@changes = Array.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def add(entry)
|
|
12
|
+
@changes.push entry
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def SvnStatusInfo::parse_xml(content)
|
|
16
|
+
info = SvnStatusInfo.new
|
|
17
|
+
xml = REXML::Document.new(content)
|
|
18
|
+
REXML::XPath.each(xml, '/status/target/entry') do |entry|
|
|
19
|
+
info.add Entry.new(entry)
|
|
20
|
+
end
|
|
21
|
+
return info
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def unversioned
|
|
25
|
+
entries('unversioned')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def missing
|
|
29
|
+
entries('missing')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def entries(status)
|
|
33
|
+
@changes.select {|entry| entry.status == status}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Entry
|
|
37
|
+
attr_reader :path
|
|
38
|
+
|
|
39
|
+
def initialize(element)
|
|
40
|
+
@element = element
|
|
41
|
+
@path = Pathname.new @element.attributes['path']
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def basename
|
|
45
|
+
@path.basename
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def status
|
|
49
|
+
status_element = @element.elements.find {|element| element.name == 'wc-status'}
|
|
50
|
+
status_element.attributes['item']
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module BuildMaster
|
|
2
|
+
class VersionNumberFile
|
|
3
|
+
attr_reader :build_number
|
|
4
|
+
|
|
5
|
+
def initialize(file)
|
|
6
|
+
@file = file
|
|
7
|
+
self.version= @file.load.strip
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def increase_build
|
|
11
|
+
@build_number = @build_number + 1
|
|
12
|
+
@file.save("#{version_number}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def version_number
|
|
16
|
+
"#{@version_number}.#{@build_number}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def version= (value)
|
|
20
|
+
index = dot_position_for_buildnumber(value)
|
|
21
|
+
@version_number = value
|
|
22
|
+
@build_number = 0
|
|
23
|
+
unless index.nil?
|
|
24
|
+
@version_number = value[0..index - 1]
|
|
25
|
+
@build_number = value[index + 1..value.length - 1].to_i
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def dot_position_for_buildnumber(value)
|
|
30
|
+
splitted = value.split('.')
|
|
31
|
+
result = nil
|
|
32
|
+
if splitted.size > 2 && splitted[splitted.size - 1].length > 0
|
|
33
|
+
result = value.length - splitted[splitted.size - 1].length - 1
|
|
34
|
+
end
|
|
35
|
+
return result
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private :dot_position_for_buildnumber
|
|
39
|
+
|
|
40
|
+
def to_s
|
|
41
|
+
"#{version_number}.#{build_number}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -6,10 +6,10 @@ module BuildMaster
|
|
|
6
6
|
class IisDriver
|
|
7
7
|
def initialize(cotta=Cotta.new)
|
|
8
8
|
@cotta = cotta
|
|
9
|
-
@executable = 'C:\\WINDOWS\\system32\\iisreset.exe'
|
|
10
|
-
if (not
|
|
11
|
-
raise "#{@executable} not found"
|
|
12
|
-
end
|
|
9
|
+
# @executable = 'C:\\WINDOWS\\system32\\iisreset.exe'
|
|
10
|
+
# if (not cotta.file(@executable).exists?)
|
|
11
|
+
# raise "#{@executable} not found"
|
|
12
|
+
# end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def status
|
|
File without changes
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
require 'webrick'
|
|
4
|
+
require 'file_processor'
|
|
5
|
+
|
|
6
|
+
module BuildMaster
|
|
7
|
+
|
|
8
|
+
class AboutHandler < WEBrick::HTTPServlet::AbstractServlet
|
|
9
|
+
# uncomment the following for automatic servlet reloading
|
|
10
|
+
# def SourceFileHandler.get_instance config, *options
|
|
11
|
+
# load __FILE__
|
|
12
|
+
# SourceFileHandler.new config, *options
|
|
13
|
+
# end
|
|
14
|
+
|
|
15
|
+
def initialize(server, spec)
|
|
16
|
+
super
|
|
17
|
+
@config = server.config
|
|
18
|
+
@logger = @config[:Logger]
|
|
19
|
+
@spec = spec
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def service(req, res)
|
|
23
|
+
content = <<CONTENT
|
|
24
|
+
<html>
|
|
25
|
+
<head><title>About BuildMaster</title>
|
|
26
|
+
<body>
|
|
27
|
+
<h1>About <a href="http://buildmaster.rubyforge.org" >BuildMaster</a></h1>
|
|
28
|
+
<pre>
|
|
29
|
+
Version : #{@spec.properties['buildmaster_version']}
|
|
30
|
+
Build Number : #{@spec.properties['buildmaster_buildnumber']}
|
|
31
|
+
Licence : <a href="http://buildmaster.rubyforge.org/license.html">Apache Licence, Version 2.0</a>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
CONTENT
|
|
35
|
+
res['content-type'] = 'text/html'
|
|
36
|
+
res['content-length'] = content.length
|
|
37
|
+
res['last-modified'] = DateTime.new
|
|
38
|
+
res.body = content
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
module BuildMaster
|
|
4
|
+
class ContentEngineRepository
|
|
5
|
+
|
|
6
|
+
def initialize
|
|
7
|
+
@map = Hash.new
|
|
8
|
+
@map['.textile'] = TextileEngine.new
|
|
9
|
+
@map['.markdown'] = MarkdownEngine.new
|
|
10
|
+
@map['.html'] = HtmlEngine.new
|
|
11
|
+
@map['.txt'] = TextileEngine.new
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def supports?(extname)
|
|
15
|
+
@map.has_key?(extname)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def for_source(source_file)
|
|
19
|
+
@map[source_file.extname]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def for_candidate(directory, basename)
|
|
23
|
+
@map.each_pair do |extname, engine|
|
|
24
|
+
candidate = directory.file("#{basename}#{extname}")
|
|
25
|
+
if candidate.exists?
|
|
26
|
+
return candidate, engine
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
return nil, nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module ContentEngine
|
|
34
|
+
#todo match only beginning of the file
|
|
35
|
+
@@TEXTILE_REGX = /---(-)*\n(.*)\n(-)*---\n/
|
|
36
|
+
def process_content_with_title(full_content)
|
|
37
|
+
match_result = @@TEXTILE_REGX.match(full_content)
|
|
38
|
+
title = ''
|
|
39
|
+
body_content = full_content
|
|
40
|
+
if match_result != nil
|
|
41
|
+
title = match_result[2]
|
|
42
|
+
body_content = match_result.post_match
|
|
43
|
+
end
|
|
44
|
+
html_body = yield body_content
|
|
45
|
+
html_content = <<HTML
|
|
46
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
47
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
48
|
+
<html xmlns="http://www.w3.org/1999/xhtml"
|
|
49
|
+
xmlns:template="http://buildmaster.rubyforge.org/xtemplate/1.0">
|
|
50
|
+
<head>
|
|
51
|
+
<title>#{title}</title>
|
|
52
|
+
</head>
|
|
53
|
+
<body>
|
|
54
|
+
#{html_body}
|
|
55
|
+
</body>
|
|
56
|
+
</html>
|
|
57
|
+
HTML
|
|
58
|
+
return html_content
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
class TextileEngine
|
|
63
|
+
include ContentEngine
|
|
64
|
+
def convert_to_html(full_content)
|
|
65
|
+
require 'redcloth'
|
|
66
|
+
process_content_with_title(full_content) {|content| RedCloth.new(content).to_html}
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
class MarkdownEngine
|
|
71
|
+
include ContentEngine
|
|
72
|
+
def convert_to_html(full_content)
|
|
73
|
+
require 'bluecloth'
|
|
74
|
+
process_content_with_title(full_content) {|content| BlueCloth.new(content).to_html}
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class HtmlEngine
|
|
79
|
+
def convert_to_html(full_content)
|
|
80
|
+
return full_content
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..')
|
|
2
|
+
|
|
3
|
+
require 'site/template_error'
|
|
4
|
+
|
|
5
|
+
module BuildMaster
|
|
6
|
+
|
|
7
|
+
class ElementProcessorByName
|
|
8
|
+
def initialize(templatelets)
|
|
9
|
+
@templatelets = templatelets
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def process(target_element, template_element, source_instance)
|
|
13
|
+
templatelet = @templatelets[template_element.name]
|
|
14
|
+
raise TemplateError.new(template_element), "Cannot process element by name #{template_element.name}" unless templatelet
|
|
15
|
+
templatelet.process(target_element, template_element, source_instance)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
require 'site_spec'
|
|
4
|
+
require 'source_content'
|
|
5
|
+
require 'pathname'
|
|
6
|
+
|
|
7
|
+
module BuildMaster
|
|
8
|
+
|
|
9
|
+
class FileProcessor
|
|
10
|
+
|
|
11
|
+
attr_reader :content_file, :target_file
|
|
12
|
+
|
|
13
|
+
def initialize(template, content_file, sitespec)
|
|
14
|
+
@template = template
|
|
15
|
+
@content_file = content_file
|
|
16
|
+
@sitespec = sitespec
|
|
17
|
+
@content_engine = sitespec.content_engines.for_source(content_file)
|
|
18
|
+
if @content_engine
|
|
19
|
+
basename = content_file.basename
|
|
20
|
+
@path = sitespec.relative_to_root(content_file).parent.join("#{basename}.html")
|
|
21
|
+
@target_file = sitespec.output_dir.file(@path)
|
|
22
|
+
else
|
|
23
|
+
@target_file = sitespec.output_dir.file(sitespec.relative_to_root(content_file))
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def is_html?
|
|
28
|
+
return target_file.extname == '.html'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def write_to_target
|
|
32
|
+
if (@content_engine)
|
|
33
|
+
document = generate_document
|
|
34
|
+
target_file.write do |file|
|
|
35
|
+
file.puts document.to_s
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
content_file.copy_to(target_file)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def generate_document
|
|
43
|
+
if (@content_engine)
|
|
44
|
+
html_content = @content_engine.convert_to_html(content_file.load)
|
|
45
|
+
process_html(html_content)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
def process_html(html_content)
|
|
51
|
+
source = SourceContent.new(@path, REXML::Document.new(html_content), content_file)
|
|
52
|
+
source_with_skin = @template.process(source)
|
|
53
|
+
document_with_skin = XTemplate.new(source_with_skin, @sitespec.load_element_processor).process(source)
|
|
54
|
+
return document_with_skin
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__)
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__))
|
|
2
2
|
|
|
3
3
|
require 'fileutils'
|
|
4
4
|
require 'file_processor'
|
|
5
|
-
require '
|
|
5
|
+
require 'site_server'
|
|
6
6
|
|
|
7
7
|
module BuildMaster
|
|
8
8
|
class NullLogger
|
|
@@ -12,6 +12,22 @@ module BuildMaster
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
class Site
|
|
15
|
+
def Site::setup(spec, templates_dir = spec.cotta.dir(__FILE__).parent.dir('templates'))
|
|
16
|
+
command_line = spec.cotta.command_interface
|
|
17
|
+
command_line.puts 'setting up site'
|
|
18
|
+
candidates = collect_candidates(templates_dir).collect {|item| item.name}
|
|
19
|
+
selection = command_line.prompt_for_choice('Select the template that you want to use', candidates)
|
|
20
|
+
selected_dir = templates_dir.dir(selection)
|
|
21
|
+
selected_dir.file('template.html').copy_to(spec.template_file)
|
|
22
|
+
selected_dir.dir('content').copy_to(spec.content_dir)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def Site::collect_candidates(dir)
|
|
26
|
+
dir.list.select do |item|
|
|
27
|
+
item.respond_to?(:file) && item.file('template.html').exists?
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
15
31
|
def initialize(spec)
|
|
16
32
|
@spec = spec
|
|
17
33
|
@spec.validate_inputs
|
|
@@ -19,6 +35,10 @@ module BuildMaster
|
|
|
19
35
|
end
|
|
20
36
|
|
|
21
37
|
public
|
|
38
|
+
def output_dir
|
|
39
|
+
@spec.output_dir
|
|
40
|
+
end
|
|
41
|
+
|
|
22
42
|
def execute(arguments)
|
|
23
43
|
action = 'build'
|
|
24
44
|
if arguments.size > 0
|
|
@@ -35,16 +55,19 @@ module BuildMaster
|
|
|
35
55
|
|
|
36
56
|
def server(*args)
|
|
37
57
|
require 'site_server'
|
|
38
|
-
@server = SiteServer.new(*args)
|
|
39
|
-
|
|
58
|
+
@server = SiteServer.new(@spec, *args)
|
|
59
|
+
['INT', 'TERM'].each { |signal|
|
|
60
|
+
trap(signal){ @server.stop}
|
|
61
|
+
}
|
|
62
|
+
@server.start
|
|
40
63
|
end
|
|
41
64
|
|
|
42
65
|
def test(port_number=2000)
|
|
43
|
-
launch_server(port_number) {|port_number| SiteTester.test("http://localhost:#{port_number}")}
|
|
66
|
+
launch_server(port_number) {|port_number| SiteTester.test("http://localhost:#{port_number}/index.html")}
|
|
44
67
|
end
|
|
45
68
|
|
|
46
69
|
def test_offline(port_number=2000)
|
|
47
|
-
launch_server(port_number) {|port_number| SiteTester.test_offline("http://localhost:#{port_number}")}
|
|
70
|
+
launch_server(port_number) {|port_number| SiteTester.test_offline("http://localhost:#{port_number}/index.html")}
|
|
48
71
|
end
|
|
49
72
|
|
|
50
73
|
private
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
|
2
|
+
|
|
3
|
+
require 'webrick'
|
|
4
|
+
require 'source_file_handler'
|
|
5
|
+
require 'about_handler'
|
|
6
|
+
require 'net/http'
|
|
7
|
+
|
|
8
|
+
module BuildMaster
|
|
9
|
+
class SiteServer
|
|
10
|
+
def initialize(spec, port_number=2000, log_file=$stdout, level=WEBrick::Log::INFO, access_log=nil)
|
|
11
|
+
@spec = spec
|
|
12
|
+
@port_number = port_number
|
|
13
|
+
@log_file = log_file
|
|
14
|
+
@level = level
|
|
15
|
+
@access_log = access_log
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def start
|
|
19
|
+
puts 'starting server...'
|
|
20
|
+
mime_types = WEBrick::HTTPUtils::DefaultMimeTypes.update(
|
|
21
|
+
{"textile" => "text/plain", 'markdown' => 'text/plain'}
|
|
22
|
+
)
|
|
23
|
+
@server = WEBrick::HTTPServer.new(
|
|
24
|
+
:Port => @port_number,
|
|
25
|
+
:Logger => WEBrick::Log.new(@log_file, @level),
|
|
26
|
+
:MimeTypes => mime_types,
|
|
27
|
+
:AccessLog => @access_log
|
|
28
|
+
)
|
|
29
|
+
@server.mount('/', SourceFileHandler, @spec)
|
|
30
|
+
@server.mount('/source', WEBrick::HTTPServlet::FileHandler, @spec.content_dir.path, true)
|
|
31
|
+
@server.mount('/about', AboutHandler, @spec)
|
|
32
|
+
@server.start
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def stop
|
|
36
|
+
@started = false
|
|
37
|
+
@server.shutdown
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def running?
|
|
41
|
+
return false unless @server
|
|
42
|
+
url = URI.parse("http://localhost:#{@port_number}/")
|
|
43
|
+
request = Net::HTTP::Get.new(url.path)
|
|
44
|
+
begin
|
|
45
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
46
|
+
http.read_timeout=5
|
|
47
|
+
http.request(request)
|
|
48
|
+
}
|
|
49
|
+
puts "response: #{res}"
|
|
50
|
+
rescue Errno::EBADF => e
|
|
51
|
+
return false
|
|
52
|
+
end
|
|
53
|
+
return true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|