svn_wc_tree 0.0.3 → 0.0.5

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/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
-