yggdrasil 0.0.15 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- 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
|