yggdrasil 0.0.15 → 0.0.16
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 +63 -58
- data/lib/yggdrasil/check.rb +22 -18
- data/lib/yggdrasil/commit.rb +2 -3
- data/lib/yggdrasil/diff.rb +3 -3
- data/lib/yggdrasil/help.rb +1 -0
- data/lib/yggdrasil/init.rb +6 -9
- data/lib/yggdrasil/update.rb +2 -2
- data/lib/yggdrasil/version.rb +1 -1
- data/lib/yggdrasil_common.rb +2 -2
- data/spec/check_spec.rb +98 -21
- data/spec/commit_spec.rb +16 -3
- data/spec/help_spec.rb +2 -0
- data/spec/init_spec.rb +19 -15
- data/spec/list_spec.rb +1 -7
- data/spec/revert_spec.rb +10 -4
- data/spec/server_results_spec.rb +1 -0
- data/spec/update_spec.rb +16 -0
- metadata +4 -4
data/lib/yggdrasil.rb
CHANGED
@@ -75,24 +75,50 @@ class Yggdrasil
|
|
75
75
|
protected
|
76
76
|
include YggdrasilCommon
|
77
77
|
|
78
|
-
def sync_mirror
|
78
|
+
def sync_mirror(target_paths)
|
79
|
+
target_relatives = Array.new
|
80
|
+
if target_paths.size == 0
|
81
|
+
target_relatives << @current_dir.sub(%r{^/*},'')
|
82
|
+
else
|
83
|
+
target_paths.each do |path|
|
84
|
+
if %r{^/} =~ path
|
85
|
+
target_relatives << path.sub(%r{^/*},'') # cut first '/'
|
86
|
+
else
|
87
|
+
target_relatives << @current_dir.sub(%r{^/*},'') + '/' + path
|
88
|
+
end
|
89
|
+
f = '/'+target_relatives[-1]
|
90
|
+
error "no such file of directory:#{f}" unless File.exist?(f)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
79
94
|
updates = Array.new
|
95
|
+
@target_file_num = 0
|
80
96
|
FileUtils.cd @mirror_dir do
|
81
|
-
|
82
|
-
cmd += username_password_options_to_read_repo
|
83
|
-
system3(cmd)
|
97
|
+
files = Array.new
|
84
98
|
cmd = "#@svn ls #@repo -R --no-auth-cache --non-interactive"
|
85
99
|
cmd += username_password_options_to_read_repo
|
86
100
|
out = system3(cmd)
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
101
|
+
ls_files = out.split(/\n/)
|
102
|
+
target_relatives.each do |target_relative|
|
103
|
+
ls_files.each do |ls_file|
|
104
|
+
files << ls_file if ls_file.match("^#{target_relative}")
|
105
|
+
end
|
106
|
+
cmd = "#@svn update --no-auth-cache --non-interactive"
|
107
|
+
cmd += " -r #{@options[:revision]}" if @options.has_key?(:revision)
|
108
|
+
cmd += username_password_options_to_read_repo
|
109
|
+
cmd += ' '+target_relative
|
110
|
+
system3(cmd)
|
111
|
+
cmd = "#@svn status -q --no-auth-cache --non-interactive"
|
112
|
+
cmd += username_password_options_to_read_repo
|
113
|
+
cmd += ' '+target_relative
|
114
|
+
out = system3(cmd)
|
115
|
+
out.split(/\n/).each do |line|
|
116
|
+
files << $1 if /^.*\s(\S+)\s*$/ =~ line
|
117
|
+
end
|
93
118
|
end
|
94
119
|
files.sort!
|
95
120
|
files.uniq!
|
121
|
+
@target_file_num = files.size
|
96
122
|
files.each do |file|
|
97
123
|
if !File.exist?("/#{file}")
|
98
124
|
system3 "#@svn delete #{file} --force" +
|
@@ -116,58 +142,34 @@ class Yggdrasil
|
|
116
142
|
end
|
117
143
|
end
|
118
144
|
end
|
119
|
-
updates
|
145
|
+
updates.sort.uniq
|
120
146
|
end
|
121
147
|
|
122
|
-
def
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
target_paths.each do |path|
|
129
|
-
if %r{^/} =~ path
|
130
|
-
target_relatives << path.sub(%r{^/*},'') # cut first '/'
|
131
|
-
else
|
132
|
-
target_relatives << @current_dir.sub(%r{^/*},'') + '/' + path
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
# search updated files in the specified dir
|
138
|
-
cond = '^'+target_relatives.join('|^') # make reg exp
|
139
|
-
matched_updates = Array.new
|
140
|
-
updates.each do |update|
|
141
|
-
matched_updates << update if update[1].match(cond)
|
142
|
-
end
|
143
|
-
|
144
|
-
# search parent updates of matched updates
|
145
|
-
parents = Array.new
|
146
|
-
updates.each do |update|
|
147
|
-
matched_updates.each do |matched_update|
|
148
|
-
parents << update if matched_update[1].match("^#{update[1]}/")
|
149
|
-
end
|
150
|
-
end
|
151
|
-
matched_updates += parents
|
152
|
-
matched_updates.sort.uniq
|
153
|
-
end
|
154
|
-
|
155
|
-
def confirm_updates(updates)
|
148
|
+
def confirm_updates(updates, yes_no=%w{Y n})
|
149
|
+
Signal.trap('INT') {
|
150
|
+
puts
|
151
|
+
exit 1
|
152
|
+
}
|
153
|
+
display_list = true
|
156
154
|
until @options.has_key?(:non_interactive?)
|
157
155
|
puts
|
158
|
-
|
159
|
-
|
156
|
+
if display_list
|
157
|
+
(0...updates.size).each do |i|
|
158
|
+
puts "#{i}:#{updates[i][0]} #{updates[i][1]}"
|
159
|
+
end
|
160
|
+
display_list = false
|
160
161
|
end
|
161
|
-
print
|
162
|
+
print "OK? [#{yes_no[0]}|#{yes_no[1]}|<num to diff>]: "
|
162
163
|
res = $stdin.gets
|
163
164
|
puts
|
164
165
|
return nil unless res
|
165
166
|
res.chomp!
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
if /^\d+$/ =~ res
|
167
|
+
break if res == yes_no[0]
|
168
|
+
return nil if res == yes_no[1]
|
169
|
+
if /^\d+$/ =~ res && updates[res.to_i]
|
170
170
|
yield updates[res.to_i][1]
|
171
|
+
else
|
172
|
+
display_list = true
|
171
173
|
end
|
172
174
|
end
|
173
175
|
# res == 'Y'
|
@@ -243,12 +245,15 @@ class Yggdrasil
|
|
243
245
|
end
|
244
246
|
end
|
245
247
|
|
246
|
-
# add checker result
|
248
|
+
# add checker script and checker result
|
247
249
|
result_files = Array.new
|
248
|
-
Find.find(@
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
250
|
+
Find.find(@checker_dir) {|f| result_files << f unless f == @checker_dir}
|
251
|
+
Find.find(@checker_result_dir) {|f| result_files << f unless f == @checker_result_dir}
|
252
|
+
if result_files.size != 0
|
253
|
+
stdout = $stdout
|
254
|
+
$stdout = StringIO.new
|
255
|
+
self.class.new.add result_files
|
256
|
+
$stdout = stdout
|
257
|
+
end
|
253
258
|
end
|
254
259
|
end
|
data/lib/yggdrasil/check.rb
CHANGED
@@ -7,17 +7,18 @@ class Yggdrasil
|
|
7
7
|
parse_options(args,
|
8
8
|
{'--username'=>:username, '--password'=>:password,
|
9
9
|
'--non-interactive'=>:non_interactive?})
|
10
|
+
error "invalid options: #{(@arg_options).join(', ')}" if @arg_options.size != 0
|
11
|
+
|
10
12
|
@arg_paths << '/' if @arg_paths.size == 0
|
11
13
|
get_user_pass_if_need_to_read_repo
|
12
14
|
|
13
15
|
exec_checker
|
14
16
|
|
15
|
-
|
16
|
-
matched_updates = select_updates(updates, @arg_paths)
|
17
|
+
matched_updates = sync_mirror(@arg_paths)
|
17
18
|
|
18
19
|
check_result = String.new
|
19
20
|
if matched_updates.size != 0
|
20
|
-
confirmed_updates = confirm_updates(matched_updates) do |relative_path|
|
21
|
+
confirmed_updates = confirm_updates(matched_updates, %w{A q}) do |relative_path|
|
21
22
|
FileUtils.cd @mirror_dir do
|
22
23
|
cmd = "#@svn diff --no-auth-cache --non-interactive #{relative_path}"
|
23
24
|
cmd += username_password_options_to_read_repo
|
@@ -42,11 +43,17 @@ class Yggdrasil
|
|
42
43
|
check_result << "\n\n"
|
43
44
|
|
44
45
|
############## add diff information to check_result
|
45
|
-
cmd = "#@svn diff --no-auth-cache --non-interactive"
|
46
|
-
cmd += username_password_options_to_read_repo
|
47
|
-
cmd += " #{confirmed_updates.join(' ')}"
|
48
46
|
FileUtils.cd @mirror_dir do
|
49
|
-
|
47
|
+
result_array.each do |result_line|
|
48
|
+
if result_line =~ /\s(\S+)$/
|
49
|
+
result_path = $1
|
50
|
+
next if File.directory?(result_path)
|
51
|
+
cmd = "#@svn diff --no-auth-cache --non-interactive"
|
52
|
+
cmd += username_password_options_to_read_repo
|
53
|
+
cmd += ' '+result_path
|
54
|
+
check_result << system3(cmd) +"\n"
|
55
|
+
end
|
56
|
+
end
|
50
57
|
end
|
51
58
|
end
|
52
59
|
|
@@ -61,18 +68,15 @@ class Yggdrasil
|
|
61
68
|
sock.puts check_result
|
62
69
|
sock.close
|
63
70
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
71
|
+
end
|
72
|
+
|
73
|
+
puts @target_file_num.to_s + ' files checked.'
|
74
|
+
return if @target_file_num == 0
|
75
|
+
if check_result == ''
|
76
|
+
puts 'Yggdrasil check: OK.'
|
70
77
|
else
|
71
|
-
|
72
|
-
|
73
|
-
else
|
74
|
-
puts check_result
|
75
|
-
end
|
78
|
+
puts check_result
|
79
|
+
puts 'Yggdrasil check: NG!!!'
|
76
80
|
end
|
77
81
|
end
|
78
82
|
end
|
data/lib/yggdrasil/commit.rb
CHANGED
@@ -10,8 +10,7 @@ class Yggdrasil
|
|
10
10
|
|
11
11
|
exec_checker
|
12
12
|
|
13
|
-
|
14
|
-
matched_updates = select_updates(updates, @arg_paths)
|
13
|
+
matched_updates = sync_mirror(@arg_paths)
|
15
14
|
if matched_updates.size == 0
|
16
15
|
puts 'no files.'
|
17
16
|
return
|
@@ -46,7 +45,7 @@ class Yggdrasil
|
|
46
45
|
|
47
46
|
input_user_pass
|
48
47
|
FileUtils.cd @mirror_dir do
|
49
|
-
cmd = "#@svn commit -
|
48
|
+
cmd = "#@svn commit -m '#{@options[:message]}'"\
|
50
49
|
' --no-auth-cache --non-interactive'\
|
51
50
|
" --username '#{@options[:username]}' --password '#{@options[:password]}'"\
|
52
51
|
" #{confirmed_updates.join(' ')}"
|
data/lib/yggdrasil/diff.rb
CHANGED
@@ -4,12 +4,12 @@ class Yggdrasil
|
|
4
4
|
def diff(args)
|
5
5
|
parse_options(args,
|
6
6
|
{'--username'=>:username, '--password'=>:password,
|
7
|
-
'-r'=>:
|
7
|
+
'-r'=>:diff_rev, '--revision'=>:diff_rev})
|
8
8
|
@arg_paths << '/' if @arg_paths.size == 0
|
9
9
|
|
10
10
|
get_user_pass_if_need_to_read_repo
|
11
11
|
exec_checker
|
12
|
-
sync_mirror
|
12
|
+
sync_mirror(@arg_paths)
|
13
13
|
|
14
14
|
paths = Array.new
|
15
15
|
err_paths = Array.new
|
@@ -33,7 +33,7 @@ class Yggdrasil
|
|
33
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
|
-
cmd_arg += " -r #{@options[:
|
36
|
+
cmd_arg += " -r #{@options[:diff_rev]}" if @options.has_key?(:diff_rev)
|
37
37
|
cmd_arg += ' ' + paths.join(' ')
|
38
38
|
FileUtils.cd @mirror_dir do
|
39
39
|
puts system3(cmd_arg)
|
data/lib/yggdrasil/help.rb
CHANGED
data/lib/yggdrasil/init.rb
CHANGED
@@ -29,9 +29,9 @@ class Yggdrasil
|
|
29
29
|
`rm -rf #@config_file`
|
30
30
|
break
|
31
31
|
end
|
32
|
+
error "Already exist config file. use --force to ignore" if @options[:non_interactive?]
|
32
33
|
puts "Already exist config file: #@config_file"
|
33
|
-
|
34
|
-
print "Overwrite? [Yn]:"
|
34
|
+
print 'Overwrite? [Yn]: '
|
35
35
|
res = $stdin.gets
|
36
36
|
puts
|
37
37
|
return nil unless res
|
@@ -100,7 +100,7 @@ class Yggdrasil
|
|
100
100
|
msg = "not exist directory(s) in repository: #{url_parts[url_parts_num...url_parts.size].join('/')}"
|
101
101
|
error msg if @options[:non_interactive?]
|
102
102
|
puts msg
|
103
|
-
print 'make directory(s)? [Yn]:'
|
103
|
+
print 'make directory(s)? [Yn]: '
|
104
104
|
input = $stdin.gets
|
105
105
|
error 'can not gets $stdin' if input.nil?
|
106
106
|
puts
|
@@ -146,18 +146,15 @@ class Yggdrasil
|
|
146
146
|
cmd += " --username '#{@options[:ro_username]}' --password '#{@options[:ro_password]}'" unless anon_access
|
147
147
|
system3 cmd
|
148
148
|
|
149
|
-
# make checker
|
149
|
+
# make checker directory
|
150
150
|
Dir.mkdir @checker_dir, 0755 unless File.exist?(@checker_dir)
|
151
|
-
FileUtils.cd @checker_dir do
|
152
|
-
`echo 'gem list' > gem_list`
|
153
|
-
`chmod +x gem_list`
|
154
|
-
end
|
155
151
|
end
|
156
152
|
|
157
153
|
|
158
154
|
def init_get_repo_interactive
|
155
|
+
error "need --repo or --server" if @options[:non_interactive?]
|
159
156
|
loop do
|
160
|
-
print 'Input svn repo URL:'
|
157
|
+
print 'Input svn repo URL: '
|
161
158
|
input = $stdin.gets
|
162
159
|
error 'can not input svn repo URL' unless input
|
163
160
|
puts
|
data/lib/yggdrasil/update.rb
CHANGED
@@ -4,12 +4,12 @@ class Yggdrasil
|
|
4
4
|
def update(args)
|
5
5
|
parse_options(args,
|
6
6
|
{'--username'=>:username, '--password'=>:password,
|
7
|
+
'-r'=>:revision, '--revision'=>:revision,
|
7
8
|
'--non-interactive'=>:non_interactive?})
|
8
9
|
@arg_paths << '/' if @arg_paths.size == 0
|
9
10
|
get_user_pass_if_need_to_read_repo
|
10
11
|
|
11
|
-
|
12
|
-
matched_updates = select_updates(updates, @arg_paths)
|
12
|
+
matched_updates = sync_mirror(@arg_paths)
|
13
13
|
if matched_updates.size == 0
|
14
14
|
puts 'no files.'
|
15
15
|
return
|
data/lib/yggdrasil/version.rb
CHANGED
data/lib/yggdrasil_common.rb
CHANGED
@@ -66,7 +66,7 @@ module YggdrasilCommon
|
|
66
66
|
def input_user_pass
|
67
67
|
until @options.has_key?(:username) do
|
68
68
|
error 'Can\'t get username or password' if @options.has_key?(:non_interactive?)
|
69
|
-
print 'Input svn username:'
|
69
|
+
print 'Input svn username: '
|
70
70
|
input = $stdin.gets
|
71
71
|
error 'can not input username' unless input
|
72
72
|
puts
|
@@ -76,7 +76,7 @@ module YggdrasilCommon
|
|
76
76
|
end
|
77
77
|
until @options.has_key?(:password) do
|
78
78
|
error 'Can\'t get username or password' if @options.has_key?(:non_interactive?)
|
79
|
-
print 'Input svn password:'
|
79
|
+
print 'Input svn password: '
|
80
80
|
#input = `sh -c 'read -s hoge;echo $hoge'`
|
81
81
|
system3 'stty -echo', false
|
82
82
|
input = $stdin.gets
|
data/spec/check_spec.rb
CHANGED
@@ -14,61 +14,61 @@ describe Yggdrasil, 'check' do
|
|
14
14
|
|
15
15
|
it 'should display check result by "check"' do
|
16
16
|
cmd = %w{check --username hoge --password foo}
|
17
|
-
out = catch_out {Yggdrasil.command(cmd, "
|
17
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
18
18
|
out.should == <<"EOS"
|
19
19
|
|
20
20
|
0:A tmp/yggdrasil-test/C
|
21
21
|
1:D tmp/yggdrasil-test/A
|
22
22
|
2:M tmp/yggdrasil-test/B
|
23
|
-
OK? [
|
23
|
+
OK? [A|q|<num to diff>]:#{' '}
|
24
24
|
EOS
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'should display check result by "c"' do
|
28
28
|
cmd = %w{c --username hoge --password foo}
|
29
|
-
out = catch_out {Yggdrasil.command(cmd, "
|
29
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
30
30
|
out.should == <<"EOS"
|
31
31
|
|
32
32
|
0:A tmp/yggdrasil-test/C
|
33
33
|
1:D tmp/yggdrasil-test/A
|
34
34
|
2:M tmp/yggdrasil-test/B
|
35
|
-
OK? [
|
35
|
+
OK? [A|q|<num to diff>]:#{' '}
|
36
36
|
EOS
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'should display check result by "status"' do
|
40
40
|
cmd = %w{status --username hoge --password foo}
|
41
|
-
out = catch_out {Yggdrasil.command(cmd, "
|
41
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
42
42
|
out.should == <<"EOS"
|
43
43
|
|
44
44
|
0:A tmp/yggdrasil-test/C
|
45
45
|
1:D tmp/yggdrasil-test/A
|
46
46
|
2:M tmp/yggdrasil-test/B
|
47
|
-
OK? [
|
47
|
+
OK? [A|q|<num to diff>]:#{' '}
|
48
48
|
EOS
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'should display check result by "stat"' do
|
52
52
|
cmd = %w{stat --username hoge --password foo}
|
53
|
-
out = catch_out {Yggdrasil.command(cmd, "
|
53
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
54
54
|
out.should == <<"EOS"
|
55
55
|
|
56
56
|
0:A tmp/yggdrasil-test/C
|
57
57
|
1:D tmp/yggdrasil-test/A
|
58
58
|
2:M tmp/yggdrasil-test/B
|
59
|
-
OK? [
|
59
|
+
OK? [A|q|<num to diff>]:#{' '}
|
60
60
|
EOS
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'should display check result by "st"' do
|
64
64
|
cmd = %w{st --username hoge --password foo}
|
65
|
-
out = catch_out {Yggdrasil.command(cmd, "
|
65
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
66
66
|
out.should == <<"EOS"
|
67
67
|
|
68
68
|
0:A tmp/yggdrasil-test/C
|
69
69
|
1:D tmp/yggdrasil-test/A
|
70
70
|
2:M tmp/yggdrasil-test/B
|
71
|
-
OK? [
|
71
|
+
OK? [A|q|<num to diff>]:#{' '}
|
72
72
|
EOS
|
73
73
|
|
74
74
|
`echo hoge > /tmp/yggdrasil-test/A`
|
@@ -78,6 +78,22 @@ EOS
|
|
78
78
|
`rm -f /tmp/yggdrasil-test/C`
|
79
79
|
end
|
80
80
|
|
81
|
+
it 'should fail by spell miss of path' do
|
82
|
+
cmd = %w{st --username hoge --password foo /hoge}
|
83
|
+
err = catch_err do
|
84
|
+
lambda{Yggdrasil.command(cmd)}.should raise_error(SystemExit)
|
85
|
+
end
|
86
|
+
err.should == "#{File.basename($0)} error: no such file of directory:/hoge\n\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should fail by spell miss of option' do
|
90
|
+
cmd = %w{st --username hoge --password foo --hoge}
|
91
|
+
err = catch_err do
|
92
|
+
lambda{Yggdrasil.command(cmd)}.should raise_error(SystemExit)
|
93
|
+
end
|
94
|
+
err.should == "#{File.basename($0)} error: invalid options: --hoge\n\n"
|
95
|
+
end
|
96
|
+
|
81
97
|
it 'should execute checker and svn add the result' do
|
82
98
|
puts "\n---- should execute checker and svn add the result"
|
83
99
|
`rm -f /tmp/yggdrasil-test/.yggdrasil/checker/gem_list`
|
@@ -88,8 +104,26 @@ EOS
|
|
88
104
|
out = catch_out {Yggdrasil.command(cmd, "Y\n")}
|
89
105
|
out.gsub! /[ ]+/, ' '
|
90
106
|
out.should == <<"EOS"
|
107
|
+
10 files checked.
|
108
|
+
A 0 tmp/yggdrasil-test/.yggdrasil
|
109
|
+
A 0 tmp/yggdrasil-test/.yggdrasil/checker
|
110
|
+
A 0 tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
111
|
+
A 0 tmp/yggdrasil-test/.yggdrasil/checker_result
|
91
112
|
A 0 tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
92
113
|
|
114
|
+
Index: tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
115
|
+
===================================================================
|
116
|
+
--- tmp/yggdrasil-test/.yggdrasil/checker/hoge (revision 0)
|
117
|
+
+++ tmp/yggdrasil-test/.yggdrasil/checker/hoge (revision 0)
|
118
|
+
@@ -0,0 +1 @@
|
119
|
+
+echo hoge
|
120
|
+
|
121
|
+
Property changes on: tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
122
|
+
___________________________________________________________________
|
123
|
+
Added: svn:executable
|
124
|
+
+ *
|
125
|
+
|
126
|
+
|
93
127
|
Index: tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
94
128
|
===================================================================
|
95
129
|
--- tmp/yggdrasil-test/.yggdrasil/checker_result/hoge (revision 0)
|
@@ -107,8 +141,12 @@ EOS
|
|
107
141
|
out = catch_out {Yggdrasil.command cmd}
|
108
142
|
|
109
143
|
out.should == <<"EOS"
|
144
|
+
Adding tmp/yggdrasil-test/.yggdrasil
|
145
|
+
Adding tmp/yggdrasil-test/.yggdrasil/checker
|
146
|
+
Adding tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
147
|
+
Adding tmp/yggdrasil-test/.yggdrasil/checker_result
|
110
148
|
Adding tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
111
|
-
Transmitting file data
|
149
|
+
Transmitting file data ..
|
112
150
|
Committed revision 4.
|
113
151
|
EOS
|
114
152
|
end
|
@@ -117,14 +155,24 @@ EOS
|
|
117
155
|
puts "\n---- should delete result if checker deleted"
|
118
156
|
`rm -f /tmp/yggdrasil-test/.yggdrasil/checker/hoge`
|
119
157
|
cmd = %w{check --username hoge --password foo}
|
120
|
-
out = catch_out {Yggdrasil.command(cmd, "
|
158
|
+
out = catch_out {Yggdrasil.command(cmd, "A\n")}
|
121
159
|
out.gsub! /[ ]+/, ' '
|
122
160
|
out.should == <<"EOS"
|
123
161
|
|
124
|
-
0:D tmp/yggdrasil-test/.yggdrasil/
|
125
|
-
|
162
|
+
0:D tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
163
|
+
1:D tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
164
|
+
OK? [A|q|<num to diff>]:#{' '}
|
165
|
+
9 files checked.
|
166
|
+
D 4 tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
126
167
|
D 4 tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
127
168
|
|
169
|
+
Index: tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
170
|
+
===================================================================
|
171
|
+
--- tmp/yggdrasil-test/.yggdrasil/checker/hoge (revision 4)
|
172
|
+
+++ tmp/yggdrasil-test/.yggdrasil/checker/hoge (working copy)
|
173
|
+
@@ -1 +0,0 @@
|
174
|
+
-echo hoge
|
175
|
+
|
128
176
|
Index: tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
129
177
|
===================================================================
|
130
178
|
--- tmp/yggdrasil-test/.yggdrasil/checker_result/hoge (revision 4)
|
@@ -142,6 +190,7 @@ EOS
|
|
142
190
|
out = catch_out {Yggdrasil.command cmd}
|
143
191
|
|
144
192
|
out.should == <<"EOS"
|
193
|
+
Deleting tmp/yggdrasil-test/.yggdrasil/checker/hoge
|
145
194
|
Deleting tmp/yggdrasil-test/.yggdrasil/checker_result/hoge
|
146
195
|
|
147
196
|
Committed revision 5.
|
@@ -177,10 +226,10 @@ EOS
|
|
177
226
|
Yggdrasil.command %w{init --debug --server localhost:4000} +
|
178
227
|
%w{--username hoge --password foo},
|
179
228
|
"Y\nhoge\nfoo\n"
|
180
|
-
|
229
|
+
|
181
230
|
Yggdrasil.command %w{check --non-interactive}
|
182
231
|
|
183
|
-
sleep
|
232
|
+
sleep 2
|
184
233
|
File.exist?('/tmp/yggdrasil-test/.yggdrasil/results').should be_true
|
185
234
|
files = Dir.entries('/tmp/yggdrasil-test/.yggdrasil/results')
|
186
235
|
result_files = files.select{|file| %r{^#{Socket.gethostname}} =~ file}
|
@@ -188,10 +237,6 @@ EOS
|
|
188
237
|
out = `cat /tmp/yggdrasil-test/.yggdrasil/results/#{result_files[0]}`
|
189
238
|
out.gsub! /[ ]+/, ' '
|
190
239
|
out.should == <<"EOS"
|
191
|
-
A 0 tmp
|
192
|
-
A 0 tmp/yggdrasil-test
|
193
|
-
A 0 tmp/yggdrasil-test/.yggdrasil
|
194
|
-
A 0 tmp/yggdrasil-test/.yggdrasil/checker_result
|
195
240
|
|
196
241
|
EOS
|
197
242
|
end
|
@@ -205,8 +250,9 @@ EOS
|
|
205
250
|
"Y\nHOGE\n"
|
206
251
|
|
207
252
|
`echo foo >> /tmp/yggdrasil-test/A`
|
208
|
-
Yggdrasil.command %w{check}, "
|
253
|
+
Yggdrasil.command %w{check}, "A\n"
|
209
254
|
|
255
|
+
sleep 1
|
210
256
|
files = Dir.entries('/tmp/yggdrasil-test/.yggdrasil/results')
|
211
257
|
result_files = files.select{|file| %r{^#{Socket.gethostname}} =~ file}
|
212
258
|
out = `cat /tmp/yggdrasil-test/.yggdrasil/results/#{result_files[0]}`
|
@@ -221,6 +267,7 @@ Index: tmp/yggdrasil-test/A
|
|
221
267
|
@@ -1 +1,2 @@
|
222
268
|
hoge
|
223
269
|
+foo
|
270
|
+
|
224
271
|
EOS
|
225
272
|
end
|
226
273
|
|
@@ -232,11 +279,41 @@ EOS
|
|
232
279
|
|
233
280
|
Yggdrasil.command %w{check --non-interactive}
|
234
281
|
|
282
|
+
sleep 1
|
235
283
|
files = Dir.entries('/tmp/yggdrasil-test/.yggdrasil/results')
|
236
284
|
result_files = files.select{|file| %r{^#{Socket.gethostname}} =~ file}
|
237
285
|
`cat /tmp/yggdrasil-test/.yggdrasil/results/#{result_files[0]}`.should == "\n"
|
238
286
|
end
|
239
287
|
|
288
|
+
it 'should recover delete flag' do
|
289
|
+
pending "under construction..."
|
290
|
+
puts "\n---- should recover delete flag"
|
291
|
+
|
292
|
+
`mkdir /tmp/yggdrasil-test/c`
|
293
|
+
`echo bar > /tmp/yggdrasil-test/c/C`
|
294
|
+
|
295
|
+
Yggdrasil.command %w{add /tmp/yggdrasil-test/c/C}
|
296
|
+
Yggdrasil.command %w{commit --username hoge --password foo} +
|
297
|
+
%w{-m BAR --non-interactive}
|
298
|
+
|
299
|
+
`mv /tmp/yggdrasil-test/c /tmp/yggdrasil-test/cc`
|
300
|
+
cmd = %w{c --username hoge --password foo}
|
301
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
302
|
+
out.should == <<"EOS"
|
303
|
+
|
304
|
+
0:D tmp/yggdrasil-test/c
|
305
|
+
1:D tmp/yggdrasil-test/c/C
|
306
|
+
OK? [A|q|<num to diff>]:#{' '}
|
307
|
+
EOS
|
308
|
+
|
309
|
+
`mv /tmp/yggdrasil-test/cc /tmp/yggdrasil-test/c`
|
310
|
+
cmd = %w{c --username hoge --password foo}
|
311
|
+
out = catch_out {Yggdrasil.command(cmd, "q\n")}
|
312
|
+
out.should == <<"EOS"
|
313
|
+
|
314
|
+
EOS
|
315
|
+
end
|
316
|
+
|
240
317
|
after(:all) do
|
241
318
|
sock = TCPSocket.open('localhost', 4000)
|
242
319
|
sock.puts('quit')
|
data/spec/commit_spec.rb
CHANGED
@@ -105,7 +105,7 @@ describe Yggdrasil, 'commit' do
|
|
105
105
|
puts "\n-- check file exists on repo"
|
106
106
|
res = `svn ls file:///tmp/yggdrasil-test/svn-repo/mng-repo/host-name/tmp/yggdrasil-test`
|
107
107
|
puts res
|
108
|
-
res.should == "
|
108
|
+
res.should == "A\nB\n"
|
109
109
|
end
|
110
110
|
|
111
111
|
it 'should commit deleted file' do
|
@@ -120,7 +120,7 @@ describe Yggdrasil, 'commit' do
|
|
120
120
|
puts "\n-- check committed delete file"
|
121
121
|
res = `svn ls file:///tmp/yggdrasil-test/svn-repo/mng-repo/host-name/tmp/yggdrasil-test`
|
122
122
|
puts res
|
123
|
-
res.should == "
|
123
|
+
res.should == "A\n"
|
124
124
|
end
|
125
125
|
|
126
126
|
it 'should commit all files at once' do
|
@@ -139,7 +139,20 @@ describe Yggdrasil, 'commit' do
|
|
139
139
|
puts "\n-- check committed delete file"
|
140
140
|
res = `svn ls file:///tmp/yggdrasil-test/svn-repo/mng-repo/host-name/tmp/yggdrasil-test`
|
141
141
|
puts res
|
142
|
-
res.should == "
|
142
|
+
res.should == "A\nc/\n"
|
143
143
|
end
|
144
144
|
|
145
|
+
it 'should commit deleted directory' do
|
146
|
+
puts '---- should commit deleted directory'
|
147
|
+
`rm -rf /tmp/yggdrasil-test/c`
|
148
|
+
|
149
|
+
Yggdrasil.command %w{commit -m delete --debug} +
|
150
|
+
%w{--username hoge --password foo},
|
151
|
+
"0\n1\nY\n"
|
152
|
+
|
153
|
+
puts "\n-- check committed delete file"
|
154
|
+
res = `svn ls file:///tmp/yggdrasil-test/svn-repo/mng-repo/host-name/tmp/yggdrasil-test`
|
155
|
+
puts res
|
156
|
+
res.should == "A\n"
|
157
|
+
end
|
145
158
|
end
|
data/spec/help_spec.rb
CHANGED
@@ -232,6 +232,7 @@ Valid options:
|
|
232
232
|
--username ARG : specify a username ARG
|
233
233
|
--password ARG : specify a password ARG
|
234
234
|
--non-interactive : do no interactive prompting
|
235
|
+
-r [--revision] ARG : revision number
|
235
236
|
|
236
237
|
EOS
|
237
238
|
end
|
@@ -247,6 +248,7 @@ Valid options:
|
|
247
248
|
--username ARG : specify a username ARG
|
248
249
|
--password ARG : specify a password ARG
|
249
250
|
--non-interactive : do no interactive prompting
|
251
|
+
-r [--revision] ARG : revision number
|
250
252
|
|
251
253
|
EOS
|
252
254
|
end
|
data/spec/init_spec.rb
CHANGED
@@ -15,6 +15,14 @@ describe Yggdrasil, 'init' do
|
|
15
15
|
err.should == "#{File.basename($0)} error: Not enough arguments provided: --repo\n\n"
|
16
16
|
end
|
17
17
|
|
18
|
+
it 'should error: "no --repo at --non-interactive"' do
|
19
|
+
puts '---- should error: "no --repo at --non-interactive"'
|
20
|
+
err = catch_err do
|
21
|
+
lambda{Yggdrasil.command(%w{init --non-interactive})}.should raise_error(SystemExit)
|
22
|
+
end
|
23
|
+
err.should == "#{File.basename($0)} error: need --repo or --server\n\n"
|
24
|
+
end
|
25
|
+
|
18
26
|
it 'should error: can not access to SVN server' do
|
19
27
|
puts '---- should error: can not access to SVN server'
|
20
28
|
`rm -rf /tmp/yggdrasil-test/.yggdrasil`
|
@@ -115,25 +123,22 @@ EOS
|
|
115
123
|
"Y\n"
|
116
124
|
end
|
117
125
|
out.should == <<"EOS"
|
118
|
-
Input svn repo URL
|
126
|
+
Input svn repo URL:#{' '}
|
119
127
|
check SVN access...
|
120
|
-
Input svn username
|
121
|
-
Input svn password
|
128
|
+
Input svn username:#{' '}
|
129
|
+
Input svn password:#{' '}
|
122
130
|
SVN access OK: svn://localhost/tmp/yggdrasil-test/svn-repo
|
123
131
|
not exist directory(s) in repository: mng-repo/host-name
|
124
|
-
make directory(s)? [Yn]
|
132
|
+
make directory(s)? [Yn]:#{' '}
|
125
133
|
add svn://localhost/tmp/yggdrasil-test/svn-repo/mng-repo
|
126
134
|
add svn://localhost/tmp/yggdrasil-test/svn-repo/mng-repo/host-name
|
127
135
|
EOS
|
128
136
|
end
|
129
137
|
|
130
|
-
it 'should make checker
|
131
|
-
puts "\n---- should make checker
|
138
|
+
it 'should make checker directory at init' do
|
139
|
+
puts "\n---- should make checker directory at init"
|
132
140
|
dir = '/tmp/yggdrasil-test/.yggdrasil/checker'
|
133
141
|
File.directory?(dir).should be_true
|
134
|
-
|
135
|
-
example_checker = dir + '/gem_list'
|
136
|
-
File.executable?(example_checker).should be_true
|
137
142
|
end
|
138
143
|
|
139
144
|
it 'should success init subcommand with server option' do
|
@@ -174,7 +179,7 @@ EOS
|
|
174
179
|
end
|
175
180
|
out.should == <<"EOS"
|
176
181
|
Already exist config file: /tmp/yggdrasil-test/.yggdrasil/config
|
177
|
-
Overwrite? [Yn]
|
182
|
+
Overwrite? [Yn]:#{' '}
|
178
183
|
EOS
|
179
184
|
end
|
180
185
|
|
@@ -186,7 +191,7 @@ EOS
|
|
186
191
|
end
|
187
192
|
out.should == <<"EOS"
|
188
193
|
Already exist config file: /tmp/yggdrasil-test/.yggdrasil/config
|
189
|
-
Overwrite? [Yn]
|
194
|
+
Overwrite? [Yn]:#{' '}
|
190
195
|
check SVN access...
|
191
196
|
SVN access OK: file:///tmp/yggdrasil-test/.yggdrasil/private_repo
|
192
197
|
EOS
|
@@ -198,15 +203,14 @@ EOS
|
|
198
203
|
|
199
204
|
it 'should error --non-interactive: already exist config file' do
|
200
205
|
puts '---- should error --non-interactive: already exist config file'
|
201
|
-
|
206
|
+
err = catch_err do
|
202
207
|
cmd_args = %w{init --repo file:///tmp/yggdrasil-test/svn-repo}+
|
203
208
|
%w{--username hoge --password foo} +
|
204
209
|
%w{--non-interactive}
|
205
210
|
lambda{Yggdrasil.command(cmd_args)}.should raise_error(SystemExit)
|
206
211
|
end
|
207
|
-
|
208
|
-
|
209
|
-
EOS
|
212
|
+
err.should == "#{File.basename($0)} error: Already exist config file. use --force to ignore\n\n"
|
213
|
+
|
210
214
|
config = `cat /tmp/yggdrasil-test/.yggdrasil/config | grep repo=`
|
211
215
|
config.should == <<"EOS"
|
212
216
|
repo=file:///tmp/yggdrasil-test/.yggdrasil/private_repo
|
data/spec/list_spec.rb
CHANGED
@@ -22,7 +22,7 @@ describe Yggdrasil, 'list' do
|
|
22
22
|
%w{--username hoge --password foo}
|
23
23
|
end
|
24
24
|
end
|
25
|
-
out.should == "
|
25
|
+
out.should == "A\nB\n"
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'should show list (no path)' do
|
@@ -36,8 +36,6 @@ describe Yggdrasil, 'list' do
|
|
36
36
|
out.should == <<"EOS"
|
37
37
|
tmp/
|
38
38
|
tmp/yggdrasil-test/
|
39
|
-
tmp/yggdrasil-test/.yggdrasil/
|
40
|
-
tmp/yggdrasil-test/.yggdrasil/checker_result/
|
41
39
|
tmp/yggdrasil-test/A
|
42
40
|
tmp/yggdrasil-test/B
|
43
41
|
EOS
|
@@ -49,8 +47,6 @@ EOS
|
|
49
47
|
%w{--username hoge --password foo})}
|
50
48
|
out.should == <<"EOS"
|
51
49
|
yggdrasil-test/
|
52
|
-
yggdrasil-test/.yggdrasil/
|
53
|
-
yggdrasil-test/.yggdrasil/checker_result/
|
54
50
|
yggdrasil-test/A
|
55
51
|
yggdrasil-test/B
|
56
52
|
EOS
|
@@ -62,8 +58,6 @@ EOS
|
|
62
58
|
%w{--username hoge --password foo})}
|
63
59
|
out.should == <<"EOS"
|
64
60
|
yggdrasil-test/
|
65
|
-
yggdrasil-test/.yggdrasil/
|
66
|
-
yggdrasil-test/.yggdrasil/checker_result/
|
67
61
|
yggdrasil-test/A
|
68
62
|
yggdrasil-test/B
|
69
63
|
EOS
|
data/spec/revert_spec.rb
CHANGED
@@ -27,7 +27,7 @@ describe Yggdrasil, 'revert' do
|
|
27
27
|
%w{--username hoge --password foo}
|
28
28
|
end
|
29
29
|
puts out
|
30
|
-
out.should == "
|
30
|
+
out.should == "3 files checked.\nYggdrasil check: OK.\n"
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'should revert modified file' do
|
@@ -45,7 +45,7 @@ describe Yggdrasil, 'revert' do
|
|
45
45
|
%w{--username hoge --password foo}
|
46
46
|
end
|
47
47
|
puts out
|
48
|
-
out.should == "
|
48
|
+
out.should == "3 files checked.\nYggdrasil check: OK.\n"
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'should accept password interactive' do
|
@@ -61,7 +61,7 @@ describe Yggdrasil, 'revert' do
|
|
61
61
|
%w{--username hoge --password foo}
|
62
62
|
end
|
63
63
|
puts out
|
64
|
-
out.should == "
|
64
|
+
out.should == "3 files checked.\nYggdrasil check: OK.\n"
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'should revert specified file only' do
|
@@ -81,6 +81,7 @@ describe Yggdrasil, 'revert' do
|
|
81
81
|
puts out
|
82
82
|
out.gsub!(%r{ +}, ' ')
|
83
83
|
out.should == <<"EOS"
|
84
|
+
3 files checked.
|
84
85
|
M 3 tmp/yggdrasil-test/A
|
85
86
|
|
86
87
|
Index: tmp/yggdrasil-test/A
|
@@ -91,6 +92,8 @@ Index: tmp/yggdrasil-test/A
|
|
91
92
|
hoge
|
92
93
|
hoge
|
93
94
|
+A
|
95
|
+
|
96
|
+
Yggdrasil check: NG!!!
|
94
97
|
EOS
|
95
98
|
end
|
96
99
|
|
@@ -110,6 +113,7 @@ EOS
|
|
110
113
|
puts out
|
111
114
|
out.gsub!(%r{ +},' ')
|
112
115
|
out.should == <<"EOS"
|
116
|
+
3 files checked.
|
113
117
|
D 3 tmp/yggdrasil-test/A
|
114
118
|
|
115
119
|
Index: tmp/yggdrasil-test/A
|
@@ -119,6 +123,8 @@ Index: tmp/yggdrasil-test/A
|
|
119
123
|
@@ -1,2 +0,0 @@
|
120
124
|
-hoge
|
121
125
|
-hoge
|
126
|
+
|
127
|
+
Yggdrasil check: NG!!!
|
122
128
|
EOS
|
123
129
|
end
|
124
130
|
|
@@ -141,6 +147,6 @@ EOS
|
|
141
147
|
%w{--username hoge --password foo}
|
142
148
|
end
|
143
149
|
puts out
|
144
|
-
out.should == "
|
150
|
+
out.should == "3 files checked.\nYggdrasil check: OK.\n"
|
145
151
|
end
|
146
152
|
end
|
data/spec/server_results_spec.rb
CHANGED
data/spec/update_spec.rb
CHANGED
@@ -69,4 +69,20 @@ describe Yggdrasil, 'update' do
|
|
69
69
|
`cat /tmp/yggdrasil-test/A`.should == "A:no path\n"
|
70
70
|
`cat /tmp/yggdrasil-test/B`.should == "B:no path\n"
|
71
71
|
end
|
72
|
+
|
73
|
+
it 'should success update with revision' do
|
74
|
+
puts '---- should success update with revision'
|
75
|
+
`echo A:hoge > /tmp/yggdrasil-test/A`
|
76
|
+
`echo B:hoge > /tmp/yggdrasil-test/B`
|
77
|
+
Yggdrasil.command %w{commit} +
|
78
|
+
%w{-m hoge} +
|
79
|
+
%w{--username hoge --password foo --non-interactive}
|
80
|
+
|
81
|
+
FileUtils.cd '/tmp' do
|
82
|
+
Yggdrasil.command %w{update} +
|
83
|
+
%w{-r 4 --username hoge --password foo --non-interactive}
|
84
|
+
end
|
85
|
+
`cat /tmp/yggdrasil-test/A`.should == "A:related/absolute path\n"
|
86
|
+
`cat /tmp/yggdrasil-test/B`.should == "B:related/absolute path\n"
|
87
|
+
end
|
72
88
|
end
|
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.16
|
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-
|
12
|
+
date: 2013-08-11 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: -1313669213311713118
|
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: -1313669213311713118
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
131
|
rubygems_version: 1.8.25
|