dev 1.0.247 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +4 -4
- data/lib/dev.rb +8 -60
- metadata +26 -69
- data/README +0 -103
- data/bin/devgem +0 -71
- data/lib/dev/Array.rb +0 -17
- data/lib/dev/BoostBuild.rb +0 -94
- data/lib/dev/Commands.rb +0 -185
- data/lib/dev/Database.rb +0 -134
- data/lib/dev/Dep.rb +0 -117
- data/lib/dev/Deps.rb +0 -44
- data/lib/dev/Environment.rb +0 -142
- data/lib/dev/Hash.rb +0 -92
- data/lib/dev/MsBuild.rb +0 -17
- data/lib/dev/Paths.rb +0 -50
- data/lib/dev/Project.rb +0 -175
- data/lib/dev/Scm.rb +0 -125
- data/lib/dev/Svn.rb +0 -55
- data/lib/dev/SystemCall.rb +0 -288
- data/lib/dev/Tasks.rb +0 -140
- data/lib/dev/cmd/Build.rb +0 -112
- data/lib/dev/cmd/Commit.rb +0 -19
- data/lib/dev/cmd/Compile.rb +0 -35
- data/lib/dev/cmd/DeepPull.rb +0 -56
- data/lib/dev/cmd/Info.rb +0 -16
- data/lib/dev/cmd/Pull.rb +0 -46
- data/lib/dev/cmd/Replace.rb +0 -69
- data/lib/dev/cmd/Setup.rb +0 -28
- data/lib/dev/cmd/Test.rb +0 -34
- data/lib/dev/cmd/Update.rb +0 -10
data/lib/dev/Scm.rb
DELETED
@@ -1,125 +0,0 @@
|
|
1
|
-
module Dev
|
2
|
-
class Scm
|
3
|
-
@@default=nil
|
4
|
-
|
5
|
-
attr_accessor :scm_type
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
puts_debug "initalizing Scm"
|
9
|
-
call=Dev::SystemCall.new("svn info")
|
10
|
-
@scm_type=nil
|
11
|
-
@scm_type = "svn" if call.output.include?("Last Changed Date:")
|
12
|
-
@scm_type = "svn" if @scm_type.nil? && File.exists?(".svn")
|
13
|
-
if(@scm_type.nil?)
|
14
|
-
call=Dev::SystemCall.new("git status")
|
15
|
-
@scm_type = "git" if call.output.include?("#")
|
16
|
-
@scm_type = "git" if @scm_type.nil? && File.exists?(".git")
|
17
|
-
end
|
18
|
-
puts_debug "scm_type = " + @scm_type.to_s
|
19
|
-
end
|
20
|
-
|
21
|
-
def file_tracked?(file)
|
22
|
-
puts_debug "file_tracked?(" + file + ")"
|
23
|
-
puts_debug "scm_type = #{@scm_type}"
|
24
|
-
if @scm_type=="git"
|
25
|
-
call=Dev::SystemCall.new("git ls-files #{file} --error-unmatch")
|
26
|
-
puts_debug "call.output:"
|
27
|
-
puts_debug call.output
|
28
|
-
puts_debug "call.error"
|
29
|
-
puts_debug call.error
|
30
|
-
if call.status==0
|
31
|
-
puts_debug "file IS tracked by git."
|
32
|
-
puts_debug call.output
|
33
|
-
return true
|
34
|
-
else
|
35
|
-
puts_debug "file is NOT tracked by git."
|
36
|
-
#return false
|
37
|
-
end
|
38
|
-
#return true if call.status==0
|
39
|
-
end
|
40
|
-
#false
|
41
|
-
end
|
42
|
-
|
43
|
-
def add_file(file)
|
44
|
-
#call=Dev::SystemCall.new("git add #{file}") if @scm_type=="git"
|
45
|
-
|
46
|
-
if @scm_type=="svn"
|
47
|
-
afile=file
|
48
|
-
afile="#{file}@" if afile.include?('@')
|
49
|
-
|
50
|
-
`svn info "#{afile}"`
|
51
|
-
status=$?.exitstatus
|
52
|
-
if(status != 0)
|
53
|
-
call=Dev::SystemCall.new("svn add \"#{afile}\" --parents")
|
54
|
-
call.puts_summary
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
if @scm_type=="git"
|
59
|
-
afile=file
|
60
|
-
|
61
|
-
#`git status "#{afile}"`
|
62
|
-
#status=$?.exitstatus
|
63
|
-
#if(status != 0)
|
64
|
-
if(file_tracked?(afile))
|
65
|
-
puts_debug "file #{afile} is tracked by git"
|
66
|
-
else
|
67
|
-
call=Dev::SystemCall.new("git add \"#{afile}\"")
|
68
|
-
call.puts_summary
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def add_file_glob(glob)
|
74
|
-
Dir.glob(glob).each { |f|
|
75
|
-
if(!f.include?("/obj/") &&
|
76
|
-
!f.include?("/bin/") &&
|
77
|
-
!f.include?("/TestOutput/") &&
|
78
|
-
f.index("obj/") != 0 &&
|
79
|
-
f.index("bin/") != 0 )
|
80
|
-
add_file(f)
|
81
|
-
end
|
82
|
-
}
|
83
|
-
end
|
84
|
-
|
85
|
-
def self.export(remote,local,scm)
|
86
|
-
puts_debug "Scm.export, scm=#{scm}"
|
87
|
-
if remote.include?("svn:") || scm=="svn"
|
88
|
-
local_tmp=local.gsub('@','-')
|
89
|
-
call=Dev::SystemCall.new("svn export \"#{remote}\" \"#{local_tmp}\"")
|
90
|
-
call.puts_summary
|
91
|
-
if(local_tmp != local)
|
92
|
-
sleep 15
|
93
|
-
File.rename(local_tmp,local) if File.exist?(local_tmp)
|
94
|
-
sleep 15
|
95
|
-
end
|
96
|
-
end
|
97
|
-
if scm=="git"
|
98
|
-
call=Dev::SystemCall.new("git clone #{remote} #{local}")
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def self.update(local)
|
103
|
-
end
|
104
|
-
|
105
|
-
def self.get_default_scm_uri
|
106
|
-
|
107
|
-
text=`svn info`
|
108
|
-
if(!text.include?("not a working copy"))
|
109
|
-
text.scan(/URL: ([\w:\/.-]+)/).each { |m|
|
110
|
-
return m[0]
|
111
|
-
}
|
112
|
-
end
|
113
|
-
return nil
|
114
|
-
end
|
115
|
-
|
116
|
-
def self.get_default_scm_type
|
117
|
-
if @@default.nil?
|
118
|
-
puts_debug "creating default instance of Scm"
|
119
|
-
@@default=Scm.new
|
120
|
-
end
|
121
|
-
return @@default.scm_type
|
122
|
-
end
|
123
|
-
|
124
|
-
end # class Scm
|
125
|
-
end # module Dev
|
data/lib/dev/Svn.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module Dev
|
2
|
-
class Svn
|
3
|
-
|
4
|
-
def self.last_changed_revision(url)
|
5
|
-
call=Dev::SystemCall.new("svn info #{url}")
|
6
|
-
if call.status == 0
|
7
|
-
call.output.each_line { |line|
|
8
|
-
words=line.split(':')
|
9
|
-
return words[1].strip if(words.length==2 && words[0] == "Last Changed Rev")
|
10
|
-
}
|
11
|
-
end
|
12
|
-
return "0"
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.update_revision_variable(filename,variable_name,url)
|
16
|
-
if File.exist?(filename)
|
17
|
-
revision=Dev::Svn::last_changed_revision(url)
|
18
|
-
replace="#{variable_name}='#{revision}'"
|
19
|
-
puts " " + replace + " in " + filename unless revision=="0"
|
20
|
-
text=File.read(filename)
|
21
|
-
unless text.include?(replace)
|
22
|
-
unless revision == "0"
|
23
|
-
puts " updating " + filename + " with " + replace
|
24
|
-
search=Regexp.new("#{variable_name}=['\"][\\d]+['\"]")
|
25
|
-
Dev::Environment.replace_text_in_file(filename,search,"#{variable_name}='#{revision}'")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.update_revision_variables(filename)
|
32
|
-
if File.exist?(filename)
|
33
|
-
puts_debug "scanning " + filename + " for revision variables"
|
34
|
-
text=File.read(filename)
|
35
|
-
# extract potential variable names of form
|
36
|
-
text.scan(/([\dA-Z_]+)=['"][\d]+['"]/).each{ | var_match |
|
37
|
-
puts_debug "found var_match: " + var_match[0].to_s
|
38
|
-
varname = var_match[0].to_s
|
39
|
-
# extract potential urls that use the variable name
|
40
|
-
# '([.\w:\/-]+)@#{INTERFACE_REV}'
|
41
|
-
uri_search=Regexp.new("['\"]([.\\w:\\/-]+)@" + '#{' + "#{varname}" + '}' + "['\"]")
|
42
|
-
#puts uri_search.to_s
|
43
|
-
text.scan(uri_search).each { |uri_match|
|
44
|
-
puts_debug "found uri_match: " + uri_match.to_s
|
45
|
-
uri=uri_match[0].to_s
|
46
|
-
update_revision_variable(filename,varname,uri)
|
47
|
-
}
|
48
|
-
}
|
49
|
-
else
|
50
|
-
puts " " + filename + " does not exist"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
end # class Svn
|
55
|
-
end # module Dev
|
data/lib/dev/SystemCall.rb
DELETED
@@ -1,288 +0,0 @@
|
|
1
|
-
puts_debug "read " + __FILE__
|
2
|
-
|
3
|
-
require 'tmpdir'
|
4
|
-
require 'open3'
|
5
|
-
require 'systemu'
|
6
|
-
require 'sqlite3' if(RUBY_VERSION != "1.8.7")
|
7
|
-
|
8
|
-
module Dev
|
9
|
-
|
10
|
-
class SystemCall
|
11
|
-
attr_accessor :output,:error,:status,:command,:start_time,:end_time,:timeout,:timed_out,:dir,:cache, :capture_output, :capture_error, :throw_on_error
|
12
|
-
|
13
|
-
def initialize(cmd)
|
14
|
-
@throw_on_error=true
|
15
|
-
if(cmd.kind_of?(Hash))
|
16
|
-
set_hash(cmd)
|
17
|
-
else
|
18
|
-
hash=Dev::Environment.s_to_hash(cmd)
|
19
|
-
set_hash(hash) unless hash.nil?
|
20
|
-
@command=cmd if hash.nil?
|
21
|
-
end
|
22
|
-
execute(@command);
|
23
|
-
end
|
24
|
-
|
25
|
-
def elapsed; @end_time-@start_time; end
|
26
|
-
|
27
|
-
def cache_name
|
28
|
-
name = @dir+"/" + @command.gsub(" ","_").gsub("\\","-").gsub("/","-") unless @dir.nil?
|
29
|
-
name = @command.gsub(" ","_").gsub("\\","-").gsub("/","-") if @dir.nil?
|
30
|
-
return name
|
31
|
-
end
|
32
|
-
|
33
|
-
def has_cache
|
34
|
-
File.exist?(cache_name)
|
35
|
-
end
|
36
|
-
|
37
|
-
def get_hash
|
38
|
-
hash = Hash.new()
|
39
|
-
hash[:cmd]=@command
|
40
|
-
hash[:dir]=@dir
|
41
|
-
hash[:output]=@output
|
42
|
-
hash[:error]=@error
|
43
|
-
hash[:status]=@status
|
44
|
-
hash[:start_time]=@start_time
|
45
|
-
hash[:end_time]=@end_time
|
46
|
-
hash[:elapsed]=elapsed.to_s
|
47
|
-
hash[:time_out]=@time_out
|
48
|
-
hash[:timeout]=@timeout
|
49
|
-
hash[:cache]=@cache
|
50
|
-
hash[:capture_output]=@capture_output
|
51
|
-
hash[:capture_error]=@capture_error
|
52
|
-
hash[:throw_on_error]=@throw_on_error
|
53
|
-
return hash
|
54
|
-
end
|
55
|
-
|
56
|
-
def set_hash(hash)
|
57
|
-
@command=hash[:cmd] unless hash[:cmd].nil?
|
58
|
-
@dir=hash[:dir] unless hash[:dir].nil?
|
59
|
-
@output=hash[:output] unless hash[:output].nil?
|
60
|
-
@error=hash[:error] unless hash[:error].nil?
|
61
|
-
@status=hash[:status] unless hash[:status].nil?
|
62
|
-
@start_time=hash[:start_time] unless hash[:start_time].nil?
|
63
|
-
@end_time=hash[:end_time] unless hash[:end_time].nil?
|
64
|
-
@time_out=hash[:timeout] unless hash[:timeout].nil?
|
65
|
-
@timed_out=hash[:timed_out] unless hash[:timed_out].nil?
|
66
|
-
@cache=hash[:cache] unless hash[:cache].nil?
|
67
|
-
@capture_output=hash[:capture_output] unless hash[:capture_output].nil?
|
68
|
-
@capture_error=hash[:capture_error] unless hash[:capture_error].nil?
|
69
|
-
@throw_on_error=hash[:throw_on_error] unless hash[:throw_on_error].nil?
|
70
|
-
end
|
71
|
-
|
72
|
-
def write_cache
|
73
|
-
marshal_dump = Marshal.dump(get_hash)
|
74
|
-
file=File.new(cache_name,'wb')
|
75
|
-
file.write marshal_dump
|
76
|
-
file.close
|
77
|
-
end
|
78
|
-
|
79
|
-
def load_cache
|
80
|
-
file=File.open(cache_name,'rb')
|
81
|
-
hash = Marshal.load file.read
|
82
|
-
file.close
|
83
|
-
set_hash hash
|
84
|
-
end
|
85
|
-
|
86
|
-
def execute(cmd)
|
87
|
-
if !@cache.nil? && has_cache
|
88
|
-
load_cache
|
89
|
-
return
|
90
|
-
end
|
91
|
-
|
92
|
-
pwd=Dir.pwd
|
93
|
-
@start_time=Time.now
|
94
|
-
begin
|
95
|
-
capture_output=true if capture_output.nil?
|
96
|
-
capture_output=false if capture_output == "false"
|
97
|
-
capture_error=true if capture_error.nil?
|
98
|
-
capture_error=false unless capture_output
|
99
|
-
capture_error=false if capture_error == "false"
|
100
|
-
#puts_debug "system2('#{@dir}','#{@command}',#{@capture_output.to_s},#{@capture_error.to_s}) (in SystemCall.execute)"
|
101
|
-
@status,@output,@error=system2(@dir,@command,@capture_output,@capture_error)
|
102
|
-
@end_time=Time.now
|
103
|
-
log
|
104
|
-
rescue Exception=>e
|
105
|
-
puts "error executing ruby code: #{@command}"
|
106
|
-
warn "exception:"
|
107
|
-
warn e.to_s
|
108
|
-
@status="1"
|
109
|
-
@end_time=Time.now
|
110
|
-
ensure
|
111
|
-
Dir.chdir(pwd) if Dir.pwd != pwd
|
112
|
-
write_cache if !@cache.nil?
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def system2(working_dir,command,capture_output,capture_error)
|
117
|
-
capture_output=true if capture_output.nil?
|
118
|
-
capture_output=false if capture_output == "false"
|
119
|
-
capture_error=true if capture_error.nil?
|
120
|
-
capture_error=false unless capture_output
|
121
|
-
capture_error=false if capture_error == "false"
|
122
|
-
|
123
|
-
filename=Dir.tmpdir + "/" + (0...2).map{65.+(rand(25)).chr}.join
|
124
|
-
filename=Dir.tmpdir + "/" + (0...2).map{65.+(rand(25)).chr}.join if File.exist? "#{filename}.out"
|
125
|
-
working_dir = Dir.pwd if working_dir.nil? || working_dir.empty?
|
126
|
-
status=0
|
127
|
-
output=""
|
128
|
-
error=""
|
129
|
-
|
130
|
-
FileUtils.rm("#{filename}.out") if File.exist? "#{filename}.out"
|
131
|
-
FileUtils.rm("#{filename}.err") if File.exist? "#{filename}.err"
|
132
|
-
|
133
|
-
Dir.chdir(working_dir) do
|
134
|
-
if(capture_output)
|
135
|
-
if(capture_error)
|
136
|
-
system("#{@command} >#{filename}.out 2>#{filename}.err")
|
137
|
-
else
|
138
|
-
system("#{@command} >#{filename}.out")
|
139
|
-
end
|
140
|
-
else
|
141
|
-
if(capture_error)
|
142
|
-
system("#{@command} 2>#{filename}.err")
|
143
|
-
else
|
144
|
-
system(@command)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
if(File.exist?("#{filename}.out"))
|
150
|
-
File.open("#{filename}.out",'r') {|f|
|
151
|
-
output = f.read
|
152
|
-
f.close
|
153
|
-
}
|
154
|
-
begin
|
155
|
-
FileUtils.rm("#{filename}.out")
|
156
|
-
rescue
|
157
|
-
warn "unable to remove file #{filename}.out"
|
158
|
-
end
|
159
|
-
end
|
160
|
-
if(File.exist?("#{filename}.err"))
|
161
|
-
File.open("#{filename}.err",'r') {|f|
|
162
|
-
error = f.read
|
163
|
-
f.close
|
164
|
-
}
|
165
|
-
begin
|
166
|
-
FileUtils.rm("#{filename}.err")
|
167
|
-
rescue
|
168
|
-
warn "unable to remove file #{filename}.err"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
status=$?.exitstatus
|
173
|
-
return status,output,error
|
174
|
-
end
|
175
|
-
|
176
|
-
def puts_summary
|
177
|
-
puts_summary2(@throw_on_error)
|
178
|
-
end
|
179
|
-
|
180
|
-
def puts_summary2(throw_on_error)
|
181
|
-
if(@status != 0)
|
182
|
-
if(RUBY_VERSION == "1.8.7")
|
183
|
-
summary = " [" + "X" + "]" + " " + @command + " has exit status of " + @status.to_s
|
184
|
-
else
|
185
|
-
summary = " [" + "X" + "]" + " " + @command + " has exit status of " + @status.to_s
|
186
|
-
#summary = Rainbow(" [").foreground(:cyan) + Rainbow("X").foreground(:red).bright + Rainbow("]").foreground(:cyan) + " " + Rainbow(@command).foreground(:green) + " has exit status of " + @status.to_s
|
187
|
-
end
|
188
|
-
summary += " dir: " + @dir unless @dir.nil?
|
189
|
-
summary += " cache: true" unless @cache.nil?
|
190
|
-
summary += " capture_output: false" unless @capture_output.nil? || @capture_output
|
191
|
-
puts summary
|
192
|
-
puts @output if !@output.nil?
|
193
|
-
warn @error if !@error.nil?
|
194
|
-
throw "exit status was " + @status.to_s if throw_on_error
|
195
|
-
else
|
196
|
-
elapsed_str="[" + "%.0f" %(elapsed) + "s]"
|
197
|
-
if(RUBY_VERSION == "1.8.7")
|
198
|
-
summary = " [" + "+" + "]" + " " + @command + " " + elapsed_str
|
199
|
-
else
|
200
|
-
summary = " [" + "+" + "]" + " " + @command + " " + elapsed_str
|
201
|
-
#summary = Rainbow(" [").foreground(:cyan) + Rainbow("+").foreground(:green) + Rainbow("]").foreground(:cyan) + " " + Rainbow(@command).foreground(:green) + " " + Rainbow(elapsed_str).foreground(:cyan)
|
202
|
-
end
|
203
|
-
summary += " dir: " + @dir unless @dir.nil?
|
204
|
-
summary += " cache: true" unless @cache.nil?
|
205
|
-
summary += " capture_output: false" unless @capture_output.nil? || @capture_output
|
206
|
-
puts summary
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def self.puts_hash_summary(h)
|
211
|
-
if(h[:status] != 0 && h[:status] != "0")
|
212
|
-
summary = " [".foreground(:cyan) + "X".foreground(:red).bright + "]".foreground(:cyan) + " " + h[:cmd].foreground(:green) + " has exit status of " + h[:status].to_s
|
213
|
-
summary += " dir: " + h[:dir] unless h[:dir].nil?
|
214
|
-
puts summary
|
215
|
-
puts h[:output] if !h[:output].nil?
|
216
|
-
warn h[:error] if !h[:error].nil?
|
217
|
-
throw "exit status was " + h[:status].to_s
|
218
|
-
else
|
219
|
-
elapsed_str="[" + "%.0f" %(h[:elapsed]) + "s]"
|
220
|
-
summary = " [".foreground(:cyan) + "+".foreground(:green) + "]".foreground(:cyan) + " " + h[:cmd].foreground(:green) + " " + elapsed_str.foreground(:cyan)
|
221
|
-
summary += " dir: " + h[:dir] unless h[:dir].nil?
|
222
|
-
puts summary
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
def user_profile
|
227
|
-
["USERPROFILE","HOME"].each {|v|
|
228
|
-
return ENV[v].gsub('\\','/') unless ENV[v].nil?
|
229
|
-
}
|
230
|
-
dir="~"
|
231
|
-
end
|
232
|
-
|
233
|
-
def split(input)
|
234
|
-
m = /(?:'(?:\\.|[^'])*'|[^' ])+/.match(input)
|
235
|
-
end
|
236
|
-
|
237
|
-
def log
|
238
|
-
filename = user_profile + "/CommandHistory.sql"
|
239
|
-
sql=""
|
240
|
-
if(File.exists?(filename))
|
241
|
-
begin
|
242
|
-
words = split(@command)
|
243
|
-
cmd = words[0]
|
244
|
-
arguments = @command.gsub("#{cmd} ","");
|
245
|
-
executable = cmd
|
246
|
-
cmd = File.basename(executable).gsub(File.extname(executable),"");
|
247
|
-
|
248
|
-
db = SQLite3::Database.new filename
|
249
|
-
@timeout=0 if @timeout.nil?
|
250
|
-
@dir=Rake.original_dir() if(@dir.nil?)
|
251
|
-
values = "VALUES(null,'" + @start_time.strftime('%Y-%m-%dT%H:%M:%S') +
|
252
|
-
"','" + @end_time.strftime('%Y-%m-%dT%H:%M:%S') +
|
253
|
-
"','" + Time.at(elapsed).gmtime.strftime('%H:%M:%S') +
|
254
|
-
"'," + @status.to_s +
|
255
|
-
",'" + cmd + #@command.gsub("'","''") +
|
256
|
-
"','" + arguments +
|
257
|
-
"','" + @dir.to_s +
|
258
|
-
#"','" + @output.gsub("'", "''") +
|
259
|
-
#"','" + @error.gsub("'", "''") +
|
260
|
-
"','" + executable +
|
261
|
-
"'," + @timeout.to_s + ")"
|
262
|
-
sql="insert into Commands #{values};"
|
263
|
-
db.execute(sql)
|
264
|
-
if(@status != 0)
|
265
|
-
id=nil
|
266
|
-
db.execute("select * from Commands where startTime='" +
|
267
|
-
@start_time.strftime('%Y-%m-%dT%H:%M:%S') +
|
268
|
-
"' AND exitCode=" + @status.to_s + ";") do |row|
|
269
|
-
id=row[0]
|
270
|
-
end
|
271
|
-
if(!id.nil?)
|
272
|
-
sql="insert or replace INTO Output VALUES(" + id.to_s +
|
273
|
-
",'" + @output.gsub("'","''") +
|
274
|
-
"','" + @error.gsub("'","''") + "')";
|
275
|
-
db.execute(sql)
|
276
|
-
end
|
277
|
-
end
|
278
|
-
db.close
|
279
|
-
db=nil
|
280
|
-
rescue
|
281
|
-
#puts_debug "failed to execute '#{sql}'"
|
282
|
-
end
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
end # class SystemCall
|
287
|
-
|
288
|
-
end # module Dev
|