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 +12 -0
- data/Manifest +1 -1
- data/README.rdoc +3 -3
- data/bin/svn_wc_tree +64 -40
- data/lib/svn_wc_broker.rb +18 -10
- data/lib/svn_wc_client.rb +136 -39
- data/svn_conf.yaml +13 -8
- data/svn_wc_tree/index.html +6 -1
- data/svn_wc_tree/js/swt.js +64 -58
- data/tests/test_installer_bin.rb +430 -0
- metadata +10 -5
- data/svn_wc_tree.conf +0 -9
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.
|
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.
|
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
|
-
# --
|
35
|
-
#
|
36
|
-
# (
|
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
|
-
# --
|
39
|
-
#
|
40
|
-
# (
|
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/'
|
55
|
-
# /tmp/svn_conf.yaml
|
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
|
-
[ '--
|
70
|
-
[ '--
|
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
|
99
|
+
@php = false
|
76
100
|
post_to_url = 'index.php' # assume php mode
|
77
101
|
conf_location = nil
|
78
|
-
|
79
|
-
|
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 '--
|
99
|
-
if arg != '' then
|
100
|
-
when '--
|
101
|
-
if arg != '' then
|
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(
|
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.
|
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 #{
|
138
|
+
#puts "Destination conf file exists #{copy_conf_to}"
|
113
139
|
end
|
114
140
|
# now edit lib to set conf_file path
|
115
|
-
|
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
|
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
|
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
|
210
|
-
if not (
|
211
|
-
puts 'if using "
|
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(
|
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
|
25
|
-
#
|
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
|
-
#
|
29
|
-
#
|
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
|
-
|
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(
|
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
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
-
|
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
|
-
|
65
|
-
ent = Array.new
|
67
|
+
repo_entries = Array.new
|
66
68
|
begin
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
-
|
100
|
+
repo_entries.push info_data
|
86
101
|
end
|
87
|
-
|
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
|
-
|
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
|
-
|
232
|
-
|
233
|
-
|
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
|
-
|
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
|
-
|
2
|
-
|
3
|
-
svn_repo_master : svn+ssh://svn_test_user@localhost/tmp/svnrepo
|
4
|
-
|
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
|
|
data/svn_wc_tree/index.html
CHANGED
@@ -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>
|
data/svn_wc_tree/js/swt.js
CHANGED
@@ -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"; // " "
|
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 ==
|
278
|
-
|
279
|
-
|
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
|
-
|
284
|
-
|
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
|
307
|
-
|
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
|
-
|
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
|
-
|
420
|
-
|
421
|
-
|
428
|
+
function process_content_and_entries(jdata, svn_action, display_svn_results){
|
429
|
+
var error = '';
|
430
|
+
var contents = '';
|
422
431
|
|
423
|
-
|
432
|
+
if (jdata.error) error = '<p style="color:red">'+jdata.error+'</p>';
|
424
433
|
|
425
|
-
|
426
|
-
|
427
|
-
|
434
|
+
// used for 'diff'
|
435
|
+
if (jdata.content) // expand newline to line break, '<' to html entity
|
436
|
+
contents += jdata.content.replace(/</g, '<').replace(/\n/g, '<br/>');
|
428
437
|
|
429
|
-
|
438
|
+
//if (jdata.entries) process_entries(jdata.entries, svn_action);
|
430
439
|
|
431
|
-
|
432
|
-
|
440
|
+
if (jdata.repo_root_local_path)
|
441
|
+
$("#svn_local_repo_root").val(jdata.repo_root_local_path);
|
433
442
|
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
443
|
+
if (contents)
|
444
|
+
display_svn_results += error + '<p style="color:grey">'+contents+'</p>';
|
445
|
+
else
|
446
|
+
display_svn_results += error;
|
438
447
|
|
439
|
-
|
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
|
-
-
|
9
|
-
version: 0.0.
|
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-
|
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.
|
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.
|