ktec-subtrac 0.1.28 → 0.1.33

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/README.markdown +0 -1
  2. data/VERSION.yml +1 -1
  3. data/lib/subtrac/apache/location.conf.erb +16 -0
  4. data/lib/subtrac/{templates → apache}/vhost.conf.erb +2 -2
  5. data/lib/subtrac/apache.rb +47 -0
  6. data/lib/subtrac/client.rb +9 -0
  7. data/lib/subtrac/config/config.yml +6 -11
  8. data/lib/subtrac/core_ext/file.rb +12 -0
  9. data/lib/subtrac/core_ext.rb +1 -0
  10. data/lib/subtrac/{templates/projects → project}/blank/svn/branches/README +0 -0
  11. data/lib/subtrac/{templates/projects → project}/blank/svn/tags/README +0 -0
  12. data/lib/subtrac/{templates/projects → project}/blank/svn/trunk/README +0 -0
  13. data/lib/subtrac/{templates/projects → project}/blank/trac/wiki/WikiStart +5 -5
  14. data/lib/subtrac/{templates/projects → project}/new/svn/trunk/trac/wiki/WikiStart +4 -4
  15. data/lib/subtrac/{templates/projects → project}/new/trac/wiki/WikiStart +4 -4
  16. data/lib/subtrac/project.rb +14 -0
  17. data/lib/subtrac/svn.rb +56 -0
  18. data/lib/subtrac/template.rb +18 -0
  19. data/lib/subtrac/trac/common.trac.ini.erb +163 -0
  20. data/lib/subtrac/{templates → trac}/trac.ini.erb +2 -2
  21. data/lib/subtrac/trac.rb +64 -0
  22. data/lib/subtrac.rb +75 -196
  23. metadata +20 -122
  24. data/lib/subtrac/common/static/404.html +0 -14
  25. data/lib/subtrac/common/styles/trac.css +0 -222
  26. data/lib/subtrac/templates/location.erb +0 -16
  27. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/__init__.py +0 -0
  28. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg.gif +0 -0
  29. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg_page.gif +0 -0
  30. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg_page_in.jpg +0 -0
  31. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/btn_more.gif +0 -0
  32. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/col_bg.gif +0 -0
  33. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/col_title_bg.gif +0 -0
  34. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/col_top.gif +0 -0
  35. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/content_article_bg.jpg +0 -0
  36. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/content_title_bg.gif +0 -0
  37. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/footer.jpg +0 -0
  38. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/header.jpg +0 -0
  39. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_archive.gif +0 -0
  40. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_archive2.gif +0 -0
  41. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_cat.gif +0 -0
  42. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_comments.gif +0 -0
  43. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_date.gif +0 -0
  44. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_links.gif +0 -0
  45. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_list.gif +0 -0
  46. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_rss.gif +0 -0
  47. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_top.gif +0 -0
  48. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_user.gif +0 -0
  49. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/search_input.gif +0 -0
  50. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/search_submit.gif +0 -0
  51. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_active_l.gif +0 -0
  52. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_active_r.gif +0 -0
  53. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_hover.gif +0 -0
  54. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_hover_l.gif +0 -0
  55. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_hover_r.gif +0 -0
  56. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_link.gif +0 -0
  57. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_link_l.gif +0 -0
  58. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_link_r.gif +0 -0
  59. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tmp_photo.gif +0 -0
  60. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/saint.css +0 -168
  61. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/screenshot.png +0 -0
  62. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/templates/saint_theme.html +0 -143
  63. data/lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/theme.py +0 -12
  64. data/lib/subtrac/templates/trac/themes/sainttheme/setup.py +0 -29
  65. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/css/subtrac.css +0 -1805
  66. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li-first.png +0 -0
  67. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li-hover.png +0 -0
  68. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li-last.png +0 -0
  69. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li.png +0 -0
  70. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive.png +0 -0
  71. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/body-home.png +0 -0
  72. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/body.png +0 -0
  73. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/content-product.png +0 -0
  74. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/content.png +0 -0
  75. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/entry.png +0 -0
  76. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/footer.png +0 -0
  77. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/gallery-nav.png +0 -0
  78. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/header.png +0 -0
  79. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/inner.png +0 -0
  80. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/logo.png +0 -0
  81. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/master.css +0 -1805
  82. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/masthead.png +0 -0
  83. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/more.png +0 -0
  84. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-a-first.png +0 -0
  85. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-a-last.png +0 -0
  86. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-a.png +0 -0
  87. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-li.png +0 -0
  88. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/products-li-large.png +0 -0
  89. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/products-li.png +0 -0
  90. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/rss-span.png +0 -0
  91. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/rss.png +0 -0
  92. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/search.png +0 -0
  93. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/sec-navigation-li.png +0 -0
  94. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/sec-navigation.png +0 -0
  95. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/slogan.png +0 -0
  96. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/wrapper-home.png +0 -0
  97. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/img/wrapper.png +0 -0
  98. data/lib/subtrac/templates/trac/themes/subtractheme/prototype/subtractheme.html +0 -115
  99. data/lib/subtrac/templates/trac/themes/subtractheme/setup.py +0 -29
  100. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/__init__.py +0 -0
  101. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li-first.png +0 -0
  102. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li-hover.png +0 -0
  103. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li-last.png +0 -0
  104. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li.png +0 -0
  105. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive.png +0 -0
  106. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/body-home.png +0 -0
  107. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/body.png +0 -0
  108. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/content-product.png +0 -0
  109. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/content.png +0 -0
  110. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/entry.png +0 -0
  111. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/footer.png +0 -0
  112. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/gallery-nav.png +0 -0
  113. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/header.png +0 -0
  114. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/inner.png +0 -0
  115. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/logo.png +0 -0
  116. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/master.css +0 -1805
  117. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/masthead.png +0 -0
  118. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/more.png +0 -0
  119. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-a-first.png +0 -0
  120. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-a-last.png +0 -0
  121. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-a.png +0 -0
  122. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-li.png +0 -0
  123. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/products-li-large.png +0 -0
  124. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/products-li.png +0 -0
  125. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/rss-span.png +0 -0
  126. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/rss.png +0 -0
  127. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/search.png +0 -0
  128. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/sec-navigation-li.png +0 -0
  129. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/sec-navigation.png +0 -0
  130. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/slogan.png +0 -0
  131. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/wrapper-home.png +0 -0
  132. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/wrapper.png +0 -0
  133. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/subtrac.css +0 -1805
  134. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/templates/subtrac_theme.html +0 -143
  135. data/lib/subtrac/templates/trac/themes/subtractheme/subtractheme/theme.py +0 -12
@@ -4,7 +4,7 @@
4
4
  file = ../../../.shared/trac.ini
5
5
 
6
6
  [project]
7
- name = <%= project_name %>
7
+ name = <%= project.display_name %>
8
8
  admin =
9
9
  admin_trac_url = .
10
10
  descr = My example project
@@ -20,7 +20,7 @@ src =
20
20
  width = -1
21
21
 
22
22
  [trac]
23
- repository_dir = ../../../svn/<%= client_path %>/<%= project_path %>
23
+ repository_dir = ../../../svn/<%= client.path %>/<%= project.path %>
24
24
 
25
25
  [components]
26
26
  batchmod.web_ui.batchmodifymodule = enabled
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright (c) 2009, Keith Salisbury (www.globalkeith.com)
3
+ # All rights reserved.
4
+ # All the trac stuff should go in here...
5
+
6
+ require 'fileutils'
7
+ require 'subtrac/template'
8
+
9
+ module Subtrac
10
+ class Trac
11
+
12
+ def initialize trac_dir, binding
13
+ @trac_dir = trac_dir
14
+ @subtrac_path = Subtrac::subtrac_path
15
+ @trac_permissions = Subtrac::trac_permissions
16
+ @temp_dir = Subtrac::temp_dir
17
+ @binding = binding
18
+ end
19
+ def create_project(project)
20
+
21
+ client = project.client
22
+
23
+ project.trac_dir = File.join(@trac_dir,client.path,project.path)
24
+
25
+ # create new project directories
26
+ say("Create project directories...")
27
+ File.create_if_missing(project.trac_dir)
28
+
29
+ # create a new trac site
30
+ say("Creating a new trac site...")
31
+ result = `trac-admin #{project.trac_dir} initenv #{project.path} sqlite:#{project.trac_dir}/db/trac.db svn #{project.svn_dir}`
32
+ FileUtils.chown_R('www-data', 'www-data', project.trac_dir, :verbose => false) if result
33
+
34
+ say("Installing trac configuration...")
35
+ # install project trac.ini
36
+ trac_ini_template = Template.new(File.join(File.dirname(__FILE__), "trac", "trac.ini.erb"))
37
+ trac_ini_template.write(File.join(project.trac_dir,"/conf/trac.ini"),@binding)
38
+
39
+ say("Setting up default trac permissions...")
40
+ # set up trac permissions
41
+ @trac_permissions.each do |key, value|
42
+ `sudo trac-admin #{project.trac_dir} permission add #{key} #{value}`
43
+ end
44
+
45
+ say("Adding default trac wiki pages...")
46
+ # loop through the directory and import all pages
47
+ Dir.foreach("#{project.template}/trac/wiki/.") do |file|
48
+ # do something with the file here
49
+ unless ['.', '..','.svn'].include? file
50
+ temp_file = File.join(@temp_dir,file)
51
+ template = Template.new(File.join(project.template,"trac/wiki",file))
52
+ template.write(temp_file,@binding)
53
+ `trac-admin #{project.trac_dir} wiki import #{file} #{temp_file}`
54
+ FileUtils.rm(temp_file)
55
+ end
56
+ end
57
+
58
+ # run trac upgrade
59
+ say("Upgrading the trac installation...")
60
+ `trac-admin #{project.trac_dir} upgrade`
61
+
62
+ end
63
+ end
64
+ end
data/lib/subtrac.rb CHANGED
@@ -26,21 +26,18 @@
26
26
  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
27
  # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
28
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- #
30
- # You may need these...
31
- #
32
- # sudo apt-get install ruby rubygems
33
- # sudo gem sources -a http://gems.github.com
34
- # sudo gem install visionmedia-commander
35
- # sudo gem install yaml erb fileutils
36
- #
37
29
 
38
30
  require 'yaml'
39
31
  require 'erb'
40
32
  require 'fileutils'
41
33
  require 'subtrac/version'
42
34
  require 'subtrac/commands'
43
-
35
+ require 'subtrac/client'
36
+ require 'subtrac/project'
37
+ require 'subtrac/apache'
38
+ require 'subtrac/svn'
39
+ require 'subtrac/trac'
40
+ require 'subtrac/core_ext'
44
41
 
45
42
  module Subtrac
46
43
 
@@ -74,7 +71,7 @@ module Subtrac
74
71
  def default_client=(name)
75
72
  @APP_CONFIG[:default_client] = @default_client = name
76
73
  end
77
-
74
+
78
75
  def default_project
79
76
  @default_project ||= @APP_CONFIG[:default_project]
80
77
  end
@@ -84,9 +81,17 @@ module Subtrac
84
81
  @APP_CONFIG[:default_project] = @default_project = name
85
82
  end
86
83
 
84
+ def default_project_type
85
+ @default_project_type ||= @APP_CONFIG[:default_project_type]
86
+ end
87
87
 
88
- # Filesystem directories
88
+ def default_project_type=(name)
89
+ puts "Updating default_project_type to #{name}"
90
+ @APP_CONFIG[:default_project_type] = @default_project_type = name
91
+ end
92
+
89
93
 
94
+ # Filesystem directories
90
95
  def root
91
96
  Pathname.new(SUBTRAC_ROOT) if defined?(SUBTRAC_ROOT)
92
97
  end
@@ -145,13 +150,15 @@ module Subtrac
145
150
  end
146
151
 
147
152
  # Urls
148
-
149
153
  def svn_url
150
- @svn_url ||= "http://#{server_hostname}#{@APP_CONFIG[:urls][:svn]}"
154
+ @svn_url ||= @APP_CONFIG[:urls][:svn]
151
155
  end
152
-
156
+
157
+ def trac_permissions
158
+ @trac_permissions ||= @APP_CONFIG[:trac][:permissions]
159
+ end
160
+
153
161
  # LDAP
154
-
155
162
  def enable_ldap
156
163
  @enable_ldap ||= @APP_CONFIG[:ldap][:enable]
157
164
  end
@@ -185,7 +192,7 @@ module Subtrac
185
192
  end
186
193
 
187
194
  end
188
-
195
+
189
196
  # Loads the configuration YML file
190
197
  def self.load_config
191
198
  # TODO: We need to refactor this code so it will load the default configuration only if one has not been created
@@ -211,6 +218,14 @@ module Subtrac
211
218
  say("Configuration loaded successfully...")
212
219
  end
213
220
 
221
+ # Write the changes configuration to disk
222
+ def self.save_config
223
+ # save the things that might have changed
224
+ file_path = File.join(subtrac_path, USER_CONFIG_FILE)
225
+ user_config = {SUBTRAC_ENV => @APP_CONFIG}
226
+ open(file_path, 'w') {|f| YAML.dump(user_config, f)}
227
+ end
228
+
214
229
 
215
230
  # Install
216
231
  def self.install(args,options)
@@ -249,19 +264,54 @@ module Subtrac
249
264
  default client: #{default_client}
250
265
  default project: #{default_project}")
251
266
 
252
- confirm = agree("Is this ok? [y/n]")
267
+ confirm = agree("Is this ok? [y/n]")
253
268
 
254
269
  exit 0 if !confirm
255
270
 
256
271
  create_environment_directories(overwrite)
257
- create_virtual_host()
272
+ #create_virtual_host()
273
+ apache = Apache.new(binding)
274
+ apache.create_virtual_host()
275
+
258
276
  install_common_files()
259
- install_default_theme()
260
277
  configure_admin_user()
261
- create_project(default_project,default_client)
278
+
279
+ # create default project
280
+ project = create_project(default_project,default_client)
281
+ # get these out for binding...we'll tidy up later
282
+ client = project.client
283
+
284
+ # create the apache configuration
285
+ apache.create_project(project)
286
+
287
+ # make sure apache can operate on these files
288
+ `sudo chown -R www-data:www-data #{install_dir}`
289
+
290
+ # store any user preferences for later use
262
291
  save_config()
263
292
 
264
293
  end
294
+
295
+ def self.create_project(project,client)
296
+
297
+ # create default project
298
+ project = Project.new(project,client,default_project_type)
299
+
300
+ # get these out for binding...we'll tidy up later
301
+ client = project.client
302
+
303
+ # create the svn repo
304
+ svn = Svn.new(svn_dir, binding)
305
+ svn.create_project(project)
306
+
307
+ # create the trac site
308
+ trac = Trac.new(trac_dir, binding)
309
+ trac.create_project(project)
310
+
311
+ # return the project
312
+ project
313
+
314
+ end
265
315
 
266
316
  private
267
317
 
@@ -269,7 +319,7 @@ module Subtrac
269
319
  def self.confirm_or_replace_value(prop, name)
270
320
  method(prop).call # initialise the property
271
321
  current_value = instance_variable_get("@#{prop}")
272
- accept_default = agree("The default value for #{prop} is \"#{current_value}\". Is this ok? [y/n]")
322
+ accept_default = agree("The default value for #{prop} @#{prop} is \"#{current_value}\". Is this ok? [y/n]")
273
323
  if !accept_default then
274
324
  answer = ask("What would you like to change it to?")
275
325
  send("#{prop}=", answer)
@@ -277,60 +327,12 @@ module Subtrac
277
327
  end
278
328
  end
279
329
 
280
- # Write the changes configuration to disk
281
- def self.save_config
282
- # save the things that might have changed
283
- file_path = File.join(subtrac_path, USER_CONFIG_FILE)
284
- user_config = {SUBTRAC_ENV => @APP_CONFIG}
285
- open(file_path, 'w') {|f| YAML.dump(user_config, f)}
286
- end
287
-
288
- # creates a directory if it does not exist
289
- def self.create_if_missing(*names)
290
- names.each do |name|
291
- unless File.directory?(name)
292
- puts "Creating directory called #{names}..."
293
- FileUtils.mkdir_p(name)
294
- end
295
- end
296
- end
297
-
298
- # publishes an erb template
299
- def self.parse_template(infile,outfile,binding)
300
- file = File.open(outfile, 'w+')
301
- if file
302
- template = ERB.new(IO.read(infile))
303
- if template
304
- file.syswrite(template.result(binding))
305
- else
306
- raise "Could not read template. file #{infile}"
307
- end
308
- else
309
- raise "Unable to open file for writing. file #{outfile}"
310
- end
311
- end
312
-
313
- # creates a new virtual host and reloads apache and enables the new virtual host
314
- def self.create_virtual_host
315
- puts "\n==== Creating new virtual host ===="
316
- vhost_template = File.join(subtrac_path, @APP_CONFIG[:templates][:virtual_host])
317
- puts "group apache virtual host template: #{vhost_template}"
318
- # TODO: Copy this to the conf folder and map a file with an Include to it.
319
- # this way the vhost file will get backed up as well.
320
- new_vhost = File.join(apache_conf_dir,server_hostname)
321
- puts "group apache file: #{new_vhost}"
322
- parse_template(vhost_template,new_vhost,binding) if SUBTRAC_ENV != 'test'
323
- # reload apache configuration
324
- `/etc/init.d/apache2 force-reload` if SUBTRAC_ENV != 'test'
325
- `a2ensite #{server_hostname}` if SUBTRAC_ENV != 'test'
326
- end
327
-
328
330
  def self.install_common_files
329
331
  puts "\n==== Installing common files ===="
330
332
  # TODO: implement a mask for .svn folders
331
333
  # TODO: refactor /common to the app config
332
334
  FileUtils.cp_r(Dir.glob(File.join(subtrac_path, "common/.")),docs_dir)
333
- FileUtils.cp_r(Dir.glob(File.join(subtrac_path, "shared/.")),create_if_missing(File.join(trac_dir, ".shared")))
335
+ FileUtils.cp_r(Dir.glob(File.join(subtrac_path, "shared/.")),File.create_if_missing(File.join(trac_dir, ".shared")))
334
336
  end
335
337
 
336
338
  def self.configure_admin_user
@@ -354,137 +356,14 @@ module Subtrac
354
356
  def self.create_environment_directories(overwrite=false)
355
357
  puts "\n==== Creating new environment directories ===="
356
358
  FileUtils.rm_rf install_dir if overwrite
357
- create_if_missing install_dir
359
+ File.create_if_missing install_dir
358
360
  # create the environment directories
359
361
  @APP_CONFIG[:dirs].each do |key, value|
360
362
  dir = File.join(install_dir,value)
361
- create_if_missing dir
362
- end
363
- end
364
-
365
- def self.create_client(name)
366
- puts "\n==== Create a new client called #{name} ===="
367
- client_name = name.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
368
- client_path = name.downcase
369
- # create apache configuration
370
- puts "subtrac_path: #{subtrac_path}"
371
- puts "templates_location: #{@APP_CONFIG[:templates][:location]}"
372
- location_template = File.join(subtrac_path, @APP_CONFIG[:templates][:location])
373
- puts "location_template: #{location_template}"
374
- location_conf = File.join(locations_dir,"#{client_path}.conf")
375
- puts "location_conf: #{location_conf}"
376
- parse_template(location_template,location_conf,binding)
377
- `/etc/init.d/apache2 force-reload` if SUBTRAC_ENV != 'test'
378
-
379
- # create svn+trac directory
380
- create_if_missing File.join(svn_dir,client_path)
381
- create_if_missing File.join(trac_dir,client_path)
382
-
383
- end
384
-
385
- def self.install_default_theme
386
- puts "\n==== Create a new client called #{name} ===="
387
- # create a project for this clients trac theme
388
- #create_project("trac_theme", client_path,@APP_CONFIG[:default_theme_template])
389
-
390
- # check the theme project out
391
- #client_theme_dir = File.join(trac_dir,client_path,".theme")
392
- #create_if_missing(client_theme_dir)
393
- #FileUtils.chown_R('www-data', 'www-data', client_theme_dir, :verbose => true) if SUBTRAC_ENV != 'test'
394
- #puts "Attempting checkout of theme project..."
395
-
396
- #`sudo svn co --username #{@APP_CONFIG[:admin_user]} --password #{@APP_CONFIG[:admin_pass]} \
397
- # file://#{svn_dir}/#{client_path}/trac_theme/trunk #{client_theme_dir}` if SUBTRAC_ENV != 'test'
398
- # TODO: Need to find a way to test before trying
399
- template_dir = File.join(subtrac_path, "templates","trac","themes","subtractheme")
400
- say(`sudo easy_install #{template_dir}`)
401
- end
402
-
403
- def self.create_project(project, client, project_type=@APP_CONFIG[:default_project_template])
404
- puts "\n==== Create a new project called #{project} for #{client} ===="
405
-
406
- client_name = client.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
407
- project_name = project.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
408
- # need to make sure this is a valid path - swap spaces for underscores etc
409
- client_path = client.downcase
410
- project_path = project.downcase
411
-
412
- # create client directory if needed
413
- create_client(client_path) if (!File.directory? File.join(svn_dir,client_path))
414
-
415
- project_svn_dir = File.join(svn_dir,client_path,project_path)
416
- project_trac_dir = File.join(trac_dir,client_path,project_path)
417
-
418
- # TODO: Need to handle this exception...
419
- if (File.directory? project_svn_dir) then
420
- raise StandardError, "A project called #{project} already exists in the #{client} repository. Would you like to replace it?"
363
+ File.create_if_missing dir
421
364
  end
422
-
423
- # create new project directories
424
- say("Create project directories...")
425
- create_if_missing project_svn_dir
426
- create_if_missing project_trac_dir
427
-
428
- project_template = File.join(subtrac_path, @APP_CONFIG[:templates][:projects],project_type)
429
-
430
- # copy template svn project to a temp folder, then svn import it into the repo
431
- say("Create temporary project directory and copy template files...")
432
- svn_template_dir = File.join(project_template,"svn")
433
- project_temp_dir = File.join(temp_dir,project_path)
434
- FileUtils.cp_r(svn_template_dir,project_temp_dir)
435
-
436
- # create a new subversion repository
437
- say("Creating a new subversion repository...")
438
- `svnadmin create #{project_svn_dir}` if SUBTRAC_ENV != 'test'
439
-
440
- # import into svn
441
- say("Importing temporary project into the new subversion repository...")
442
- `svn import #{project_temp_dir} file:///#{project_svn_dir} --message "initial import"` if SUBTRAC_ENV != 'test'
443
- # delete the temporary directory
444
- FileUtils.rm_r(project_temp_dir, :force => true)
445
-
446
- # create a new trac site
447
- say("Creating a new trac site...")
448
- result = `trac-admin #{project_trac_dir} initenv #{project_path} sqlite:#{project_trac_dir}/db/trac.db svn #{project_svn_dir}` if SUBTRAC_ENV != 'test'
449
- FileUtils.chown_R('www-data', 'www-data', project_trac_dir, :verbose => false) if SUBTRAC_ENV != 'test'
450
- FileUtils.mkdir_p("#{project_trac_dir}/conf") if SUBTRAC_ENV == 'test' # fake the folder for tests
451
-
452
- say("Installing trac configuration...")
453
- # install shared trac.ini
454
- trac_ini_template = File.join(subtrac_path, @APP_CONFIG[:templates][:trac])
455
- parse_template(trac_ini_template,File.join(project_trac_dir,"/conf/trac.ini"),binding)
456
-
457
- # remove custom templates directory so trac uses the shared location (while we wait for trac patch)
458
- #FileUtils.rm_rf("#{project_trac_dir}/templates")
459
-
460
- say("Setting up default trac permissions...")
461
- # set up trac permissions
462
- @APP_CONFIG[:trac][:permissions].each do |key, value|
463
- `sudo trac-admin #{project_trac_dir} permission add #{key} #{value}` if SUBTRAC_ENV != 'test'
464
- end
465
-
466
- say("Adding default trac wiki pages...")
467
- # loop through the directory and import all pages
468
- Dir.foreach("#{project_template}/trac/wiki/.") do |file|
469
- # do something with the file here
470
- unless ['.', '..','.svn'].include? file
471
- temp_file = File.join(temp_dir,file)
472
- puts = binding
473
- parse_template(File.join(project_template,"trac/wiki",file), temp_file, binding)
474
- `trac-admin #{project_trac_dir} wiki import #{file} #{temp_file}` if SUBTRAC_ENV != 'test'
475
- FileUtils.rm(temp_file)
476
- end
477
- end
478
-
479
- # chown the whole directory
480
- `sudo chown -R www-data:www-data #{install_dir}`
481
- #FileUtils.chown_R('www-data', 'www-data', File.join(install_dir,"*"), :verbose => true) if SUBTRAC_ENV != 'test'
482
-
483
- # run trac upgrade
484
- say("Upgrading the trac installation...")
485
- `trac-admin #{project_trac_dir} upgrade` if SUBTRAC_ENV != 'test'
486
-
487
365
  end
366
+
488
367
  end
489
368
 
490
369
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ktec-subtrac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.28
4
+ version: 0.1.33
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Salisbury
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-23 00:00:00 -07:00
12
+ date: 2009-04-29 00:00:00 -07:00
13
13
  default_executable: subtrac
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -38,6 +38,10 @@ files:
38
38
  - VERSION.yml
39
39
  - bin/subtrac
40
40
  - lib/subtrac.rb
41
+ - lib/subtrac/apache.rb
42
+ - lib/subtrac/apache/location.conf.erb
43
+ - lib/subtrac/apache/vhost.conf.erb
44
+ - lib/subtrac/client.rb
41
45
  - lib/subtrac/commands.rb
42
46
  - lib/subtrac/commands/create.rb
43
47
  - lib/subtrac/commands/install.rb
@@ -47,128 +51,22 @@ files:
47
51
  - lib/subtrac/common/images/trac/footer_back.png
48
52
  - lib/subtrac/common/images/trac/main_bg.gif
49
53
  - lib/subtrac/common/images/trac/saint_logo_small.png
50
- - lib/subtrac/common/static/404.html
51
- - lib/subtrac/common/styles/trac.css
52
54
  - lib/subtrac/config/config.yml
55
+ - lib/subtrac/core_ext.rb
56
+ - lib/subtrac/core_ext/file.rb
57
+ - lib/subtrac/project.rb
58
+ - lib/subtrac/project/blank/svn/branches/README
59
+ - lib/subtrac/project/blank/svn/tags/README
60
+ - lib/subtrac/project/blank/svn/trunk/README
61
+ - lib/subtrac/project/blank/trac/wiki/WikiStart
62
+ - lib/subtrac/project/new/svn/trunk/trac/wiki/WikiStart
63
+ - lib/subtrac/project/new/trac/wiki/WikiStart
53
64
  - lib/subtrac/shared/trac.ini
54
- - lib/subtrac/templates/location.erb
55
- - lib/subtrac/templates/projects/blank/svn/branches/README
56
- - lib/subtrac/templates/projects/blank/svn/tags/README
57
- - lib/subtrac/templates/projects/blank/svn/trunk/README
58
- - lib/subtrac/templates/projects/blank/trac/wiki/WikiStart
59
- - lib/subtrac/templates/projects/new/svn/trunk/trac/wiki/WikiStart
60
- - lib/subtrac/templates/projects/new/trac/wiki/WikiStart
61
- - lib/subtrac/templates/trac.ini.erb
62
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/__init__.py
63
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg.gif
64
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg_page.gif
65
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg_page_in.jpg
66
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/btn_more.gif
67
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/col_bg.gif
68
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/col_title_bg.gif
69
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/col_top.gif
70
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/content_article_bg.jpg
71
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/content_title_bg.gif
72
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/footer.jpg
73
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/header.jpg
74
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_archive.gif
75
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_archive2.gif
76
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_cat.gif
77
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_comments.gif
78
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_date.gif
79
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_links.gif
80
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_list.gif
81
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_rss.gif
82
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_top.gif
83
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/ico_user.gif
84
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/search_input.gif
85
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/search_submit.gif
86
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_active_l.gif
87
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_active_r.gif
88
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_hover.gif
89
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_hover_l.gif
90
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_hover_r.gif
91
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_link.gif
92
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_link_l.gif
93
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tab_link_r.gif
94
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/tmp_photo.gif
95
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/saint.css
96
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/screenshot.png
97
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/templates/saint_theme.html
98
- - lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/theme.py
99
- - lib/subtrac/templates/trac/themes/sainttheme/setup.py
100
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/css/subtrac.css
101
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li-first.png
102
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li-hover.png
103
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li-last.png
104
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive-li.png
105
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/archive.png
106
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/body-home.png
107
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/body.png
108
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/content-product.png
109
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/content.png
110
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/entry.png
111
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/footer.png
112
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/gallery-nav.png
113
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/header.png
114
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/inner.png
115
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/logo.png
116
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/master.css
117
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/masthead.png
118
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/more.png
119
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-a-first.png
120
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-a-last.png
121
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-a.png
122
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/nav-li.png
123
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/products-li-large.png
124
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/products-li.png
125
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/rss-span.png
126
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/rss.png
127
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/search.png
128
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/sec-navigation-li.png
129
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/sec-navigation.png
130
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/slogan.png
131
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/wrapper-home.png
132
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/img/wrapper.png
133
- - lib/subtrac/templates/trac/themes/subtractheme/prototype/subtractheme.html
134
- - lib/subtrac/templates/trac/themes/subtractheme/setup.py
135
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/__init__.py
136
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li-first.png
137
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li-hover.png
138
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li-last.png
139
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive-li.png
140
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/archive.png
141
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/body-home.png
142
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/body.png
143
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/content-product.png
144
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/content.png
145
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/entry.png
146
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/footer.png
147
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/gallery-nav.png
148
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/header.png
149
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/inner.png
150
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/logo.png
151
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/master.css
152
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/masthead.png
153
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/more.png
154
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-a-first.png
155
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-a-last.png
156
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-a.png
157
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/nav-li.png
158
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/products-li-large.png
159
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/products-li.png
160
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/rss-span.png
161
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/rss.png
162
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/search.png
163
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/sec-navigation-li.png
164
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/sec-navigation.png
165
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/slogan.png
166
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/wrapper-home.png
167
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/img/wrapper.png
168
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/htdocs/subtrac.css
169
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/templates/subtrac_theme.html
170
- - lib/subtrac/templates/trac/themes/subtractheme/subtractheme/theme.py
171
- - lib/subtrac/templates/vhost.conf.erb
65
+ - lib/subtrac/svn.rb
66
+ - lib/subtrac/template.rb
67
+ - lib/subtrac/trac.rb
68
+ - lib/subtrac/trac/common.trac.ini.erb
69
+ - lib/subtrac/trac/trac.ini.erb
172
70
  - lib/subtrac/version.rb
173
71
  has_rdoc: true
174
72
  homepage: http://ktec.subtrac.com/subtrac