svn_wc_tree 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,15 @@
1
+ version 0.0.5
2
+ * bug fix: default svn_status uses filter if set
3
+
4
+ version 0.0.4
5
+ * dir entries now grouped togther
6
+ * added filter(s): regex and amount. (amount filter is very beta)
7
+ * can filter svn_status and svn_list (set field use right click js menu)
8
+ (for instance, use filter with svn_list to delete unneeded files)
9
+
10
+ version 0.0.3
11
+ * added (installer unit tests)
12
+
1
13
  version 0.0.2
2
14
  * initial release
3
15
  * run as PHP app (Ruby installation still required)
data/Manifest CHANGED
@@ -3,6 +3,7 @@ cgi/svn_wc_broker.cgi
3
3
  ChangeLog
4
4
  lib/svn_wc_broker.rb
5
5
  lib/svn_wc_client.rb
6
+ tests/test_installer_bin.rb
6
7
  LICENSE
7
8
  Manifest
8
9
  README.rdoc
@@ -11,7 +12,6 @@ svn_wc_tree/css/swt.css
11
12
  svn_wc_tree/img/swt_spinner.gif
12
13
  svn_wc_tree/index.html
13
14
  svn_wc_tree/index.php
14
- svn_wc_tree.conf
15
15
  svn_wc_tree/js/swt.js
16
16
  svn_wc_tree/js/jquery-1.3.2.js
17
17
  svn_wc_tree/js/jquery.blockUI-2.31.js
data/README.rdoc CHANGED
@@ -1,12 +1,12 @@
1
1
  = svn_wc_tree
2
2
 
3
3
  A Web application front end that operates on the working copy of an
4
- Subversion (SVN) repository.
4
+ Subversion (SVN) repository. (See Requirements)
5
5
 
6
6
 
7
7
  == VERSION:
8
8
 
9
- Version 0.0.3
9
+ Version 0.0.5
10
10
 
11
11
  NOTE: THIS IS ALPHA QUALITY SOFTWARE, use at your own risk!
12
12
 
@@ -293,7 +293,7 @@ See the ChangeLog file for details.
293
293
  Copyright 2010 David Wright (david_v_wright@yahoo.com), all rights reserved.
294
294
 
295
295
 
296
- svn_wc_tree 0.0.3 is released under the LGPL license.
296
+ svn_wc_tree 0.0.5 is released under the LGPL license.
297
297
 
298
298
 
299
299
  == AUTHOR:
data/bin/svn_wc_tree CHANGED
@@ -31,29 +31,53 @@
31
31
  # location (filesystem path) of your svn_wc.conf file (readable by 'httpd
32
32
  # runs as' owner)
33
33
  #
34
- # --move_conf_from, -f [move_conf_from]:
35
- # move your conf file (svn_wc_tree.conf) from filesystem path to
36
- # (move_conf_to)
34
+ # --copy_conf_from, -f [copy_conf_from]:
35
+ # copy your conf file (svn_conf.yaml) from filesystem path to
36
+ # (copy_conf_to)
37
37
  #
38
- # --move_conf_to, -t [move_conf_to]:
39
- # move your conf file (svn_wc_tree.conf) to filesystem path from
40
- # (move_conf_from)
38
+ # --copy_conf_to, -t [copy_conf_to]:
39
+ # copy your conf file (svn_conf.yaml) to filesystem path from
40
+ # (copy_conf_from)
41
41
  #
42
42
  #
43
43
  # Example:
44
- # svn_wc_tree --html /var/htdocs --cgi /var/cgi-bin \
45
- # --post_to_url 'http://example.com/cgi-bin/ \
46
- # --conf_location /opt/conf/svn_conf.yaml
47
- #
48
- # sudo svn_wc_tree --html /var/htdocs --post_to_url 'cgi-bin/cgi.rb'
49
44
  #
45
+ # # install into /var/htdocs, post to PHP, use conf file already at location
50
46
  # sudo svn_wc_tree --html /var/htdocs --php true \
51
47
  # --conf_location /opt/svn_wc_tree/svn_conf.yaml
52
48
  #
49
+ # # install (app/html/js) into /var/htdocs
50
+ # # install CGI into /var/cgi-bin
51
+ # # post to CGI script at 'http://example.com/cgi-bin/svn_wc_broker.cgi'
52
+ # # (install at path: /var/cgi-bin)
53
+ # # use conf file already at location
54
+ # svn_wc_tree --html /var/htdocs --cgi /var/cgi-bin \
55
+ # --post_to_url 'http://example.com/cgi-bin/svn_wc_broker.cgi' \
56
+ # --conf_location /opt/conf/svn_conf.yaml
57
+ #
58
+ # # install (app/html/js) into /var/htdocs
59
+ # # install CGI into /var/cgi-bin
60
+ # # post to CGI (pre existing script) at 'cgi-bin/cgi.rb' (must be relative
61
+ # # to the app html dir, or fully qualified path)
62
+ # # conf file path already added to the pre existing cgi you wrote
63
+ # sudo svn_wc_tree --html /var/htdocs --post_to_url 'cgi-bin/cgi.rb'
64
+ #
65
+ # # install app into /var/www
66
+ # # install CGI into /usr/lib/cgi-bin
67
+ # # post to CGI (use apps provided cgi script - installed with --cgi)
68
+ # # using fully qualified path)
69
+ # # copy conf file from /tmp/svn_conf.yaml to /usr/local/svn_wc_tree dir/)
53
70
  # sudo svn_wc_tree --html /var/www --cgi /usr/lib/cgi-bin \
54
- # --post_to_url 'http://localhost/cgi-bin/' --move_conf_from \
55
- # /tmp/svn_conf.yaml --move_conf_to /usr/local/svn_wc_tree
56
-
71
+ # --post_to_url 'http://localhost/cgi-bin/svn_wc_broker.cgi' \
72
+ # --copy_conf_from /tmp/svn_conf.yaml \
73
+ # --copy_conf_to /usr/local/svn_wc_tree
74
+ #
75
+ # # install app into `$HOME`/public_html
76
+ # # post to PHP (resource provided by this app)
77
+ # # copy conf file from, to
78
+ # sudo svn_wc_tree --html ~/public_html --php true \
79
+ # --copy_conf_from `pwd`/svn_conf.yaml \
80
+ # --copy_conf_to /home/dwright/test_svn/wc
57
81
 
58
82
  require 'getoptlong'
59
83
  require 'rdoc/usage'
@@ -66,17 +90,17 @@ opts = GetoptLong.new(
66
90
  [ '--cgi', '-c', GetoptLong::OPTIONAL_ARGUMENT],
67
91
  [ '--php', '-p', GetoptLong::OPTIONAL_ARGUMENT],
68
92
  [ '--conf_location', '-o', GetoptLong::OPTIONAL_ARGUMENT],
69
- [ '--move_conf_from', '-f', GetoptLong::OPTIONAL_ARGUMENT],
70
- [ '--move_conf_to' , '-t', GetoptLong::OPTIONAL_ARGUMENT]
93
+ [ '--copy_conf_from', '-f', GetoptLong::OPTIONAL_ARGUMENT],
94
+ [ '--copy_conf_to' , '-t', GetoptLong::OPTIONAL_ARGUMENT]
71
95
  )
72
96
 
73
97
  html_dir = nil
74
98
  cgi_dir = nil
75
- php = nil
99
+ @php = false
76
100
  post_to_url = 'index.php' # assume php mode
77
101
  conf_location = nil
78
- move_conf_from = nil
79
- move_conf_to = nil
102
+ copy_conf_from = nil
103
+ copy_conf_to = nil
80
104
 
81
105
  opts.each do |opt, arg|
82
106
  case opt
@@ -89,36 +113,36 @@ opts.each do |opt, arg|
89
113
  when '--cgi'
90
114
  if arg != '' then cgi_dir = arg end
91
115
  when '--php'
92
- if arg != '' then php = true end
116
+ if arg != '' then @php = true end
93
117
  when '--post_to_url'
94
118
  #if php then raise ArgumentError, 'post_to_url, is not used when php'
95
119
  if arg != '' then post_to_url = arg end
96
120
  when '--conf_location'
97
121
  if arg != '' then conf_location = arg end
98
- when '--move_conf_from'
99
- if arg != '' then move_conf_from = arg end
100
- when '--move_conf_to'
101
- if arg != '' then move_conf_to = arg end
122
+ when '--copy_conf_from'
123
+ if arg != '' then copy_conf_from = arg end
124
+ when '--copy_conf_to'
125
+ if arg != '' then copy_conf_to = arg end
102
126
  end
103
127
  end
104
128
 
105
129
  # methods
106
130
 
107
- def handle_conf(move_conf_from, move_conf_to, cgi_dir=nil)
131
+ def handle_conf(copy_conf_from, copy_conf_to, cgi_dir=nil)
132
+ raise "#{copy_conf_to} is a file!" if File.file? copy_conf_to
133
+ FileUtils.mkdir copy_conf_to unless File.directory? copy_conf_to
134
+
108
135
  begin
109
- FileUtils.mkdir move_conf_to
110
- FileUtils.cp move_conf_from, move_conf_to
136
+ FileUtils.cp copy_conf_from, copy_conf_to
111
137
  rescue
112
- #puts "Destination conf file exists #{move_conf_to}"
138
+ #puts "Destination conf file exists #{copy_conf_to}"
113
139
  end
114
140
  # now edit lib to set conf_file path
115
- to_path = File.dirname(move_conf_to) # moved to path
116
- to_name = File.basename(move_conf_from) # name of conf file
117
- conf_abs_path = File.join(to_path, to_name)
141
+ conf_abs_path = File.join(copy_conf_to, File.basename(copy_conf_from))
118
142
  set_conf_file_in_cgi(cgi_dir, conf_abs_path) if cgi_dir
119
143
  end
120
144
 
121
- def set_conf_file_in_cgi(cgi_dir, conf_location, php=nil)
145
+ def set_conf_file_in_cgi(cgi_dir, conf_location)
122
146
  cgi_file = File.join(cgi_dir, 'svn_wc_broker.cgi')
123
147
  File.open(cgi_file, 'r+') do |cf|
124
148
  lines = cf.readlines
@@ -126,7 +150,7 @@ def set_conf_file_in_cgi(cgi_dir, conf_location, php=nil)
126
150
  el.gsub! /CONF_FILE = nil/,
127
151
  "CONF_FILE = '#{conf_location}'"
128
152
  # dont print header when run under php
129
- el.gsub! /print cgi.header/, '#print cgi.header' if php
153
+ el.gsub! /print cgi.header/, '#print cgi.header' if @php
130
154
  end
131
155
  cf.pos = 0
132
156
  cf.print lines
@@ -171,9 +195,9 @@ rescue Exception => e
171
195
  end
172
196
 
173
197
  # cgi script
174
- cgi_path = html_dest if php
198
+ cgi_path = html_dest if @php
175
199
  # if set, will overwrite php cgi url
176
- cgi_path = cgi_dir if cgi_dir
200
+ cgi_path = cgi_dir if cgi_dir
177
201
 
178
202
  if cgi_path
179
203
  begin
@@ -188,7 +212,7 @@ end
188
212
  if conf_location
189
213
  if cgi_path and conf_location
190
214
  begin
191
- set_conf_file_in_cgi(cgi_path, conf_location, php)
215
+ set_conf_file_in_cgi(cgi_path, conf_location)
192
216
  rescue Exception => e
193
217
  puts "line:#{__LINE__} Exception: #{e.message}"
194
218
  exit 1
@@ -206,12 +230,12 @@ end
206
230
 
207
231
  begin
208
232
  # conf file
209
- if move_conf_from or move_conf_to
210
- if not (move_conf_from and move_conf_to)
211
- puts 'if using "move_", both move_conf_to and move_conf_from must be set'
233
+ if copy_conf_from or copy_conf_to
234
+ if not (copy_conf_from and copy_conf_to)
235
+ puts 'if using "copy_", both copy_conf_to and copy_conf_from must be set'
212
236
  exit 1
213
237
  end
214
- handle_conf(move_conf_from, move_conf_to, cgi_dir)
238
+ handle_conf(copy_conf_from, copy_conf_to, cgi_path)
215
239
  end
216
240
  rescue Exception => e
217
241
  puts "line:#{__LINE__} Exception: #{e.message}"
data/lib/svn_wc_broker.rb CHANGED
@@ -21,12 +21,11 @@ require 'svn_wc_client'
21
21
  #
22
22
  # Broker requests between web app (AJAX) to svn_wc_client
23
23
  #
24
- # (this probably totally unnecessary and can be done away with
25
- # is left over form an early design decision which has
26
- # already changed)
24
+ # (this script is probably unnecessary and can be done away with
25
+ # it's left over from an early design decision which has changed)
27
26
  #
28
- # mostly what it does is populate the top level array element with :run_error
29
- # with any exception that occurs: #repo[0]={:run_error => "Error: #{e.message}"}
27
+ # what it does: populate the top level array element with :run_error
28
+ # set to any exception that occurs: #repo[0]={:run_error => "Error: #{e.message}"}
30
29
  #
31
30
  module SvnWcBroker
32
31
 
@@ -41,7 +40,7 @@ module SvnWcBroker
41
40
  # set abs_path to your configuration file
42
41
  def set_conf_file(conf) ; @conf_file = conf ; end
43
42
 
44
- # makes the requests against svn_wc
43
+ # makes the requests against our lib which, uses the ruby gem lib 'svn_wc'
45
44
  include SvnRepoClient
46
45
 
47
46
  # pass web requests in, handle defined actions, return results
@@ -49,9 +48,11 @@ module SvnWcBroker
49
48
  # contains our web POST request
50
49
  def handle_responses(params)
51
50
 
52
- # to debug
51
+ #--
52
+ # to debug during devel
53
53
  #return svn_results debug_request(params['do_svn_action'])
54
54
  #return svn_results debug_request(params.to_s.to_a)
55
+ #++
55
56
  if params['do_svn_action'] \
56
57
  && (params['do_svn_action'].to_s == 'Do Svn Action')
57
58
 
@@ -59,7 +60,7 @@ module SvnWcBroker
59
60
  if params and params['svn_action'].to_s.strip.empty?
60
61
  return svn_results
61
62
  else
62
- return svn_results send( :do_requested_action, params )
63
+ return svn_results( send(:do_requested_action, params) )
63
64
  end
64
65
 
65
66
  else
@@ -93,7 +94,14 @@ module SvnWcBroker
93
94
  end
94
95
 
95
96
  end
96
- eval("svn_#{action}") if SUPPORTED_ACTIONS.index(action)
97
+ # eval known actions only
98
+ # svn_list takes args # svn_status takes args
99
+ if action == 'list' || action == 'status'
100
+ eval("svn_#{action}('#{params['filter_re']}','#{params['filter_amt']}')")
101
+ else
102
+ # danger will robinson, only eval known supported actions
103
+ eval("svn_#{action}") if SUPPORTED_ACTIONS.index(action)
104
+ end
97
105
  rescue Exception => exn
98
106
  resp_data[0] = {:run_error => "Error: #{exn.message}"}
99
107
  end
@@ -106,7 +114,7 @@ module SvnWcBroker
106
114
  run_error = String.new
107
115
 
108
116
  begin
109
- svn_status_list = svn_status
117
+ svn_status_list = svn_status(params['filter_re'], params['filter_amt'])
110
118
  rescue Exception => e
111
119
  run_error << e.message
112
120
  end
data/lib/svn_wc_client.rb CHANGED
@@ -18,7 +18,7 @@ require 'svn_wc'
18
18
 
19
19
  #
20
20
  # receives method/action requests from web app (AJAX) returns data in expected format
21
- # is just a client of svn_wc
21
+ # is just a 'simple' client of ruby gem lib 'svn_wc'
22
22
  #
23
23
  # returned data is generally a array of anonymous hashes containing
24
24
  # svn entries info, or errors.
@@ -33,6 +33,7 @@ require 'svn_wc'
33
33
  # each_details[:repo_root_local_path] = File.join(@repo_root, '/')
34
34
  #
35
35
  module SvnRepoClient
36
+ STATUS_SPACER = "\t" # swt.js (js/jqtree file uses this)
36
37
 
37
38
  @@svn_wc = SvnWc::RepoAccess.new
38
39
 
@@ -41,53 +42,66 @@ module SvnRepoClient
41
42
 
42
43
  # if conf file exists and have a working copy of the repo, return the path
43
44
  # to it, otherwise create it (do a checkout, not forced)
45
+ # set force_checkout = true to force a checkout
44
46
  # returns svn_repo_working_copy abs_path
45
47
  def get_repo
46
48
  if File.file? @conf_file
47
49
  @@svn_wc.set_conf @conf_file
48
50
  else raise ArgumentError, "config file not found! #{@conf_file}" end
49
51
 
50
- if not File.directory? @@svn_wc.svn_repo_working_copy
51
- begin
52
- @@svn_wc.do_checkout true
53
- rescue SvnWc::RepoAccessError => e
54
- raise e.message
52
+ #if not File.directory? @@svn_wc.svn_repo_working_copy
53
+ begin
54
+ if not File.directory? @@svn_wc.svn_repo_working_copy \
55
+ or @@svn_wc.force_checkout
56
+ #@@svn_wc.do_checkout(true, @@svn_wc.force_checkout)
57
+ @@svn_wc.do_checkout(true)
55
58
  end
59
+ rescue SvnWc::RepoAccessError => e
60
+ raise e.message
56
61
  end
57
62
  @repo_root = @@svn_wc.svn_repo_working_copy
58
63
  end
59
64
 
60
- # basic status list of entries in repo root
61
- # do checkout if not exists at local path
62
- def svn_status
65
+ def svn_status(f_regex=nil, f_amt=nil)
63
66
  get_repo
64
- st_list = Array.new
65
- ent = Array.new
67
+ repo_entries = Array.new
66
68
  begin
67
- @@svn_wc.status.each do |ef|
68
- each_details = Hash.new
69
- each_details[:status] = ef[:status]
70
- each_details[:error] = ''
71
- each_details[:entry_name] = ef[:path]
72
- each_details[:kind] = 1 # is 'file'
73
- if File.directory?(File.join(@repo_root, ef[:path]))
74
- each_details[:dir_name] = File.join(@repo_root, el)
75
- each_details[:kind] = 2 # is dir
76
- end
77
- ent.push each_details
78
- end
79
- add_repo_as_dir = Hash.new
80
- add_repo_as_dir[:dir_name] = @repo_root
81
- add_repo_as_dir[:kind] = 2
82
- ent.push add_repo_as_dir
69
+ l_svn_list = Array.new
70
+ @@svn_wc.status.each { |el|
71
+ status_info = {}
72
+ #status_info[:last_changed_rev] = el[:last_changed_rev]
73
+ status_info[:status] = el[:status]
74
+ status_info[:error] = ''
75
+ status_info[:entry_name] = el[:path]
76
+ if File.directory?(File.join(@repo_root, el[:path]))
77
+ status_info[:kind] = 2 # is dir
78
+ else
79
+ status_info[:kind] = 1 # is 'file'
80
+ end
81
+ #apply filter - limit result set with filter
82
+ #f_regex, f_amt = 'cof/htdocs/template', 10
83
+ if f_regex.nil?
84
+ l_svn_list.push status_info
85
+ elsif el[:path].match(f_regex)
86
+ l_svn_list.push status_info
87
+ end
88
+ #l_svn_list.push status_info
89
+ if f_amt.nil? or f_amt.empty?
90
+ elsif l_svn_list.size > f_amt.to_i
91
+ break
92
+ end
93
+ }
94
+
95
+ @entries_list = _to_expected_json_format(l_svn_list)
96
+ repo_entries.push info_data
83
97
  rescue SvnWc::RepoAccessError => e
98
+ #@error = e.message
84
99
  @error = "#{e.message} #{@@svn_wc}"
85
- st_list.push info_data
100
+ repo_entries.push info_data
86
101
  end
87
- @entries_list = ent
88
- st_list.push info_data if ent.length > 0
89
- st_list
102
+ repo_entries
90
103
  end
104
+
91
105
 
92
106
  # diff current to previous (HEAD only)
93
107
  # returns diff content
@@ -218,23 +232,37 @@ module SvnRepoClient
218
232
 
219
233
  # recursively list entries, provides file or dir info and access to
220
234
  # nice repo/file info
221
- def svn_list
235
+ def svn_list(f_regex=nil, f_amt=nil)
222
236
  get_repo
223
237
  repo_entries = Array.new
224
238
  begin
225
239
  l_svn_list = Array.new
226
240
  @@svn_wc.list.each { |el|
227
241
  status_info = {}
228
- status_info[:entry_name] = el[:entry]
229
- status_info[:kind] = 1 # is 'file'
242
+ fqpn = File.join(@repo_root, el[:entry])
230
243
  #status_info[:last_changed_rev] = el[:last_changed_rev]
231
- if File.directory?(File.join(@repo_root, el[:entry]))
232
- status_info[:dir_name] = File.join(@repo_root, el[:entry])
233
- status_info[:kind] = 2
244
+ status_info[:entry_name] = fqpn
245
+ status_info[:status] = ' '
246
+ if File.directory? fqpn
247
+ status_info[:kind] = 2 # is dir
248
+ else
249
+ status_info[:kind] = 1 # is 'file'
250
+ end
251
+ #apply filter - limit result set with filter
252
+ #f_regex, f_amt = 'cof/htdocs/template', 10
253
+ if f_regex.nil?
254
+ l_svn_list.push status_info
255
+ elsif el[:entry].match(f_regex)
256
+ l_svn_list.push status_info
257
+ end
258
+ #l_svn_list.push status_info
259
+ if f_amt.nil? or f_amt.empty?
260
+ elsif l_svn_list.size > f_amt.to_i
261
+ break
234
262
  end
235
- l_svn_list.push status_info
236
263
  }
237
- @entries_list = l_svn_list
264
+ #@entries_list = l_svn_list
265
+ @entries_list = _to_expected_json_format(l_svn_list)
238
266
  repo_entries.push info_data
239
267
  rescue SvnWc::RepoAccessError => e
240
268
  @error = e.message
@@ -243,6 +271,53 @@ module SvnRepoClient
243
271
  repo_entries
244
272
  end
245
273
 
274
+ def _collect_and_group(file_info_list)
275
+
276
+ entries_group_by_dir = {}
277
+ file_info_list.each do |el|
278
+ en = el[:entry_name]
279
+ if el[:kind] == 2
280
+ entries_group_by_dir[en] = [] unless entries_group_by_dir[en]
281
+ entries_group_by_dir[en].push en
282
+ elsif el[:kind] == 1
283
+ entries_group_by_dir[File.dirname(en)] = [] unless entries_group_by_dir[File.dirname(en)]
284
+ entries_group_by_dir[File.dirname(en)].push "#{en}:#{el[:status]}"
285
+ end
286
+ end
287
+
288
+ entries_group_by_dir
289
+ end
290
+
291
+ def _to_expected_json_format(file_info_list)
292
+ require 'enumerator' # to_enum :each_with_index
293
+
294
+ entries_group_by_dir = _collect_and_group(file_info_list)
295
+
296
+ entries_formatted = {}
297
+ entries_formatted[:children] = []
298
+ atts = {}
299
+ atts[:id] = ''
300
+ c_entries = {}
301
+ c_entries[:attributes] = atts
302
+ c_entries[:data] = ''
303
+ entries = []
304
+ id = 0
305
+ entries_group_by_dir.each do |k|
306
+ entries_formatted[:state] = 'open'
307
+ entries_formatted[:data] = k[0]
308
+ entries_formatted[:children] = k[1].to_enum(:each_with_index).collect{|x,i|
309
+ next unless x and x.split(':')[1]
310
+ {:attributes => {:id => i}, :data => x.split(':')[1] + STATUS_SPACER + x.split(':')[0]}
311
+ }
312
+ entries.push entries_formatted
313
+ entries_formatted = {}
314
+ c_entries = {}
315
+ end
316
+
317
+ entries
318
+
319
+ end
320
+
246
321
  def info_data
247
322
  each_details = Hash.new
248
323
  each_details[:file] = @path
@@ -264,3 +339,25 @@ module SvnRepoClient
264
339
  end
265
340
 
266
341
  end
342
+
343
+ if __FILE__ == $0
344
+ @conf_file = '/home/httpd/radmin/config/svn_conf.yaml'
345
+ #p SvnRepoClient::svn_list
346
+ #p svn_list
347
+ #p svn_list
348
+ #p Object.new.extend(self).svn_list
349
+
350
+ class Object
351
+ require 'fileutils'
352
+ require 'svn_wc_client'
353
+ include SvnRepoClient
354
+ #svn_list
355
+ end
356
+ #p eval("svn_list")
357
+ p svn_list
358
+ #p SvnRepoClient::svn_list
359
+ #p Tester.new.svn_list
360
+
361
+
362
+ end
363
+
data/svn_conf.yaml CHANGED
@@ -1,9 +1,14 @@
1
- #svn_repo_master : file:///tmp/svn/repo_test
2
- #svn_repo_master : svn+ssh:///tmp/svnrepo
3
- svn_repo_master : svn+ssh://svn_test_user@localhost/tmp/svnrepo
4
- #svn_repo_master : svn+ssh://example.com/tmp/svnrepo
5
- svn_repo_working_copy : /tmp/repo_test
6
- svn_user : svn_test_user
7
- svn_pass : svn_test_pass
8
- svn_repo_config_path : /tmp/config
1
+ ##svn_repo_master : file:///tmp/svn/repo_test
2
+ ##svn_repo_master : svn+ssh:///tmp/svnrepo
3
+ #svn_repo_master : svn+ssh://svn_test_user@localhost/tmp/svnrepo
4
+ ##svn_repo_master : svn+ssh://example.com/tmp/svnrepo
5
+ #svn_repo_working_copy : /tmp/repo_test
6
+ #svn_user : svn_test_user
7
+ #svn_pass : svn_test_pass
8
+ #svn_repo_config_path : /tmp/config
9
+
10
+ svn_repo_master : file:///home/dwright/test_svn/test_repo
11
+ svn_repo_working_copy : /home/dwright/test_svn/wc
12
+ svn_repo_config_path : /home/dwright/test_svn/
13
+ force_checkout : true
9
14
 
@@ -124,7 +124,12 @@
124
124
  <input type='hidden' id="svn_local_repo_root" value='' />
125
125
 
126
126
  <a id='disp_repo_info'>~</a><div id="display_repo_info" class="disp_no"></div>
127
-
127
+ <br/>
128
+ <br/>
129
+ Filter: <input type='text' id='swt_filter_re' size='25'/> [Limit by Terms, Regex Ok]<br/>
130
+ Filter: <input type='text' id='swt_filter_amt' size='3'/> [Limit by Amount]
131
+ <br/>
132
+ <br/>
128
133
  <!-- start: show results from svn actions -->
129
134
  <div id="show_hide_container" class="disp_no">
130
135
  <a id="hide_n_show">[-]</a>
@@ -20,6 +20,9 @@ var POST_URL = '';
20
20
  ///////////////////////////////////////////////////////////////////////////////
21
21
 
22
22
  //XXX/TODO this file needs to be refactored
23
+ // TODO upgrade to 1.0.a, or whatever newest of jstree is, unfortunelty
24
+ // the API does not appear to be backwards compatible, so a rewrite will be
25
+ // needed
23
26
 
24
27
  var STATUS_SPACER = "\t"; // "&nbsp;"
25
28
  var SVN_ACTION = '';
@@ -47,11 +50,13 @@ $.blockUI.defaults.css =
47
50
  //$.blockUI.defaults.applyPlatformOpacityRules = false;
48
51
  $(document).ajaxStart($.blockUI).ajaxStop($.unblockUI);
49
52
 
50
-
51
53
  $(document).ready(function(){
52
54
  var CHECKED_FILE_NAMES = []
53
55
  var SVN_ENTRIES = []
54
56
 
57
+ // 'onload' populate 'keep filter' if has been set
58
+ keep_filter($.cookie('swt_filter_re'));
59
+
55
60
  // the repo tree
56
61
  $(function () {
57
62
  $("#svn_repo_entries_tree").tree({
@@ -177,6 +182,10 @@ $(document).ready(function(){
177
182
  refresh : {
178
183
  label : "refresh tree",
179
184
  action : function (NODE, TREE_OBJ) {
185
+ var re_filter = $("#swt_filter_re").val();
186
+ //console.log(re_filter);
187
+ // set current filter to a cookie
188
+ $.cookie('swt_filter_re', re_filter);
180
189
  window.location.reload();
181
190
  //history.go();
182
191
  },
@@ -243,24 +252,23 @@ $(document).ready(function(){
243
252
  return {
244
253
  'do_svn_action': 'Do Svn Action',
245
254
  'svn_action' : SVN_ACTION,
246
- 'svn_files' : [gather_selected_files()]
255
+ 'svn_files' : [gather_selected_files()],
256
+ 'filter_re' : $("#swt_filter_re").val(),
257
+ 'filter_amt' : $("#swt_filter_amt").val()
247
258
  }
248
259
  }
249
260
  }
250
261
  });
251
262
  });
252
263
 
264
+ // XXX this is called for all ajax requests (i.e. 'refresh')
253
265
  function on_data(DATA, TREE_OBJ) {
254
266
  //console.log('on DATA'); console.log(DATA);
255
267
  if (!DATA) document.write('No Data received, possibly your session expired');
256
268
 
257
269
  var entries_list = new Array
270
+
258
271
  if (DATA && DATA.length) {
259
- var f_nodes = {
260
- 'state' : 'open',
261
- 'data' : DATA[0].repo_root_local_path,
262
- 'children' : new Array
263
- };
264
272
  $("#svn_local_repo_root").val(DATA[0].repo_root_local_path);
265
273
 
266
274
  // display high level repo info
@@ -268,49 +276,49 @@ $(document).ready(function(){
268
276
 
269
277
  if (DATA[0].run_error) return display_error_message(DATA[0].run_error);
270
278
  if (DATA[0].error) return display_error_message(DATA[0].error);
279
+ if (DATA[0].entries == undefined) display_error_message('no result');
271
280
 
272
-
273
- var f_node_children = new Array;
274
- var has_status = ' ';
275
- var repo_initial_state = 'open'; // open|closed
276
281
  var amount_of_entries = DATA[0].entries.length;
277
- if (amount_of_entries == 1) repo_up_to_date();
278
- //if (amount_of_entries < 10) repo_initial_state = 'open';
279
- // set hidden text field to repo root fs local path
282
+ if (amount_of_entries == 0) {
283
+ if ($("#swt_filter_re").val()) report_no_match_if_filter();
284
+ else repo_up_to_date();
285
+
286
+ // use repo root as default when no results
287
+ var repo_default = {
288
+ 'state' : 'open',
289
+ 'data' : DATA[0].repo_root_local_path
290
+ }
291
+ entries_list.push(repo_default);
292
+ }
280
293
  for (i = 0; i<amount_of_entries; i++) {
281
294
  ent = DATA[0].entries[i];
282
295
  if (ent === undefined) continue;
283
- if (ent.kind == 2){ // dir
284
- f_nodes = {
285
- 'state' : repo_initial_state,
286
- 'data' : ent.dir_name,
287
- 'children' : f_node_children
288
- };
289
- entries_list.push(f_nodes)
290
- f_node_children = new Array;
291
- } // regular file
292
- else if (ent.kind == 1){ // file
293
- if (ent.status) has_status = ent.status
294
- var f_node_child = {
295
- 'attributes' : {'id' : i},
296
- data : has_status + STATUS_SPACER + ent.entry_name
297
- };
298
- f_node_children.push(f_node_child)
299
- }
296
+ //console.log(ent);
297
+ entries_list.push(ent);
300
298
  }
301
299
  }
302
300
  //console.log(entries_list);
303
301
  return entries_list;
304
302
  }
305
303
 
306
- function repo_up_to_date(f_nodes){
307
- var entries_list = new Array
304
+ function keep_filter(re_filter){
305
+ //console.log(re_filter);
306
+ $("#swt_filter_re").val(re_filter);
307
+ }
308
+
309
+ // limit result set with filter
310
+ function is_filtered(file_name, re_filter){
311
+ if(!file_name.match(re_filter)) return true;
312
+ return false;
313
+ }
314
+
315
+ function report_no_match_if_filter(){
316
+ $("#svn_action_results").prepend('<p style="color:blue">No Match.</p>');
317
+ }
318
+
319
+ function repo_up_to_date(){
308
320
  $("#svn_action_results").prepend('<p style="color:blue">'
309
321
  + 'Repository is up to date.</p>');
310
- //if (DATA[0].entries === undefined){
311
- // entries_list.push(f_nodes)
312
- //}
313
- //return entries_list;
314
322
  }
315
323
 
316
324
  function post_req_non_svn(action) {
@@ -393,7 +401,8 @@ $(document).ready(function(){
393
401
  var run_err = undefined;
394
402
  if (resp && resp[0] && resp[0].run_error) run_err = resp[0].run_error;
395
403
  else if (resp && resp.run_error) run_err = resp.run_error;
396
- if (run_err) return display_error_message(resp.run_error);
404
+
405
+ if (run_err) return display_error_message(resp.run_error);
397
406
 
398
407
  // update tree display post success action
399
408
  if (svn_action == 'commit') change_display_selected_files(STATUS_SPACER);
@@ -408,36 +417,36 @@ $(document).ready(function(){
408
417
 
409
418
  display_svn_results = process_content_and_entries(resp[i], svn_action,
410
419
  display_svn_results);
420
+ //console.log(display_svn_results);
411
421
  }
412
422
 
413
423
  if (show_response_area) $('#show_hide_container').show();
414
424
  // populate our div
415
425
  $("#svn_action_results").html(display_svn_results);
416
426
  }
417
-
418
427
 
419
- function process_content_and_entries(jdata, svn_action, display_svn_results){
420
- var error = '';
421
- var contents = '';
428
+ function process_content_and_entries(jdata, svn_action, display_svn_results){
429
+ var error = '';
430
+ var contents = '';
422
431
 
423
- if (jdata.error) error = '<p style="color:red">'+jdata.error+'</p>';
432
+ if (jdata.error) error = '<p style="color:red">'+jdata.error+'</p>';
424
433
 
425
- // used for 'diff'
426
- if (jdata.content) // expand newline to line break, '<' to html entity
427
- contents += jdata.content.replace(/</g, '&lt;').replace(/\n/g, '<br/>');
434
+ // used for 'diff'
435
+ if (jdata.content) // expand newline to line break, '<' to html entity
436
+ contents += jdata.content.replace(/</g, '&lt;').replace(/\n/g, '<br/>');
428
437
 
429
- if (jdata.entries) process_entries(jdata.entries, svn_action);
438
+ //if (jdata.entries) process_entries(jdata.entries, svn_action);
430
439
 
431
- if (jdata.repo_root_local_path)
432
- $("#svn_local_repo_root").val(jdata.repo_root_local_path);
440
+ if (jdata.repo_root_local_path)
441
+ $("#svn_local_repo_root").val(jdata.repo_root_local_path);
433
442
 
434
- if (contents)
435
- display_svn_results += error + '<p style="color:grey">'+contents+'</p>';
436
- else
437
- display_svn_results += error;
443
+ if (contents)
444
+ display_svn_results += error + '<p style="color:grey">'+contents+'</p>';
445
+ else
446
+ display_svn_results += error;
438
447
 
439
- return display_svn_results;
440
- }
448
+ return display_svn_results;
449
+ }
441
450
 
442
451
  function process_entries(entries, svn_action){
443
452
  SVN_ENTRIES = entries;
@@ -465,8 +474,6 @@ $(document).ready(function(){
465
474
  }
466
475
 
467
476
  function change_display_selected_files(to_show){
468
- //console.log(CHECKED_FILE_NAMES);
469
-
470
477
  for(j=0;j<CHECKED_FILE_NAMES.length;j++){
471
478
  if(CHECKED_FILE_NAMES[j] !== undefined){
472
479
  //remove the status, was committed (i.e 'M', or '?', '!', etc)
@@ -478,7 +485,6 @@ $(document).ready(function(){
478
485
  $.tree.focused().remove('#' + j, ent);
479
486
  }
480
487
  }
481
-
482
488
  }
483
489
 
484
490
 
@@ -0,0 +1,430 @@
1
+ require 'test/unit'
2
+ require 'fileutils'
3
+ require 'tempfile'
4
+
5
+ # unit tests to prove installation of svn_wc_tree
6
+ # just testing the bin/ installer
7
+
8
+ class TestSvnWcTreeBinInstaller < Test::Unit::TestCase
9
+
10
+ INSTALLER = File.join(File.dirname(__FILE__), "..", "bin", 'svn_wc_tree')
11
+
12
+ # --html, -l [html_dir]:
13
+ # Move all web files to the directory path specified.
14
+ # A directory called svn_wc_tree will be created at this path.
15
+ #
16
+ # --cgi, -c [cgi_dir]:
17
+ # Move the included CGI script to the path specified.
18
+ # path/directory must exist and must be able to execute CGI scripts
19
+ #
20
+ # --post_to_url, -u [post_to_url]:
21
+ # a URL that will receive AJAX requests and return the required JSON.
22
+ # (see the CGI script provided)
23
+ #
24
+ # --php, -p [php]:
25
+ # Run as a PHP application. (use only as last choice)
26
+ # (Ruby is still required; CGI not needed)
27
+ #
28
+ # --conf_location, -u [conf_location]:
29
+ # location (filesystem path) of your svn_wc.conf file (readable by 'httpd
30
+ # runs as' owner)
31
+ #
32
+ # --copy_conf_from, -f [copy_conf_from]:
33
+ # move your conf file (svn_conf.yaml) from filesystem path to
34
+ # (copy_conf_to)
35
+ #
36
+ # --copy_conf_to, -t [copy_conf_to]:
37
+ # move your conf file (svn_conf.yaml) to filesystem path from
38
+ # (copy_conf_from)
39
+ #
40
+ #
41
+ # Example:
42
+ # svn_wc_tree --html /var/htdocs --cgi /var/cgi-bin \
43
+ # --post_to_url 'http://example.com/cgi-bin/' \
44
+ # --conf_location /opt/conf/svn_conf.yaml
45
+ #
46
+ # sudo svn_wc_tree --html /var/htdocs --php true \
47
+ # --conf_location /opt/svn_wc_tree/svn_conf.yaml
48
+ #
49
+ # sudo svn_wc_tree --html /var/www --cgi /usr/lib/cgi-bin \
50
+ # --post_to_url 'http://localhost/cgi-bin/' --copy_conf_from \
51
+ # /tmp/svn_conf.yaml --copy_conf_to /usr/local/svn_wc_tree
52
+
53
+ def setup
54
+ @conf = {
55
+ #"svn_repo_master" => "svn+ssh://localhost/home/dwright/svnrepo",
56
+ "svn_repo_master" => "file://#{Dir.mktmpdir('R')}",
57
+ #"svn_user" => "svn_test_user",
58
+ #"svn_pass" => "svn_test_pass",
59
+ "svn_repo_working_copy" => "#{Dir.mktmpdir('F')}",
60
+ "svn_repo_config_path" => Dir.mktmpdir('N')
61
+ }
62
+ #@conf_file = new_unique_file_at_path(Dir.mktmpdir('C'))
63
+ @conf_file = Tempfile.new(%w(conf_ .yaml)).path
64
+ File.open(@conf_file, 'w') {|fl| fl.write YAML::dump(@conf) }
65
+ end
66
+
67
+ def teardown
68
+ FileUtils.rm_r @html_dir if @html_dir
69
+ FileUtils.rm_r @cgi_dir if @cgi_dir
70
+ #FileUtils.rm_r @conf_file
71
+ end
72
+
73
+ def test_no_arg
74
+ assert `#{INSTALLER}`.match('Required argument missing')
75
+ end
76
+
77
+ def test_help
78
+ opt = '--help'
79
+ #assert `#{INSTALLER} #{opt}`.grep(/Usage\n-----\nsvn_wc_tree \[OPTIONS\]/)[0]
80
+ assert `#{INSTALLER} #{opt}`.match('svn_wc_tree: install the svn_wc_tree web application.')
81
+ opt = '-h'
82
+ assert `#{INSTALLER} #{opt}`.match('svn_wc_tree: install the svn_wc_tree web application.')
83
+ end
84
+
85
+ def test_missing_required_arg
86
+ opt = '--php true'
87
+ assert `#{INSTALLER} #{opt}`.match('Required argument missing')
88
+ end
89
+
90
+ def test_required_arg_empty
91
+ opt = '--html ""'
92
+ assert `#{INSTALLER} #{opt}`.match('path cannot be empty!')
93
+ end
94
+
95
+ def test_most_basic_install_non_functional__no_php_no_cgi_no_conf
96
+ @html_dir = Dir.mktmpdir('H')
97
+
98
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
99
+
100
+ opt = "--html #{@html_dir}"
101
+ # no output, is success
102
+ assert `#{INSTALLER} #{opt}`.empty?
103
+
104
+ # created dir at target location
105
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
106
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
107
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js'))
108
+ end
109
+
110
+ def test_basic_install_functional__no_php_no_cgi_no_conf_POST_to_other_resource
111
+ @html_dir = Dir.mktmpdir('H')
112
+
113
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
114
+
115
+ opts = "--html #{@html_dir} --post_to_url '/svn/svn_controller'"
116
+
117
+ # no output, is success
118
+ assert `#{INSTALLER} #{opts}`.empty?
119
+
120
+ # created dir at target location
121
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
122
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
123
+ js_file = File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js')
124
+ assert File.file? js_file
125
+
126
+ is_ok = false
127
+ File.readlines(js_file).each do |line|
128
+ if line.grep(/var POST_URL = '\/svn\/svn_controller';/)[0]
129
+ is_ok = true
130
+ break
131
+ end
132
+ end
133
+ assert is_ok
134
+ end
135
+
136
+ # works but doesn't make sense,...
137
+ # conf file must be added by hand to the POST resource
138
+
139
+ # why would you want this combination?
140
+ def test_conf_path_not_written_anywhere__install_no_php_no_cgi
141
+ @html_dir = Dir.mktmpdir('H')
142
+
143
+ assert File.file?(@conf_file)
144
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
145
+
146
+ opts = "--html #{@html_dir} --post_to_url '/svn/svn_controller' "
147
+ opts << "--conf_location #{@conf_file}"
148
+
149
+ # no output, is success
150
+ assert `#{INSTALLER} #{opts}`.empty?
151
+
152
+ # created dir at target location
153
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
154
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
155
+ js_file = File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js')
156
+ assert File.file? js_file
157
+
158
+ is_ok = false
159
+ File.readlines(js_file).each do |line|
160
+ if line.grep(/var POST_URL = '\/svn\/svn_controller';/)[0]
161
+ is_ok = true
162
+ break
163
+ end
164
+ end
165
+ assert is_ok
166
+ end
167
+
168
+ def test_default_js_file_POST_url_is_empty
169
+ js_file = File.join(File.dirname(__FILE__), "..",
170
+ 'svn_wc_tree', 'js', 'swt.js')
171
+ assert File.file? js_file
172
+
173
+ is_ok = false
174
+ File.readlines(js_file).each do |line|
175
+ if line.grep(/var POST_URL = '';/)[0]
176
+ is_ok = true
177
+ break
178
+ end
179
+ end
180
+ assert is_ok
181
+ end
182
+
183
+ def test_default_cgi_file_POST_url_is_empty
184
+ cgi_file = File.join('..', 'cgi', 'svn_wc_broker.cgi')
185
+ cgi_file = File.join(File.dirname(__FILE__), "..", 'cgi',
186
+ 'svn_wc_broker.cgi')
187
+ assert File.file? cgi_file
188
+
189
+ is_ok = false
190
+ is_ok2 = false
191
+ File.readlines(cgi_file).each do |line|
192
+ if line.grep(/CONF_FILE = nil/)[0]
193
+ is_ok = true
194
+ next
195
+ end
196
+
197
+ if line.grep(/print cgi.header/)[0]
198
+ is_ok2 = true
199
+ break
200
+ end
201
+
202
+ end
203
+ assert is_ok
204
+ assert is_ok2
205
+ end
206
+
207
+ # conf file must be added by hand to the POST resource (wherever that is)
208
+ def test_install_functional__php_no_conf
209
+ @html_dir = Dir.mktmpdir('H')
210
+
211
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
212
+
213
+ opts = "--html #{@html_dir} --php true"
214
+
215
+ # no output, is success
216
+ assert `#{INSTALLER} #{opts}`.empty?
217
+
218
+ # created dir at target location
219
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
220
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
221
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.php'))
222
+ js_file = File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js')
223
+ assert File.file? js_file
224
+
225
+ is_ok = false
226
+ File.readlines(js_file).each do |line|
227
+ if line.grep(/var POST_URL = 'index.php';/)[0]
228
+ is_ok = true
229
+ break
230
+ end
231
+ end
232
+ assert is_ok
233
+ end
234
+
235
+ def test_install_functional__php_w_conf
236
+ @html_dir = Dir.mktmpdir('H')
237
+
238
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
239
+
240
+ opts = "--html #{@html_dir} --php true "
241
+ opts << "--conf_location #{@conf_file}"
242
+
243
+ # no output, is success
244
+ assert `#{INSTALLER} #{opts}`.empty?
245
+
246
+ # created dir at target location
247
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
248
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
249
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.php'))
250
+ js_file = File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js')
251
+ cgi_file = File.join(@html_dir, 'svn_wc_tree', 'svn_wc_broker.cgi')
252
+ assert File.file? js_file
253
+ assert File.file? cgi_file
254
+
255
+ is_ok = false
256
+ File.readlines(js_file).each do |line|
257
+ if line.grep(/var POST_URL = 'index.php';/)[0]
258
+ is_ok = true
259
+ break
260
+ end
261
+ end
262
+ assert is_ok
263
+
264
+ is_ok = false
265
+ is_ok2 = false
266
+ File.readlines(cgi_file).each do |line|
267
+ if line.grep(/CONF_FILE = '#{@conf_file}'/)[0]
268
+ is_ok = true
269
+ next
270
+ end
271
+ if line.grep(/#print cgi.header/)[0]
272
+ is_ok2 = true
273
+ break
274
+ end
275
+ end
276
+ assert is_ok
277
+ assert is_ok2
278
+ end
279
+
280
+ def test_install_functional__cgi_w_conf
281
+ @html_dir = Dir.mktmpdir('H')
282
+ @cgi_dir = Dir.mktmpdir('C')
283
+
284
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
285
+
286
+ opts = "--html #{@html_dir} --cgi #{@cgi_dir} --conf_location #{@conf_file} "
287
+ opts << "--post_to_url 'http://example.com/cgi-bin/'"
288
+
289
+ # no output, is success
290
+ assert `#{INSTALLER} #{opts}`.empty?
291
+
292
+ # created dir at target location
293
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
294
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
295
+ # is still copied over, do we want that, if not needed?
296
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.php'))
297
+ # not php mode, so not copied to html/php dir
298
+ assert !File.file?(File.join(@html_dir, 'svn_wc_tree', 'svn_wc_broker.cgi'))
299
+
300
+ js_file = File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js')
301
+ cgi_file = File.join(@cgi_dir, 'svn_wc_broker.cgi')
302
+ assert File.file? js_file
303
+ assert File.file? cgi_file
304
+
305
+ is_ok = false
306
+ File.readlines(js_file).each do |line|
307
+ if line.grep(/var POST_URL = 'http:\/\/example.com\/cgi-bin\/';/)[0]
308
+ is_ok = true
309
+ break
310
+ end
311
+ end
312
+ assert is_ok
313
+
314
+ is_ok = false
315
+ File.readlines(cgi_file).each do |line|
316
+ if line.grep(/CONF_FILE = '#{@conf_file}'/)[0]
317
+ is_ok = true
318
+ break
319
+ end
320
+ end
321
+ assert is_ok
322
+ end
323
+
324
+ # TODO
325
+ #def test_cgi_precendence_over_php_if_both_set
326
+ # try mis-matched opts
327
+
328
+ def test_install_functional_cgi_all_opts
329
+ @html_dir = Dir.mktmpdir('H')
330
+ @cgi_dir = Dir.mktmpdir('C')
331
+ @conf_to = Dir.mktmpdir('F')
332
+
333
+ @new_conf = File.join(@conf_to, File.basename(@conf_file))
334
+
335
+ assert !File.directory?(File.join(@html_dir, 'svn_wc_tree'))
336
+ assert File.file?(@conf_file)
337
+ assert !File.file?(@new_conf)
338
+
339
+ opts = "--html #{@html_dir} --cgi #{@cgi_dir} "
340
+ opts << "--post_to_url 'http://example.com/cgi-bin/' "
341
+ opts << "--copy_conf_from #{@conf_file} "
342
+ opts << "--copy_conf_to #{@conf_to} "
343
+ opts << "--conf_location #{@new_conf} "
344
+
345
+ # no output, is success
346
+ assert `#{INSTALLER} #{opts}`.empty?
347
+
348
+ # created dir at target location
349
+ assert File.directory?(File.join(@html_dir, 'svn_wc_tree'))
350
+ assert File.file?(File.join(@html_dir, 'svn_wc_tree', 'index.html'))
351
+ assert File.directory?(@conf_to)
352
+
353
+ js_file = File.join(@html_dir, 'svn_wc_tree', 'js', 'swt.js')
354
+ cgi_file = File.join(@cgi_dir, 'svn_wc_broker.cgi')
355
+ assert File.file? js_file
356
+ assert File.file? cgi_file
357
+
358
+ assert File.file?(@conf_file)
359
+ assert File.file?(@new_conf)
360
+
361
+ is_ok = false
362
+ File.readlines(js_file).each do |line|
363
+ if line.grep(/var POST_URL = 'http:\/\/example.com\/cgi-bin\/';/)[0]
364
+ is_ok = true
365
+ break
366
+ end
367
+ end
368
+ assert is_ok
369
+
370
+ is_ok = false
371
+ File.readlines(cgi_file).each do |line|
372
+ if line.grep(/CONF_FILE = '#{@new_conf}'/)[0]
373
+ is_ok = true
374
+ break
375
+ end
376
+
377
+ if line.grep(/print cgi.header/)[0]
378
+ is_ok = true
379
+ break
380
+ end
381
+ end
382
+ assert is_ok
383
+ end
384
+
385
+
386
+ end
387
+
388
+
389
+ if VERSION < '1.8.7'
390
+ # File lib/tmpdir.rb, line 99
391
+ def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil)
392
+ case prefix_suffix
393
+ when nil
394
+ prefix = "d"
395
+ suffix = ""
396
+ when String
397
+ prefix = prefix_suffix
398
+ suffix = ""
399
+ when Array
400
+ prefix = prefix_suffix[0]
401
+ suffix = prefix_suffix[1]
402
+ else
403
+ raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
404
+ end
405
+ tmpdir ||= Dir.tmpdir
406
+ t = Time.now.strftime("%Y%m%d")
407
+ n = nil
408
+ begin
409
+ path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
410
+ path << "-#{n}" if n
411
+ path << suffix
412
+ Dir.mkdir(path, 0700)
413
+ rescue Errno::EEXIST
414
+ n ||= 0
415
+ n += 1
416
+ retry
417
+ end
418
+
419
+ if block_given?
420
+ begin
421
+ yield path
422
+ ensure
423
+ FileUtils.rm_r path
424
+ end
425
+ else
426
+ path
427
+ end
428
+ end
429
+ end
430
+
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svn_wc_tree
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 21
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 3
9
- version: 0.0.3
9
+ - 5
10
+ version: 0.0.5
10
11
  platform: ruby
11
12
  authors:
12
13
  - David Wright
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-03-12 00:00:00 -08:00
18
+ date: 2010-10-12 00:00:00 -07:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -34,6 +35,7 @@ files:
34
35
  - ChangeLog
35
36
  - lib/svn_wc_broker.rb
36
37
  - lib/svn_wc_client.rb
38
+ - tests/test_installer_bin.rb
37
39
  - LICENSE
38
40
  - Manifest
39
41
  - README.rdoc
@@ -42,7 +44,6 @@ files:
42
44
  - svn_wc_tree/img/swt_spinner.gif
43
45
  - svn_wc_tree/index.html
44
46
  - svn_wc_tree/index.php
45
- - svn_wc_tree.conf
46
47
  - svn_wc_tree/js/swt.js
47
48
  - svn_wc_tree/js/jquery-1.3.2.js
48
49
  - svn_wc_tree/js/jquery.blockUI-2.31.js
@@ -96,23 +97,27 @@ rdoc_options: []
96
97
  require_paths:
97
98
  - lib
98
99
  required_ruby_version: !ruby/object:Gem::Requirement
100
+ none: false
99
101
  requirements:
100
102
  - - ">="
101
103
  - !ruby/object:Gem::Version
104
+ hash: 3
102
105
  segments:
103
106
  - 0
104
107
  version: "0"
105
108
  required_rubygems_version: !ruby/object:Gem::Requirement
109
+ none: false
106
110
  requirements:
107
111
  - - ">="
108
112
  - !ruby/object:Gem::Version
113
+ hash: 3
109
114
  segments:
110
115
  - 0
111
116
  version: "0"
112
117
  requirements: []
113
118
 
114
119
  rubyforge_project:
115
- rubygems_version: 1.3.6
120
+ rubygems_version: 1.3.7
116
121
  signing_key:
117
122
  specification_version: 3
118
123
  summary: svn_wc_tree is a web application (GUI) that enables basic operations on a working copy of a Subversion repository.
data/svn_wc_tree.conf DELETED
@@ -1,9 +0,0 @@
1
-
2
- mkdir PUBLIC_HTML/svn_wc_tree/
3
- rsync -avz js PUBLIC_HTML/svn_wc_tree/
4
- rsync -avz css PUBLIC_HTML/svn_wc_tree/
5
- rsync -avz img PUBLIC_HTML/svn_wc_tree/
6
- cp svn_wc_tree.html PUBLIC_HTML/svn_wc_tree/
7
-
8
-
9
-