projektbauer 0.0.2

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 (44) hide show
  1. data/.gitignore +20 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +118 -0
  5. data/lib/projektbauer.rb +466 -0
  6. data/lib/projektbauer/erb/index_html.erb +6 -0
  7. data/lib/projektbauer/erb/post-commit.erb +24 -0
  8. data/lib/projektbauer/erb/project_location_httpd_conf.erb +31 -0
  9. data/lib/projektbauer/erb/svn_authz_file.erb +15 -0
  10. data/lib/projektbauer/erb/trac.ini.erb +258 -0
  11. data/lib/projektbauer/erb/virtual_host_httpd_conf.erb +27 -0
  12. data/lib/projektbauer/version.rb +3 -0
  13. data/projektbauer.gemspec +30 -0
  14. data/rakefile.rb +22 -0
  15. data/spec/reference/domain_01/include_locations.httpd.conf +2 -0
  16. data/spec/reference/domain_01/project_01/Feldbauer-environment.htdigest +8 -0
  17. data/spec/reference/domain_01/project_01/Feldbauer-environment.htdigest.txt +11 -0
  18. data/spec/reference/domain_01/project_01/project_01.dav_svn_authz +15 -0
  19. data/spec/reference/domain_01/project_01/project_01.httpd.conf +31 -0
  20. data/spec/reference/domain_01/project_02/Feldbauer-environment.htdigest +7 -0
  21. data/spec/reference/domain_01/project_02/Feldbauer-environment.htdigest.txt +9 -0
  22. data/spec/reference/domain_01/project_02/project_02.dav_svn_authz +15 -0
  23. data/spec/reference/domain_01/project_02/project_02.httpd.conf +31 -0
  24. data/spec/reference/domain_01/virtual_host.httpd.conf +43 -0
  25. data/spec/reference/domain_01/www/index.html +6 -0
  26. data/spec/reference/domain_02/include_locations.httpd.conf +1 -0
  27. data/spec/reference/domain_02/project_01/Feldbauer-environment.htdigest +7 -0
  28. data/spec/reference/domain_02/project_01/Feldbauer-environment.htdigest.txt +9 -0
  29. data/spec/reference/domain_02/project_01/project_01.dav_svn_authz +15 -0
  30. data/spec/reference/domain_02/project_01/project_01.httpd.conf +31 -0
  31. data/spec/reference/domain_02/virtual_host.httpd.conf +43 -0
  32. data/spec/reference/domain_02/www/index.html +6 -0
  33. data/spec/reference/include_virtual_hosts.httpd.conf +4 -0
  34. data/spec/reference/space domain 02/include_locations.httpd.conf +1 -0
  35. data/spec/reference/space domain 02/space project 01/Feldbauer-environment.htdigest +7 -0
  36. data/spec/reference/space domain 02/space project 01/Feldbauer-environment.htdigest.txt +9 -0
  37. data/spec/reference/space domain 02/space project 01/space project 01.dav_svn_authz +15 -0
  38. data/spec/reference/space domain 02/space project 01/space project 01.httpd.conf +31 -0
  39. data/spec/reference/space domain 02/virtual_host.httpd.conf +43 -0
  40. data/spec/reference/space domain 02/www/index.html +6 -0
  41. data/spec/setup_project_spec.rb +88 -0
  42. data/testresults/test_results.html +308 -0
  43. data/weichel21_projekbauer.rb +28 -0
  44. metadata +251 -0
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ spec/reference/**/svn
19
+ spec/reference/domain_01/project_01/svn
20
+ spec/tmp_output
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in projektbauer.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Bernhard Weichel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,118 @@
1
+ # Projektbauer
2
+
3
+ Projektbauer (a german play on words which could be translated to
4
+ "project builder" or to "poject farmer") is a ruby gem which supports
5
+ the setup of an SVN/Trac environment in an apache enviroment.
6
+
7
+ To use it one creates a configuration file which is actually a ruby
8
+ script and executes the same. The following approach applies
9
+
10
+ - **top level project folder** all projects are kept under one
11
+ particular folder for a **project collection** Usually on one host,
12
+ there is exactly one project collection.
13
+
14
+ - **virtual host** acting as project set: Within the project
15
+ collection, multiple project sets can be installed. One project set
16
+ corelates to an apache virtual host (e.g `myprojects.mydomin.xx`).
17
+ **Projektbauer** creates an apache configuration file for this
18
+ virtual domain.
19
+
20
+ **Projektbauer** supports virtual host by
21
+ - creating a folder for the virtual host
22
+ - creating an apache configuration for that virtual host
23
+ (`virtual_host.httpd.conf`)
24
+ - maintains a configuration file (`include_locations.httpd.conf`)
25
+ which is be included in the aforehead mentioned file. This file
26
+ includes the project configurations.
27
+
28
+ **Note** that some providers (e.g. <http://www.webhostone.de>) do
29
+ not support creation of virtual hosts this way. In this case, you
30
+ can simply ignore the generated virtual host. But you need to
31
+ include the project list in the existing virtual host.
32
+
33
+ - **project** a project is associated with a **virtual host** such
34
+ that it can be accessed by
35
+ - `https://myprojects.mydomin.xx/myproject/svn`
36
+ - `https://myprojects.mydomin.xx/myproject/trac`
37
+
38
+ **Projektbauer** generates the configuration of the the project,
39
+ namely:
40
+ - svn repository
41
+ - htdigest user file
42
+ - svn_authz file
43
+
44
+ ## Installation
45
+
46
+ As of now **Projektbauer** is not released at <http://rubygems.org>. Therefore you need
47
+ to install it on your server by
48
+
49
+ $ git clone https://github.com/bwl21/projektbauer.git
50
+
51
+ Add this line to your application's Gemfile:
52
+
53
+ gem 'projektbauer'
54
+
55
+ And then execute:
56
+
57
+ $ bundle
58
+
59
+ Or install it yourself as:
60
+
61
+ $ gem install projektbauer
62
+
63
+ ## Usage
64
+
65
+ In order to use **Projektbauer** you need to create a configuration file
66
+ which is in fact a ruby program.
67
+
68
+ require './lib/projektbauer.rb'
69
+
70
+ p=Project.new
71
+ p.project_name = "{name of the project}"
72
+ p.project_users = {
73
+ admin: ["admin.first", "admin.second"],
74
+ observer: ["observer.first", "observer.second"],
75
+ contributor: ["contributor.first", "contributor.second"]
76
+ }
77
+ p.virtual_host = "{server internal folder name of the virtual host,}"
78
+ p.project_realm = "{realm for authorization, no spaces, no colons!}"
79
+ p.server_root = "{path to top level project folder on the server}"
80
+ p.virtual_host_ip = "{url of virtual host without port}"
81
+ p.server_name = "{domain of the virtual host}"
82
+ p.server_admin = "{email adress}"
83
+ p.server_port_nossl = 8080
84
+ p.server_port_ssl = 443
85
+
86
+ # this is required for the trac configuration
87
+
88
+ p.smtp_default_domain = "foo.bar.de" # Default dopmain for smtp
89
+ p.smtp_enabled = true # allow trac to send smtp
90
+ p.smtp_from = "projektbauer@foo.bar.de" # sender adress
91
+ p.smtp_from_author = false # not supported defaults to false
92
+ p.smtp_from_name = "Projekt bauer at foo bar de" # name of sender adress
93
+ p.smtp_user = "sample.user.smtp" # username for smtp
94
+ p.smtp_password = "sample.password.smtp" # password for smtp
95
+ p.smtp_port = 25 # port for smtp
96
+ p.smtp_replyto = "projetkbauer.trac.replyto@#{@p.server_name}" # reply-to adress
97
+ p.smtp_server = @p.server_name # smtp-server
98
+ p.smtp_subject_prefix = "__default__" # prefix for subject = __default__
99
+
100
+
101
+ p.create_all
102
+
103
+ For more details refer to the yard documentation included.
104
+
105
+ Note that you can run it repeatedly. Thereby
106
+
107
+ - new users are created
108
+ - old users are removed
109
+
110
+ you can see this in the project folder, in file `{project_realm}.htdigest.txt`
111
+
112
+ ## Contributing
113
+
114
+ 1. Fork it
115
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
116
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
117
+ 4. Push to the branch (`git push origin my-new-feature`)
118
+ 5. Create new Pull Request
@@ -0,0 +1,466 @@
1
+ #
2
+ # todo:
3
+ #
4
+ # add comments
5
+ # optimize file layout
6
+ # improve auth handling
7
+ # store auth-files in folder of virtual server
8
+ # cross use auth-files
9
+ # update htdigest files
10
+ # add rake tasks
11
+ # * add user
12
+ # * specifiy observer, contributors on config file
13
+ # * update trac permissions accordingly
14
+ #
15
+ # projektbauer init
16
+ # projektbuaer updateuser
17
+ # projektbauer add user
18
+ # ...
19
+ #
20
+ #
21
+ require 'fileutils'
22
+ require 'digest/md5'
23
+ require 'erb'
24
+
25
+ class Project
26
+ attr_accessor :output_folder, # output folder - currently not in use
27
+ :server_name, # server name of the virtual host <apache>
28
+ :server_root, # root folder on the server <apache>
29
+ :server_admin, # name of the server administrator <apache>
30
+ :document_root, # document root within the location <apache>
31
+ :project_name, # name of the project (please no spaces) \
32
+ # used for filename
33
+ :project_users, # hash of project users. Key is :admin, :observer, :contributor
34
+ :virtual_host, # domain of virtual host
35
+ :project_realm, # realm for the project authentification
36
+ :virtual_host_ip, # ip of the virtual host without port
37
+ :server_port_nossl, # port for the no ssl access of the virtual host (e.g. 8080)
38
+ :server_port_ssl, # port of ssel access to the virtual host (e.g. 443)
39
+ # used to find the right trac tools
40
+ :trac_admin, # allows the name of trac-admin (used for virtualenv)
41
+
42
+ ### smtp configuration for trac
43
+ :smtp_default_domain, # Default dopmain for smtp
44
+ :smtp_enabled, # allow trac to send smtp
45
+ :smtp_from, # sender adress
46
+ :smtp_from_author, # not supported defaults to false
47
+ :smtp_from_name, # name of sender adress
48
+ :smtp_user, # username for smtp
49
+ :smtp_password, # password for smtp
50
+ :smtp_port, # port for smtp
51
+ :smtp_replyto, # reply-to adress
52
+ :smtp_server, # smtp-server
53
+ :smtp_subject_prefix # prefix for subject = __default__
54
+
55
+
56
+
57
+ #
58
+ # The class constructor
59
+ #
60
+ # @return [Project] returns the created class
61
+ def initialize
62
+
63
+ @server_port_nossl = nil
64
+ @server_port_ssl = nil
65
+ @server_root = "xxx"
66
+
67
+
68
+ @project_name = nil # name of project
69
+ @virtual_host = nil # set of the project
70
+ @project_realm = nil # realm for authorization
71
+ @project_admin_user = nil # admin - user
72
+ @server_admin = nil # email of server admin
73
+ @smtp_enabled = false # email is not supported by default
74
+
75
+ @trac_admin = "trac-admin" # the command to trac-admin
76
+
77
+ end
78
+
79
+
80
+ #
81
+ # Inititalizes filenames etc. Needs to be called
82
+ # whenever one or more of the attributes are changed.
83
+ #
84
+ # @return [nil] no return
85
+ def init_filenames
86
+
87
+ #todo add checks for the attributes
88
+ # no spaces in project_name
89
+ #
90
+
91
+ @_virtual_host_home_dir = "#{@server_root}/#{@virtual_host}"
92
+ @_include_virtual_hosts_httpd_conf = "#{@server_root}/include_virtual_hosts.httpd.conf"
93
+ @_project_home = "#{@_virtual_host_home_dir}/#{@project_name}"
94
+ @_virtual_host_httpd_conf = "#{@_virtual_host_home_dir}/virtual_host.httpd.conf"
95
+ @_virtual_host_locations_httpd_conf = "#{@_virtual_host_home_dir}/include_locations.httpd.conf"
96
+ @_project_location_httpd_conf = "#{@_project_home}/#{@project_name}.httpd.conf"
97
+ @_project_svn_dir = "#{@_project_home}/svn"
98
+ @_project_trac_dir = "#{@_project_home}/trac"
99
+ @_project_auth_user_file = "#{@_project_home}/#{@project_realm}.htdigest"
100
+ @_project_svn_authz_file = "#{@_project_home}/#{@project_name}.dav_svn_authz"
101
+ @_document_root_dir = "#{@_virtual_host_home_dir}/www"
102
+ @_index_html_file = "#{@_document_root_dir}/index.html"
103
+ @_trac_admin = "#{@trac_admin}"
104
+ @_trac_ini_file = "#{@_project_trac_dir}/conf/trac.ini"
105
+ nil
106
+ end
107
+
108
+
109
+
110
+ #
111
+ # Creates the folders in the file system.
112
+ # If a folder already exists, nothing happens.
113
+ #
114
+ # @return [nil] no return
115
+ #
116
+ def create_folders
117
+ #todo: double check if path exists
118
+ FileUtils.mkdir_p @_project_svn_dir
119
+ FileUtils.mkdir_p @_project_trac_dir
120
+ FileUtils.mkdir_p @_document_root_dir
121
+ #todo: ensure that folders are not listable
122
+ #todo: htaccess - file
123
+ nil
124
+ end
125
+
126
+
127
+
128
+ #
129
+ # This basically creates the configuration of the virtual host
130
+ #
131
+ # @return [Nil] no return
132
+ #
133
+ def save_virtual_host_httpd_conf
134
+ config = expand_erb("virtual_host_httpd_conf.erb")
135
+
136
+ File.open(@_virtual_host_httpd_conf,"w"){|f|
137
+ f.puts config
138
+ }
139
+
140
+ nil
141
+ end
142
+
143
+
144
+ #
145
+ # create the apache configuration for the <location>
146
+ # It corresponds to a project.
147
+ #
148
+ # @return [Nil] no return
149
+ def save_project_location_httpd_conf
150
+ config = expand_erb("project_location_httpd_conf.erb")
151
+
152
+ File.open(@_project_location_httpd_conf,"w"){|f|
153
+ f.puts config
154
+ }
155
+
156
+ nil
157
+ end
158
+
159
+
160
+ #
161
+ # creates the Authorization file for svn.
162
+ # Thereby it creates an observer and a contributor group.
163
+ # the {Project.project_admin_user} is entered as contributor
164
+ #
165
+ # @return [Nil] no return
166
+ def create_svn_authz_file
167
+ config =expand_erb("svn_authz_file.erb")
168
+
169
+ File.open(@_project_svn_authz_file, "w") {|f|
170
+ f.puts config
171
+ }
172
+ nil
173
+ end
174
+
175
+
176
+ #
177
+ # Creates a minimalistic index.html in the virtual host.
178
+ # In particular this avoids that the files can be listed.
179
+ #
180
+ # @return [Nil] no return
181
+ #
182
+ def create_index_html
183
+ config = expand_erb("index_html.erb")
184
+ File.open(@_index_html_file, "w") {|f|
185
+ f.puts config
186
+ }
187
+ end
188
+
189
+
190
+ #
191
+ # Updates the include file with the locations.
192
+ # This file is subsequently included in the virtual hosts.
193
+ #
194
+ # Duplicate entries are removed.
195
+ #
196
+ # @return [Nil] no return
197
+ def update_virtual_host_locations_httpd_conf
198
+ _maintain_include_file(@_virtual_host_locations_httpd_conf,
199
+ @_project_location_httpd_conf
200
+ )
201
+ end
202
+
203
+
204
+ #
205
+ # Updates the include file with the virtual hosts.
206
+ # This file needs to be added manually to `/etc/apache2/apache2.conf`
207
+ #
208
+ # @return [Nil] no return
209
+ def update_include_virtual_hosts_httpd_conf
210
+ _maintain_include_file(@_include_virtual_hosts_httpd_conf,
211
+ @_project_location_httpd_conf
212
+ )
213
+ nil
214
+ end
215
+
216
+
217
+
218
+ #
219
+ # This creates the trac environment
220
+ #
221
+ # @return [type] [description]
222
+ def create_trac
223
+ quoted_project_trac_dir = "\"#{@_project_trac_dir}\""
224
+
225
+ unless File.exists?("#{@_project_trac_dir}/conf")
226
+ FileUtils.mkdir_p(@_project_trac_dir)
227
+ _trac_admin "#{quoted_project_trac_dir} initenv \"#{@project_name}\" sqlite:\"#{@_project_trac_dir}/db/trac.db\""
228
+ FileUtils.rm(@_trac_ini_file) # remove this such that it gets regenerated
229
+ end
230
+
231
+ _update_trac_ini
232
+
233
+ # create group for project.admins
234
+ _trac_admin "#{quoted_project_trac_dir} permission add project.admins TRAC_ADMIN TICKET_ADMIN WIKI_ADMIN"
235
+
236
+
237
+ @project_users[:admin].each{|u|
238
+ _trac_admin "#{quoted_project_trac_dir} permission add #{u} project.admins"
239
+ }
240
+ _trac_admin "#{quoted_project_trac_dir} permission add project.contributors TRAC_ADMIN TICKET_ADMIN WIKI_ADMIN"
241
+ anonymous_revoke="BROWSER_VIEW CHANGESET_VIEW FILE_VIEW LOG_VIEW MILESTONE_VIEW REPORT_SQL_VIEW"
242
+ anonymous_revoke <<" REPORT_VIEW ROADMAP_VIEW SEARCH_VIEW TICKET_VIEW TIMELINE_VIEW WIKI_VIEW"
243
+
244
+ _trac_admin "#{quoted_project_trac_dir} permission remove anonymous #{anonymous_revoke}"
245
+ _trac_admin "#{quoted_project_trac_dir} permission add authenticated #{anonymous_revoke}"
246
+
247
+ # crate include-file for webserver
248
+ #
249
+ _trac_admin "#{quoted_project_trac_dir} deploy #{quoted_project_trac_dir}"
250
+
251
+ cmd = "chmod +x #{@_project_trac_dir}/cgi-bin/*"
252
+ `#{cmd}`
253
+ # link to the svn repository
254
+ #
255
+ _trac_admin "#{quoted_project_trac_dir} repository add \"(default)\" \"#{@_project_svn_dir}\" svn"
256
+
257
+ _create_post_commit
258
+ end
259
+
260
+
261
+ #
262
+ # This creates the svn repository if it does not yet exist.
263
+ # Note that this is tested by investigating the format
264
+ # folder in the svn repository.
265
+ #
266
+ # todo: improve the detection
267
+ #
268
+ # @return [type] [description]
269
+ def create_svn
270
+ unless File.exists?(@_project_svn_dir + "/format")
271
+ cmd = "svnadmin create \"#{@_project_svn_dir}\""
272
+ puts cmd
273
+ `#{cmd}`
274
+ initialfolders= ["tags", "branches", "trunk"]
275
+ cmd = ["svn mkdir",
276
+ initialfolders.map{|d| "file://\"#{@_project_svn_dir}\"/#{d}"},
277
+ "-m \"Repository created by Projektbauer\""].flatten.join(" ")
278
+ puts cmd
279
+ `#{cmd}`
280
+ end
281
+ end
282
+
283
+ #
284
+ # This creates the htdigest file
285
+ #
286
+ # @return [Nil] no return
287
+ def create_htpasswd
288
+
289
+ allusers = @project_users.map{|k,v| v}.flatten
290
+ pwdhashes = {}
291
+ passwords = {}
292
+ allusers.each{|user|
293
+ password = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
294
+ pwdhashes[user] = _create_passwdentry(@project_realm, user, password)
295
+ passwords[user] = password
296
+ }
297
+
298
+ if File.exists?(@_project_auth_user_file) then
299
+ oldcontents = File.open(@_project_auth_user_file).readlines
300
+ oldcontents = oldcontents.map{|i| i.strip }.sort.uniq
301
+
302
+ oldentries={}
303
+ oldcontents.each{|entry|
304
+
305
+ record = entry.split(":")
306
+ if pwdhashes.has_key?(record.first) then
307
+ pwdhashes[record.first] = entry
308
+ passwords[record.first] = "<password unchanged>"
309
+ else
310
+ passwords[record.first] = "<user deleted>"
311
+ end
312
+ }
313
+ else
314
+ oldcontents=[]
315
+ end
316
+
317
+ newcontents=pwdhashes.map{|k,v| v }.sort.uniq
318
+ unless oldcontents==newcontents
319
+ File.open(@_project_auth_user_file, "w"){|f|
320
+ f.puts(newcontents.join("\n"))
321
+ }
322
+ end
323
+
324
+ File.open(@_project_auth_user_file+".txt", "a"){|f|
325
+ f.puts "generated passwords for #{@project_realm}"
326
+ f.puts ""
327
+ f.puts(passwords.map{|k,v| "#{k} => #{v}"}.sort.join("\n"))
328
+ }
329
+
330
+ end
331
+
332
+
333
+
334
+ #
335
+ # calling this method after setting all attributes
336
+ # does the entire generation job
337
+ #
338
+ # @return [Nil] no return
339
+ def create_all
340
+ init_filenames
341
+ create_folders
342
+
343
+ create_index_html
344
+
345
+ save_virtual_host_httpd_conf
346
+ save_project_location_httpd_conf
347
+ update_virtual_host_locations_httpd_conf
348
+ update_include_virtual_hosts_httpd_conf
349
+
350
+ create_htpasswd
351
+ create_svn_authz_file
352
+ create_svn
353
+
354
+ create_trac
355
+ end
356
+
357
+
358
+ private
359
+
360
+
361
+ #
362
+ # This expands the embedded ruby templated
363
+ # @param file [String] Path to the erb template
364
+ #
365
+ # @return [String] Expanded Templated
366
+ def expand_erb(file)
367
+ template=ERB.new File.new(File.dirname(__FILE__)+ "/projektbauer/erb/" + file).readlines.join
368
+ template.result(binding)
369
+ end
370
+
371
+
372
+ #
373
+ # This maintains an include file as follows:
374
+ #
375
+ # - the file is read
376
+ # - the new entry is appended
377
+ # - the result is sorted an duplicates are removed
378
+ # - the file is saved if it is different than before
379
+ #
380
+ # @param include_file [String] Name if the include file to be maintained
381
+ # @param entry [String] The new entry which shall be included
382
+ #
383
+ # @return [Nil] no return
384
+ #
385
+ def _maintain_include_file(include_file, entry)
386
+ if File.exists?(include_file) then
387
+ old = File.open(include_file).readlines.map{|i| i.strip}
388
+ new=old.clone
389
+ else
390
+ new=[]
391
+ end
392
+
393
+ new << "Include #{entry}"
394
+
395
+ new=new.sort.uniq
396
+
397
+ unless old == new then
398
+ File.open(include_file, "w") {|f|
399
+ f.puts new.join("\n")
400
+ }
401
+ end
402
+ nil
403
+ end
404
+
405
+
406
+
407
+ #
408
+ # This creates the post commit hook file
409
+ #
410
+ # @param file [type] [description]
411
+ #
412
+ # @return [type] [description]
413
+ def _create_post_commit()
414
+ post_commit_file="#{@_project_svn_dir}/hooks/post-commit"
415
+ trac_ini = expand_erb("post-commit.erb")
416
+ File.open(post_commit_file, "w") {|f|
417
+ f.puts trac_ini
418
+ }
419
+ cmd="chmod +x \"#{post_commit_file}\""
420
+ #{cmd}`
421
+ end
422
+
423
+
424
+ #
425
+ # This updates (actually rewrites) trac.ini
426
+ #
427
+ # @return [Nil]
428
+ def _update_trac_ini()
429
+ trac_ini = expand_erb("trac.ini.erb")
430
+ unless File.exists?(@_trac_ini_file)
431
+ File.open(@_trac_ini_file, "w") {|f|
432
+ f.puts trac_ini
433
+ }
434
+ end
435
+ end
436
+
437
+
438
+
439
+ #
440
+ # Creates on e particular password entry
441
+ #
442
+ # @param realm [String] Realm for the password
443
+ # @param user [String] username
444
+ # @param password [String] password
445
+ #
446
+ # @return [type] [description]
447
+ def _create_passwdentry(realm, user, password)
448
+ pwdhash=Digest::MD5.hexdigest("#{user}:#{realm}:#{password}")
449
+ result="#{user}:#{realm}:#{pwdhash}"
450
+ result
451
+ end
452
+
453
+
454
+ #
455
+ # This performs tracadmin commands
456
+ # @param cmd [STring] the arguments to trac-admin
457
+ #
458
+ # @return [String] [description]
459
+ def _trac_admin(command)
460
+
461
+ cmd= "#{@trac_admin} #{command}"
462
+ puts cmd
463
+ `#{cmd}`
464
+ end
465
+
466
+ end