rant 0.4.8 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS +31 -0
- data/README +3 -1
- data/Rantfile +53 -2
- data/doc/advanced.rdoc +86 -1
- data/doc/c.rdoc +8 -0
- data/doc/homepage/index.html +2 -0
- data/doc/rant.1 +4 -0
- data/doc/rant.rdoc +38 -0
- data/doc/rant_vs_rake.rdoc +13 -0
- data/doc/rantfile.rdoc +93 -63
- data/doc/sys.rdoc +568 -0
- data/lib/rant/coregen.rb +43 -16
- data/lib/rant/import/command.rb +7 -4
- data/lib/rant/import/filelist/more.rb +57 -0
- data/lib/rant/import/metadata.rb +5 -1
- data/lib/rant/import/nodes/default.rb +3 -24
- data/lib/rant/import/signedfile.rb +1 -8
- data/lib/rant/import/sys/more.rb +2 -1
- data/lib/rant/import/var/booleans.rb +65 -0
- data/lib/rant/import/var/lists.rb +34 -0
- data/lib/rant/import/var/numbers.rb +116 -0
- data/lib/rant/import/var/strings.rb +43 -0
- data/lib/rant/import.rb +19 -3
- data/lib/rant/node.rb +39 -6
- data/lib/rant/rantlib.rb +44 -8
- data/lib/rant/rantsys.rb +22 -54
- data/lib/rant/rantvar.rb +89 -256
- data/misc/TODO +18 -0
- data/misc/devel-notes +26 -1
- data/test/action.rant +24 -0
- data/test/deprecated/test_0_5_4.rb +53 -0
- data/test/deprecated/test_0_6_0.rb +1 -1
- data/test/dryrun/Rantfile +10 -0
- data/test/dryrun/foo.c +8 -0
- data/test/dryrun/test_dryrun.rb +31 -0
- data/test/import/c/dependencies/Rantfile +1 -1
- data/test/import/command/Rantfile +1 -1
- data/test/import/sys/test_tgz.rb +22 -0
- data/test/subdirs2/root.rant +11 -1
- data/test/subdirs2/sub1/sub.rant +3 -0
- data/test/subdirs2/test_subdirs2.rb +19 -0
- data/test/test_action.rb +75 -0
- data/test/test_filelist.rb +13 -10
- data/test/test_rant_interface.rb +2 -2
- data/test/test_rule.rb +121 -3
- data/test/test_sys_methods.rb +558 -0
- data/test/test_var.rb +10 -0
- data/test/tutil.rb +81 -8
- metadata +19 -2
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
# more.rb - More Rant::FileList methods.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
|
5
|
+
|
6
|
+
module Rant
|
7
|
+
class FileList
|
8
|
+
# Remove all files which have the given name.
|
9
|
+
def no_file(name)
|
10
|
+
@actions << [:apply_ary_method, :reject!,
|
11
|
+
lambda { |entry|
|
12
|
+
entry == name && !@keep[entry] && test(?f, entry)
|
13
|
+
}]
|
14
|
+
@pending = true
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
# Remove all entries which contain an element
|
19
|
+
# with the given suffix.
|
20
|
+
def no_suffix(suffix)
|
21
|
+
@actions << [:no_suffix, suffix]
|
22
|
+
@pending = true
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def apply_no_suffix(suffix)
|
27
|
+
elems = nil
|
28
|
+
elem = nil
|
29
|
+
@files.reject! { |entry|
|
30
|
+
elems = Sys.split_all(entry)
|
31
|
+
elems.any? { |elem|
|
32
|
+
elem =~ /#{suffix}$/ && !@keep[entry]
|
33
|
+
}
|
34
|
+
}
|
35
|
+
end
|
36
|
+
private :apply_no_suffix
|
37
|
+
|
38
|
+
# Remove all entries which contain an element
|
39
|
+
# with the given prefix.
|
40
|
+
def no_prefix(prefix)
|
41
|
+
@actions << [:no_prefix, prefix]
|
42
|
+
@pending = true
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def apply_no_prefix(prefix)
|
47
|
+
elems = elem = nil
|
48
|
+
@files.reject! { |entry|
|
49
|
+
elems = Sys.split_all(entry)
|
50
|
+
elems.any? { |elem|
|
51
|
+
elem =~ /^#{prefix}/ && !@keep[entry]
|
52
|
+
}
|
53
|
+
}
|
54
|
+
end
|
55
|
+
private :apply_no_prefix
|
56
|
+
end # class FileList
|
57
|
+
end # module Rant
|
data/lib/rant/import/metadata.rb
CHANGED
@@ -8,7 +8,7 @@ module Rant
|
|
8
8
|
def self.init_import_metadata(rac, *rest)
|
9
9
|
mi = MetaData::Interface.new(rac)
|
10
10
|
rac.var._set("__metadata__", mi)
|
11
|
-
rac.at_return(&mi.method(:
|
11
|
+
rac.at_return(&mi.method(:at_rant_return))
|
12
12
|
rac.var._init("__autoclean_common__", []) << MetaData::META_FN
|
13
13
|
end
|
14
14
|
|
@@ -105,6 +105,10 @@ module Rant
|
|
105
105
|
set(key, value, fn, dir)
|
106
106
|
end
|
107
107
|
|
108
|
+
def at_rant_return
|
109
|
+
save unless @rac[:dry_run]
|
110
|
+
end
|
111
|
+
|
108
112
|
# Assumes to be called from the projects root directory.
|
109
113
|
def save
|
110
114
|
@modified_dirs.each_key { |dir|
|
@@ -43,11 +43,6 @@ module Rant
|
|
43
43
|
@pre_resolved = false
|
44
44
|
@block = block
|
45
45
|
@run = false
|
46
|
-
# success has one of three values:
|
47
|
-
# nil no invoke
|
48
|
-
# false invoked, but fail
|
49
|
-
# true invoked and run successfully
|
50
|
-
@success = nil
|
51
46
|
@receiver = nil
|
52
47
|
end
|
53
48
|
|
@@ -87,11 +82,6 @@ module Rant
|
|
87
82
|
@success == false
|
88
83
|
end
|
89
84
|
|
90
|
-
# Task was run and didn't fail.
|
91
|
-
def done?
|
92
|
-
@success
|
93
|
-
end
|
94
|
-
|
95
85
|
# Enhance this task with the given dependencies and blk.
|
96
86
|
def enhance(deps = nil, &blk)
|
97
87
|
if deps
|
@@ -111,10 +101,6 @@ module Rant
|
|
111
101
|
end
|
112
102
|
end
|
113
103
|
|
114
|
-
def needed?
|
115
|
-
invoke(:needed? => true)
|
116
|
-
end
|
117
|
-
|
118
104
|
# Returns a true value if task was acutally run.
|
119
105
|
# Raises Rant::TaskFail to signal task (or prerequiste) failure.
|
120
106
|
def invoke(opt = INVOKE_OPT)
|
@@ -319,11 +305,6 @@ module Rant
|
|
319
305
|
true
|
320
306
|
end
|
321
307
|
|
322
|
-
def needed?
|
323
|
-
return false if done?
|
324
|
-
invoke(:needed? => true)
|
325
|
-
end
|
326
|
-
|
327
308
|
def invoke(opt = INVOKE_OPT)
|
328
309
|
return circular_dep if @run
|
329
310
|
@run = true
|
@@ -384,7 +365,7 @@ module Rant
|
|
384
365
|
private
|
385
366
|
def run
|
386
367
|
goto_task_home
|
387
|
-
@rac.running_task(self)
|
368
|
+
return if @rac.running_task(self)
|
388
369
|
dir = File.dirname(name)
|
389
370
|
@rac.build dir unless dir == "." || dir == "/"
|
390
371
|
return unless @block
|
@@ -457,7 +438,7 @@ module Rant
|
|
457
438
|
end
|
458
439
|
|
459
440
|
def run
|
460
|
-
@rac.running_task(self)
|
441
|
+
return if @rac.running_task(self)
|
461
442
|
@rac.sys.mkdir @name unless @isdir
|
462
443
|
if @block
|
463
444
|
@block.arity == 0 ? @block.call : @block[self]
|
@@ -537,10 +518,8 @@ module Rant
|
|
537
518
|
}
|
538
519
|
@ts
|
539
520
|
end
|
540
|
-
def needed?
|
541
|
-
false
|
542
|
-
end
|
543
521
|
def invoke(opt = INVOKE_OPT)
|
522
|
+
# self.timestamp would be required for correctness...
|
544
523
|
false
|
545
524
|
end
|
546
525
|
def related_sources
|
@@ -31,7 +31,6 @@ module Rant
|
|
31
31
|
raise ArgumentError, "prerequisites required"
|
32
32
|
@block = block
|
33
33
|
@run = false
|
34
|
-
@success = nil
|
35
34
|
@receiver = nil
|
36
35
|
end
|
37
36
|
def prerequisites
|
@@ -57,9 +56,6 @@ module Rant
|
|
57
56
|
def fail?
|
58
57
|
@success == false
|
59
58
|
end
|
60
|
-
def done?
|
61
|
-
@success
|
62
|
-
end
|
63
59
|
def enhance(deps = nil, &blk)
|
64
60
|
@pre.concat(deps) if deps
|
65
61
|
if @block
|
@@ -74,9 +70,6 @@ module Rant
|
|
74
70
|
@block = blk
|
75
71
|
end
|
76
72
|
end
|
77
|
-
def needed?
|
78
|
-
invoke(:needed? => true)
|
79
|
-
end
|
80
73
|
def invoke(opt = INVOKE_OPT)
|
81
74
|
return circular_dep if @run
|
82
75
|
@run = true
|
@@ -226,7 +219,7 @@ module Rant
|
|
226
219
|
end
|
227
220
|
private
|
228
221
|
def run
|
229
|
-
@rac.running_task(self)
|
222
|
+
return if @rac.running_task(self)
|
230
223
|
@rac.cx.sys.mkdir @name unless test ?d, @name
|
231
224
|
if @block
|
232
225
|
@block.arity == 0 ? @block.call : @block[self]
|
data/lib/rant/import/sys/more.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
# booleans.rb - Constraints for Rantfile boolean variables.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
|
5
|
+
|
6
|
+
module Rant
|
7
|
+
module RantVar
|
8
|
+
module Constraints
|
9
|
+
class Bool
|
10
|
+
include Constraint
|
11
|
+
class << self
|
12
|
+
alias rant_constraint new
|
13
|
+
end
|
14
|
+
def filter(val)
|
15
|
+
if ::Symbol === val or ::Integer === val
|
16
|
+
val = val.to_s
|
17
|
+
end
|
18
|
+
if val == true
|
19
|
+
true
|
20
|
+
elsif val == false || val == nil
|
21
|
+
false
|
22
|
+
elsif val.respond_to? :to_str
|
23
|
+
case val.to_str
|
24
|
+
when /^\s*true\s*$/i: true
|
25
|
+
when /^\s*false\s*$/i: false
|
26
|
+
when /^\s*y(es)?\s*$/i: true
|
27
|
+
when /^\s*n(o)?\s*$/: false
|
28
|
+
when /^\s*on\s*$/i: true
|
29
|
+
when /^\s*off\s*$/i: false
|
30
|
+
when /^\s*1\s*$/: true
|
31
|
+
when /^\s*0\s*$/: false
|
32
|
+
else
|
33
|
+
raise ConstraintError.new(self, val)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
raise ConstraintError.new(self, val)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
def default
|
40
|
+
false
|
41
|
+
end
|
42
|
+
def to_s
|
43
|
+
"bool"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class BoolTrue < Bool
|
48
|
+
def default
|
49
|
+
true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
#--
|
54
|
+
# perhaps this should stay a secret ;)
|
55
|
+
#++
|
56
|
+
def true.rant_constraint
|
57
|
+
BoolTrue.rant_constraint
|
58
|
+
end
|
59
|
+
def false.rant_constraint
|
60
|
+
Bool.rant_constraint
|
61
|
+
end
|
62
|
+
|
63
|
+
end # module Constraints
|
64
|
+
end # module RantVar
|
65
|
+
end # module Rant
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
# lists.rb - Constraints for Rantfile list variables.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
|
5
|
+
|
6
|
+
module Rant
|
7
|
+
module RantVar
|
8
|
+
module Constraints
|
9
|
+
class List
|
10
|
+
include Constraint
|
11
|
+
|
12
|
+
class << self
|
13
|
+
alias rant_constraint new
|
14
|
+
end
|
15
|
+
|
16
|
+
def filter(val)
|
17
|
+
if val.respond_to? :to_ary
|
18
|
+
val.to_ary
|
19
|
+
else
|
20
|
+
raise ConstraintError.new(self, val)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
def default
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
def to_s
|
27
|
+
"list (Array)"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Array = List
|
32
|
+
end # module Constraints
|
33
|
+
end # module RantVar
|
34
|
+
end # module Rant
|
@@ -0,0 +1,116 @@
|
|
1
|
+
|
2
|
+
# numbers.rb - Constraints for numeric Rantfile variables.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
|
5
|
+
|
6
|
+
module Rant
|
7
|
+
module RantVar
|
8
|
+
module Constraints
|
9
|
+
|
10
|
+
class Integer
|
11
|
+
include Constraint
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def rant_constraint(range = nil)
|
15
|
+
if range
|
16
|
+
IntegerInRange.new(range)
|
17
|
+
else
|
18
|
+
self.new
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def filter(val)
|
24
|
+
Kernel::Integer(val)
|
25
|
+
rescue
|
26
|
+
raise ConstraintError.new(self, val)
|
27
|
+
end
|
28
|
+
def default
|
29
|
+
0
|
30
|
+
end
|
31
|
+
def to_s
|
32
|
+
"integer"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class IntegerInRange < Integer
|
37
|
+
def initialize(range)
|
38
|
+
@range = range
|
39
|
+
end
|
40
|
+
def filter(val)
|
41
|
+
i = super
|
42
|
+
if @range === i
|
43
|
+
i
|
44
|
+
else
|
45
|
+
raise ConstraintError.new(self, val)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
def default
|
49
|
+
@range.min
|
50
|
+
end
|
51
|
+
def to_s
|
52
|
+
super + " #{@range}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class Float
|
57
|
+
include Constraint
|
58
|
+
|
59
|
+
class << self
|
60
|
+
def rant_constraint(range = nil)
|
61
|
+
if range
|
62
|
+
FloatInRange.new(range)
|
63
|
+
else
|
64
|
+
self.new
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def filter(val)
|
70
|
+
Kernel::Float(val)
|
71
|
+
rescue
|
72
|
+
raise ConstraintError.new(self, val)
|
73
|
+
end
|
74
|
+
def default
|
75
|
+
0.0
|
76
|
+
end
|
77
|
+
def to_s
|
78
|
+
"float"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class FloatInRange < Float
|
83
|
+
def initialize(range)
|
84
|
+
@range = range
|
85
|
+
end
|
86
|
+
def filter(val)
|
87
|
+
i = super
|
88
|
+
if @range === i
|
89
|
+
i
|
90
|
+
else
|
91
|
+
raise ConstraintError.new(self, val)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
def default
|
95
|
+
@range.first
|
96
|
+
end
|
97
|
+
def to_s
|
98
|
+
super + " #{@range}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end # module Constraints
|
102
|
+
end # module RantVar
|
103
|
+
end # module Rant
|
104
|
+
|
105
|
+
class Range
|
106
|
+
def rant_constraint
|
107
|
+
case first
|
108
|
+
when ::Integer
|
109
|
+
Rant::RantVar::Constraints::IntegerInRange.new(self)
|
110
|
+
when ::Float
|
111
|
+
Rant::RantVar::Constraints::FloatInRange.new(self)
|
112
|
+
else
|
113
|
+
raise NotAConstraintFactoryError.new(self)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
# strings.rb - Constraints for Rantfile string variables.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
|
5
|
+
|
6
|
+
module Rant
|
7
|
+
module RantVar
|
8
|
+
module Constraints
|
9
|
+
class String
|
10
|
+
include Constraint
|
11
|
+
|
12
|
+
class << self
|
13
|
+
alias rant_constraint new
|
14
|
+
end
|
15
|
+
|
16
|
+
def filter(val)
|
17
|
+
if val.respond_to? :to_str
|
18
|
+
val.to_str
|
19
|
+
elsif Symbol === val
|
20
|
+
val.to_s
|
21
|
+
else
|
22
|
+
raise ConstraintError.new(self, val)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
def default
|
26
|
+
""
|
27
|
+
end
|
28
|
+
def to_s
|
29
|
+
"string"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ToString < String
|
34
|
+
class << self
|
35
|
+
alias rant_constraint new
|
36
|
+
end
|
37
|
+
def filter(val)
|
38
|
+
val.to_s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end # module Constraints
|
42
|
+
end # module RantVar
|
43
|
+
end # module Rant
|
data/lib/rant/import.rb
CHANGED
@@ -218,7 +218,12 @@ EOF
|
|
218
218
|
cmd_opts.quiet = true
|
219
219
|
cmd_opts.each { |opt, value|
|
220
220
|
case opt
|
221
|
-
when "--version"
|
221
|
+
when "--version":
|
222
|
+
puts "rant-import #{Rant::VERSION}"
|
223
|
+
done
|
224
|
+
when "-v":
|
225
|
+
warn_msg "Option `-v' is deprecated and won't be in",
|
226
|
+
"release 0.6.0. Use `-V' or `--version' instead!."
|
222
227
|
puts "rant-import #{Rant::VERSION}"
|
223
228
|
done
|
224
229
|
when "--help": help
|
@@ -436,10 +441,20 @@ EOF
|
|
436
441
|
# Note:: The comment with the module name in line 3 of the
|
437
442
|
# input is very important.
|
438
443
|
def filter_reopen_module(script)
|
444
|
+
loop {
|
445
|
+
script, done = filter_reopen_module_onepass(script)
|
446
|
+
break(script) if done
|
447
|
+
}
|
448
|
+
end
|
449
|
+
|
450
|
+
# Returns true as second return value if at no useless
|
451
|
+
# statement was removed.
|
452
|
+
def filter_reopen_module_onepass(script)
|
439
453
|
lines = []
|
440
454
|
buffer = []
|
441
455
|
identifier = nil # class/module name
|
442
|
-
keyword = nil # class or module
|
456
|
+
keyword = nil # `class' or `module'
|
457
|
+
done = true
|
443
458
|
script.split(/\n/).each { |line|
|
444
459
|
if identifier
|
445
460
|
if line.strip.empty?
|
@@ -449,6 +464,7 @@ EOF
|
|
449
464
|
lines << ""
|
450
465
|
buffer.clear
|
451
466
|
identifier = keyword = nil
|
467
|
+
done = false
|
452
468
|
else
|
453
469
|
lines.concat buffer
|
454
470
|
buffer.clear
|
@@ -463,7 +479,7 @@ EOF
|
|
463
479
|
lines << line
|
464
480
|
end
|
465
481
|
}
|
466
|
-
|
482
|
+
[lines.join("\n") << "\n", done]
|
467
483
|
end
|
468
484
|
|
469
485
|
end # class RantImport
|
data/lib/rant/node.rb
CHANGED
@@ -73,6 +73,11 @@ module Rant
|
|
73
73
|
@line_number = nil
|
74
74
|
@run = false
|
75
75
|
@project_subdir = ""
|
76
|
+
# success has one of three values:
|
77
|
+
# nil no invoke
|
78
|
+
# false invoked, but fail
|
79
|
+
# true invoked and run successfully
|
80
|
+
@success = nil
|
76
81
|
end
|
77
82
|
|
78
83
|
def reference_name
|
@@ -113,12 +118,13 @@ module Rant
|
|
113
118
|
false
|
114
119
|
end
|
115
120
|
|
121
|
+
# Task was run and didn't fail.
|
116
122
|
def done?
|
117
|
-
@
|
123
|
+
@success
|
118
124
|
end
|
119
125
|
|
120
126
|
def needed?
|
121
|
-
|
127
|
+
invoke(:needed? => true)
|
122
128
|
end
|
123
129
|
|
124
130
|
# True during invoke. Used to encounter circular dependencies.
|
@@ -139,8 +145,11 @@ module Rant
|
|
139
145
|
return circular_dep if run?
|
140
146
|
@run = true
|
141
147
|
begin
|
142
|
-
return
|
143
|
-
|
148
|
+
return !done? if opt[:needed?]
|
149
|
+
# we don't need to check for opt[:force] here
|
150
|
+
# since a plain Node is run anyway.
|
151
|
+
self.run if !done?
|
152
|
+
@success = true
|
144
153
|
ensure
|
145
154
|
@run = false
|
146
155
|
end
|
@@ -163,15 +172,39 @@ module Rant
|
|
163
172
|
defined? @block and @block
|
164
173
|
end
|
165
174
|
|
175
|
+
def dry_run
|
176
|
+
text = "Executing #{name.dump}"
|
177
|
+
text << " [NOOP]" unless has_actions?
|
178
|
+
@rac.cmd_msg text
|
179
|
+
action_descs.each { |ad|
|
180
|
+
@rac.cmd_print " - "
|
181
|
+
@rac.cmd_msg ad.sub(/\n$/, '').gsub(/\n/, "\n ")
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
166
185
|
private
|
167
186
|
def run
|
168
|
-
return unless has_actions?
|
169
187
|
goto_task_home
|
170
|
-
@rac.running_task(self)
|
188
|
+
return if @rac.running_task(self)
|
189
|
+
return unless has_actions?
|
171
190
|
@receiver.pre_run(self) if defined? @receiver and @receiver
|
172
191
|
@block.arity == 0 ? @block.call : @block[self] if @block
|
173
192
|
end
|
174
193
|
|
194
|
+
def action_descs
|
195
|
+
descs = []
|
196
|
+
if defined? @receiver and @receiver
|
197
|
+
descs.concat(@receiver.pre_action_descs)
|
198
|
+
end
|
199
|
+
@block ? descs << action_block_desc : descs
|
200
|
+
end
|
201
|
+
|
202
|
+
def action_block_desc
|
203
|
+
@block.inspect =~ /^#<Proc:[\da-z]+@(.+):(\d+)>$/i
|
204
|
+
fn, ln = $1, $2
|
205
|
+
"Ruby Proc at #{fn.sub(/^#{Regexp.escape @rac.rootdir}\//, '')}:#{ln}"
|
206
|
+
end
|
207
|
+
|
175
208
|
def circular_dep
|
176
209
|
rac.warn_msg "Circular dependency on task `#{full_name}'."
|
177
210
|
false
|