dev 2.0.46 → 2.0.47
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/dev_commands.rb +1063 -0
- data/lib/dev_environment.rb +42 -1
- data/lib/dev_git.rb +50 -3
- data/lib/dev_msbuild.rb +72 -0
- data/lib/dev_projects.rb +136 -5
- data/lib/dev_svn.rb +98 -1
- data/lib/dev_tasks.rb +84 -2
- metadata +2 -33
- data/lib/add.rb +0 -22
- data/lib/analyze.rb +0 -8
- data/lib/array.rb +0 -30
- data/lib/build.rb +0 -33
- data/lib/clean.rb +0 -12
- data/lib/clobber.rb +0 -15
- data/lib/command.rb +0 -208
- data/lib/commands.rb +0 -36
- data/lib/commit.rb +0 -20
- data/lib/doc.rb +0 -9
- data/lib/environment.rb +0 -49
- data/lib/gemspec.rb +0 -40
- data/lib/git.rb +0 -51
- data/lib/hash.rb +0 -21
- data/lib/info.rb +0 -3
- data/lib/internet.rb +0 -24
- data/lib/msbuild.rb +0 -70
- data/lib/project.rb +0 -64
- data/lib/projects.rb +0 -66
- data/lib/publish.rb +0 -21
- data/lib/pull.rb +0 -12
- data/lib/push.rb +0 -9
- data/lib/setup.rb +0 -25
- data/lib/svn.rb +0 -99
- data/lib/tasks.rb +0 -82
- data/lib/test.rb +0 -58
- data/lib/text.rb +0 -16
- data/lib/timeout.rb +0 -81
- data/lib/timer.rb +0 -41
- data/lib/update.rb +0 -6
- data/lib/upgrade.rb +0 -6
data/lib/dev_commands.rb
CHANGED
@@ -1,3 +1,1066 @@
|
|
1
|
+
require 'open3'
|
2
|
+
#require_relative('./array.rb')
|
3
|
+
#require_relative('./hash.rb')
|
4
|
+
#require_relative('./timer.rb')
|
5
|
+
|
6
|
+
BUFFER_SIZE=1024 if(!defined?(BUFFER_SIZE))
|
7
|
+
|
8
|
+
# = Command
|
9
|
+
#
|
10
|
+
# execution of system commands
|
11
|
+
#
|
12
|
+
# = Keys
|
13
|
+
#
|
14
|
+
# - :input The input of the commands.
|
15
|
+
# - :timeout The timeout in seconds.
|
16
|
+
# a value of zero is to infinite timeout.
|
17
|
+
# defaults to zero
|
18
|
+
# - :directory The working directory for the command.
|
19
|
+
# defaults to the current directory
|
20
|
+
# - :exit_code The exit code of the command
|
21
|
+
# - :output The output contains the stdout output of the command
|
22
|
+
# - :error The error contains stderr output of the command
|
23
|
+
# - :machine The name of the machine the command executed on
|
24
|
+
# - :user The user name
|
25
|
+
# - :start_time
|
26
|
+
# - :end_time
|
27
|
+
#
|
28
|
+
class Command < Hash
|
29
|
+
def initialize command
|
30
|
+
|
31
|
+
self[:input] = ''
|
32
|
+
self[:timeout] = 0
|
33
|
+
self[:directory] = ''
|
34
|
+
self[:exit_code] = 0
|
35
|
+
self[:output] = ''
|
36
|
+
self[:error] = ''
|
37
|
+
self[:machine] = ''
|
38
|
+
self[:user] = ''
|
39
|
+
self[:start_time] = nil
|
40
|
+
self[:end_time] = nil
|
41
|
+
|
42
|
+
if(command.kind_of?(String))
|
43
|
+
self[:input] = command
|
44
|
+
end
|
45
|
+
|
46
|
+
if(command.kind_of?(Hash))
|
47
|
+
command.each{|k,v|
|
48
|
+
self[k.to_sym]=v
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def quiet?
|
54
|
+
(self.has_key?(:quiet) && self[:quiet])
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute value=nil
|
58
|
+
|
59
|
+
if(!value.nil? && value.is_a?(Hash))
|
60
|
+
value.each{|k,v|self[k]=v}
|
61
|
+
end
|
62
|
+
|
63
|
+
pwd=Dir.pwd
|
64
|
+
self[:directory] = pwd if(!self.has_key?(:directory) || self[:directory].length==0)
|
65
|
+
|
66
|
+
if(self[:timeout] > 0)
|
67
|
+
puts "#{self[:input]} (#{self[:directory]}) timeout #{self[:timeout].to_s}" if(!quiet?)
|
68
|
+
else
|
69
|
+
puts "#{self[:input]} (#{self[:directory]})" if(!quiet?)
|
70
|
+
end
|
71
|
+
|
72
|
+
self[:machine] = Command.machine
|
73
|
+
self[:user] = Command.user
|
74
|
+
|
75
|
+
self[:start_time]=Time.now
|
76
|
+
timer=Timer.new
|
77
|
+
|
78
|
+
Dir.chdir(self[:directory]) do
|
79
|
+
if self[:input].include?('<%') && self[:input].include?('%>')
|
80
|
+
ruby = self[:input].gsub("<%","").gsub("%>","")
|
81
|
+
|
82
|
+
begin
|
83
|
+
self[:output]=eval(ruby)
|
84
|
+
rescue
|
85
|
+
self[:exit_code]=1
|
86
|
+
self[:error]="unable to eval(#{ruby})"
|
87
|
+
end
|
88
|
+
|
89
|
+
self[:elapsed] = timer.elapsed_str
|
90
|
+
self[:end_time] = Time.now
|
91
|
+
else
|
92
|
+
begin
|
93
|
+
if(self[:timeout] <= 0)
|
94
|
+
self[:output],self[:error],status= Open3.capture3(self[:input])
|
95
|
+
self[:exit_code]=status.to_i
|
96
|
+
self[:elapsed] = timer.elapsed_str
|
97
|
+
self[:end_time] = Time.now
|
98
|
+
else
|
99
|
+
require_relative 'timeout.rb'
|
100
|
+
#puts run_with_timeout(self[:input], self[:timeout], 1).to_s
|
101
|
+
#self[:output] = run_with_timeout(self[:input], self[:timeout], 1)
|
102
|
+
result=run_with_timeout2(self[:directory],self[:input], self[:timeout], 2)
|
103
|
+
self[:output]=result[0]
|
104
|
+
self[:error]=result[1]
|
105
|
+
self[:exit_code]=result[2]
|
106
|
+
|
107
|
+
self[:elapsed] = timer.elapsed_str
|
108
|
+
self[:end_time] = Time.now
|
109
|
+
|
110
|
+
if(timer.elapsed >= self[:timeout])
|
111
|
+
self[:exit_code]=1
|
112
|
+
self[:error] = self[:error] + "timed out"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
rescue Exception => e
|
116
|
+
self[:elapsed] = timer.elapsed_str
|
117
|
+
self[:end_time] = Time.now
|
118
|
+
self[:error] = "Exception: " + e.to_s
|
119
|
+
self[:exit_code]=1
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
if(self[:exit_code] != 0)
|
126
|
+
if(!quiet?)
|
127
|
+
puts "exit_code=#{self[:exit_code]}"
|
128
|
+
puts self[:output]
|
129
|
+
puts self[:error]
|
130
|
+
end
|
131
|
+
if(!self.has_key?(:ignore_failure) || !self[:ignore_failure])
|
132
|
+
raise "#{self[:input]} failed"
|
133
|
+
end #unless (self.has_key?(:ignore_failure) && self[:ignore_failure]==true)
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.machine
|
139
|
+
if !ENV['COMPUTERNAME'].nil?
|
140
|
+
return ENV['COMPUTERNAME']
|
141
|
+
end
|
142
|
+
|
143
|
+
machine = `hostname`
|
144
|
+
machine = machine.split('.')[0] if machine.include?('.')
|
145
|
+
return machine.strip
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.user
|
149
|
+
ENV['USER'].nil? ? ENV['USERNAME'] : ENV['USER']
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.home
|
153
|
+
["USERPROFILE","HOME"].each {|v|
|
154
|
+
return ENV[v].gsub('\\','/') unless ENV[v].nil?
|
155
|
+
}
|
156
|
+
dir="~"
|
157
|
+
dir=ENV["HOME"] unless ENV["HOME"].nil?
|
158
|
+
dir=ENV["USERPROFILE"].gsub('\\','/') unless ENV["USERPROFILE"].nil?
|
159
|
+
return dir
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.dev_root
|
163
|
+
["DEV_HOME","DEV_ROOT"].each {|v|
|
164
|
+
return ENV[v].gsub('\\','/') unless ENV[v].nil?
|
165
|
+
}
|
166
|
+
dir=home
|
167
|
+
#dir=ENV["DEV_ROOT"].gsub('\\','/') unless ENV["DEV_ROOT"].nil?
|
168
|
+
return dir
|
169
|
+
end
|
170
|
+
|
171
|
+
def self.exit_code command
|
172
|
+
cmd = Command.new(command)
|
173
|
+
cmd[:ignore_failure]=true
|
174
|
+
cmd[:quiet]=true
|
175
|
+
cmd.execute
|
176
|
+
cmd[:exit_code]
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.output command
|
180
|
+
cmd = Command.new(command)
|
181
|
+
cmd[:ignore_failure]=true
|
182
|
+
cmd[:quiet]=true
|
183
|
+
cmd.execute
|
184
|
+
cmd[:output]
|
185
|
+
end
|
186
|
+
|
187
|
+
def getFormattedTimeSpan timespan
|
188
|
+
seconds = timespan
|
189
|
+
seconds.to_s + " sec"
|
190
|
+
end
|
191
|
+
|
192
|
+
def summary
|
193
|
+
duration=""
|
194
|
+
duration=getFormattedTimeSpan(self[:end_time]-[:start_time]) + " - " if(!self[:end_time].nil?)
|
195
|
+
duration + "#{self[:exit_code].to_s} #{self[:input]} (#{self[:directory]})"
|
196
|
+
end
|
197
|
+
|
198
|
+
def to_html
|
199
|
+
if self[:exit_code] == 0
|
200
|
+
[
|
201
|
+
'<div><table><tr><td width="20"></td><td><pre>',
|
202
|
+
self[:input],
|
203
|
+
'</pre></td></tr></table></div>'
|
204
|
+
].join
|
205
|
+
else
|
206
|
+
[
|
207
|
+
'<div><table><tr><td width="20"></td><td><pre>',
|
208
|
+
self[:input],
|
209
|
+
'</pre><table><tr><td width="20"></td><td><table>',
|
210
|
+
map { |k, v| ["<tr><td><strong>#{k}</strong></td>", v.respond_to?(:to_html) ? v.to_html : "<td><span><pre>#{v}</pre></span></td></tr>"] },
|
211
|
+
'</table>',
|
212
|
+
'</td></tr></table></td></tr></table></div>'
|
213
|
+
].join
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
class Add < Array
|
218
|
+
def update
|
219
|
+
if(File.exists?('.git') && File.exists?('.gitignore'))
|
220
|
+
add 'git add --all'
|
221
|
+
else
|
222
|
+
if(defined?(SOURCE))
|
223
|
+
if(File.exists?('.svn'))
|
224
|
+
SOURCE.each{|f|
|
225
|
+
|
226
|
+
add "svn add #{f} --parents" if Command.output("svn status #{f}").include?('?')
|
227
|
+
add "svn add #{f} --parents" if Command.exit_code("svn status #{f}") != 0
|
228
|
+
}
|
229
|
+
end
|
230
|
+
if(File.exists?('.git'))
|
231
|
+
SOURCE.each{|f|
|
232
|
+
add "git add #{f} -v" if `git status #{f}`.include?('untracked')
|
233
|
+
}
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
class Analyze < Array
|
240
|
+
def update
|
241
|
+
if(`gem list countloc`.include?('countloc ('))
|
242
|
+
FileUtils.mkdir('doc') if(!File.exists?('doc'))
|
243
|
+
add 'countloc -r * --html doc/countloc.html'
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
class Array
|
248
|
+
def execute value=nil
|
249
|
+
i=0
|
250
|
+
while i < self.length
|
251
|
+
self[i]=Command.new(self[i]) if(self[i].is_a?(String))
|
252
|
+
self[i]=Command.new(self[i]) if(self[i].is_a?(Hash) && !self[i].is_a?(Command))
|
253
|
+
|
254
|
+
if(!value.nil? && value.is_a?(Hash))
|
255
|
+
value.each{|k,v|self[i][k]=v}
|
256
|
+
end
|
257
|
+
|
258
|
+
self[i].execute if(self[i].is_a?(Command))
|
259
|
+
i=i+1
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def add command
|
264
|
+
self << command if(!include?(command))
|
265
|
+
end
|
266
|
+
|
267
|
+
def to_html
|
268
|
+
html=Array.new
|
269
|
+
html << '<div>'
|
270
|
+
self.each{|e|
|
271
|
+
html << e.to_html if e.respond_to?(:to_html)
|
272
|
+
}
|
273
|
+
html << '</div>'
|
274
|
+
html.join
|
275
|
+
end
|
276
|
+
end
|
277
|
+
#require_relative('msbuild.rb')
|
278
|
+
#require_relative('gemspec.rb')
|
279
|
+
require 'rake'
|
280
|
+
|
281
|
+
SLN_FILES=FileList.new('*.sln','*/*.sln','*/*/*.sln')
|
282
|
+
|
283
|
+
class Build < Array
|
284
|
+
def update
|
285
|
+
|
286
|
+
changed = true
|
287
|
+
#changed = Git.has_changes? if(File.exists?('.git') && defined?(Git))
|
288
|
+
#changed = Svn.has_changes? if(File.exists?('.svn') && defined?(Svn))
|
289
|
+
if(changed)
|
290
|
+
Dir.glob('*.gemspec'){|gemspec|
|
291
|
+
add "gem build #{gemspec}" if !File.exist?(Gemspec.gemfile gemspec)
|
292
|
+
}
|
293
|
+
|
294
|
+
SLN_FILES.each{|sln_file|
|
295
|
+
vs_version=MSBuild.get_vs_version(sln_file)
|
296
|
+
if(MSBuild.has_version?(vs_version))
|
297
|
+
MSBuild.get_configurations(sln_file).each{ |configuration|
|
298
|
+
MSBuild.get_platforms(sln_file).each{|platform|
|
299
|
+
#Console.debug "configuration='#{configuration}', platform='#{platform}'"
|
300
|
+
self.add "\"#{MSBuild.get_version(vs_version)}\" \"#{sln_file}\" /nologo /p:Configuration=#{configuration} /p:Platform=\"#{platform}\""
|
301
|
+
}
|
302
|
+
}
|
303
|
+
else
|
304
|
+
"puts version #{vs_version} not found for MsBuild"
|
305
|
+
end
|
306
|
+
}
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
class Clean < Array
|
311
|
+
def update
|
312
|
+
['.yardoc','log','tmp','obj'].each{|dir|
|
313
|
+
CLEAN.include(dir) if File.exists?(dir)
|
314
|
+
}
|
315
|
+
|
316
|
+
CLEAN.include('*.{suo,sdf}')
|
317
|
+
|
318
|
+
#add '<%Rake::Task[:clean].reenable%>'
|
319
|
+
add '<%Rake::Task[:clean].invoke%>'
|
320
|
+
end
|
321
|
+
end
|
322
|
+
class Clobber < Array
|
323
|
+
def update
|
324
|
+
['bin'].each{|dir|
|
325
|
+
CLOBBER.include(dir) if File.exists?(dir)
|
326
|
+
}
|
327
|
+
|
328
|
+
clean=Clean.new
|
329
|
+
clean.update
|
330
|
+
|
331
|
+
CLOBBER.include('*.gem')
|
332
|
+
|
333
|
+
#add '<%Rake::Task[:clobber].reenable%>'
|
334
|
+
add '<%Rake::Task[:clobber].invoke%>'
|
335
|
+
end
|
336
|
+
end
|
337
|
+
require 'open3'
|
338
|
+
#require_relative('./array.rb')
|
339
|
+
#require_relative('./hash.rb')
|
340
|
+
#require_relative('./timer.rb')
|
341
|
+
|
342
|
+
BUFFER_SIZE=1024 if(!defined?(BUFFER_SIZE))
|
343
|
+
|
344
|
+
# = Command
|
345
|
+
#
|
346
|
+
# execution of system commands
|
347
|
+
#
|
348
|
+
# = Keys
|
349
|
+
#
|
350
|
+
# - :input The input of the commands.
|
351
|
+
# - :timeout The timeout in seconds.
|
352
|
+
# a value of zero is to infinite timeout.
|
353
|
+
# defaults to zero
|
354
|
+
# - :directory The working directory for the command.
|
355
|
+
# defaults to the current directory
|
356
|
+
# - :exit_code The exit code of the command
|
357
|
+
# - :output The output contains the stdout output of the command
|
358
|
+
# - :error The error contains stderr output of the command
|
359
|
+
# - :machine The name of the machine the command executed on
|
360
|
+
# - :user The user name
|
361
|
+
# - :start_time
|
362
|
+
# - :end_time
|
363
|
+
#
|
364
|
+
class Command < Hash
|
365
|
+
def initialize command
|
366
|
+
|
367
|
+
self[:input] = ''
|
368
|
+
self[:timeout] = 0
|
369
|
+
self[:directory] = ''
|
370
|
+
self[:exit_code] = 0
|
371
|
+
self[:output] = ''
|
372
|
+
self[:error] = ''
|
373
|
+
self[:machine] = ''
|
374
|
+
self[:user] = ''
|
375
|
+
self[:start_time] = nil
|
376
|
+
self[:end_time] = nil
|
377
|
+
|
378
|
+
if(command.kind_of?(String))
|
379
|
+
self[:input] = command
|
380
|
+
end
|
381
|
+
|
382
|
+
if(command.kind_of?(Hash))
|
383
|
+
command.each{|k,v|
|
384
|
+
self[k.to_sym]=v
|
385
|
+
}
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
def quiet?
|
390
|
+
(self.has_key?(:quiet) && self[:quiet])
|
391
|
+
end
|
392
|
+
|
393
|
+
def execute value=nil
|
394
|
+
|
395
|
+
if(!value.nil? && value.is_a?(Hash))
|
396
|
+
value.each{|k,v|self[k]=v}
|
397
|
+
end
|
398
|
+
|
399
|
+
pwd=Dir.pwd
|
400
|
+
self[:directory] = pwd if(!self.has_key?(:directory) || self[:directory].length==0)
|
401
|
+
|
402
|
+
if(self[:timeout] > 0)
|
403
|
+
puts "#{self[:input]} (#{self[:directory]}) timeout #{self[:timeout].to_s}" if(!quiet?)
|
404
|
+
else
|
405
|
+
puts "#{self[:input]} (#{self[:directory]})" if(!quiet?)
|
406
|
+
end
|
407
|
+
|
408
|
+
self[:machine] = Command.machine
|
409
|
+
self[:user] = Command.user
|
410
|
+
|
411
|
+
self[:start_time]=Time.now
|
412
|
+
timer=Timer.new
|
413
|
+
|
414
|
+
Dir.chdir(self[:directory]) do
|
415
|
+
if self[:input].include?('<%') && self[:input].include?('%>')
|
416
|
+
ruby = self[:input].gsub("<%","").gsub("%>","")
|
417
|
+
|
418
|
+
begin
|
419
|
+
self[:output]=eval(ruby)
|
420
|
+
rescue
|
421
|
+
self[:exit_code]=1
|
422
|
+
self[:error]="unable to eval(#{ruby})"
|
423
|
+
end
|
424
|
+
|
425
|
+
self[:elapsed] = timer.elapsed_str
|
426
|
+
self[:end_time] = Time.now
|
427
|
+
else
|
428
|
+
begin
|
429
|
+
if(self[:timeout] <= 0)
|
430
|
+
self[:output],self[:error],status= Open3.capture3(self[:input])
|
431
|
+
self[:exit_code]=status.to_i
|
432
|
+
self[:elapsed] = timer.elapsed_str
|
433
|
+
self[:end_time] = Time.now
|
434
|
+
else
|
435
|
+
require_relative 'timeout.rb'
|
436
|
+
#puts run_with_timeout(self[:input], self[:timeout], 1).to_s
|
437
|
+
#self[:output] = run_with_timeout(self[:input], self[:timeout], 1)
|
438
|
+
result=run_with_timeout2(self[:directory],self[:input], self[:timeout], 2)
|
439
|
+
self[:output]=result[0]
|
440
|
+
self[:error]=result[1]
|
441
|
+
self[:exit_code]=result[2]
|
442
|
+
|
443
|
+
self[:elapsed] = timer.elapsed_str
|
444
|
+
self[:end_time] = Time.now
|
445
|
+
|
446
|
+
if(timer.elapsed >= self[:timeout])
|
447
|
+
self[:exit_code]=1
|
448
|
+
self[:error] = self[:error] + "timed out"
|
449
|
+
end
|
450
|
+
end
|
451
|
+
rescue Exception => e
|
452
|
+
self[:elapsed] = timer.elapsed_str
|
453
|
+
self[:end_time] = Time.now
|
454
|
+
self[:error] = "Exception: " + e.to_s
|
455
|
+
self[:exit_code]=1
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
|
461
|
+
if(self[:exit_code] != 0)
|
462
|
+
if(!quiet?)
|
463
|
+
puts "exit_code=#{self[:exit_code]}"
|
464
|
+
puts self[:output]
|
465
|
+
puts self[:error]
|
466
|
+
end
|
467
|
+
if(!self.has_key?(:ignore_failure) || !self[:ignore_failure])
|
468
|
+
raise "#{self[:input]} failed"
|
469
|
+
end #unless (self.has_key?(:ignore_failure) && self[:ignore_failure]==true)
|
470
|
+
end
|
471
|
+
|
472
|
+
end
|
473
|
+
|
474
|
+
def self.machine
|
475
|
+
if !ENV['COMPUTERNAME'].nil?
|
476
|
+
return ENV['COMPUTERNAME']
|
477
|
+
end
|
478
|
+
|
479
|
+
machine = `hostname`
|
480
|
+
machine = machine.split('.')[0] if machine.include?('.')
|
481
|
+
return machine.strip
|
482
|
+
end
|
483
|
+
|
484
|
+
def self.user
|
485
|
+
ENV['USER'].nil? ? ENV['USERNAME'] : ENV['USER']
|
486
|
+
end
|
487
|
+
|
488
|
+
def self.home
|
489
|
+
["USERPROFILE","HOME"].each {|v|
|
490
|
+
return ENV[v].gsub('\\','/') unless ENV[v].nil?
|
491
|
+
}
|
492
|
+
dir="~"
|
493
|
+
dir=ENV["HOME"] unless ENV["HOME"].nil?
|
494
|
+
dir=ENV["USERPROFILE"].gsub('\\','/') unless ENV["USERPROFILE"].nil?
|
495
|
+
return dir
|
496
|
+
end
|
497
|
+
|
498
|
+
def self.dev_root
|
499
|
+
["DEV_HOME","DEV_ROOT"].each {|v|
|
500
|
+
return ENV[v].gsub('\\','/') unless ENV[v].nil?
|
501
|
+
}
|
502
|
+
dir=home
|
503
|
+
#dir=ENV["DEV_ROOT"].gsub('\\','/') unless ENV["DEV_ROOT"].nil?
|
504
|
+
return dir
|
505
|
+
end
|
506
|
+
|
507
|
+
def self.exit_code command
|
508
|
+
cmd = Command.new(command)
|
509
|
+
cmd[:ignore_failure]=true
|
510
|
+
cmd[:quiet]=true
|
511
|
+
cmd.execute
|
512
|
+
cmd[:exit_code]
|
513
|
+
end
|
514
|
+
|
515
|
+
def self.output command
|
516
|
+
cmd = Command.new(command)
|
517
|
+
cmd[:ignore_failure]=true
|
518
|
+
cmd[:quiet]=true
|
519
|
+
cmd.execute
|
520
|
+
cmd[:output]
|
521
|
+
end
|
522
|
+
|
523
|
+
def getFormattedTimeSpan timespan
|
524
|
+
seconds = timespan
|
525
|
+
seconds.to_s + " sec"
|
526
|
+
end
|
527
|
+
|
528
|
+
def self.execute command
|
529
|
+
cmd - Command.new(command)
|
530
|
+
cmd.execute
|
531
|
+
cmd[:exit_code]
|
532
|
+
end
|
533
|
+
|
534
|
+
def summary
|
535
|
+
duration=""
|
536
|
+
duration=getFormattedTimeSpan(self[:end_time]-self[:start_time]) + " - " if(!self[:end_time].nil?)
|
537
|
+
duration + "#{self[:exit_code].to_s} #{self[:input]} (#{self[:directory]})"
|
538
|
+
end
|
539
|
+
|
540
|
+
def to_html
|
541
|
+
if self[:exit_code] == 0
|
542
|
+
[
|
543
|
+
'<div><table><tr><td width="20"></td><td><pre>',
|
544
|
+
self[:input],
|
545
|
+
'</pre></td></tr></table></div>'
|
546
|
+
].join
|
547
|
+
else
|
548
|
+
[
|
549
|
+
'<div><table><tr><td width="20"></td><td><pre>',
|
550
|
+
self[:input],
|
551
|
+
'</pre><table><tr><td width="20"></td><td><table>',
|
552
|
+
map { |k, v| ["<tr><td><strong>#{k}</strong></td>", v.respond_to?(:to_html) ? v.to_html : "<td><span><pre>#{v}</pre></span></td></tr>"] },
|
553
|
+
'</table>',
|
554
|
+
'</td></tr></table></td></tr></table></div>'
|
555
|
+
].join
|
556
|
+
end
|
557
|
+
end
|
558
|
+
end
|
559
|
+
#require_relative('hash.rb')
|
560
|
+
#require_relative('pull.rb')
|
561
|
+
#require_relative('update.rb')
|
562
|
+
#require_relative('setup.rb')
|
563
|
+
#require_relative('build.rb')
|
564
|
+
#require_relative('test.rb')
|
565
|
+
#require_relative('analyze.rb')
|
566
|
+
#require_relative('publish.rb')
|
567
|
+
#require_relative('doc.rb')
|
568
|
+
#require_relative('clean.rb')
|
569
|
+
#require_relative('clobber.rb')
|
570
|
+
#require_relative('add.rb')
|
571
|
+
#require_relative('commit.rb')
|
572
|
+
#require_relative('push.rb')
|
573
|
+
|
574
|
+
class Commands < Hash
|
575
|
+
|
576
|
+
def initialize directory=Dir.pwd
|
577
|
+
Dir.chdir(directory) do
|
578
|
+
self[:pull]=Pull.new
|
579
|
+
self[:update]=Update.new
|
580
|
+
self[:setup]=Setup.new
|
581
|
+
self[:build]=Build.new
|
582
|
+
self[:test]=Test.new
|
583
|
+
self[:analyze]=Analyze.new
|
584
|
+
self[:doc]=Doc.new
|
585
|
+
self[:clean]=Clean.new
|
586
|
+
self[:publish]=Publish.new
|
587
|
+
self[:clobber]=Clobber.new
|
588
|
+
self[:add]=Add.new
|
589
|
+
self[:commit]=Commit.new
|
590
|
+
self[:push]=Push.new
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
end
|
595
|
+
#require_relative('internet.rb')
|
596
|
+
|
597
|
+
class Commit < Array
|
598
|
+
def update
|
599
|
+
if(File.exists?('.git') && `git config --list`.include?('user.name='))
|
600
|
+
if(!`git status`.include?('nothing to commit') &&
|
601
|
+
!`git status`.include?('untracked files present'))
|
602
|
+
if(File.exists?('commit.message') && File.read('commit.message').gsub(/\s+/,"").length >0)
|
603
|
+
add "git commit -a -v -m \"#{File.read('commit.message')}\""
|
604
|
+
else
|
605
|
+
add "git commit -m'all'"
|
606
|
+
end
|
607
|
+
add "<%FileUtils.rm('commit.message')%>" if File.exists?('commit.message')
|
608
|
+
end
|
609
|
+
end
|
610
|
+
if(File.exists?('.svn') && Internet.available?)
|
611
|
+
add 'svn commit -m"commit all"'
|
612
|
+
end
|
613
|
+
end
|
614
|
+
end
|
615
|
+
class Doc < Array
|
616
|
+
def update
|
617
|
+
#cmd=Command.new ({ :input => 'yard --version', :ignore_failure => true})
|
618
|
+
#cmd.execute
|
619
|
+
if(Command.exit_code('yard --version'))
|
620
|
+
add 'yard doc - LICENSE' if File.exists?('README.md') && File.exists?('LICENSE')
|
621
|
+
end
|
622
|
+
end
|
623
|
+
end
|
624
|
+
class Gemspec
|
625
|
+
def self.update gemspec_file
|
626
|
+
Text.replace_in_file gemspec_file,
|
627
|
+
/('\d{4}-\d{2}-\d{2}')/,
|
628
|
+
"'#{Time.now.strftime('%Y-%m-%d')}'"
|
629
|
+
end
|
630
|
+
|
631
|
+
def self.gemfile gemspec_file
|
632
|
+
spec=Gem::Specification.load(gemspec_file)
|
633
|
+
return "#{spec.name}-#{spec.version}.gem" if !spec.nil?
|
634
|
+
return ""
|
635
|
+
end
|
636
|
+
|
637
|
+
def self.version gemspec_file
|
638
|
+
spec=Gem::Specification.load(gemspec_file)
|
639
|
+
return spec.version.to_s
|
640
|
+
end
|
641
|
+
|
642
|
+
def self.published_version gemspec_file
|
643
|
+
published_version=''
|
644
|
+
spec=Gem::Specification.load(gemspec_file)
|
645
|
+
begin
|
646
|
+
published_version = `gem list -r #{spec.name}`.scan(/\((\d+.\d+.\d+)\)/)[0][0]
|
647
|
+
rescue
|
648
|
+
published_version=''
|
649
|
+
end
|
650
|
+
published_version
|
651
|
+
end
|
652
|
+
def self.published? gemspec_file
|
653
|
+
published_version(gemspec_file)==version(gemspec_file) ? true : false
|
654
|
+
end
|
655
|
+
|
656
|
+
def self.normalize gemspec_file
|
657
|
+
spec=Gem::Specification.load(gemspec_file)
|
658
|
+
File.open(gemspec_file,'w'){|f|f.write(spec.to_ruby)}
|
659
|
+
end
|
660
|
+
|
661
|
+
def self.upgrade gemspec_file
|
662
|
+
end
|
663
|
+
end
|
664
|
+
class Git
|
665
|
+
def self.branch
|
666
|
+
begin
|
667
|
+
`git branch`.scan(/\* ([.\w-]+)/)[0][0]
|
668
|
+
rescue
|
669
|
+
''
|
670
|
+
end
|
671
|
+
end
|
672
|
+
|
673
|
+
def self.remote_origin directory=''
|
674
|
+
url=''
|
675
|
+
directory=Dir.pwd if directory.length == 0
|
676
|
+
Dir.chdir(directory) do
|
677
|
+
begin
|
678
|
+
url=`git remote show origin`.scan(/Fetch URL: ([\.\-:\/\w\d]+)/)[0]
|
679
|
+
rescue
|
680
|
+
url=''
|
681
|
+
end
|
682
|
+
end
|
683
|
+
url
|
684
|
+
end
|
685
|
+
end
|
686
|
+
class Hash
|
687
|
+
def execute value=nil
|
688
|
+
self.each{|k,v|
|
689
|
+
v.update if v.respond_to?(:update)
|
690
|
+
if(v.is_a?(Array) && v.length==0)
|
691
|
+
self.delete k
|
692
|
+
else
|
693
|
+
#puts "executing #{k}"
|
694
|
+
|
695
|
+
v.execute(value) if v.respond_to?(:execute)
|
696
|
+
end
|
697
|
+
}
|
698
|
+
end
|
699
|
+
def to_html
|
700
|
+
[
|
701
|
+
'<div>',
|
702
|
+
map { |k, v| ["<br/><div><strong>#{k}</strong>", v.respond_to?(:to_html) ? v.to_html : "<span>#{v}</span></div><br/>"] },
|
703
|
+
'</div>'
|
704
|
+
].join
|
705
|
+
end
|
706
|
+
end
|
707
|
+
#require_relative 'array.rb'
|
708
|
+
INFO=Array.new
|
709
|
+
|
710
|
+
require 'open-uri'
|
711
|
+
#require 'net/http'
|
712
|
+
require 'timeout'
|
713
|
+
class Internet
|
714
|
+
|
715
|
+
@@available=true
|
716
|
+
|
717
|
+
def self.available?
|
718
|
+
return @@available if !@@available.nil?
|
719
|
+
|
720
|
+
begin
|
721
|
+
index=open('http://www.google.com').read
|
722
|
+
if index.include?('<Title>Google')
|
723
|
+
@@available = true
|
724
|
+
else
|
725
|
+
puts "open('http://www.google.com') returned false"
|
726
|
+
end
|
727
|
+
rescue Exception => e
|
728
|
+
puts "open('http://www.google.com') raised an exception: #{e.to_s}"
|
729
|
+
@@available = false
|
730
|
+
end
|
731
|
+
@@available
|
732
|
+
end
|
733
|
+
end
|
734
|
+
# Visual Studio 2008 version 9.0, solution format version 10.00
|
735
|
+
# Visual Studio 2010 version 10.0, solution format version 11.00
|
736
|
+
# Visual Studio 2012 version 11.0, solution format version 12.00
|
737
|
+
# Visual Studio 2013 version 12.0, solution format version 12.00
|
738
|
+
class MSBuild < Hash
|
739
|
+
|
740
|
+
def initialize
|
741
|
+
self[:vs9]="C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\msbuild.exe" if(File.exists?("C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\msbuild.exe"))
|
742
|
+
self[:vs12]="C:\\Program Files (x86)\\MSBuild\\12.0\\bin\\msbuild.exe" if(File.exists?("C:\\Program Files (x86)\\MSBuild\\12.0\\bin\\msbuild.exe"))
|
743
|
+
end
|
744
|
+
|
745
|
+
def self.has_version? version
|
746
|
+
if(defined?(MSBUILD))
|
747
|
+
MSBUILD.has_key?(version)
|
748
|
+
else
|
749
|
+
msb=MSBuild.new
|
750
|
+
return msb.has_key? version
|
751
|
+
end
|
752
|
+
end
|
753
|
+
|
754
|
+
def self.get_version version
|
755
|
+
if(defined?(MSBUILD))
|
756
|
+
MSBUILD[version]
|
757
|
+
else
|
758
|
+
msb=MSBuild.new
|
759
|
+
return msb[version]
|
760
|
+
end
|
761
|
+
end
|
762
|
+
|
763
|
+
def self.get_vs_version(sln_filename)
|
764
|
+
sln_text=File.read(sln_filename,:encoding=>'UTF-8')
|
765
|
+
return :vs9 if sln_text.include?('Format Version 10.00')
|
766
|
+
return :vs12
|
767
|
+
end
|
768
|
+
|
769
|
+
def self.get_configurations(sln_filename)
|
770
|
+
configs=Array.new
|
771
|
+
sln_text=File.read(sln_filename,:encoding=>'UTF-8')
|
772
|
+
sln_text.scan( /= ([\w]+)\|/ ).each{|m|
|
773
|
+
c=m.first.to_s
|
774
|
+
configs << c if !configs.include?(c)
|
775
|
+
}
|
776
|
+
return configs
|
777
|
+
end
|
778
|
+
|
779
|
+
def self.get_platforms(sln_filename)
|
780
|
+
platforms=Array.new
|
781
|
+
sln_text=File.read(sln_filename,:encoding=>"UTF-8")
|
782
|
+
sln_text.scan( /= [\w]+\|([\w ]+)/ ).each{|m|
|
783
|
+
p=m.first.to_s
|
784
|
+
platforms << p if !platforms.include?(p)
|
785
|
+
}
|
786
|
+
return platforms
|
787
|
+
end
|
788
|
+
end
|
789
|
+
|
790
|
+
#require_relative('internet.rb')
|
791
|
+
class Publish < Array
|
792
|
+
def update
|
793
|
+
if(Internet.available?)
|
794
|
+
if(File.exists?('.git'))
|
795
|
+
if(`git branch`.include?('* master'))
|
796
|
+
Dir.glob('*.gemspec').each{|gemspec_file|
|
797
|
+
add "gem push #{Gemspec.gemfile(gemspec_file)}" if !Gemspec.published? gemspec_file
|
798
|
+
}
|
799
|
+
end
|
800
|
+
end
|
801
|
+
if(File.exists?('.svn'))
|
802
|
+
if(`svn info`.include?('/trunk'))
|
803
|
+
Dir.glob('*.gemspec').each{|gemspec_file|
|
804
|
+
add "gem push #{Gemspec.gemfile(gemspec_file)}" if !Gemspec.published? gemspec_file
|
805
|
+
}
|
806
|
+
end
|
807
|
+
end
|
808
|
+
end
|
809
|
+
end
|
810
|
+
end
|
811
|
+
#require_relative('git.rb')
|
812
|
+
#require_relative('internet.rb')
|
813
|
+
|
814
|
+
class Pull < Array
|
815
|
+
def update
|
816
|
+
if(Internet.available?)
|
817
|
+
if(File.exists?('.git') && `git config --list`.include?('user.name='))
|
818
|
+
self << 'git pull' if Git.branch != 'develop'
|
819
|
+
end
|
820
|
+
end
|
821
|
+
end
|
822
|
+
end
|
823
|
+
#require_relative('internet.rb')
|
824
|
+
class Push < Array
|
825
|
+
def update
|
826
|
+
if(File.exists?('.git') && `git config --list`.include?('user.name='))
|
827
|
+
add 'git config --global push.default simple'
|
828
|
+
self << 'git push' if Git.branch != 'develop' && Internet.available?
|
829
|
+
end
|
830
|
+
end
|
831
|
+
end
|
832
|
+
#
|
833
|
+
# use the SVN_EXPORTS hash to define svn exports destined for DEV_ROOT/dep
|
834
|
+
#
|
835
|
+
# SVN_EXPORT={ 'System.Data.SQLite/1.0.93.0' => 'https://third-party.googlecode.com/svn/trunk/System.Data.SQLite/1.0.93.0' }
|
836
|
+
#
|
837
|
+
class Setup < Array
|
838
|
+
def update
|
839
|
+
add 'bundle install' if(File.exists?('Gemfile'))
|
840
|
+
|
841
|
+
Dir.glob('*.gemspec').each{|gemspec_file|
|
842
|
+
add "<%Gemspec.update('#{gemspec_file}')%>"
|
843
|
+
}
|
844
|
+
|
845
|
+
if(defined?(SVN_EXPORTS))
|
846
|
+
SVN_EXPORTS.each{|k,v|
|
847
|
+
if(!File.exists?("#{Command.dev_root}/dep/#{k}"))
|
848
|
+
FileUtils.mkdir_p(File.dirname("#{Command.dev_root}/dep/#{k}")) if !File.exists?("#{Command.dev_root}/dep/#{k}")
|
849
|
+
dest="#{Command.dev_root}/dep/#{k}"
|
850
|
+
add "svn export #{v} #{Command.dev_root}/dep/#{k}" if !dest.include?("@")
|
851
|
+
add "svn export #{v} #{Command.dev_root}/dep/#{k}@" if dest.include?("@")
|
852
|
+
end
|
853
|
+
}
|
854
|
+
end
|
855
|
+
end
|
856
|
+
end
|
857
|
+
#
|
858
|
+
# nunit dlls may be specified with
|
859
|
+
# NUNIT=FileList.new('**/*.Test.dll')
|
860
|
+
#
|
861
|
+
# for nunit dlls that must be run in x86 mode,
|
862
|
+
# NUNIT_x86=FileList.new('**/*.x86.Test.dll')
|
863
|
+
#
|
864
|
+
class Test < Array
|
865
|
+
def update
|
866
|
+
add 'rspec' if File.exists?('spec')
|
867
|
+
|
868
|
+
if(defined?(NUNIT))
|
869
|
+
NUNIT.each{|nunit_dll|
|
870
|
+
add "\"#{Test.nunit_console}\" \"#{Rake.application.original_dir}\\#{nunit_dll}\" /xml:\"#{nunit_dll}.TestResults.xml\""
|
871
|
+
}
|
872
|
+
end
|
873
|
+
|
874
|
+
if(defined?(NUNIT_X86))
|
875
|
+
NUNIT_X86.each{|nunit_dll|
|
876
|
+
add "\"#{Test.nunit_console_x86}\" \"#{Rake.application.original_dir}\\#{nunit_dll}\" /xml:\"#{nunit_dll}.TestResults.xml\""
|
877
|
+
}
|
878
|
+
end
|
879
|
+
|
880
|
+
if(defined?(TESTS))
|
881
|
+
TEST.each{|t| add t}
|
882
|
+
end
|
883
|
+
end
|
884
|
+
|
885
|
+
@@nunit_console=''
|
886
|
+
def self.nunit_console
|
887
|
+
if(!File.exists?(@@nunit_console))
|
888
|
+
if(defined?(NUNIT_CONSOLE))
|
889
|
+
@@nunit_console = NUNIT_CONSOLE
|
890
|
+
end
|
891
|
+
@@nunit_console = "C:\\Program Files (x86)\\NUnit 2.6.4\\bin\\nunit-console.exe" if(!File.exists?(@@nunit_console))
|
892
|
+
@@nunit_console = "C:\\Program Files (x86)\\NUnit 2.6.3\\bin\\nunit-console.exe" if(!File.exists?(@@nunit_console))
|
893
|
+
end
|
894
|
+
if(!File.exists?(@@nunit_console))
|
895
|
+
raise "unable to locate nunit-console.exe, assign NUNIT_CONSOLE to the correct location."
|
896
|
+
end
|
897
|
+
@@nunit_console
|
898
|
+
end
|
899
|
+
|
900
|
+
@@nunit_console_x86=''
|
901
|
+
def self.nunit_console_x86
|
902
|
+
if(!File.exists?(@@nunit_console_x86))
|
903
|
+
if(defined?(NUNIT_CONSOLE_X86))
|
904
|
+
@@nunit_console_x86 = NUNIT_CONSOLE_X86
|
905
|
+
end
|
906
|
+
@@nunit_console_x86 = "C:\\Program Files (x86)\\NUnit 2.6.4\\bin\\nunit-console-x86.exe" if(!File.exists?(@@nunit_console_x86))
|
907
|
+
@@nunit_console_x86 = "C:\\Program Files (x86)\\NUnit 2.6.3\\bin\\nunit-console-x86.exe" if(!File.exists?(@@nunit_console_x86))
|
908
|
+
end
|
909
|
+
if(!File.exists?(@@nunit_console_x86))
|
910
|
+
raise "unable to locate nunit-console-x86.exe, assign NUNIT_CONSOLE_X86 to the correct location."
|
911
|
+
end
|
912
|
+
@@nunit_console_x86
|
913
|
+
end
|
914
|
+
end
|
915
|
+
class Text
|
916
|
+
def self.replace_in_glob(glob,search,replace)
|
917
|
+
Dir.glob(glob).each{ |f| replace_in_file(f,search,replace) }
|
918
|
+
end
|
919
|
+
|
920
|
+
def self.replace_in_file(filename,search,replace)
|
921
|
+
text1 = IO.read(filename)
|
922
|
+
text2 = text1.gsub(search) { |str| str=replace }
|
923
|
+
unless text1==text2
|
924
|
+
File.open(filename,"w") { |f| f.puts text2 }
|
925
|
+
return true
|
926
|
+
end
|
927
|
+
false
|
928
|
+
end
|
929
|
+
|
930
|
+
end
|
931
|
+
############################################################################
|
932
|
+
# The following code is based on code originally copied from
|
933
|
+
# https://gist.github.com/lpar/1032297
|
934
|
+
# Gist title: lpar/timeout.rb
|
935
|
+
############################################################################
|
936
|
+
# Runs a specified shell command in a separate thread.
|
937
|
+
# If it exceeds the given timeout in seconds, kills it.
|
938
|
+
# Returns any output produced by the command (stdout or stderr) as a String.
|
939
|
+
# Uses Kernel.select to wait up to the tick length (in seconds) between
|
940
|
+
# checks on the command's status
|
941
|
+
#
|
942
|
+
# If you've got a cleaner way of doing this, I'd be interested to see it.
|
943
|
+
# If you think you can do it with Ruby's Timeout module, think again.
|
944
|
+
def run_with_timeout(directory,command, timeout, tick)
|
945
|
+
output = ''
|
946
|
+
exit_code=1
|
947
|
+
begin
|
948
|
+
# Start task in another thread, which spawns a process
|
949
|
+
stdin, stderrout, thread = Open3.popen2e(command, :chdir=>directory)
|
950
|
+
# Get the pid of the spawned process
|
951
|
+
pid = thread[:pid]
|
952
|
+
start = Time.now
|
953
|
+
|
954
|
+
while (Time.now - start) < timeout and thread.alive?
|
955
|
+
# Wait up to `tick` seconds for output/error data
|
956
|
+
Kernel.select([stderrout], nil, nil, tick)
|
957
|
+
# Try to read the data
|
958
|
+
begin
|
959
|
+
output << stderrout.read_nonblock(BUFFER_SIZE)
|
960
|
+
rescue IO::WaitReadable
|
961
|
+
# A read would block, so loop around for another select
|
962
|
+
rescue EOFError
|
963
|
+
# Command has completed, not really an error...
|
964
|
+
break
|
965
|
+
end
|
966
|
+
end
|
967
|
+
|
968
|
+
# Give Ruby time to clean up the other thread
|
969
|
+
sleep 1
|
970
|
+
|
971
|
+
if thread.alive?
|
972
|
+
# We need to kill the process, because killing the thread leaves
|
973
|
+
# the process alive but detached, annoyingly enough.
|
974
|
+
Process.kill("TERM", pid)
|
975
|
+
else
|
976
|
+
exit_code=thread.value
|
977
|
+
sleep 1
|
978
|
+
end
|
979
|
+
|
980
|
+
ensure
|
981
|
+
stdin.close if stdin
|
982
|
+
stderrout.close if stderrout
|
983
|
+
end
|
984
|
+
return [output,exit_code]
|
985
|
+
end
|
986
|
+
|
987
|
+
require 'timeout'
|
988
|
+
def run_with_timeout2(directory,command,timeout)
|
989
|
+
# stdout, stderr pipes
|
990
|
+
rout, wout = IO.pipe
|
991
|
+
rerr, werr = IO.pipe
|
992
|
+
output=''
|
993
|
+
error=''
|
994
|
+
exit_code=1
|
995
|
+
pid = Process.spawn(command, :chdir => directory, :out => wout, :err => werr)
|
996
|
+
begin
|
997
|
+
Timeout.timeout(timeout) do
|
998
|
+
exit_code = Process.wait2(pid)
|
999
|
+
output = rout.readlines.join("\n")
|
1000
|
+
error = rerr.readlines.join("\n")
|
1001
|
+
end
|
1002
|
+
rescue
|
1003
|
+
Proces.kill('TERM',pid)
|
1004
|
+
output = output + 'timeout occurred.'
|
1005
|
+
ensure
|
1006
|
+
rout.close
|
1007
|
+
rerr.close
|
1008
|
+
end
|
1009
|
+
[output,exit_code]
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
class Timer
|
1013
|
+
attr_accessor :start_time
|
1014
|
+
|
1015
|
+
def initialize
|
1016
|
+
@start_time=Time.now
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
def elapsed # in seconds
|
1020
|
+
return Time.now-@start_time
|
1021
|
+
end
|
1022
|
+
|
1023
|
+
def elapsed_str
|
1024
|
+
elapsed_str="[" + "%.0f" %(elapsed) + "s]"
|
1025
|
+
end
|
1026
|
+
|
1027
|
+
def self.elapsed_exceeds?(name,duration_seconds)
|
1028
|
+
if(Timer.get_elapsed(name).nil? || Timer.get_elapsed(name) > duration_seconds)
|
1029
|
+
return true
|
1030
|
+
end
|
1031
|
+
return false
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
def self.get_elapsed(name)
|
1035
|
+
timestamp=get_timestamp(name)
|
1036
|
+
return Time.now-timestamp if(!timestamp.nil?)
|
1037
|
+
nil
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
def self.get_timestamp(name)
|
1041
|
+
dir=Rake.application.original_dir
|
1042
|
+
if(File.exists?("#{DEV[:dev_root]}/log/#{name}.timestamp"))
|
1043
|
+
return Time.parse(File.read("#{DEV[:dev_root]}/log/#{name}.timestamp").strip)
|
1044
|
+
end
|
1045
|
+
nil
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
def self.set_timestamp(name)
|
1049
|
+
Dir.mkdir("#{DEV_TASKS[:dev_root]}/log") if(!Dir.exists?("#{DEV_TASKS[:dev_root]}/log"))
|
1050
|
+
File.open("#{DEV_TASKS[:dev_root]}/log/#{name}.timestamp",'w'){|f|f.puts(Time.now.to_s)}
|
1051
|
+
end
|
1052
|
+
end
|
1053
|
+
class Update < Array
|
1054
|
+
def update
|
1055
|
+
self .add 'svn update' if File.exists?('.svn') && Internet.available?
|
1056
|
+
end
|
1057
|
+
end
|
1058
|
+
class Upgrade < Array
|
1059
|
+
def update
|
1060
|
+
if(File.exists?('Gemfile'))
|
1061
|
+
end
|
1062
|
+
end
|
1063
|
+
end
|
1
1064
|
require 'json'
|
2
1065
|
require 'rake/clean'
|
3
1066
|
|