rant 0.3.2 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS +22 -1
- data/README +9 -12
- data/Rantfile +32 -9
- data/devel-notes +16 -0
- data/doc/advanced.rdoc +55 -0
- data/doc/rant.rdoc +27 -2
- data/doc/rantfile.rdoc +104 -30
- data/install.rb +6 -0
- data/lib/rant.rb +5 -1
- data/lib/rant/import.rb +12 -4
- data/lib/rant/import/rubydoc.rb +1 -1
- data/lib/rant/import/rubypackage.rb +2 -2
- data/lib/rant/import/rubytest.rb +3 -2
- data/lib/rant/plugin/csharp.rb +5 -9
- data/lib/rant/rantenv.rb +1 -0
- data/lib/rant/rantfile.rb +184 -68
- data/lib/rant/rantlib.rb +203 -195
- data/lib/rant/rantsys.rb +87 -44
- data/lib/rant/rantvar.rb +236 -17
- data/rantmethods.rb +9 -4
- data/run_rant +1 -1
- data/test/Rantfile +16 -0
- data/test/plugin/csharp/test_csharp.rb +2 -1
- data/test/plugin/rantfile +1 -0
- data/test/project1/Rantfile +8 -4
- data/test/rule.rf +27 -0
- data/test/subdirs/Rantfile +2 -0
- data/test/subdirs/sub2/sub/rantfile +17 -0
- data/test/subdirs/test_subdirs.rb +46 -2
- data/test/test_dirtask.rb +33 -0
- data/test/test_filelist.rb +81 -0
- data/test/test_filetask.rb +6 -6
- data/test/test_rant_interface.rb +4 -3
- data/test/test_rule.rb +67 -0
- data/test/test_source.rb +26 -0
- data/test/test_task.rb +27 -6
- data/test/test_var.rb +102 -0
- data/test/toplevel.rf +1 -1
- data/test/var.rf +19 -0
- metadata +11 -2
data/install.rb
ADDED
data/lib/rant.rb
CHANGED
data/lib/rant/import.rb
CHANGED
@@ -29,6 +29,8 @@ module Rant
|
|
29
29
|
"Print this help and exit." ],
|
30
30
|
[ "--version", "-v", GetoptLong::NO_ARGUMENT,
|
31
31
|
"Print version of rant-import and exit." ],
|
32
|
+
[ "--quiet", "-q", GetoptLong::NO_ARGUMENT,
|
33
|
+
"Operate quiet." ],
|
32
34
|
[ "--plugins", "-p", GetoptLong::REQUIRED_ARGUMENT,
|
33
35
|
"Include PLUGINS (comma separated list)." ],
|
34
36
|
[ "--imports", "-i", GetoptLong::REQUIRED_ARGUMENT,
|
@@ -86,16 +88,17 @@ module Rant
|
|
86
88
|
@reduce_whitespace = false
|
87
89
|
@auto = false
|
88
90
|
@arg_rantfiles = []
|
91
|
+
@quiet = false
|
89
92
|
end
|
90
93
|
|
91
94
|
def run
|
92
95
|
process_args
|
93
96
|
|
94
97
|
if @auto
|
95
|
-
|
96
|
-
%w(-v --stop-after-load) +
|
98
|
+
rac_args = %w(--stop-after-load) +
|
97
99
|
@arg_rantfiles.collect { |rf| "-f#{rf}" }
|
98
|
-
|
100
|
+
rac_args << "-v" unless @quiet
|
101
|
+
@rantapp = RantApp.new(rac_args)
|
99
102
|
unless @rantapp.run == 0
|
100
103
|
abort("Auto-determination of required code failed.")
|
101
104
|
end
|
@@ -111,7 +114,7 @@ module Rant
|
|
111
114
|
mf << <<EOH
|
112
115
|
#!/usr/bin/env ruby
|
113
116
|
|
114
|
-
# #@mono_fn - Monolithic rant script, autogenerated by rant-import.
|
117
|
+
# #@mono_fn - Monolithic rant script, autogenerated by rant-import #{Rant::VERSION}.
|
115
118
|
#
|
116
119
|
# Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
|
117
120
|
#
|
@@ -171,6 +174,7 @@ EOF
|
|
171
174
|
puts "rant-import #{Rant::VERSION}"
|
172
175
|
done
|
173
176
|
when "--help": help
|
177
|
+
when "--quiet": @quiet = true
|
174
178
|
when "--force": @force = true
|
175
179
|
when "--with-comments": @skip_comments = false
|
176
180
|
when "--reduce-whitespace": @reduce_whitespace = true
|
@@ -211,6 +215,10 @@ EOF
|
|
211
215
|
done
|
212
216
|
end
|
213
217
|
|
218
|
+
def msg *args
|
219
|
+
super unless @quiet
|
220
|
+
end
|
221
|
+
|
214
222
|
def abort(*text)
|
215
223
|
err_msg(*text) unless text.empty?
|
216
224
|
raise RantImportAbortException
|
data/lib/rant/import/rubydoc.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'rant/rantlib'
|
3
3
|
|
4
|
-
class Rant::RubyPackage
|
4
|
+
class Rant::Generators::RubyPackage
|
5
5
|
|
6
6
|
class << self
|
7
7
|
def rant_generate(app, ch, args, &block)
|
@@ -266,7 +266,7 @@ class Rant::RubyPackage
|
|
266
266
|
end
|
267
267
|
Gem.manage_gems
|
268
268
|
# map rdoc options from application vars
|
269
|
-
@data["rdoc_options"] ||= @app.var[
|
269
|
+
@data["rdoc_options"] ||= @app.var[:rubydoc_opts]
|
270
270
|
if @data["rdoc_options"]
|
271
271
|
# remove the --op option, otherwise rubygems will
|
272
272
|
# install the rdoc in the wrong directory (at least as
|
data/lib/rant/import/rubytest.rb
CHANGED
@@ -31,6 +31,7 @@ module Rant
|
|
31
31
|
attr_accessor :test_dir
|
32
32
|
|
33
33
|
def initialize(app, cinf, name = :test, prerequisites = [], &block)
|
34
|
+
@rac = app
|
34
35
|
@name = name
|
35
36
|
@pre = prerequisites
|
36
37
|
@block = block
|
@@ -77,10 +78,10 @@ module Rant
|
|
77
78
|
def optlist
|
78
79
|
options = (@options.is_a? Array) ?
|
79
80
|
@options.arglist : @options
|
80
|
-
|
81
|
+
@rac.cx.var["TESTOPTS"] || options || ""
|
81
82
|
end
|
82
83
|
def filelist
|
83
|
-
return Dir[
|
84
|
+
return Dir[@rac.cx.var['TEST']] if @rac.cx.var['TEST']
|
84
85
|
filelist = @test_files || []
|
85
86
|
if filelist.empty?
|
86
87
|
if @test_dirs && !@test_dirs.empty?
|
data/lib/rant/plugin/csharp.rb
CHANGED
@@ -145,27 +145,23 @@ module Rant
|
|
145
145
|
end # class Generators::Assembly
|
146
146
|
|
147
147
|
class AssemblyTask < FileTask
|
148
|
+
|
148
149
|
def initialize(app, assembly)
|
149
150
|
@assembly = assembly
|
150
151
|
super(app, @assembly.out) { |t|
|
151
152
|
app.context.sys assembly.send("cmd_" + assembly.target)
|
152
153
|
}
|
153
154
|
end
|
154
|
-
|
155
|
-
def resolve_prerequisites
|
156
|
-
@assembly.init
|
157
|
-
@pre.concat(@assembly.sources)
|
158
|
-
@pre.concat(@assembly.resources) if @assembly.resources
|
159
|
-
super
|
160
|
-
end
|
161
|
-
=end
|
155
|
+
|
162
156
|
def invoke(force = false)
|
157
|
+
goto_task_home
|
163
158
|
@assembly.init
|
164
159
|
@pre.concat(@assembly.sources)
|
165
160
|
@pre.concat(@assembly.resources) if @assembly.resources
|
166
161
|
super
|
167
162
|
end
|
168
|
-
|
163
|
+
|
164
|
+
end # class AssemblyTask
|
169
165
|
end # module Rant
|
170
166
|
|
171
167
|
module Rant::Plugin
|
data/lib/rant/rantenv.rb
CHANGED
data/lib/rant/rantfile.rb
CHANGED
@@ -49,11 +49,12 @@ module Rant
|
|
49
49
|
@description = nil
|
50
50
|
@rantfile = nil
|
51
51
|
@line_number = nil
|
52
|
+
@run = false
|
52
53
|
end
|
53
54
|
|
54
|
-
# Returns the
|
55
|
+
# Returns the full name of this task.
|
55
56
|
def to_s
|
56
|
-
|
57
|
+
full_name
|
57
58
|
end
|
58
59
|
|
59
60
|
def project_subdir
|
@@ -77,6 +78,11 @@ module Rant
|
|
77
78
|
!done?
|
78
79
|
end
|
79
80
|
|
81
|
+
# True during invoke. Used to encounter circular dependencies.
|
82
|
+
def run?
|
83
|
+
@run
|
84
|
+
end
|
85
|
+
|
80
86
|
# +opt+ is a Hash and shouldn't be modified.
|
81
87
|
# All objects implementing the Rant::Worker protocol should
|
82
88
|
# know about the following +opt+ values:
|
@@ -85,10 +91,16 @@ module Rant
|
|
85
91
|
# as calling Worker#needed?
|
86
92
|
# <tt>:force</tt>::
|
87
93
|
# Run task action even if needed? is false.
|
94
|
+
# Returns true if task action was run.
|
88
95
|
def invoke(opt = INVOKE_OPT)
|
89
|
-
|
90
|
-
|
91
|
-
|
96
|
+
return circular_dep if run?
|
97
|
+
@run = true
|
98
|
+
begin
|
99
|
+
return needed? if opt[:needed?]
|
100
|
+
self.run if opt[:force] || self.needed?
|
101
|
+
ensure
|
102
|
+
@run = false
|
103
|
+
end
|
92
104
|
end
|
93
105
|
|
94
106
|
def fail msg = nil
|
@@ -102,14 +114,20 @@ module Rant
|
|
102
114
|
end
|
103
115
|
private :run
|
104
116
|
|
117
|
+
def circular_dep
|
118
|
+
app.warn_msg "Circular dependency on task `#{full_name}'."
|
119
|
+
false
|
120
|
+
end
|
121
|
+
private :circular_dep
|
122
|
+
|
105
123
|
def hash
|
106
124
|
name.hash
|
107
125
|
end
|
108
126
|
|
109
127
|
def eql? other
|
110
|
-
Worker === other and
|
128
|
+
Worker === other and full_name.eql? other.full_name
|
111
129
|
end
|
112
|
-
end
|
130
|
+
end # module Worker
|
113
131
|
|
114
132
|
# A list of tasks with an equal name.
|
115
133
|
class MetaTask < Array
|
@@ -238,33 +256,36 @@ module Rant
|
|
238
256
|
return false if done?
|
239
257
|
return true if @needed.nil?
|
240
258
|
goto_task_home
|
241
|
-
|
242
|
-
@needed.call
|
243
|
-
else
|
244
|
-
@needed[self]
|
245
|
-
end
|
259
|
+
@needed.arity == 0 ? @needed.call : @needed[self]
|
246
260
|
end
|
247
261
|
|
248
262
|
def invoke(opt = INVOKE_OPT)
|
249
|
-
return
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
if
|
256
|
-
run
|
263
|
+
return circular_dep if @run
|
264
|
+
@run = true
|
265
|
+
begin
|
266
|
+
return needed? if opt[:needed?]
|
267
|
+
# +run+ already calls +goto_task_home+
|
268
|
+
#goto_task_home
|
269
|
+
if opt[:force] && !@done
|
270
|
+
self.run
|
257
271
|
@done = true
|
258
272
|
else
|
259
|
-
|
273
|
+
if needed?
|
274
|
+
run
|
275
|
+
@done = true
|
276
|
+
else
|
277
|
+
false
|
278
|
+
end
|
260
279
|
end
|
280
|
+
rescue CommandError => e
|
281
|
+
err_msg e.message if app[:err_commands]
|
282
|
+
self.fail
|
283
|
+
rescue SystemCallError => e
|
284
|
+
err_msg e.message
|
285
|
+
self.fail
|
286
|
+
ensure
|
287
|
+
@run = false
|
261
288
|
end
|
262
|
-
rescue CommandError => e
|
263
|
-
err_msg e.message if app[:err_commands]
|
264
|
-
self.fail
|
265
|
-
rescue SystemCallError => e
|
266
|
-
err_msg e.message
|
267
|
-
self.fail
|
268
289
|
end
|
269
290
|
end # LightTask
|
270
291
|
|
@@ -287,13 +308,17 @@ module Rant
|
|
287
308
|
|
288
309
|
def initialize(app, name, prerequisites = [], &block)
|
289
310
|
super()
|
290
|
-
@app = app || Rant.
|
311
|
+
@app = app || Rant.rac
|
291
312
|
@name = name or raise ArgumentError, "name not given"
|
292
313
|
@pre = prerequisites || []
|
293
314
|
@pre_resolved = false
|
294
315
|
@block = block
|
295
316
|
@run = false
|
296
|
-
|
317
|
+
# success has one of three values:
|
318
|
+
# nil no invoke
|
319
|
+
# false invoked, but fail
|
320
|
+
# true invoked and run successfully
|
321
|
+
@success = nil
|
297
322
|
end
|
298
323
|
|
299
324
|
# Get a list of the *names* of all prerequisites. The
|
@@ -303,6 +328,11 @@ module Rant
|
|
303
328
|
@pre.collect { |pre| pre.to_s }
|
304
329
|
end
|
305
330
|
|
331
|
+
# First prerequisite.
|
332
|
+
def source
|
333
|
+
@pre.first.to_s
|
334
|
+
end
|
335
|
+
|
306
336
|
# True if this task has at least one action (block to be
|
307
337
|
# executed) associated.
|
308
338
|
def has_actions?
|
@@ -315,20 +345,20 @@ module Rant
|
|
315
345
|
@pre << pre
|
316
346
|
end
|
317
347
|
|
318
|
-
# Was this task ever
|
348
|
+
# Was this task ever invoked? If this is true, it doesn't
|
319
349
|
# necessarily mean that the run was successfull!
|
320
|
-
def
|
321
|
-
|
350
|
+
def invoked?
|
351
|
+
!@success.nil?
|
322
352
|
end
|
323
353
|
|
324
354
|
# True if last task run fail.
|
325
355
|
def fail?
|
326
|
-
@
|
356
|
+
@success == false
|
327
357
|
end
|
328
358
|
|
329
359
|
# Task was run and didn't fail.
|
330
360
|
def done?
|
331
|
-
|
361
|
+
@success
|
332
362
|
end
|
333
363
|
|
334
364
|
# Enhance this task with the given dependencies and blk.
|
@@ -357,8 +387,14 @@ module Rant
|
|
357
387
|
# Returns a true value if task was acutally run.
|
358
388
|
# Raises Rant::TaskFail to signal task (or prerequiste) failure.
|
359
389
|
def invoke(opt = INVOKE_OPT)
|
360
|
-
return if
|
361
|
-
|
390
|
+
return circular_dep if @run
|
391
|
+
@run = true
|
392
|
+
begin
|
393
|
+
return if done?
|
394
|
+
internal_invoke opt
|
395
|
+
ensure
|
396
|
+
@run = false
|
397
|
+
end
|
362
398
|
end
|
363
399
|
|
364
400
|
def internal_invoke opt, ud_init = true
|
@@ -379,13 +415,12 @@ module Rant
|
|
379
415
|
}
|
380
416
|
# Never run a task block for a "needed?" query.
|
381
417
|
return update if opt[:needed?]
|
382
|
-
if update
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
@run
|
418
|
+
run if update
|
419
|
+
@success = true
|
420
|
+
# IMPORTANT: return update flag
|
421
|
+
update
|
387
422
|
rescue StandardError => e
|
388
|
-
@
|
423
|
+
@success = false
|
389
424
|
case e
|
390
425
|
when TaskFail: raise
|
391
426
|
when CommandError
|
@@ -446,6 +481,7 @@ module Rant
|
|
446
481
|
return @pre.each { |t| yield(t) }
|
447
482
|
end
|
448
483
|
my_full_name = full_name
|
484
|
+
my_project_subdir = project_subdir
|
449
485
|
@pre.map! { |t|
|
450
486
|
if Worker === t
|
451
487
|
# Remove references to self from prerequisites!
|
@@ -461,8 +497,8 @@ module Rant
|
|
461
497
|
nil
|
462
498
|
else
|
463
499
|
#STDERR.puts "selecting `#{t}'"
|
464
|
-
selection = @app.
|
465
|
-
|
500
|
+
selection = @app.resolve t,
|
501
|
+
my_project_subdir
|
466
502
|
#STDERR.puts selection.size
|
467
503
|
if selection.empty?
|
468
504
|
# use return value of yield
|
@@ -519,8 +555,14 @@ module Rant
|
|
519
555
|
# the +ud_init+ flag according to the result of a call to the
|
520
556
|
# +needed+ block.
|
521
557
|
def invoke(opt = INVOKE_OPT)
|
522
|
-
return if
|
523
|
-
|
558
|
+
return circular_dep if @run
|
559
|
+
@run = true
|
560
|
+
begin
|
561
|
+
return if done?
|
562
|
+
internal_invoke(opt, ud_init_by_needed)
|
563
|
+
ensure
|
564
|
+
@run = false
|
565
|
+
end
|
524
566
|
end
|
525
567
|
|
526
568
|
private
|
@@ -528,6 +570,7 @@ module Rant
|
|
528
570
|
if @needed
|
529
571
|
goto_task_home
|
530
572
|
@needed.arity == 0 ? @needed.call : @needed[self]
|
573
|
+
#else: true #??
|
531
574
|
end
|
532
575
|
end
|
533
576
|
end # class UserTask
|
@@ -555,14 +598,20 @@ module Rant
|
|
555
598
|
end
|
556
599
|
|
557
600
|
def invoke(opt = INVOKE_OPT)
|
558
|
-
return if
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
601
|
+
return circular_dep if @run
|
602
|
+
@run = true
|
603
|
+
begin
|
604
|
+
return if done?
|
605
|
+
goto_task_home
|
606
|
+
if @path.exist?
|
607
|
+
@ts = @path.mtime
|
608
|
+
internal_invoke opt, false
|
609
|
+
else
|
610
|
+
@ts = T0
|
611
|
+
internal_invoke opt, true
|
612
|
+
end
|
613
|
+
ensure
|
614
|
+
@run = false
|
566
615
|
end
|
567
616
|
end
|
568
617
|
|
@@ -590,8 +639,6 @@ module Rant
|
|
590
639
|
# directory.
|
591
640
|
class DirTask < Task
|
592
641
|
|
593
|
-
# TODO: subdir support
|
594
|
-
|
595
642
|
class << self
|
596
643
|
|
597
644
|
# Generate a task for making a directory path.
|
@@ -650,19 +697,26 @@ module Rant
|
|
650
697
|
@isdir = nil
|
651
698
|
end
|
652
699
|
|
653
|
-
def needed?
|
654
|
-
|
655
|
-
end
|
700
|
+
#def needed?
|
701
|
+
# invoke(:needed? => true)
|
702
|
+
#end
|
656
703
|
|
657
704
|
def invoke(opt = INVOKE_OPT)
|
658
|
-
return if
|
659
|
-
@
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
@
|
665
|
-
|
705
|
+
return circular_dep if @run
|
706
|
+
@run = true
|
707
|
+
begin
|
708
|
+
return if done?
|
709
|
+
goto_task_home
|
710
|
+
@isdir = test(?d, @name)
|
711
|
+
if @isdir
|
712
|
+
@ts = @block ? test(?M, @name) : Time.now
|
713
|
+
internal_invoke opt, false
|
714
|
+
else
|
715
|
+
@ts = T0
|
716
|
+
internal_invoke opt, true
|
717
|
+
end
|
718
|
+
ensure
|
719
|
+
@run = false
|
666
720
|
end
|
667
721
|
end
|
668
722
|
|
@@ -692,6 +746,68 @@ module Rant
|
|
692
746
|
end
|
693
747
|
end # class DirTask
|
694
748
|
module Generators
|
749
|
+
Task = ::Rant::Task
|
750
|
+
LightTask = ::Rant::LightTask
|
695
751
|
Directory = ::Rant::DirTask
|
696
|
-
|
752
|
+
|
753
|
+
class Rule
|
754
|
+
# TODO
|
755
|
+
def self.rant_generate(rac, ch, args, &block)
|
756
|
+
unless args.size == 1
|
757
|
+
rac.abort_at(ch, "Rule takes only one argument.")
|
758
|
+
end
|
759
|
+
arg = args.first
|
760
|
+
target = nil
|
761
|
+
src_arg = nil
|
762
|
+
if Symbol === arg
|
763
|
+
target = ".#{arg}"
|
764
|
+
elsif arg.respond_to? :to_str
|
765
|
+
target = arg.to_str
|
766
|
+
elsif Regexp === arg
|
767
|
+
target = arg
|
768
|
+
elsif Hash === arg && arg.size == 1
|
769
|
+
arg.each_pair { |target, src_arg| }
|
770
|
+
src_arg = src_arg.to_str if src_arg.respond_to? :to_str
|
771
|
+
target = target.to_str if target.respond_to? :to_str
|
772
|
+
src_arg = ".#{src_arg}" if Symbol === src_arg
|
773
|
+
target = ".#{target}" if Symbol === target
|
774
|
+
else
|
775
|
+
rac.abort_at(ch, "Rule argument " +
|
776
|
+
"has to be a hash with one key-value pair.")
|
777
|
+
end
|
778
|
+
esc_target = nil
|
779
|
+
target_rx = case target
|
780
|
+
when String
|
781
|
+
esc_target = Regexp.escape(target)
|
782
|
+
/#{esc_target}$/
|
783
|
+
when Regexp
|
784
|
+
target
|
785
|
+
else
|
786
|
+
rac.abort_at(ch, "rule target has " +
|
787
|
+
"to be a string or regular expression")
|
788
|
+
end
|
789
|
+
src_proc = case src_arg
|
790
|
+
when String
|
791
|
+
unless String === target
|
792
|
+
rac.abort(ch, "rule target has to be a string " +
|
793
|
+
"if source is a string")
|
794
|
+
end
|
795
|
+
lambda { |name| name.sub(/#{esc_target}$/, src_arg) }
|
796
|
+
when Proc: src_arg
|
797
|
+
when nil: lambda { |name| [] }
|
798
|
+
else
|
799
|
+
rac.abort_at(ch, "rule source has to be " +
|
800
|
+
"String or Proc")
|
801
|
+
end
|
802
|
+
rac.at_resolve { |task_name|
|
803
|
+
if target_rx =~ task_name
|
804
|
+
[rac.file(:__caller__ => ch,
|
805
|
+
task_name => src_proc[task_name], &block)]
|
806
|
+
else
|
807
|
+
nil
|
808
|
+
end
|
809
|
+
}
|
810
|
+
end
|
811
|
+
end # class Rule
|
812
|
+
end # module Generators
|
697
813
|
end # module Rant
|