keithsalisbury-subtrac 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +133 -0
- data/VERSION.yml +1 -1
- data/lib/subtrac.rb +208 -91
- data/lib/subtrac/config/config.yml +1 -1
- data/lib/subtrac/templates/location.erb +3 -3
- data/lib/subtrac/templates/trac.erb +2 -2
- data/lib/subtrac/templates/vhost.erb +7 -7
- metadata +2 -3
- data/lib/subtrac/common/trac.ini +0 -178
data/README.markdown
CHANGED
@@ -21,6 +21,139 @@ For all users, you can add it here:
|
|
21
21
|
|
22
22
|
...
|
23
23
|
export PATH=$PATH:/var/lib/gems/1.8/bin
|
24
|
+
|
25
|
+
|
26
|
+
# Installing on VirtualBox
|
27
|
+
|
28
|
+
Start with a Fresh VM Image
|
29
|
+
Install jeos (hardy)
|
30
|
+
# mount guest additions -
|
31
|
+
sudo mount /media/cdrom0/ -o unhide
|
32
|
+
|
33
|
+
# install gcc and make
|
34
|
+
sudo aptitude install build-essential linux-headers-`uname -r`
|
35
|
+
|
36
|
+
# install the guest additions
|
37
|
+
sudo /cdrom/VBoxLinuxAdditions-x86.run all
|
38
|
+
|
39
|
+
# install openssh-server?
|
40
|
+
sudo apt-get install openssh-server
|
41
|
+
|
42
|
+
# install gems
|
43
|
+
sudo apt-get install ruby rubygems
|
44
|
+
|
45
|
+
# update gems
|
46
|
+
sudo apt-get update --system
|
47
|
+
|
48
|
+
# edit bash.bashrc so all users can run the gem binaries
|
49
|
+
sudo vi /etc/bash.bashrc
|
50
|
+
|
51
|
+
# add github to the gem sources list
|
52
|
+
sudo gem sources -a http://gems.github.com
|
53
|
+
|
54
|
+
# some other pre-requisites
|
55
|
+
sudo aptitude install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 sqlite3
|
56
|
+
|
57
|
+
# install subtrac gem package
|
58
|
+
sudo gem install --include-dependencies keithsalisbury-subtrac
|
59
|
+
|
60
|
+
# enable mod_rewrite
|
61
|
+
a2enmod rewrite
|
62
|
+
|
63
|
+
# enable dav
|
64
|
+
sudo apt-get install libapache2-svn
|
65
|
+
|
66
|
+
# enable mod_python
|
67
|
+
sudo apt-get install libapache2-mod-python libapache2-mod-python-doc
|
68
|
+
|
69
|
+
sudo apt-get install apache2 libapache2-mod-python \
|
70
|
+
libapache2-svn python-setuptools subversion python-subversion
|
71
|
+
sudo easy_install Trac
|
72
|
+
|
73
|
+
# some trac plugin requirements
|
74
|
+
sudo apt-get install build-essential graphviz
|
75
|
+
sudo apt-get install htmldoc
|
76
|
+
sudo apt-get install enscript
|
77
|
+
|
78
|
+
easy_install -U setuptools
|
79
|
+
|
80
|
+
# some cool plugins
|
81
|
+
sudo easy_install http://svn.edgewall.org/repos/genshi/trunk/
|
82
|
+
sudo easy_install http://trac-hacks.org/svn/accountmanagerplugin/trunk
|
83
|
+
sudo easy_install http://trac-hacks.org/svn/customfieldadminplugin/0.11
|
84
|
+
sudo easy_install http://trac-hacks.org/svn/eclipsetracplugin/tracrpcext/0.10
|
85
|
+
sudo easy_install http://trac-hacks.org/svn/iniadminplugin/0.11
|
86
|
+
sudo easy_install http://trac-hacks.org/svn/masterticketsplugin/0.11
|
87
|
+
sudo easy_install http://trac-hacks.org/svn/pagetopdfplugin/0.10/
|
88
|
+
sudo easy_install http://trac-hacks.org/svn/progressmetermacro/0.11
|
89
|
+
sudo easy_install http://trac-hacks.org/svn/ticketdeleteplugin/0.11
|
90
|
+
sudo easy_install http://trac-hacks.org/svn/tracwysiwygplugin/0.11
|
91
|
+
sudo easy_install http://wikinotification.ufsoft.org/svn/trunk
|
92
|
+
|
93
|
+
# install subtrac server
|
94
|
+
sudo subtrac install [--clean]
|
95
|
+
|
96
|
+
# Mount a shared host folder from the VM Guest
|
97
|
+
mount.vboxsf pkg /mnt/subtrac/
|
98
|
+
|
99
|
+
# Setting up VM to use an internal loop back interface
|
100
|
+
|
101
|
+
## Create the interal interface
|
102
|
+
Snakey:~ adambarton$ sudo -i
|
103
|
+
Snakey:~ root# python
|
104
|
+
Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
|
105
|
+
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
|
106
|
+
Type "help", "copyright", "credits" or "license" for more information.
|
107
|
+
>>> import os
|
108
|
+
>>> file_path = '/dev/tap1'
|
109
|
+
>>> dev_file = os.open(file_path, os.O_RDWR)
|
110
|
+
>>> interface = 'tap1'
|
111
|
+
|
112
|
+
Leave this window open...
|
113
|
+
|
114
|
+
## Configure the interface
|
115
|
+
|
116
|
+
Snakey:~ root# ifconfig tap1 10.0.2.100 up
|
117
|
+
Snakey:~ root# ifconfig tap1
|
118
|
+
tap1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
|
119
|
+
inet 100.100.100.100 netmask 0xff000000 broadcast 100.255.255.255
|
120
|
+
ether ea:a2:95:41:b0:8f
|
121
|
+
open (pid 4104)
|
122
|
+
|
123
|
+
## Configure the VM
|
124
|
+
|
125
|
+
VBoxManage modifyvm TestHost1 -nic1 hostif -hostifdev1 'tap1: ethernet'
|
126
|
+
|
127
|
+
Boot it, and give it a static address on the same subnet
|
128
|
+
|
129
|
+
## Assign a static ip
|
130
|
+
|
131
|
+
sudo vi /etc/networking/interfaces
|
132
|
+
|
133
|
+
# The primary network interface
|
134
|
+
auto eth0
|
135
|
+
iface eth0 inet static
|
136
|
+
address 10.0.2.2
|
137
|
+
netmask 255.255.255.0
|
138
|
+
network 10.0.2.0
|
139
|
+
broadcast 10.0.2.255
|
140
|
+
gateway 10.0.2.200
|
141
|
+
|
142
|
+
# The secondary network interface
|
143
|
+
auto eth1
|
144
|
+
iface eth0 inet dhcp
|
145
|
+
|
146
|
+
# For linux users there's an even cooler way to set this up...
|
147
|
+
|
148
|
+
http://muffinresearch.co.uk/archives/2009/04/08/virtualbox-access-guests-via-a-virtual-interface/
|
149
|
+
|
150
|
+
# OSX Map your new domain to the ip
|
151
|
+
|
152
|
+
sudo mate /private/etc/hosts
|
153
|
+
|
154
|
+
10.0.2.2 dev.subtrac.com
|
155
|
+
|
156
|
+
|
24
157
|
|
25
158
|
## Copyright
|
26
159
|
|
data/VERSION.yml
CHANGED
data/lib/subtrac.rb
CHANGED
@@ -41,11 +41,96 @@ require 'fileutils'
|
|
41
41
|
require 'subtrac/version'
|
42
42
|
|
43
43
|
module Subtrac
|
44
|
-
SUBTRAC_ROOT = File.join(File.dirname(__FILE__), "subtrac")
|
45
|
-
DEV_ENV = 'development' # should be a system environment var
|
46
|
-
|
47
|
-
attr_accessor :server_name, :server_hostname, :server_ip, :default_client, :default_project, :install_dir, :docs_dir, :conf_dir, :locations_dir, :svn_dir, :trac_dir, :temp_dir
|
48
44
|
|
45
|
+
SUBTRAC_ROOT = "#{File.dirname(__FILE__)}/" unless defined?(SUBTRAC_ROOT)
|
46
|
+
SUBTRAC_ENV = (ENV['SUBTRAC_ENV'] || 'development').dup unless defined?(SUBTRAC_ENV)
|
47
|
+
USER_CONFIG = 'config/user.yml'
|
48
|
+
|
49
|
+
class << self
|
50
|
+
|
51
|
+
# The Configuration instance used to configure the Subtrac environment
|
52
|
+
def configuration
|
53
|
+
@@configuration
|
54
|
+
end
|
55
|
+
|
56
|
+
def configuration=(configuration)
|
57
|
+
@@configuration = configuration
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialized?
|
61
|
+
@initialized || false
|
62
|
+
end
|
63
|
+
|
64
|
+
def initialized=(initialized)
|
65
|
+
@initialized ||= initialized
|
66
|
+
end
|
67
|
+
|
68
|
+
def root
|
69
|
+
Pathname.new(SUBTRAC_ROOT) if defined?(SUBTRAC_ROOT)
|
70
|
+
end
|
71
|
+
|
72
|
+
def public_path
|
73
|
+
@@public_path ||= self.root ? File.join(self.root, "public") : "public"
|
74
|
+
end
|
75
|
+
|
76
|
+
def subtrac_path
|
77
|
+
@@subtrac_path ||= self.root ? File.join(self.root, "subtrac") : "subtrac"
|
78
|
+
end
|
79
|
+
|
80
|
+
def public_path=(path)
|
81
|
+
@@public_path = path
|
82
|
+
end
|
83
|
+
|
84
|
+
def docs_dir
|
85
|
+
@@docs_dir ||= File.join(@install_dir,@APP_CONFIG[:dirs][:docs])
|
86
|
+
end
|
87
|
+
|
88
|
+
def docs_dir=(dir)
|
89
|
+
@@docs_dir = dir
|
90
|
+
end
|
91
|
+
|
92
|
+
def svn_dir
|
93
|
+
@@svn_dir ||= File.join(@install_dir,@APP_CONFIG[:dirs][:svn])
|
94
|
+
end
|
95
|
+
|
96
|
+
def svn_dir=(dir)
|
97
|
+
@@svn_dir = dir
|
98
|
+
end
|
99
|
+
|
100
|
+
def trac_dir
|
101
|
+
@@trac_dir ||= File.join(@install_dir,@APP_CONFIG[:dirs][:trac])
|
102
|
+
end
|
103
|
+
|
104
|
+
def trac_dir=(dir)
|
105
|
+
@@trac_dir = dir
|
106
|
+
end
|
107
|
+
|
108
|
+
def temp_dir
|
109
|
+
@@temp_dir ||= File.join(@install_dir,@APP_CONFIG[:dirs][:temp])
|
110
|
+
end
|
111
|
+
|
112
|
+
def temp_dir=(dir)
|
113
|
+
@@temp_dir = dir
|
114
|
+
end
|
115
|
+
|
116
|
+
def log_dir
|
117
|
+
@@log_dir ||= File.join(@install_dir,@APP_CONFIG[:dirs][:log])
|
118
|
+
end
|
119
|
+
|
120
|
+
def log_dir=(dir)
|
121
|
+
@@log_dir = dir
|
122
|
+
end
|
123
|
+
|
124
|
+
def locations_dir
|
125
|
+
@@locations_dir ||= File.join(@install_dir,@APP_CONFIG[:dirs][:locations])
|
126
|
+
end
|
127
|
+
|
128
|
+
def locations_dir=(dir)
|
129
|
+
@@locations_dir = dir
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
49
134
|
module Commands
|
50
135
|
class Install
|
51
136
|
def initialize(args, options)
|
@@ -55,54 +140,34 @@ module Subtrac
|
|
55
140
|
end
|
56
141
|
class Create
|
57
142
|
def initialize(args, options)
|
58
|
-
project = ask("What is the name of the project you would like to create? ") if !options.project
|
59
|
-
client = ask("Which client is this project for? ") if !options.client
|
143
|
+
options.project = ask("What is the name of the project you would like to create? ") if !options.project
|
144
|
+
options.client = ask("Which client is this project for? ") if !options.client
|
145
|
+
# this needs to load the updated configuration?
|
60
146
|
Subtrac.load_config()
|
61
147
|
Subtrac.create_project(options.project,options.client)
|
62
148
|
end
|
63
149
|
end
|
64
150
|
end
|
65
|
-
|
66
|
-
# Install
|
67
|
-
def self.install(args,options)
|
68
|
-
puts "\n==== Installing development server files ===="
|
69
|
-
# Ask if the user agrees (yes or no)
|
70
|
-
confirm_clean = agree("Are you sure you would like a clean install? [Y/n]") if options.clean
|
71
|
-
# clear previous data
|
72
|
-
clean() if confirm_clean
|
73
|
-
# right lets install
|
74
|
-
change_server_name = agree("The default server name is \"#{@server_name}\". Would you like to change this? [Y/n]")
|
75
|
-
@server_name = ask("What would you like to call your new development server? ") if change_server_name
|
76
|
-
|
77
|
-
create_environment_directories()
|
78
|
-
install_common_files()
|
79
|
-
create_virtual_host()
|
80
|
-
confirm_default_client = agree("Do you want to create a default client project? [Y/n]")
|
81
|
-
# create default project and client
|
82
|
-
if confirm_default_client
|
83
|
-
change_client = agree("The default client name is \"#{@default_client}\". Would you like to change this? [Y/n]")
|
84
|
-
@default_client = ask("What client name would you like to use? ") if change_client
|
85
|
-
change_project = agree("The default project name is \"#{@default_project}\". Would you like to change this? [Y/n]")
|
86
|
-
@default_project = ask("What would you like to call your new project? ") if change_project
|
87
|
-
create_project(@default_project,@default_client)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
151
|
+
|
91
152
|
# Loads the configuration YML file
|
92
153
|
def self.load_config
|
154
|
+
# TODO: We need to refactor this code so it will load the default configuration only if one has not been created
|
93
155
|
puts "\n==== Loading configuration file ===="
|
94
156
|
# load configuration file
|
157
|
+
file_path = File.join(subtrac_path, USER_CONFIG)
|
158
|
+
file_path = File.join(subtrac_path,"/config/config.yml") if not File.exists?(file_path)
|
159
|
+
puts "Attempting to read config file: #{file_path}"
|
95
160
|
begin
|
96
|
-
raw_config = File.read(
|
161
|
+
raw_config = File.read(file_path)
|
97
162
|
yamlFile = YAML.load(raw_config)
|
98
163
|
rescue Exception => e
|
99
164
|
raise StandardError, "Config #{file_path} could not be loaded."
|
100
165
|
end
|
101
166
|
if yamlFile
|
102
|
-
if yamlFile[
|
103
|
-
@APP_CONFIG = yamlFile[
|
167
|
+
if yamlFile[SUBTRAC_ENV]
|
168
|
+
@APP_CONFIG = yamlFile[SUBTRAC_ENV]
|
104
169
|
else
|
105
|
-
raise StandardError, "config/config.yml exists, but doesn't have a configuration for
|
170
|
+
raise StandardError, "config/config.yml exists, but doesn't have a configuration for #{SUBTRAC_ENV}."
|
106
171
|
end
|
107
172
|
else
|
108
173
|
raise StandardError, "config/config.yml does not exist."
|
@@ -118,25 +183,69 @@ module Subtrac
|
|
118
183
|
@default_project = @APP_CONFIG[:default_project]
|
119
184
|
|
120
185
|
@install_dir = File.expand_path(@APP_CONFIG[:installation_dir])
|
121
|
-
@docs_dir = File.join(@install_dir,@APP_CONFIG[:dirs][:docs])
|
122
186
|
@conf_dir = @APP_CONFIG[:apache2_conf]
|
123
|
-
@locations_dir = File.join(@install_dir,@APP_CONFIG[:dirs][:conf_locations])
|
124
|
-
@svn_dir = File.join(@install_dir,@APP_CONFIG[:dirs][:svn])
|
125
|
-
@trac_dir = File.join(@install_dir,@APP_CONFIG[:dirs][:trac])
|
126
|
-
@temp_dir = File.join(@install_dir,@APP_CONFIG[:dirs][:temp])
|
127
|
-
@log_dir = File.join(@install_dir,@APP_CONFIG[:dirs][:log])
|
128
187
|
|
129
188
|
@ldap_bind_dn = @APP_CONFIG[:ldap][:bind_dn]
|
130
189
|
@ldap_bind_password = @APP_CONFIG[:ldap][:bind_password]
|
131
190
|
@ldap_url = @APP_CONFIG[:ldap][:host]
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
# Install
|
196
|
+
def self.install(args,options)
|
197
|
+
puts "\n==== Installing development server files ===="
|
198
|
+
# check where we are installing
|
199
|
+
change_install_dir = agree("The default installation directory is \"#{@install_dir}\". Would you like to change this? [Y/n]")
|
200
|
+
@install_dir = ask("Where would you like to install this server?") if change_install_dir
|
201
|
+
|
202
|
+
unless !File.directory?(@install_dir)
|
203
|
+
# Ask if the user agrees (yes or no)
|
204
|
+
confirm_clean = agree("Err, that dirctory's got stuff init. You sure you want me to overwrite? [Y/n]") if options.clean
|
205
|
+
end
|
132
206
|
|
207
|
+
# right lets install
|
208
|
+
change_server_name = agree("The default server name is \"#{@server_name}\". Would you like to change this? [Y/n]")
|
209
|
+
@server_name = ask("What would you like to call your new development server? ") if change_server_name
|
210
|
+
|
211
|
+
create_environment_directories(confirm_clean)
|
212
|
+
install_common_files()
|
213
|
+
# TODO: Need to check for default client/project before creating virtual host
|
214
|
+
# otherwise we need remove the rewrite rule
|
215
|
+
create_virtual_host()
|
216
|
+
confirm_default_client = agree("Do you want to create a default client project? [Y/n]")
|
217
|
+
# create default project and client
|
218
|
+
if confirm_default_client
|
219
|
+
change_client = agree("The default client name is \"#{@default_client}\". Would you like to change this? [Y/n]")
|
220
|
+
@default_client = ask("What client name would you like to use? ") if change_client
|
221
|
+
change_project = agree("The default project name is \"#{@default_project}\". Would you like to change this? [Y/n]")
|
222
|
+
@default_project = ask("What would you like to call your new project? ") if change_project
|
223
|
+
create_project(@default_project,@default_client)
|
224
|
+
end
|
225
|
+
save_config()
|
133
226
|
end
|
134
227
|
|
135
228
|
private
|
136
229
|
|
137
|
-
#
|
138
|
-
def self.
|
230
|
+
# Write the changes configuration to disk
|
231
|
+
def self.save_config
|
232
|
+
# save the things that might have changed
|
233
|
+
@APP_CONFIG[:server_name] = @server_name
|
234
|
+
@APP_CONFIG[:server_hostname] = @server_hostname
|
235
|
+
@APP_CONFIG[:server_ip] = @server_ip
|
236
|
+
|
237
|
+
@APP_CONFIG[:default_client] = @default_client
|
238
|
+
@APP_CONFIG[:default_project] = @default_project
|
239
|
+
|
240
|
+
@APP_CONFIG[:installation_dir] = @install_dir
|
241
|
+
@APP_CONFIG[:apache2_conf] = @conf_dir
|
139
242
|
|
243
|
+
@APP_CONFIG[:ldap][:bind_dn] = @ldap_bind_dn
|
244
|
+
@APP_CONFIG[:ldap][:bind_password] = @ldap_bind_password
|
245
|
+
@APP_CONFIG[:ldap][:host] = @ldap_url
|
246
|
+
|
247
|
+
file_path = File.join(subtrac_path, USER_CONFIG)
|
248
|
+
open(file_path, 'w') {|f| YAML.dump({SUBTRAC_ENV => @APP_CONFIG}, f)}
|
140
249
|
end
|
141
250
|
|
142
251
|
# creates a directory if it does not exist
|
@@ -167,53 +276,51 @@ module Subtrac
|
|
167
276
|
# creates a new virtual host and reloads apache and enables the new virtual host
|
168
277
|
def self.create_virtual_host
|
169
278
|
puts "\n==== Creating new virtual host ===="
|
170
|
-
vhost_template = File.join(
|
279
|
+
vhost_template = File.join(subtrac_path, @APP_CONFIG[:templates][:virtual_host])
|
280
|
+
puts "group apache tempalte: #{vhost_template}"
|
171
281
|
new_vhost = File.join(@conf_dir,@server_hostname)
|
172
|
-
|
282
|
+
puts "group apache file: #{new_vhost}"
|
283
|
+
parse_template(vhost_template,new_vhost,binding) if SUBTRAC_ENV != 'test'
|
173
284
|
# reload apache configuration
|
174
|
-
`/etc/init.d/apache2 force-reload` if
|
175
|
-
`a2ensite #{@server_hostname}` if
|
285
|
+
`/etc/init.d/apache2 force-reload` if SUBTRAC_ENV != 'test'
|
286
|
+
`a2ensite #{@server_hostname}` if SUBTRAC_ENV != 'test'
|
176
287
|
end
|
177
288
|
|
178
289
|
def self.install_common_files
|
179
290
|
puts "\n==== Installing common files ===="
|
180
291
|
# TODO: implement a mask for .svn folders
|
181
292
|
# TODO: refactor /common to the app config
|
182
|
-
|
183
|
-
|
184
|
-
dest = @docs_dir
|
185
|
-
FileUtils.cp_r(source,dest)
|
293
|
+
FileUtils.cp_r(Dir.glob(File.join(subtrac_path, "common/.")),docs_dir)
|
294
|
+
FileUtils.cp_r(Dir.glob(File.join(subtrac_path, "shared/.")),File.join(trac_dir, ".shared"))
|
186
295
|
end
|
187
296
|
|
188
|
-
def self.create_environment_directories
|
297
|
+
def self.create_environment_directories(overwrite=false)
|
189
298
|
puts "\n==== Creating new environment directories ===="
|
299
|
+
FileUtils.rm_rf @install_dir if overwrite
|
300
|
+
create_if_missing @install_dir
|
190
301
|
# create the environment directories
|
191
302
|
@APP_CONFIG[:dirs].each do |key, value|
|
192
|
-
|
303
|
+
dir = File.join(@install_dir,value)
|
304
|
+
create_if_missing dir
|
193
305
|
end
|
194
306
|
end
|
195
307
|
|
196
|
-
def self.clean
|
197
|
-
puts "\n==== Remove old data if exists ===="
|
198
|
-
@APP_CONFIG[:dirs].each do |key, value|
|
199
|
-
#TODO: Ask for confirmation - yes,no,All
|
200
|
-
puts "Deleting #{value}"
|
201
|
-
FileUtils.rm_rf value
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
308
|
def self.create_client(name)
|
206
309
|
puts "\n==== Create a new client called #{name} ===="
|
207
310
|
client_name = name.downcase
|
208
311
|
# create apache configuration
|
209
|
-
|
210
|
-
|
312
|
+
puts "subtrac_path: #{subtrac_path}"
|
313
|
+
puts "templates_location: #{@APP_CONFIG[:templates][:location]}"
|
314
|
+
location_template = File.join(subtrac_path, @APP_CONFIG[:templates][:location])
|
315
|
+
puts "location_template: #{location_template}"
|
316
|
+
location_conf = File.join(locations_dir,"#{client_name}.conf")
|
317
|
+
puts "location_conf: #{location_conf}"
|
211
318
|
parse_template(location_template,location_conf,binding)
|
212
|
-
`/etc/init.d/apache2 force-reload` if
|
319
|
+
`/etc/init.d/apache2 force-reload` if SUBTRAC_ENV != 'test'
|
213
320
|
|
214
321
|
# create svn+trac directory
|
215
|
-
create_if_missing File.join(
|
216
|
-
create_if_missing File.join(
|
322
|
+
create_if_missing File.join(svn_dir,client_name)
|
323
|
+
create_if_missing File.join(trac_dir,client_name)
|
217
324
|
end
|
218
325
|
|
219
326
|
def self.create_project(project, client)
|
@@ -223,51 +330,57 @@ module Subtrac
|
|
223
330
|
project_name = project.downcase
|
224
331
|
|
225
332
|
# create client directory if needed
|
226
|
-
create_client(client_name) if (!File.directory? File.join(
|
333
|
+
create_client(client_name) if (!File.directory? File.join(svn_dir,client_name))
|
334
|
+
|
335
|
+
project_svn_dir = File.join(svn_dir,client_name,project_name)
|
336
|
+
project_trac_dir = File.join(trac_dir,client_name,project_name)
|
227
337
|
|
228
|
-
|
229
|
-
|
230
|
-
if (File.directory? svn_dir) then
|
338
|
+
# TODO: Need to change this to use a 'groups' yml file
|
339
|
+
if (File.directory? project_svn_dir) then
|
231
340
|
raise StandardError, "A project called #{project} already exists in the #{client} repository. Would you like to replace it?"
|
232
341
|
end
|
233
342
|
|
234
343
|
# create new project directories
|
235
|
-
|
236
|
-
create_if_missing
|
344
|
+
say("Create project directories...")
|
345
|
+
create_if_missing project_svn_dir
|
346
|
+
create_if_missing project_trac_dir
|
237
347
|
|
238
|
-
project_template = File.join(
|
348
|
+
project_template = File.join(subtrac_path, @APP_CONFIG[:templates][:projects],@APP_CONFIG[:default_project_template])
|
239
349
|
|
240
350
|
# copy template svn project to a temp folder, then svn import it into the repo
|
351
|
+
say("Create temporary project directory and copy template files...")
|
241
352
|
svn_template_dir = File.join(project_template,"svn")
|
242
|
-
|
243
|
-
FileUtils.cp_r(svn_template_dir,
|
353
|
+
project_temp_dir = File.join(temp_dir,project_name)
|
354
|
+
FileUtils.cp_r(svn_template_dir,project_temp_dir)
|
244
355
|
|
245
356
|
# create a new subversion repository
|
246
357
|
say("Creating a new subversion repository...")
|
247
|
-
`svnadmin create #{
|
358
|
+
`svnadmin create #{project_svn_dir}` if SUBTRAC_ENV != 'test'
|
248
359
|
|
249
360
|
# import into svn
|
250
|
-
|
361
|
+
say("Importing temporary project into the new subversion repository...")
|
362
|
+
`svn import #{project_temp_dir} file:///#{project_svn_dir} --message "initial import"` if SUBTRAC_ENV != 'test'
|
251
363
|
# delete the temporary directory
|
252
|
-
FileUtils.rm_r(
|
364
|
+
FileUtils.rm_r(project_temp_dir, :force => true)
|
253
365
|
|
254
366
|
# create a new trac site
|
255
367
|
say("Creating a new trac site...")
|
256
|
-
result = `trac-admin #{
|
257
|
-
FileUtils.chown_R('www-data', 'www-data',
|
258
|
-
FileUtils.mkdir_p("#{
|
368
|
+
result = `trac-admin #{project_trac_dir} initenv #{project_name} sqlite:#{project_trac_dir}/db/trac.db svn #{project_svn_dir}` if SUBTRAC_ENV != 'test'
|
369
|
+
FileUtils.chown_R('www-data', 'www-data', project_trac_dir, :verbose => true) if SUBTRAC_ENV != 'test'
|
370
|
+
FileUtils.mkdir_p("#{project_trac_dir}/conf") if SUBTRAC_ENV == 'test' # fake the folder for tests
|
259
371
|
|
372
|
+
say("Installing trac configuration...")
|
260
373
|
# install shared trac.ini
|
261
|
-
trac_ini_template = File.join(
|
262
|
-
parse_template(trac_ini_template,File.join(
|
374
|
+
trac_ini_template = File.join(subtrac_path, @APP_CONFIG[:templates][:trac])
|
375
|
+
parse_template(trac_ini_template,File.join(project_trac_dir,"/conf/trac.ini"),binding)
|
263
376
|
|
264
377
|
# remove custom templates directory so trac uses the shared location (while we wait for trac patch)
|
265
|
-
FileUtils.rm_rf("#{
|
378
|
+
FileUtils.rm_rf("#{project_trac_dir}/templates")
|
266
379
|
|
267
|
-
say("Setting up default trac
|
380
|
+
say("Setting up default trac permissions...")
|
268
381
|
# set up trac permissions
|
269
382
|
@APP_CONFIG[:trac][:permissions].each do |key, value|
|
270
|
-
`trac-admin #{
|
383
|
+
`trac-admin #{project_trac_dir} permission add #{key} #{value}` if SUBTRAC_ENV != 'test'
|
271
384
|
end
|
272
385
|
|
273
386
|
say("Adding default trac wiki pages...")
|
@@ -275,13 +388,17 @@ module Subtrac
|
|
275
388
|
Dir.foreach("#{project_template}/trac/wiki/.") do |file|
|
276
389
|
# do something with the file here
|
277
390
|
unless ['.', '..','.svn'].include? file
|
278
|
-
temp_file = File.join(
|
391
|
+
temp_file = File.join(temp_dir,file)
|
279
392
|
parse_template(File.join(project_template,"trac/wiki",file), temp_file, binding)
|
280
|
-
`trac-admin #{
|
393
|
+
`trac-admin #{project_trac_dir} wiki import #{file} #{temp_file}` if SUBTRAC_ENV != 'test'
|
281
394
|
FileUtils.rm(temp_file)
|
282
395
|
end
|
283
396
|
end
|
284
|
-
|
397
|
+
|
398
|
+
# run trac upgrade
|
399
|
+
say("Upgrading the trac installation...")
|
400
|
+
`trac-admin #{project_trac_dir} upgrade` if SUBTRAC_ENV != 'test'
|
401
|
+
|
285
402
|
end
|
286
403
|
end
|
287
404
|
|
@@ -2,14 +2,14 @@
|
|
2
2
|
SetHandler mod_python
|
3
3
|
PythonInterpreter main_interpreter
|
4
4
|
PythonHandler trac.web.modpython_frontend
|
5
|
-
PythonOption TracEnvParentDir <%=
|
5
|
+
PythonOption TracEnvParentDir <%= trac_dir %>/<%= client_name %>
|
6
6
|
PythonOption TracUriRoot /<%= client_name %>
|
7
|
-
PythonOption TracEnvIndexTemplate <%=
|
7
|
+
PythonOption TracEnvIndexTemplate <%= trac_dir %>/<%= client_name %>/trac_theme/htdocs/index/index.html
|
8
8
|
PythonOption PYTHON_EGG_CACHE /tmp
|
9
9
|
</location>
|
10
10
|
<location <%= @APP_CONFIG[:urls][:svn] %>/<%= client_name %>>
|
11
11
|
DAV svn
|
12
|
-
SVNParentPath <%=
|
12
|
+
SVNParentPath <%= svn_dir %>/<%= client_name %>
|
13
13
|
SVNListParentPath On
|
14
14
|
SVNAutoversioning On
|
15
15
|
SVNReposName "Saint Digital Source Repository for <%= client_name %>"
|
@@ -1,19 +1,19 @@
|
|
1
1
|
<virtualhost *>
|
2
2
|
ServerAdmin webmaster@localhost
|
3
3
|
ServerName <%= @server_hostname %>
|
4
|
-
DocumentRoot <%=
|
5
|
-
ErrorLog <%=
|
6
|
-
CustomLog <%=
|
4
|
+
DocumentRoot <%= docs_dir %>
|
5
|
+
ErrorLog <%= log_dir %>/error.<%= @server_hostname %>.log
|
6
|
+
CustomLog <%= log_dir %>/access.<%= @server_hostname %>.log combined
|
7
7
|
LogLevel error
|
8
8
|
|
9
9
|
RewriteEngine On
|
10
|
-
RewriteRule ^/$ http://<%= @server_hostname %>/<%= @default_client %>/<%= @default_project %>
|
11
|
-
RewriteRule ^/index*$ http://<%= @server_hostname %>/<%= @default_client %>/<%= @default_project %>
|
10
|
+
RewriteRule ^/$ http://<%= @server_hostname %>/<%= @default_client.downcase %>/<%= @default_project.downcase %>
|
11
|
+
RewriteRule ^/index*$ http://<%= @server_hostname %>/<%= @default_client.downcase %>/<%= @default_project.downcase %>
|
12
12
|
|
13
13
|
<location />
|
14
14
|
AuthType Basic
|
15
15
|
AuthName '<%= @server_name %>'
|
16
|
-
AuthUserFile <%= @
|
16
|
+
AuthUserFile <%= @install_dir %>/passwords
|
17
17
|
#Require valid-user
|
18
18
|
#AuthBasicProvider file ldap
|
19
19
|
#AuthLDAPBindDN '<%= @ldap_bind_dn %>'
|
@@ -30,6 +30,6 @@
|
|
30
30
|
SVNReposName '<%= @server_name %>'
|
31
31
|
</location>
|
32
32
|
|
33
|
-
Include <%=
|
33
|
+
Include <%= locations_dir %>/*
|
34
34
|
|
35
35
|
</virtualhost>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keithsalisbury-subtrac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
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-
|
12
|
+
date: 2009-04-19 00:00:00 -07:00
|
13
13
|
default_executable: subtrac
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -47,7 +47,6 @@ files:
|
|
47
47
|
- lib/subtrac/common/images/trac/saint_logo_small.png
|
48
48
|
- lib/subtrac/common/static/404.html
|
49
49
|
- lib/subtrac/common/styles/trac.css
|
50
|
-
- lib/subtrac/common/trac.ini
|
51
50
|
- lib/subtrac/config/config.yml
|
52
51
|
- lib/subtrac/passwords
|
53
52
|
- lib/subtrac/shared/trac.ini
|
data/lib/subtrac/common/trac.ini
DELETED
@@ -1,178 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
[attachment]
|
4
|
-
max_size = 262144
|
5
|
-
render_unsafe_content = false
|
6
|
-
|
7
|
-
[browser]
|
8
|
-
color_scale = True
|
9
|
-
downloadable_paths = /trunk, /branches/*, /tags/*
|
10
|
-
hide_properties = svk:merge
|
11
|
-
intermediate_color =
|
12
|
-
intermediate_point =
|
13
|
-
newest_color = (255, 136, 136)
|
14
|
-
oldest_color = (136, 136, 255)
|
15
|
-
oneliner_properties = trac:summary
|
16
|
-
render_unsafe_content = false
|
17
|
-
wiki_properties = trac:description
|
18
|
-
|
19
|
-
[changeset]
|
20
|
-
max_diff_bytes = 10000000
|
21
|
-
max_diff_files = 0
|
22
|
-
wiki_format_messages = true
|
23
|
-
|
24
|
-
[header_logo]
|
25
|
-
alt = Saint Development Server
|
26
|
-
height = -1
|
27
|
-
link = /
|
28
|
-
src = /images/trac/saint_logo_small.png
|
29
|
-
width = -1
|
30
|
-
|
31
|
-
[inherit]
|
32
|
-
plugins_dir =
|
33
|
-
templates_dir =
|
34
|
-
|
35
|
-
[logging]
|
36
|
-
log_file = trac.log
|
37
|
-
# log_format = <inherited>
|
38
|
-
log_level = DEBUG
|
39
|
-
log_type = none
|
40
|
-
|
41
|
-
[milestone]
|
42
|
-
stats_provider = DefaultTicketGroupStatsProvider
|
43
|
-
|
44
|
-
[mimeviewer]
|
45
|
-
enscript_modes = text/x-dylan:dylan:4
|
46
|
-
enscript_path = enscript
|
47
|
-
max_preview_size = 262144
|
48
|
-
mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb
|
49
|
-
php_path = php
|
50
|
-
tab_width = 8
|
51
|
-
|
52
|
-
[notification]
|
53
|
-
admit_domains =
|
54
|
-
always_notify_owner = false
|
55
|
-
always_notify_reporter = false
|
56
|
-
always_notify_updater = true
|
57
|
-
ignore_domains =
|
58
|
-
mime_encoding = base64
|
59
|
-
smtp_always_bcc =
|
60
|
-
smtp_always_cc =
|
61
|
-
smtp_default_domain =
|
62
|
-
smtp_enabled = false
|
63
|
-
smtp_from = trac@localhost
|
64
|
-
smtp_from_name =
|
65
|
-
smtp_password =
|
66
|
-
smtp_port = 25
|
67
|
-
smtp_replyto = trac@localhost
|
68
|
-
smtp_server = localhost
|
69
|
-
smtp_subject_prefix = __default__
|
70
|
-
smtp_user =
|
71
|
-
ticket_subject_template = $prefix #$ticket.id: $summary
|
72
|
-
use_public_cc = false
|
73
|
-
use_short_addr = false
|
74
|
-
use_tls = false
|
75
|
-
|
76
|
-
[project]
|
77
|
-
admin =
|
78
|
-
admin_trac_url = .
|
79
|
-
descr = My example project
|
80
|
-
footer = Visit the Trac open source project at<br /><a href="http://trac.edgewall.org/">http://trac.edgewall.org/</a>
|
81
|
-
icon = /favicon.ico
|
82
|
-
url =
|
83
|
-
|
84
|
-
[query]
|
85
|
-
default_anonymous_query = status!=closed&cc~=$USER
|
86
|
-
default_query = status!=closed&owner=$USER
|
87
|
-
items_per_page = 100
|
88
|
-
|
89
|
-
[report]
|
90
|
-
items_per_page = 100
|
91
|
-
items_per_page_rss = 0
|
92
|
-
|
93
|
-
[revisionlog]
|
94
|
-
default_log_limit = 100
|
95
|
-
|
96
|
-
[roadmap]
|
97
|
-
stats_provider = DefaultTicketGroupStatsProvider
|
98
|
-
|
99
|
-
[search]
|
100
|
-
min_query_length = 3
|
101
|
-
|
102
|
-
[svn]
|
103
|
-
branches = trunk,branches/*
|
104
|
-
tags = tags/*
|
105
|
-
|
106
|
-
[ticket]
|
107
|
-
default_cc =
|
108
|
-
default_component =
|
109
|
-
default_description =
|
110
|
-
default_keywords =
|
111
|
-
default_milestone =
|
112
|
-
default_owner =
|
113
|
-
default_priority = major
|
114
|
-
default_resolution = fixed
|
115
|
-
default_severity =
|
116
|
-
default_summary =
|
117
|
-
default_type = defect
|
118
|
-
default_version =
|
119
|
-
max_comment_size = 262144
|
120
|
-
max_description_size = 262144
|
121
|
-
preserve_newlines = default
|
122
|
-
restrict_owner = false
|
123
|
-
workflow = ConfigurableTicketWorkflow
|
124
|
-
|
125
|
-
[ticket-workflow]
|
126
|
-
accept = new,assigned,accepted,reopened -> accepted
|
127
|
-
accept.operations = set_owner_to_self
|
128
|
-
accept.permissions = TICKET_MODIFY
|
129
|
-
leave = * -> *
|
130
|
-
leave.default = 1
|
131
|
-
leave.operations = leave_status
|
132
|
-
reassign = new,assigned,accepted,reopened -> assigned
|
133
|
-
reassign.operations = set_owner
|
134
|
-
reassign.permissions = TICKET_MODIFY
|
135
|
-
reopen = closed -> reopened
|
136
|
-
reopen.operations = del_resolution
|
137
|
-
reopen.permissions = TICKET_CREATE
|
138
|
-
resolve = new,assigned,accepted,reopened -> closed
|
139
|
-
resolve.operations = set_resolution
|
140
|
-
resolve.permissions = TICKET_MODIFY
|
141
|
-
|
142
|
-
[timeline]
|
143
|
-
abbreviated_messages = True
|
144
|
-
changeset_collapse_events = false
|
145
|
-
changeset_long_messages = false
|
146
|
-
changeset_show_files = 0
|
147
|
-
default_daysback = 30
|
148
|
-
max_daysback = 90
|
149
|
-
newticket_formatter = oneliner
|
150
|
-
ticket_show_details = false
|
151
|
-
|
152
|
-
[trac]
|
153
|
-
authz_file =
|
154
|
-
authz_module_name =
|
155
|
-
auto_reload = False
|
156
|
-
base_url =
|
157
|
-
check_auth_ip = false
|
158
|
-
database = sqlite:db/trac.db
|
159
|
-
default_charset = iso-8859-15
|
160
|
-
htdocs_location =
|
161
|
-
ignore_auth_case = false
|
162
|
-
mainnav = wiki,timeline,roadmap,browser,tickets,newticket,search
|
163
|
-
metanav = login,logout,prefs,help,about
|
164
|
-
permission_policies = DefaultPermissionPolicy, LegacyAttachmentPolicy
|
165
|
-
permission_store = DefaultPermissionStore
|
166
|
-
repository_type = svn
|
167
|
-
secure_cookies = False
|
168
|
-
show_email_addresses = false
|
169
|
-
show_ip_addresses = false
|
170
|
-
timeout = 20
|
171
|
-
use_base_url_for_redirect = False
|
172
|
-
|
173
|
-
[wiki]
|
174
|
-
ignore_missing_pages = false
|
175
|
-
max_size = 262144
|
176
|
-
render_unsafe_content = false
|
177
|
-
split_page_names = false
|
178
|
-
|