yggdrasil 0.0.17 → 0.0.18
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/lib/yggdrasil.rb +25 -18
- data/lib/yggdrasil/add.rb +9 -3
- data/lib/yggdrasil/check.rb +3 -3
- data/lib/yggdrasil/cleanup.rb +2 -2
- data/lib/yggdrasil/commit.rb +2 -2
- data/lib/yggdrasil/diff.rb +1 -1
- data/lib/yggdrasil/help.rb +14 -14
- data/lib/yggdrasil/init.rb +11 -11
- data/lib/yggdrasil/list.rb +2 -2
- data/lib/yggdrasil/log.rb +1 -1
- data/lib/yggdrasil/update.rb +5 -5
- data/lib/yggdrasil/version.rb +2 -2
- data/lib/yggdrasil_common.rb +2 -3
- data/lib/yggdrasil_server.rb +3 -3
- data/lib/yggdrasil_server/help.rb +7 -7
- data/lib/yggdrasil_server/put_result.rb +1 -1
- data/lib/yggdrasil_server/results.rb +5 -2
- data/lib/yggdrasil_server/server.rb +2 -2
- data/lib/yggdrasil_server/version.rb +1 -1
- data/spec/check_spec.rb +1 -1
- data/spec/commit_spec.rb +133 -0
- data/spec/init_spec.rb +1 -2
- data/spec/server_results_spec.rb +17 -0
- metadata +4 -4
data/lib/yggdrasil.rb
CHANGED
@@ -55,12 +55,12 @@ class Yggdrasil
|
|
55
55
|
|
56
56
|
def initialize(exist_config = true)
|
57
57
|
@base_cmd = File::basename($0)
|
58
|
-
@current_dir = `
|
58
|
+
@current_dir = `pwd`.chomp
|
59
59
|
@config_dir = "#{ENV['HOME']}/.yggdrasil"
|
60
|
-
@config_file = "
|
61
|
-
@mirror_dir = "
|
62
|
-
@checker_dir = "
|
63
|
-
@checker_result_dir = "
|
60
|
+
@config_file = "#{@config_dir}/config"
|
61
|
+
@mirror_dir = "#{@config_dir}/mirror"
|
62
|
+
@checker_dir = "#{@config_dir}/checker"
|
63
|
+
@checker_result_dir = "#{@config_dir}/checker_result"
|
64
64
|
|
65
65
|
return unless exist_config
|
66
66
|
configs = read_config(@config_file)
|
@@ -95,7 +95,7 @@ class Yggdrasil
|
|
95
95
|
@target_file_num = 0
|
96
96
|
FileUtils.cd @mirror_dir do
|
97
97
|
files = Array.new
|
98
|
-
cmd = "
|
98
|
+
cmd = "#{@svn} ls #{@repo} -R --no-auth-cache --non-interactive"
|
99
99
|
cmd += username_password_options_to_read_repo
|
100
100
|
out = system3(cmd)
|
101
101
|
ls_files = out.split(/\n/)
|
@@ -103,12 +103,12 @@ class Yggdrasil
|
|
103
103
|
ls_files.each do |ls_file|
|
104
104
|
files << ls_file if ls_file.match("^#{target_relative}")
|
105
105
|
end
|
106
|
-
cmd = "
|
106
|
+
cmd = "#{@svn} update --no-auth-cache --non-interactive"
|
107
107
|
cmd += " -r #{@options[:revision]}" if @options.has_key?(:revision)
|
108
108
|
cmd += username_password_options_to_read_repo
|
109
109
|
cmd += ' '+target_relative
|
110
110
|
system3(cmd)
|
111
|
-
cmd = "
|
111
|
+
cmd = "#{@svn} status -q --no-auth-cache --non-interactive"
|
112
112
|
cmd += username_password_options_to_read_repo
|
113
113
|
cmd += ' '+target_relative
|
114
114
|
out = system3(cmd)
|
@@ -121,24 +121,31 @@ class Yggdrasil
|
|
121
121
|
@target_file_num = files.size
|
122
122
|
files.each do |file|
|
123
123
|
if !File.exist?("/#{file}")
|
124
|
-
system3 "
|
124
|
+
system3 "#{@svn} delete #{file} --force" +
|
125
125
|
' --no-auth-cache --non-interactive'
|
126
126
|
elsif File.file?("/#{file}")
|
127
|
-
if !File.exist?("
|
128
|
-
cmd = "
|
127
|
+
if !File.exist?("#{@mirror_dir}/#{file}")
|
128
|
+
cmd = "#{@svn} revert #{file}"
|
129
129
|
system3 cmd
|
130
130
|
end
|
131
|
-
|
132
|
-
|
131
|
+
FileUtils.copy_file "/#{file}", "#{@mirror_dir}/#{file}"
|
132
|
+
#`cp -fd /#{file} #@mirror_dir/#{file}`
|
133
133
|
end
|
134
134
|
end
|
135
|
-
cmd = "
|
135
|
+
cmd = "#{@svn} status -qu --no-auth-cache --non-interactive"
|
136
136
|
cmd += username_password_options_to_read_repo
|
137
137
|
out = system3(cmd)
|
138
138
|
out.split(/\n/).each do |line|
|
139
139
|
next if /^Status against revision/ =~ line
|
140
140
|
if /^(.).*\s(\S+)\s*$/ =~ line
|
141
|
-
|
141
|
+
stat = $1
|
142
|
+
file = $2
|
143
|
+
files.each do |target|
|
144
|
+
if file =~ /^#{target}/ || target =~ /^#{file}/
|
145
|
+
updates << [stat, file]
|
146
|
+
break
|
147
|
+
end
|
148
|
+
end
|
142
149
|
end
|
143
150
|
end
|
144
151
|
end
|
@@ -232,14 +239,14 @@ class Yggdrasil
|
|
232
239
|
|
233
240
|
def exec_checker
|
234
241
|
# execute checker
|
235
|
-
`rm -rf
|
242
|
+
`rm -rf #{@checker_result_dir}`
|
236
243
|
Dir.mkdir @checker_result_dir, 0755
|
237
244
|
if File.exist?(@checker_dir)
|
238
245
|
Find.find(@checker_dir) do |file|
|
239
246
|
if File.file?(file) && File.executable?(file)
|
240
|
-
if file =~ %r{
|
247
|
+
if file =~ %r{^#{@checker_dir}(.*)$}
|
241
248
|
file_body = $1
|
242
|
-
system3("#{file} >
|
249
|
+
system3("#{file} > #{@checker_result_dir}#{file_body}")
|
243
250
|
end
|
244
251
|
end
|
245
252
|
end
|
data/lib/yggdrasil/add.rb
CHANGED
@@ -3,9 +3,15 @@ class Yggdrasil
|
|
3
3
|
# @param [Array] args
|
4
4
|
def add(args)
|
5
5
|
parse_options(args, {})
|
6
|
+
error "invalid options: #{(@arg_options).join(', ')}" if @arg_options.size != 0
|
7
|
+
|
6
8
|
while (arg = @arg_paths.shift)
|
7
9
|
|
8
|
-
|
10
|
+
if arg =~ /^\//
|
11
|
+
file_path = arg
|
12
|
+
else
|
13
|
+
file_path = `pwd`.chomp + '/' + arg
|
14
|
+
end
|
9
15
|
unless File.exist?(file_path)
|
10
16
|
puts "no such file: #{file_path}"
|
11
17
|
next
|
@@ -16,11 +22,11 @@ class Yggdrasil
|
|
16
22
|
mirror_path += "/#{part}"
|
17
23
|
next if File.exist?(mirror_path)
|
18
24
|
if part.equal?(file_path_parts[-1]) && File.file?(file_path)
|
19
|
-
FileUtils.
|
25
|
+
FileUtils.copy_file file_path, mirror_path
|
20
26
|
else
|
21
27
|
Dir.mkdir mirror_path
|
22
28
|
end
|
23
|
-
cmd = "
|
29
|
+
cmd = "#{@svn} add #{mirror_path}"
|
24
30
|
cmd += ' ' + @arg_options.join(' ') if @arg_options.size != 0
|
25
31
|
puts system3(cmd)
|
26
32
|
end
|
data/lib/yggdrasil/check.rb
CHANGED
@@ -20,7 +20,7 @@ class Yggdrasil
|
|
20
20
|
if matched_updates.size != 0
|
21
21
|
confirmed_updates = confirm_updates(matched_updates, %w{A q}) do |relative_path|
|
22
22
|
FileUtils.cd @mirror_dir do
|
23
|
-
cmd = "
|
23
|
+
cmd = "#{@svn} diff --no-auth-cache --non-interactive #{relative_path}"
|
24
24
|
cmd += username_password_options_to_read_repo
|
25
25
|
puts system3(cmd)
|
26
26
|
end
|
@@ -30,7 +30,7 @@ class Yggdrasil
|
|
30
30
|
|
31
31
|
############## add status information to check_result
|
32
32
|
FileUtils.cd @mirror_dir do
|
33
|
-
cmd = "
|
33
|
+
cmd = "#{@svn} status -quN --no-auth-cache --non-interactive"
|
34
34
|
cmd += username_password_options_to_read_repo
|
35
35
|
cmd += " #{confirmed_updates.join(' ')}"
|
36
36
|
check_result = system3(cmd)
|
@@ -48,7 +48,7 @@ class Yggdrasil
|
|
48
48
|
if result_line =~ /\s(\S+)$/
|
49
49
|
result_path = $1
|
50
50
|
next if File.directory?(result_path)
|
51
|
-
cmd = "
|
51
|
+
cmd = "#{@svn} diff --no-auth-cache --non-interactive"
|
52
52
|
cmd += username_password_options_to_read_repo
|
53
53
|
cmd += ' '+result_path
|
54
54
|
check_result << system3(cmd) +"\n"
|
data/lib/yggdrasil/cleanup.rb
CHANGED
@@ -9,9 +9,9 @@ class Yggdrasil
|
|
9
9
|
|
10
10
|
get_user_pass_if_need_to_read_repo
|
11
11
|
|
12
|
-
system3 "rm -rf
|
12
|
+
system3 "rm -rf #{@mirror_dir}"
|
13
13
|
|
14
|
-
cmd = "
|
14
|
+
cmd = "#{@svn} checkout --no-auth-cache --non-interactive #{@repo} #{@mirror_dir}"
|
15
15
|
cmd += username_password_options_to_read_repo
|
16
16
|
system3 cmd
|
17
17
|
end
|
data/lib/yggdrasil/commit.rb
CHANGED
@@ -18,7 +18,7 @@ class Yggdrasil
|
|
18
18
|
|
19
19
|
confirmed_updates = confirm_updates(matched_updates) do |relative_path|
|
20
20
|
FileUtils.cd @mirror_dir do
|
21
|
-
cmd = "
|
21
|
+
cmd = "#{@svn} diff --no-auth-cache --non-interactive #{relative_path}"
|
22
22
|
cmd += username_password_options_to_read_repo
|
23
23
|
puts system3(cmd)
|
24
24
|
end
|
@@ -45,7 +45,7 @@ class Yggdrasil
|
|
45
45
|
|
46
46
|
input_user_pass
|
47
47
|
FileUtils.cd @mirror_dir do
|
48
|
-
cmd = "
|
48
|
+
cmd = "#{@svn} commit -m '#{@options[:message]}'"\
|
49
49
|
' --no-auth-cache --non-interactive'\
|
50
50
|
" --username '#{@options[:username]}' --password '#{@options[:password]}'"\
|
51
51
|
" #{confirmed_updates.join(' ')}"
|
data/lib/yggdrasil/diff.rb
CHANGED
@@ -30,7 +30,7 @@ class Yggdrasil
|
|
30
30
|
error "following files are not managed.\n"+err_paths.join("\n")
|
31
31
|
end
|
32
32
|
|
33
|
-
cmd_arg = "
|
33
|
+
cmd_arg = "#{@svn} diff --no-auth-cache --non-interactive"
|
34
34
|
cmd_arg += username_password_options_to_read_repo
|
35
35
|
cmd_arg += ' ' + @arg_options.join(' ') if @arg_options.size != 0
|
36
36
|
cmd_arg += " -r #{@options[:diff_rev]}" if @options.has_key?(:diff_rev)
|
data/lib/yggdrasil/help.rb
CHANGED
@@ -4,9 +4,9 @@ class Yggdrasil
|
|
4
4
|
def help(args)
|
5
5
|
if args.size == 0
|
6
6
|
puts <<EOS
|
7
|
-
usage:
|
7
|
+
usage: #{@base_cmd} <subcommand> [options] [args]
|
8
8
|
Yggdrasil version #{VERSION}
|
9
|
-
Type '
|
9
|
+
Type '#{@base_cmd} help <subcommand>' for help on a specific subcommand.
|
10
10
|
|
11
11
|
Available subcommands:
|
12
12
|
add
|
@@ -22,7 +22,7 @@ Available subcommands:
|
|
22
22
|
version
|
23
23
|
|
24
24
|
Yggdrasil is a subversion wrapper to manage server configurations and conditions.
|
25
|
-
At first, you should type '
|
25
|
+
At first, you should type '#{@base_cmd} init' to create config file.
|
26
26
|
|
27
27
|
EOS
|
28
28
|
elsif args.size != 1 then
|
@@ -32,14 +32,14 @@ EOS
|
|
32
32
|
when 'add'
|
33
33
|
puts <<"EOS"
|
34
34
|
add: Add files to management list (add to subversion)
|
35
|
-
usage
|
35
|
+
usage #{@base_cmd} add [FILES...]
|
36
36
|
|
37
37
|
EOS
|
38
38
|
|
39
39
|
when 'check', 'c', 'status', 'stat', 'st' # check (c, status, stat, st)
|
40
40
|
puts <<"EOS"
|
41
41
|
check (c, status, stat, st): check updating of managed files and the execution output of a commands.
|
42
|
-
usage:
|
42
|
+
usage: #{@base_cmd} check [OPTIONS...]
|
43
43
|
|
44
44
|
This subcommand execute the executable files in ~/.yggdrasil/checker/, and
|
45
45
|
the outputs are checked difference to repository with other managed files.
|
@@ -60,7 +60,7 @@ EOS
|
|
60
60
|
when 'cleanup' ################################################ cleanup
|
61
61
|
puts <<"EOS"
|
62
62
|
cleanup: clean up the working copy
|
63
|
-
usage:
|
63
|
+
usage: #{@base_cmd} cleanup [OPTIONS...]
|
64
64
|
|
65
65
|
Valid options:
|
66
66
|
--username ARG : specify a username ARG
|
@@ -70,7 +70,7 @@ EOS
|
|
70
70
|
when 'commit', 'ci' ####################################### commit (ci)
|
71
71
|
puts <<"EOS"
|
72
72
|
commit (ci): Send changes from your local file to the repository.
|
73
|
-
usage:
|
73
|
+
usage: #{@base_cmd} commit [OPTIONS...] [FILES...]
|
74
74
|
|
75
75
|
Valid options:
|
76
76
|
--username ARG : specify a username ARG
|
@@ -82,7 +82,7 @@ EOS
|
|
82
82
|
when 'diff', 'di' ########################################### diff (di)
|
83
83
|
puts <<"EOS"
|
84
84
|
diff (di): Display the differences between two revisions or paths.
|
85
|
-
usage:
|
85
|
+
usage: #{@base_cmd} diff [OPTIONS...] [PATH...]
|
86
86
|
|
87
87
|
Valid options:
|
88
88
|
--username ARG : specify a username ARG
|
@@ -100,13 +100,13 @@ EOS
|
|
100
100
|
when 'help', '--help', 'h', '-h', '?' ###################### help (?,h)
|
101
101
|
puts <<"EOS"
|
102
102
|
help (?,h): Describe the usage of this program or its subcommands.
|
103
|
-
usage:
|
103
|
+
usage: #{@base_cmd} help [SUBCOMMAND]
|
104
104
|
|
105
105
|
EOS
|
106
106
|
when 'init' ###################################################### init
|
107
107
|
puts <<"EOS"
|
108
108
|
init: Check environment and initialize configuration.
|
109
|
-
usage:
|
109
|
+
usage: #{@base_cmd} init [OPTIONS...]
|
110
110
|
|
111
111
|
Valid options:
|
112
112
|
--repo ARG : specify svn repository URL
|
@@ -126,7 +126,7 @@ EOS
|
|
126
126
|
when 'list', 'ls' ########################################### list (ls)
|
127
127
|
puts <<"EOS"
|
128
128
|
list (ls): List directory entries in the repository.
|
129
|
-
usage:
|
129
|
+
usage: #{@base_cmd} list [OPTIONS...] [PATH...]
|
130
130
|
|
131
131
|
Valid options:
|
132
132
|
--username ARG : specify a username ARG
|
@@ -145,7 +145,7 @@ EOS
|
|
145
145
|
when 'log' ######################################################## log
|
146
146
|
puts <<"EOS"
|
147
147
|
log: Show the log messages for a set of revision(s) and/or file(s).
|
148
|
-
usage:
|
148
|
+
usage: #{@base_cmd} log [OPTIONS...] [PATH]
|
149
149
|
|
150
150
|
Valid options:
|
151
151
|
--username ARG : specify a username ARG
|
@@ -165,7 +165,7 @@ EOS
|
|
165
165
|
when 'update', 'up', 'revert' ##################### update (up, revert)
|
166
166
|
puts <<"EOS"
|
167
167
|
update (up, revert): Set the files to the contents of the newest repository.
|
168
|
-
usage:
|
168
|
+
usage: #{@base_cmd} update [OPTIONS...] [PATH...]
|
169
169
|
|
170
170
|
Valid options:
|
171
171
|
--username ARG : specify a username ARG
|
@@ -178,7 +178,7 @@ EOS
|
|
178
178
|
when 'version', '--version', '-v' ######################## version (-v)
|
179
179
|
puts <<"EOS"
|
180
180
|
version: See the program version
|
181
|
-
usage:
|
181
|
+
usage: #{@base_cmd} version
|
182
182
|
|
183
183
|
EOS
|
184
184
|
else
|
data/lib/yggdrasil/init.rb
CHANGED
@@ -26,11 +26,11 @@ class Yggdrasil
|
|
26
26
|
|
27
27
|
while File.exist?(@config_file)
|
28
28
|
if @options[:force?]
|
29
|
-
`rm -rf
|
29
|
+
`rm -rf #{@config_file}`
|
30
30
|
break
|
31
31
|
end
|
32
|
-
error
|
33
|
-
puts "Already exist config file:
|
32
|
+
error 'Already exist config file. use --force to ignore' if @options[:non_interactive?]
|
33
|
+
puts "Already exist config file: #{@config_file}"
|
34
34
|
print 'Overwrite? [Yn]: '
|
35
35
|
res = $stdin.gets
|
36
36
|
puts
|
@@ -38,7 +38,7 @@ class Yggdrasil
|
|
38
38
|
res.chomp!
|
39
39
|
return nil if res == 'n'
|
40
40
|
if res == 'Y'
|
41
|
-
`rm -rf
|
41
|
+
`rm -rf #{@config_file}`
|
42
42
|
break
|
43
43
|
end
|
44
44
|
end
|
@@ -53,7 +53,7 @@ class Yggdrasil
|
|
53
53
|
@options[:repo].gsub!(/\{host\}/, Socket.gethostname.split('.')[0])
|
54
54
|
if @options[:repo] == 'private'
|
55
55
|
Dir.mkdir @config_dir, 0755 unless File.exist?(@config_dir)
|
56
|
-
repo_dir = "
|
56
|
+
repo_dir = "#{@config_dir}/private_repo"
|
57
57
|
system3 "svnadmin create #{repo_dir}"
|
58
58
|
@options[:repo] = "file://#{repo_dir}"
|
59
59
|
end
|
@@ -109,10 +109,10 @@ class Yggdrasil
|
|
109
109
|
break if input == 'Y'
|
110
110
|
end
|
111
111
|
input_user_pass
|
112
|
-
`rm -rf
|
112
|
+
`rm -rf #{@mirror_dir}`
|
113
113
|
system3 "#{svn} checkout -N --no-auth-cache --non-interactive" +
|
114
114
|
" --username '#{@options[:ro_username]}' --password '#{@options[:ro_password]}'" +
|
115
|
-
" #{url_parts[0...url_parts_num].join('/')}
|
115
|
+
" #{url_parts[0...url_parts_num].join('/')} #{@mirror_dir}"
|
116
116
|
add_paths = Array.new
|
117
117
|
path = @mirror_dir
|
118
118
|
while url_parts_num < url_parts.size
|
@@ -127,7 +127,7 @@ class Yggdrasil
|
|
127
127
|
system3 "#{svn} commit -m 'yggdrasil init' --no-auth-cache --non-interactive" +
|
128
128
|
" --username '#{@options[:username]}' --password '#{@options[:password]}'" +
|
129
129
|
' ' + add_paths.join(' ')
|
130
|
-
system3 "rm -rf
|
130
|
+
system3 "rm -rf #{@mirror_dir}"
|
131
131
|
end
|
132
132
|
|
133
133
|
# make config file
|
@@ -141,8 +141,8 @@ class Yggdrasil
|
|
141
141
|
end
|
142
142
|
|
143
143
|
# make mirror dir
|
144
|
-
`rm -rf
|
145
|
-
cmd = "#{svn} checkout --no-auth-cache --non-interactive #{@options[:repo]}
|
144
|
+
`rm -rf #{@mirror_dir}`
|
145
|
+
cmd = "#{svn} checkout --no-auth-cache --non-interactive #{@options[:repo]} #{@mirror_dir}"
|
146
146
|
cmd += " --username '#{@options[:ro_username]}' --password '#{@options[:ro_password]}'" unless anon_access
|
147
147
|
system3 cmd
|
148
148
|
|
@@ -152,7 +152,7 @@ class Yggdrasil
|
|
152
152
|
|
153
153
|
|
154
154
|
def init_get_repo_interactive
|
155
|
-
error
|
155
|
+
error 'need --repo or --server' if @options[:non_interactive?]
|
156
156
|
loop do
|
157
157
|
print 'Input svn repo URL: '
|
158
158
|
input = $stdin.gets
|
data/lib/yggdrasil/list.rb
CHANGED
@@ -14,11 +14,11 @@ class Yggdrasil
|
|
14
14
|
|
15
15
|
repos = Array.new
|
16
16
|
@arg_paths.each do |path|
|
17
|
-
path = "
|
17
|
+
path = "#{@current_dir}/#{path}" unless %r{^/} =~ path
|
18
18
|
repos << @repo+path
|
19
19
|
end
|
20
20
|
|
21
|
-
cmd_arg = "
|
21
|
+
cmd_arg = "#{@svn} list --no-auth-cache --non-interactive"
|
22
22
|
cmd_arg += username_password_options_to_read_repo
|
23
23
|
cmd_arg += " -r #{@options[:revision]}" if @options.has_key?(:revision)
|
24
24
|
cmd_arg += ' -R' if @options.has_key?(:recursive?)
|
data/lib/yggdrasil/log.rb
CHANGED
@@ -28,7 +28,7 @@ class Yggdrasil
|
|
28
28
|
error "following files are not managed.\n"+err_paths.join("\n")
|
29
29
|
end
|
30
30
|
|
31
|
-
cmd_arg = "
|
31
|
+
cmd_arg = "#{@svn} log --no-auth-cache --non-interactive"
|
32
32
|
cmd_arg += username_password_options_to_read_repo
|
33
33
|
cmd_arg += ' ' + @arg_options.join(' ') if @arg_options.size != 0
|
34
34
|
if @options.has_key?(:revision)
|
data/lib/yggdrasil/update.rb
CHANGED
@@ -17,7 +17,7 @@ class Yggdrasil
|
|
17
17
|
|
18
18
|
confirmed_updates = confirm_updates(matched_updates) do |relative_path|
|
19
19
|
FileUtils.cd @mirror_dir do
|
20
|
-
cmd = "
|
20
|
+
cmd = "#{@svn} diff --no-auth-cache --non-interactive #{relative_path}"
|
21
21
|
cmd += username_password_options_to_read_repo
|
22
22
|
puts system3(cmd)
|
23
23
|
end
|
@@ -26,11 +26,11 @@ class Yggdrasil
|
|
26
26
|
return if confirmed_updates.size == 0
|
27
27
|
|
28
28
|
FileUtils.cd @mirror_dir do
|
29
|
-
cmd = "
|
29
|
+
cmd = "#{@svn} revert #{confirmed_updates.reverse.join(' ')}"
|
30
30
|
system3 cmd
|
31
31
|
|
32
32
|
# make ls hash
|
33
|
-
cmd = "
|
33
|
+
cmd = "#{@svn} ls -R #{@repo} --no-auth-cache --non-interactive"
|
34
34
|
cmd += username_password_options_to_read_repo
|
35
35
|
out = system3(cmd)
|
36
36
|
|
@@ -40,8 +40,8 @@ class Yggdrasil
|
|
40
40
|
# reflect mirror to real file
|
41
41
|
confirmed_updates.each do |file|
|
42
42
|
if ls_hash.has_key?(file)
|
43
|
-
if File.file?("
|
44
|
-
FileUtils.copy_file "
|
43
|
+
if File.file?("#{@mirror_dir}/#{file}")
|
44
|
+
FileUtils.copy_file "#{@mirror_dir}/#{file}", "/#{file}"
|
45
45
|
end
|
46
46
|
else
|
47
47
|
system3 "rm -rf #{@mirror_dir + '/' + file}"
|
data/lib/yggdrasil/version.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
class Yggdrasil
|
2
|
-
VERSION = '0.0.
|
2
|
+
VERSION = '0.0.18'
|
3
3
|
|
4
4
|
def version
|
5
5
|
puts <<"EOS"
|
6
|
-
|
6
|
+
#{@base_cmd}, version #{VERSION}
|
7
7
|
|
8
8
|
Copyright (C) 2012-2013 Tomohisa Kusukawa.
|
9
9
|
Yggdrasil is open source software, see https://github.com/tkusukawa/yggdrasil/
|
data/lib/yggdrasil_common.rb
CHANGED
@@ -69,7 +69,6 @@ module YggdrasilCommon
|
|
69
69
|
print 'Input svn username: '
|
70
70
|
input = $stdin.gets
|
71
71
|
error 'can not input username' unless input
|
72
|
-
puts
|
73
72
|
input.chomp!
|
74
73
|
return if input.size == 0
|
75
74
|
@options[:username] = @options[:ro_username] = input
|
@@ -100,7 +99,7 @@ module YggdrasilCommon
|
|
100
99
|
else
|
101
100
|
cmd_display = (cmd.split)[0]+' ...'
|
102
101
|
end
|
103
|
-
$stderr.puts "
|
102
|
+
$stderr.puts "#{@base_cmd} error: command failure: #{cmd_display}"
|
104
103
|
$stderr.puts 'command output:'
|
105
104
|
$stderr.puts out
|
106
105
|
exit stat.exitstatus
|
@@ -110,7 +109,7 @@ module YggdrasilCommon
|
|
110
109
|
|
111
110
|
# @param [String] msg
|
112
111
|
def error(msg)
|
113
|
-
$stderr.puts "
|
112
|
+
$stderr.puts "#{@base_cmd} error: #{msg}"
|
114
113
|
$stderr.puts
|
115
114
|
exit 1
|
116
115
|
end
|
data/lib/yggdrasil_server.rb
CHANGED
@@ -51,10 +51,10 @@ class YggdrasilServer
|
|
51
51
|
|
52
52
|
def initialize(exist_config = true)
|
53
53
|
@base_cmd = File::basename($0)
|
54
|
-
@current_dir = `
|
54
|
+
@current_dir = `pwd`.chomp
|
55
55
|
@config_dir = "#{ENV['HOME']}/.yggdrasil"
|
56
|
-
@server_config_file = "
|
57
|
-
@results_dir = "
|
56
|
+
@server_config_file = "#{@config_dir}/server_config"
|
57
|
+
@results_dir = "#{@config_dir}/results"
|
58
58
|
|
59
59
|
return unless exist_config
|
60
60
|
configs = read_config(@server_config_file)
|
@@ -6,9 +6,9 @@ class YggdrasilServer
|
|
6
6
|
def help(args)
|
7
7
|
if args.size == 0
|
8
8
|
puts <<EOS
|
9
|
-
usage:
|
9
|
+
usage: #{@base_cmd} <subcommand> [options] [args]
|
10
10
|
Yggdrasil version #{Yggdrasil::VERSION}
|
11
|
-
Type '
|
11
|
+
Type '#{@base_cmd} help <subcommand>' for help on a specific subcommand.
|
12
12
|
|
13
13
|
Available subcommands:
|
14
14
|
daemon
|
@@ -21,7 +21,7 @@ Available subcommands:
|
|
21
21
|
Yggdrasil server is a TCP server
|
22
22
|
to receive/record the yggdrasil check result of all managed servers.
|
23
23
|
|
24
|
-
At first, you should type '
|
24
|
+
At first, you should type '#{@base_cmd} init' to create config file.
|
25
25
|
|
26
26
|
EOS
|
27
27
|
elsif args.size != 1 then
|
@@ -43,13 +43,13 @@ EOS
|
|
43
43
|
when 'help', '--help', 'h', '-h', '?' ###################### help (h,?)
|
44
44
|
puts <<"EOS"
|
45
45
|
help (?,h): Describe the usage of this program or its subcommands.
|
46
|
-
usage:
|
46
|
+
usage: #{@base_cmd} help [SUBCOMMAND]
|
47
47
|
|
48
48
|
EOS
|
49
49
|
when 'init' ###################################################### init
|
50
50
|
puts <<"EOS"
|
51
51
|
init: setup yggdrasil server configuration.
|
52
|
-
usage:
|
52
|
+
usage: #{@base_cmd} init [OPTIONS...]
|
53
53
|
|
54
54
|
Valid options:
|
55
55
|
--port ARG : specify a TCP port number ARG
|
@@ -65,7 +65,7 @@ EOS
|
|
65
65
|
when 'results', 'res' ################################### results (res)
|
66
66
|
puts <<"EOS"
|
67
67
|
results: display the result of yggdrasil check command.
|
68
|
-
usage:
|
68
|
+
usage: #{@base_cmd} results [OPTIONS...]
|
69
69
|
|
70
70
|
Valid options:
|
71
71
|
--expire ARG : minutes from the final report, to judge the host not be alive
|
@@ -74,7 +74,7 @@ EOS
|
|
74
74
|
when 'version', '--version', '-v' ######################## version (-v)
|
75
75
|
puts <<"EOS"
|
76
76
|
version: See the program version
|
77
|
-
usage:
|
77
|
+
usage: #{@base_cmd} version
|
78
78
|
|
79
79
|
EOS
|
80
80
|
else
|
@@ -6,7 +6,7 @@ class YggdrasilServer
|
|
6
6
|
end
|
7
7
|
# make result file
|
8
8
|
Dir.mkdir @results_dir, 0755 unless File.exist?(@results_dir)
|
9
|
-
result_file = "
|
9
|
+
result_file = "#{@results_dir}/#{arg_hash[:hostname]}_#{sock.peeraddr[3]}"
|
10
10
|
File.delete result_file if File.exist?(result_file)
|
11
11
|
File.open(result_file, 'w') do |f|
|
12
12
|
f.write result_string
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'nkf'
|
2
|
+
|
1
3
|
class YggdrasilServer
|
2
4
|
|
3
5
|
# @param [Array] args
|
@@ -13,7 +15,7 @@ class YggdrasilServer
|
|
13
15
|
alert = false
|
14
16
|
files.each do |file|
|
15
17
|
next if /^\./ =~ file
|
16
|
-
absolute = "
|
18
|
+
absolute = "#{@results_dir}/#{file}"
|
17
19
|
if @options.has_key?(:expire)
|
18
20
|
stat = File.stat(absolute)
|
19
21
|
if stat.mtime < (Time.now - @options[:expire].to_i * 60)
|
@@ -23,7 +25,8 @@ class YggdrasilServer
|
|
23
25
|
next
|
24
26
|
end
|
25
27
|
end
|
26
|
-
buf = File.read("
|
28
|
+
buf = File.read("#{@results_dir}/#{file}")
|
29
|
+
buf = NKF::nkf('-wm0', buf)
|
27
30
|
if buf.gsub(/\s*\n/m, '') != ''
|
28
31
|
alert = true
|
29
32
|
puts "######## #{file} Mismatch:"
|
@@ -7,7 +7,7 @@ class YggdrasilServer
|
|
7
7
|
end
|
8
8
|
|
9
9
|
ctime = Time.now
|
10
|
-
$stdout.printf "Start: yggdrasil server (port
|
10
|
+
$stdout.printf "Start: yggdrasil server (port:#{@port})[%04d-%02d-%02d %02d:%02d:%02d.%03d]\n",
|
11
11
|
ctime.year, ctime.month, ctime.day, ctime.hour, ctime.min, ctime.sec, (ctime.usec/1000).round
|
12
12
|
$stdout.flush
|
13
13
|
TCPServer.do_not_reverse_lookup = true
|
@@ -43,7 +43,7 @@ class YggdrasilServer
|
|
43
43
|
sock.close
|
44
44
|
if @options.has_key?(:debug?) && msg == MESSAGE_QUIT
|
45
45
|
ctime = Time.now
|
46
|
-
$stdout.printf "Quit: yggdrasil server (port
|
46
|
+
$stdout.printf "Quit: yggdrasil server (port:#{@port})[%04d-%02d-%02d %02d:%02d:%02d.%03d]\n",
|
47
47
|
ctime.year, ctime.month, ctime.day, ctime.hour, ctime.min, ctime.sec, (ctime.usec/1000).round
|
48
48
|
$stdout.flush
|
49
49
|
break
|
@@ -4,7 +4,7 @@ class YggdrasilServer
|
|
4
4
|
|
5
5
|
def version
|
6
6
|
puts <<"EOS"
|
7
|
-
|
7
|
+
#{@base_cmd}, version #{Yggdrasil::VERSION}
|
8
8
|
|
9
9
|
Copyright (C) 2012-2013 Tomohisa Kusukawa.
|
10
10
|
Yggdrasil is open source software, see https://github.com/tkusukawa/yggdrasil/
|
data/spec/check_spec.rb
CHANGED
data/spec/commit_spec.rb
CHANGED
@@ -155,4 +155,137 @@ describe Yggdrasil, 'commit' do
|
|
155
155
|
puts res
|
156
156
|
res.should == "A\n"
|
157
157
|
end
|
158
|
+
|
159
|
+
it 'should commit symbolic link files' do
|
160
|
+
puts '---- should commit symbolic link files'
|
161
|
+
`ln -s /tmp/yggdrasil-test/A /tmp/yggdrasil-test/B`
|
162
|
+
`ln -s /tmp/yggdrasil-test /tmp/yggdrasil-test/c`
|
163
|
+
|
164
|
+
puts '1'
|
165
|
+
Yggdrasil.command %w{add /tmp/yggdrasil-test/B /tmp/yggdrasil-test/c/A}
|
166
|
+
puts '2'
|
167
|
+
|
168
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
169
|
+
out.should == <<"EOS"
|
170
|
+
|
171
|
+
0:A tmp/yggdrasil-test/B
|
172
|
+
1:A tmp/yggdrasil-test/c
|
173
|
+
2:A tmp/yggdrasil-test/c/A
|
174
|
+
OK? [A|q|<num to diff>]:#{' '}
|
175
|
+
EOS
|
176
|
+
puts '3'
|
177
|
+
|
178
|
+
Yggdrasil.command %w{commit -m addSymbolicLinks --debug} +
|
179
|
+
%w{--username hoge --password foo},
|
180
|
+
"Y\n"
|
181
|
+
puts '4'
|
182
|
+
|
183
|
+
res = `svn ls file:///tmp/yggdrasil-test/svn-repo/mng-repo/host-name/tmp/yggdrasil-test`
|
184
|
+
puts res
|
185
|
+
res.should == "A\nB\nc/\n"
|
186
|
+
puts '5'
|
187
|
+
|
188
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
189
|
+
out.should == <<"EOS"
|
190
|
+
6 files checked.
|
191
|
+
Yggdrasil check: OK.
|
192
|
+
EOS
|
193
|
+
|
194
|
+
`echo hoge >> /tmp/yggdrasil-test/A`
|
195
|
+
|
196
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
197
|
+
out.should == <<"EOS"
|
198
|
+
|
199
|
+
0:M tmp/yggdrasil-test/A
|
200
|
+
1:M tmp/yggdrasil-test/B
|
201
|
+
2:M tmp/yggdrasil-test/c/A
|
202
|
+
OK? [A|q|<num to diff>]:#{' '}
|
203
|
+
EOS
|
204
|
+
|
205
|
+
Yggdrasil.command %w{commit -m addSymbolicLinks --debug} +
|
206
|
+
%w{--username hoge --password foo},
|
207
|
+
"Y\n"
|
208
|
+
|
209
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
210
|
+
out.should == <<"EOS"
|
211
|
+
6 files checked.
|
212
|
+
Yggdrasil check: OK.
|
213
|
+
EOS
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'should commit only specified files' do
|
218
|
+
puts '---- should commit only specified files'
|
219
|
+
|
220
|
+
`echo hoge >> /tmp/yggdrasil-test/A`
|
221
|
+
|
222
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
223
|
+
out.should == <<"EOS"
|
224
|
+
|
225
|
+
0:M tmp/yggdrasil-test/A
|
226
|
+
1:M tmp/yggdrasil-test/B
|
227
|
+
2:M tmp/yggdrasil-test/c/A
|
228
|
+
OK? [A|q|<num to diff>]:#{' '}
|
229
|
+
EOS
|
230
|
+
|
231
|
+
out = catch_out do
|
232
|
+
Yggdrasil.command %w{commit -m absolutePath --debug /tmp/yggdrasil-test/A} +
|
233
|
+
%w{--username hoge --password foo},
|
234
|
+
"Y\n"
|
235
|
+
end
|
236
|
+
out.should == <<"EOS"
|
237
|
+
|
238
|
+
0:M tmp/yggdrasil-test/A
|
239
|
+
OK? [Y|n|<num to diff>]:#{' '}
|
240
|
+
Sending tmp/yggdrasil-test/A
|
241
|
+
Transmitting file data .
|
242
|
+
Committed revision 12.
|
243
|
+
EOS
|
244
|
+
|
245
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
246
|
+
out.should == <<"EOS"
|
247
|
+
|
248
|
+
0:M tmp/yggdrasil-test/B
|
249
|
+
1:M tmp/yggdrasil-test/c/A
|
250
|
+
OK? [A|q|<num to diff>]:#{' '}
|
251
|
+
EOS
|
252
|
+
|
253
|
+
out = catch_out do
|
254
|
+
FileUtils.cd '/tmp/yggdrasil-test' do
|
255
|
+
Yggdrasil.command %w{commit -m absolutePath --debug c} +
|
256
|
+
%w{--username hoge --password foo},
|
257
|
+
"Y\n"
|
258
|
+
end
|
259
|
+
end
|
260
|
+
out.should == <<"EOS"
|
261
|
+
|
262
|
+
0:M tmp/yggdrasil-test/c/A
|
263
|
+
OK? [Y|n|<num to diff>]:#{' '}
|
264
|
+
Sending tmp/yggdrasil-test/c/A
|
265
|
+
Transmitting file data .
|
266
|
+
Committed revision 13.
|
267
|
+
EOS
|
268
|
+
|
269
|
+
out = catch_out {Yggdrasil.command %w{c --username hoge --password foo}}
|
270
|
+
out.should == <<"EOS"
|
271
|
+
|
272
|
+
0:M tmp/yggdrasil-test/B
|
273
|
+
OK? [A|q|<num to diff>]:#{' '}
|
274
|
+
EOS
|
275
|
+
|
276
|
+
out = catch_out do
|
277
|
+
Yggdrasil.command %w{commit -m absolutePath --debug} +
|
278
|
+
%w{--username hoge --password foo},
|
279
|
+
"Y\n"
|
280
|
+
end
|
281
|
+
out.should == <<"EOS"
|
282
|
+
|
283
|
+
0:M tmp/yggdrasil-test/B
|
284
|
+
OK? [Y|n|<num to diff>]:#{' '}
|
285
|
+
Sending tmp/yggdrasil-test/B
|
286
|
+
Transmitting file data .
|
287
|
+
Committed revision 14.
|
288
|
+
EOS
|
289
|
+
end
|
290
|
+
|
158
291
|
end
|
data/spec/init_spec.rb
CHANGED
@@ -125,8 +125,7 @@ EOS
|
|
125
125
|
out.should == <<"EOS"
|
126
126
|
Input svn repo URL:#{' '}
|
127
127
|
check SVN access...
|
128
|
-
Input svn username:#{' '}
|
129
|
-
Input svn password:#{' '}
|
128
|
+
Input svn username:#{' '}Input svn password:#{' '}
|
130
129
|
SVN access OK: svn://localhost/tmp/yggdrasil-test/svn-repo
|
131
130
|
not exist directory(s) in repository: mng-repo/host-name
|
132
131
|
make directory(s)? [Yn]:#{' '}
|
data/spec/server_results_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
3
|
require 'yggdrasil_server'
|
3
4
|
|
@@ -81,6 +82,22 @@ Index: tmp/yggdrasil-test/A
|
|
81
82
|
EOS
|
82
83
|
end
|
83
84
|
|
85
|
+
it 'should show s-jis results' do
|
86
|
+
puts '---- should show s-jis results'
|
87
|
+
|
88
|
+
`rm /tmp/yggdrasil-test/.yggdrasil/results/*`
|
89
|
+
`echo 'あいうえお' | nkf -s > /tmp/yggdrasil-test/.yggdrasil/results/hoge`
|
90
|
+
|
91
|
+
out = catch_out do
|
92
|
+
lambda{YggdrasilServer.command(%w{results})}.should raise_error(SystemExit)
|
93
|
+
end
|
94
|
+
out.should == <<"EOS"
|
95
|
+
######## hoge Mismatch:
|
96
|
+
あいうえお
|
97
|
+
EOS
|
98
|
+
end
|
99
|
+
|
100
|
+
|
84
101
|
after(:all) do
|
85
102
|
sleep 1
|
86
103
|
sock = TCPSocket.open('localhost', 4000)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yggdrasil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.18
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -116,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
116
|
version: '0'
|
117
117
|
segments:
|
118
118
|
- 0
|
119
|
-
hash:
|
119
|
+
hash: 1911977696976218263
|
120
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
121
|
none: false
|
122
122
|
requirements:
|
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: 1911977696976218263
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
131
|
rubygems_version: 1.8.25
|