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.
Files changed (174) hide show
  1. data/bin/svnfix.rb +3 -0
  2. data/lib/buildmaster/ci/server.rb +55 -0
  3. data/lib/buildmaster/common.rb +3 -0
  4. data/lib/buildmaster/common/properties.rb +28 -0
  5. data/lib/buildmaster/{tree_to_object.rb → common/tree_to_object.rb} +0 -0
  6. data/lib/buildmaster/cotta.rb +1 -1
  7. data/lib/buildmaster/cotta/command_error.rb +6 -1
  8. data/lib/buildmaster/cotta/command_interface.rb +44 -0
  9. data/lib/buildmaster/cotta/command_runner.rb +39 -0
  10. data/lib/buildmaster/cotta/cotta.rb +40 -3
  11. data/lib/buildmaster/cotta/cotta_dir.rb +28 -7
  12. data/lib/buildmaster/cotta/cotta_file.rb +14 -2
  13. data/lib/buildmaster/cotta/cotta_pathname.rb +9 -0
  14. data/lib/buildmaster/cotta/in_memory_system.rb +20 -9
  15. data/lib/buildmaster/cotta/physical_system.rb +4 -8
  16. data/lib/buildmaster/project.rb +10 -0
  17. data/lib/buildmaster/{ant_driver.rb → project/ant_driver.rb} +0 -0
  18. data/lib/buildmaster/project/build.rb +3 -0
  19. data/lib/buildmaster/{build_number_file.rb → project/build_number_file.rb} +4 -0
  20. data/lib/buildmaster/project/ci.rb +3 -0
  21. data/lib/buildmaster/{cvs_driver.rb → project/cvs_driver.rb} +0 -0
  22. data/lib/buildmaster/project/ftp_driver.rb +64 -0
  23. data/lib/buildmaster/{java_manifest.rb → project/java_manifest.rb} +0 -0
  24. data/lib/buildmaster/project/pscp_driver.rb +17 -0
  25. data/lib/buildmaster/project/release.rb +67 -0
  26. data/lib/buildmaster/project/ruby_forge_project.rb +26 -0
  27. data/lib/buildmaster/{run_ant.rb → project/run_ant.rb} +0 -0
  28. data/lib/buildmaster/project/server_manager.rb +64 -0
  29. data/lib/buildmaster/project/svn_admin_driver.rb +20 -0
  30. data/lib/buildmaster/project/svn_driver.rb +94 -0
  31. data/lib/buildmaster/project/svn_helper.rb +113 -0
  32. data/lib/buildmaster/project/svn_status_info.rb +54 -0
  33. data/lib/buildmaster/{try.rb → project/try.rb} +0 -0
  34. data/lib/buildmaster/project/version_number_file.rb +45 -0
  35. data/lib/buildmaster/{windows → project/windows}/iis_driver.rb +4 -4
  36. data/lib/buildmaster/{windows → project/windows}/sql_server_driver.rb +0 -0
  37. data/lib/buildmaster/site.rb +5 -0
  38. data/lib/buildmaster/site/about_handler.rb +43 -0
  39. data/lib/buildmaster/site/content_engine_repository.rb +83 -0
  40. data/lib/buildmaster/site/element_processor_by_name.rb +18 -0
  41. data/lib/buildmaster/site/file_processor.rb +59 -0
  42. data/lib/buildmaster/site/site.rb +29 -6
  43. data/lib/buildmaster/site/site_server.rb +56 -0
  44. data/lib/buildmaster/{site_spec.rb → site/site_spec.rb} +63 -38
  45. data/lib/buildmaster/{site_tester.rb → site/site_tester.rb} +0 -0
  46. data/lib/buildmaster/site/source_content.rb +12 -0
  47. data/lib/buildmaster/{source_file_handler.rb → site/source_file_handler.rb} +13 -27
  48. data/lib/buildmaster/site/template_builder.rb +4 -0
  49. data/lib/buildmaster/site/template_error.rb +18 -0
  50. data/lib/buildmaster/{template_runner.rb → site/template_runner.rb} +6 -16
  51. data/lib/buildmaster/{templatelets.rb → site/templatelets.rb} +3 -1
  52. data/lib/buildmaster/site/templatelets/attribute.rb +21 -0
  53. data/lib/buildmaster/site/templatelets/code.rb +82 -0
  54. data/lib/buildmaster/{templatelets → site/templatelets}/each.rb +7 -5
  55. data/lib/buildmaster/{templatelets → site/templatelets}/href.rb +1 -1
  56. data/lib/buildmaster/{templatelets → site/templatelets}/include.rb +0 -0
  57. data/lib/buildmaster/{templatelets → site/templatelets}/link.rb +2 -3
  58. data/lib/buildmaster/{templatelets → site/templatelets}/text.rb +1 -1
  59. data/lib/buildmaster/{templatelets → site/templatelets}/when.rb +4 -7
  60. data/lib/buildmaster/site/templates/buildmaster/content/border_bottom.gif +0 -0
  61. data/lib/buildmaster/site/templates/buildmaster/content/buildmaster.css +370 -0
  62. data/lib/buildmaster/site/templates/buildmaster/content/logo.gif +0 -0
  63. data/lib/buildmaster/site/templates/buildmaster/content/news-rss2.xml +4 -0
  64. data/lib/buildmaster/site/templates/buildmaster/content/print.css +65 -0
  65. data/lib/buildmaster/site/templates/buildmaster/content/ruby.css +14 -0
  66. data/lib/buildmaster/site/templates/buildmaster/template.html +121 -0
  67. data/lib/buildmaster/site/templates/cotta/content/border_bottom.gif +0 -0
  68. data/lib/buildmaster/site/templates/cotta/content/cotta.css +363 -0
  69. data/lib/buildmaster/site/templates/cotta/content/cotta.gif +0 -0
  70. data/lib/buildmaster/site/templates/cotta/content/news-rss2.xml +2 -0
  71. data/lib/buildmaster/site/templates/cotta/template.html +106 -0
  72. data/lib/buildmaster/site/xtemplate.rb +26 -0
  73. data/lib/buildmaster/version +1 -0
  74. data/test/buildmaster/common/tc_properties.rb +24 -0
  75. data/test/buildmaster/{tc_tree_to_object.rb → common/tc_tree_to_object.rb} +18 -18
  76. data/test/buildmaster/cotta/cotta_specifications.rb +88 -64
  77. data/test/buildmaster/cotta/physical_system_stub.rb +3 -3
  78. data/test/buildmaster/cotta/system_file_specifications.rb +38 -47
  79. data/test/buildmaster/cotta/tc_command_interface.rb +46 -0
  80. data/test/buildmaster/cotta/tc_command_runner.rb +28 -0
  81. data/test/buildmaster/cotta/tc_cotta.rb +35 -9
  82. data/test/buildmaster/cotta/tc_cotta_dir_in_memory.rb +10 -5
  83. data/test/buildmaster/cotta/tc_cotta_file_in_memory.rb +3 -3
  84. data/test/buildmaster/cotta/tc_in_memory_system.rb +7 -2
  85. data/test/buildmaster/cotta/tc_pathname.rb +22 -0
  86. data/test/buildmaster/cotta/tc_physical_system.rb +12 -2
  87. data/test/buildmaster/{build.xml → project/build.xml} +0 -0
  88. data/test/buildmaster/{manifest.mf → project/manifest.mf} +0 -0
  89. data/test/buildmaster/{tc_ant_driver.rb → project/tc_ant_driver.rb} +3 -3
  90. data/test/buildmaster/{tc_build_number_file.rb → project/tc_build_number_file.rb} +7 -7
  91. data/test/buildmaster/{tc_cvs_driver.rb → project/tc_cvs_driver.rb} +14 -14
  92. data/test/buildmaster/{tc_java_manifest.rb → project/tc_java_manifest.rb} +7 -7
  93. data/test/buildmaster/project/tc_release.rb +61 -0
  94. data/test/buildmaster/project/tc_server_manager.rb +70 -0
  95. data/test/buildmaster/project/tc_svn_driver.rb +104 -0
  96. data/test/buildmaster/project/tc_svn_status_info.rb +37 -0
  97. data/test/buildmaster/project/tc_version_number_file.rb +46 -0
  98. data/test/buildmaster/{windows → project/windows}/tc_iis_driver.rb +5 -4
  99. data/test/buildmaster/{windows → project/windows}/tc_sql_server_driver.rb +4 -4
  100. data/test/buildmaster/site/content/tc_content_engine_repository.rb +63 -0
  101. data/test/buildmaster/site/tc_element_processor_by_name.rb +29 -0
  102. data/test/buildmaster/site/tc_file_processor.rb +141 -0
  103. data/test/buildmaster/site/tc_site.rb +42 -11
  104. data/test/buildmaster/site/tc_site_server.rb +43 -0
  105. data/test/buildmaster/{tc_site_spec.rb → site/tc_site_spec.rb} +9 -9
  106. data/test/buildmaster/{tc_source_file_handler.rb → site/tc_source_file_handler.rb} +10 -9
  107. data/test/buildmaster/site/tc_template_builder.rb +23 -23
  108. data/test/buildmaster/site/tc_template_error.rb +15 -0
  109. data/test/buildmaster/{tc_template_runner.rb → site/tc_template_runner.rb} +22 -17
  110. data/test/buildmaster/site/tc_templatelets.rb +37 -0
  111. data/test/buildmaster/{tc_xtemplate.rb → site/tc_xtemplate.rb} +14 -15
  112. data/test/buildmaster/{template.xhtml → site/template.xhtml} +0 -0
  113. data/test/buildmaster/{templatelets → site/templatelets}/common_templatelet_test.rb +11 -7
  114. data/test/buildmaster/{templatelets → site/templatelets}/tc_attribute.rb +14 -10
  115. data/test/buildmaster/site/templatelets/tc_code.rb +132 -0
  116. data/test/buildmaster/{templatelets → site/templatelets}/tc_each.rb +25 -12
  117. data/test/buildmaster/{templatelets → site/templatelets}/tc_href.rb +6 -8
  118. data/test/buildmaster/{templatelets → site/templatelets}/tc_include.rb +3 -12
  119. data/test/buildmaster/{templatelets → site/templatelets}/tc_link.rb +11 -18
  120. data/test/buildmaster/{templatelets → site/templatelets}/tc_text.rb +2 -9
  121. data/test/buildmaster/{templatelets → site/templatelets}/tc_when.rb +8 -15
  122. data/test/manual/bms.rb +10 -0
  123. data/test/tmp/svn_test/repository/README.txt +5 -0
  124. data/test/tmp/svn_test/repository/conf/authz +21 -0
  125. data/test/tmp/svn_test/repository/conf/passwd +8 -0
  126. data/test/tmp/svn_test/repository/conf/svnserve.conf +30 -0
  127. data/test/tmp/svn_test/repository/db/current +1 -0
  128. data/test/tmp/svn_test/repository/db/format +1 -0
  129. data/test/tmp/svn_test/repository/db/fs-type +1 -0
  130. data/test/tmp/svn_test/repository/db/revprops/0 +5 -0
  131. data/test/tmp/svn_test/repository/db/revprops/1 +13 -0
  132. data/test/tmp/svn_test/repository/db/revprops/2 +13 -0
  133. data/test/tmp/svn_test/repository/db/revprops/3 +13 -0
  134. data/test/tmp/svn_test/repository/db/revprops/4 +13 -0
  135. data/test/tmp/svn_test/repository/db/revs/0 +11 -0
  136. data/test/tmp/svn_test/repository/db/revs/1 +25 -0
  137. data/test/tmp/svn_test/repository/db/revs/2 +29 -0
  138. data/test/tmp/svn_test/repository/db/revs/3 +33 -0
  139. data/test/tmp/svn_test/repository/db/revs/4 +0 -0
  140. data/test/tmp/svn_test/repository/db/uuid +1 -0
  141. data/test/tmp/svn_test/repository/db/write-lock +0 -0
  142. data/test/tmp/svn_test/repository/format +1 -0
  143. data/test/tmp/svn_test/repository/hooks/post-commit.tmpl +51 -0
  144. data/test/tmp/svn_test/repository/hooks/post-lock.tmpl +44 -0
  145. data/test/tmp/svn_test/repository/hooks/post-revprop-change.tmpl +56 -0
  146. data/test/tmp/svn_test/repository/hooks/post-unlock.tmpl +42 -0
  147. data/test/tmp/svn_test/repository/hooks/pre-commit.tmpl +70 -0
  148. data/test/tmp/svn_test/repository/hooks/pre-lock.tmpl +64 -0
  149. data/test/tmp/svn_test/repository/hooks/pre-revprop-change.tmpl +66 -0
  150. data/test/tmp/svn_test/repository/hooks/pre-unlock.tmpl +60 -0
  151. data/test/tmp/svn_test/repository/hooks/start-commit.tmpl +54 -0
  152. data/test/tmp/svn_test/repository/locks/db-logs.lock +3 -0
  153. data/test/tmp/svn_test/repository/locks/db.lock +3 -0
  154. data/test/tmp/svn_test/second/test.txt +1 -0
  155. data/test/tmp/svn_test/workdir/test.txt +1 -0
  156. data/test/ts_buildmaster.rb +0 -1
  157. metadata +168 -69
  158. data/lib/buildmaster.rb +0 -10
  159. data/lib/buildmaster/build_file.rb +0 -11
  160. data/lib/buildmaster/buildnumber +0 -1
  161. data/lib/buildmaster/file_processor.rb +0 -138
  162. data/lib/buildmaster/site_server.rb +0 -33
  163. data/lib/buildmaster/source_content.rb +0 -11
  164. data/lib/buildmaster/svn_driver.rb +0 -78
  165. data/lib/buildmaster/template_error.rb +0 -8
  166. data/lib/buildmaster/templatelets/attribute.rb +0 -16
  167. data/lib/buildmaster/xtemplate.rb +0 -27
  168. data/lib/mock.rb +0 -3
  169. data/lib/mock/mock_base.rb +0 -24
  170. data/test/buildmaster/tc_file_processor.rb +0 -125
  171. data/test/buildmaster/tc_svn_driver.rb +0 -81
  172. data/test/tmp/output/index.html +0 -8
  173. data/test/tmp/output/markdown.html +0 -8
  174. 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
@@ -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 File.exists?(@executable))
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
@@ -0,0 +1,5 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require 'cotta'
4
+ require 'site/site_spec'
5
+ require 'site/site'
@@ -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 'site_spec'
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
- @server.start(@spec)
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