rant 0.4.6 → 0.4.8
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/INSTALL +44 -0
- data/NEWS +30 -0
- data/README +6 -46
- data/Rantfile +38 -7
- data/doc/c.rdoc +2 -0
- data/doc/command.rdoc +210 -0
- data/doc/examples/c_dependencies/Rantfile +1 -1
- data/doc/examples/directedrule/Rantfile +1 -1
- data/doc/homepage/index.html +12 -1
- data/doc/rant-import.rdoc +5 -0
- data/doc/rant_vs_rake.rdoc +107 -0
- data/doc/rantfile.rdoc +17 -17
- data/doc/rubyproject.rdoc +45 -45
- data/doc/subdirs.rdoc +1 -1
- data/lib/rant/coregen.rb +62 -22
- data/lib/rant/import/archive.rb +1 -0
- data/lib/rant/import/command.rb +206 -0
- data/lib/rant/import/nodes/default.rb +12 -6
- data/lib/rant/import/nodes/signed.rb +3 -3
- data/lib/rant/import/signedfile.rb +14 -15
- data/lib/rant/import/win32/rubycmdwrapper.rb +1 -0
- data/lib/rant/import.rb +52 -4
- data/lib/rant/metautils.rb +119 -0
- data/lib/rant/node.rb +11 -2
- data/lib/rant/rantenv.rb +5 -2
- data/lib/rant/rantlib.rb +30 -46
- data/lib/rant/rantsys.rb +81 -13
- data/lib/rant/rantvar.rb +1 -76
- data/lib/rant.rb +2 -2
- data/misc/TODO +21 -0
- data/test/deprecated/test_0_5_2.rb +28 -0
- data/test/deprecated/test_0_6_0.rb +24 -0
- data/test/dyn_dependencies.rf +25 -0
- data/test/import/command/Rantfile +102 -0
- data/test/import/command/test_command.rb +597 -0
- data/test/rant-import/test_rant-import.rb +23 -1
- data/test/rule.rf +2 -0
- data/test/test_dyn_dependencies.rb +45 -0
- data/test/test_env.rb +5 -4
- data/test/test_filelist.rb +60 -3
- data/test/test_rant_interface.rb +5 -0
- data/test/test_sys.rb +53 -2
- data/test/tutil.rb +14 -6
- metadata +17 -6
- data/test/deprecated/test_0_4_8.rb +0 -41
data/lib/rant/rantsys.rb
CHANGED
@@ -138,15 +138,36 @@ module Rant
|
|
138
138
|
end
|
139
139
|
##############################################################
|
140
140
|
|
141
|
-
if Object.method_defined?
|
141
|
+
if Object.method_defined?(:fcall) || Object.method_defined?(:funcall) # in Ruby 1.9 like __send__
|
142
|
+
@@__send_private__ = Object.method_defined?(:fcall) ? :fcall : :funcall
|
142
143
|
def resolve
|
143
144
|
@pending = false
|
144
|
-
@actions.each{ |action| self.
|
145
|
+
@actions.each{ |action| self.__send__(@@__send_private__, *action) }.clear
|
145
146
|
ix = ignore_rx
|
146
147
|
if ix
|
147
148
|
@files.reject! { |f| f =~ ix && !@keep[f] }
|
148
149
|
end
|
149
150
|
end
|
151
|
+
elsif RUBY_VERSION < "1.8.2"
|
152
|
+
def resolve
|
153
|
+
@pending = false
|
154
|
+
@actions.each{ |action| self.__send__(*action) }.clear
|
155
|
+
ix = ignore_rx
|
156
|
+
@files.reject! { |f|
|
157
|
+
unless @keep[f]
|
158
|
+
next(true) if ix && f =~ ix
|
159
|
+
if @glob_flags & File::FNM_DOTMATCH != File::FNM_DOTMATCH
|
160
|
+
if ESC_ALT_SEPARATOR
|
161
|
+
f =~ /(^|(#{ESC_SEPARATOR}|#{ESC_ALT_SEPARATOR})+)\..*
|
162
|
+
((#{ESC_SEPARATOR}|#{ESC_ALT_SEPARATOR})+|$)/x
|
163
|
+
else
|
164
|
+
f =~ /(^|#{ESC_SEPARATOR}+)\..*
|
165
|
+
(#{ESC_SEPARATOR}+|$)/x
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
}
|
170
|
+
end
|
150
171
|
else
|
151
172
|
def resolve
|
152
173
|
@pending = false
|
@@ -359,9 +380,9 @@ end
|
|
359
380
|
# will result on windows:
|
360
381
|
# rdoc foo\bar "with space"
|
361
382
|
# on other systems:
|
362
|
-
# rdoc foo/bar
|
383
|
+
# rdoc foo/bar with\ space
|
363
384
|
def arglist
|
364
|
-
|
385
|
+
Rant::Sys.sp to_ary
|
365
386
|
end
|
366
387
|
alias to_s arglist
|
367
388
|
|
@@ -422,10 +443,15 @@ end
|
|
422
443
|
@basedir = Dir.pwd
|
423
444
|
super(*patterns)
|
424
445
|
@ignore_hash = nil
|
446
|
+
@add_ignore_args = []
|
425
447
|
update_ignore_rx
|
426
448
|
end
|
427
449
|
|
428
|
-
|
450
|
+
alias filelist_ignore ignore
|
451
|
+
def ignore(*patterns)
|
452
|
+
@add_ignore_args.concat patterns
|
453
|
+
self
|
454
|
+
end
|
429
455
|
|
430
456
|
def ignore_rx
|
431
457
|
update_ignore_rx
|
@@ -450,10 +476,11 @@ end
|
|
450
476
|
private
|
451
477
|
def update_ignore_rx
|
452
478
|
ri = @rac.var[:ignore]
|
479
|
+
ri = ri ? (ri + @add_ignore_args) : @add_ignore_args
|
453
480
|
rh = ri.hash
|
454
481
|
unless rh == @ignore_hash
|
455
482
|
@ignore_rx = nil
|
456
|
-
|
483
|
+
filelist_ignore(*ri)
|
457
484
|
@ignore_hash = rh
|
458
485
|
end
|
459
486
|
end
|
@@ -571,18 +598,51 @@ end
|
|
571
598
|
# The empty string argument ensures that +system+
|
572
599
|
# doesn't start a subshell but invokes ruby directly.
|
573
600
|
# The empty string argument is ignored by ruby.
|
574
|
-
sh(Env::
|
601
|
+
sh(Env::RUBY_EXE, '', &block)
|
575
602
|
else
|
576
|
-
sh(args.unshift(Env::
|
603
|
+
sh(args.unshift(Env::RUBY_EXE), &block)
|
577
604
|
end
|
578
605
|
end
|
579
606
|
|
580
607
|
# Returns a string that can be used as a valid path argument
|
581
608
|
# on the shell respecting portability issues.
|
582
|
-
def sp
|
583
|
-
|
609
|
+
def sp(arg)
|
610
|
+
if arg.respond_to? :to_ary
|
611
|
+
arg.to_ary.map{ |e| sp e }.join(' ')
|
612
|
+
else
|
613
|
+
_escaped_path arg
|
614
|
+
end
|
584
615
|
end
|
585
616
|
|
617
|
+
# Escape special shell characters (currently only spaces).
|
618
|
+
# Flattens arrays and returns always a single string.
|
619
|
+
def escape(arg)
|
620
|
+
if arg.respond_to? :to_ary
|
621
|
+
arg.to_ary.map{ |e| escape e }.join(' ')
|
622
|
+
else
|
623
|
+
_escaped arg
|
624
|
+
end
|
625
|
+
end
|
626
|
+
|
627
|
+
if Env.on_windows?
|
628
|
+
def _escaped_path(path)
|
629
|
+
_escaped(path.to_s.tr("/", "\\"))
|
630
|
+
end
|
631
|
+
def _escaped(arg)
|
632
|
+
sarg = arg.to_s
|
633
|
+
return sarg unless sarg.include?(" ")
|
634
|
+
sarg << "\\" if sarg[-1].chr == "\\"
|
635
|
+
"\"#{sarg}\""
|
636
|
+
end
|
637
|
+
else
|
638
|
+
def _escaped_path(path)
|
639
|
+
path.to_s.gsub(/(?=\s)/, "\\")
|
640
|
+
end
|
641
|
+
alias _escaped _escaped_path
|
642
|
+
end
|
643
|
+
private :_escaped_path
|
644
|
+
private :_escaped
|
645
|
+
|
586
646
|
# If supported, make a hardlink, otherwise
|
587
647
|
# fall back to copying.
|
588
648
|
def safe_ln(*args)
|
@@ -612,7 +672,7 @@ end
|
|
612
672
|
|
613
673
|
extend self
|
614
674
|
|
615
|
-
if RUBY_VERSION >= "1.9.0
|
675
|
+
if RUBY_VERSION >= "1.8.4" # needed by 1.9.0, too
|
616
676
|
class << self
|
617
677
|
public(*::FileUtils::METHODS)
|
618
678
|
end
|
@@ -634,12 +694,20 @@ end
|
|
634
694
|
raise ArgumentError, "controller required"
|
635
695
|
end
|
636
696
|
|
637
|
-
def glob(*
|
638
|
-
fl = RacFileList.new(@rac, *
|
697
|
+
def glob(*patterns, &block)
|
698
|
+
fl = RacFileList.new(@rac, *patterns)
|
639
699
|
fl.instance_eval(&block) if block
|
640
700
|
fl
|
641
701
|
end
|
642
702
|
|
703
|
+
def glob_all(*patterns, &block)
|
704
|
+
fl = RacFileList.new(@rac, *patterns)
|
705
|
+
fl.ignore(".", "..")
|
706
|
+
fl.glob_flags |= File::FNM_DOTMATCH
|
707
|
+
fl.instance_eval(&block) if block
|
708
|
+
fl
|
709
|
+
end
|
710
|
+
|
643
711
|
def [](*patterns)
|
644
712
|
RacFileList.new(@rac, *patterns)
|
645
713
|
end
|
data/lib/rant/rantvar.rb
CHANGED
@@ -16,14 +16,13 @@
|
|
16
16
|
# If you're looking for general info about Rant, read the
|
17
17
|
# README[link:files/README.html].
|
18
18
|
module Rant
|
19
|
-
VERSION = '0.4.
|
19
|
+
VERSION = '0.4.8'
|
20
20
|
|
21
21
|
# Those are the filenames for rantfiles.
|
22
22
|
# Case matters!
|
23
23
|
ROOT_RANTFILE = "root.rant"
|
24
24
|
SUB_RANTFILE = "sub.rant"
|
25
25
|
RANTFILES = [ "Rantfile", "rantfile", ROOT_RANTFILE ]
|
26
|
-
DEPRECATED_RANTFILES = [ "Rantfile.rb", "rantfile.rb" ]
|
27
26
|
|
28
27
|
# Names of plugins and imports for which code was loaded.
|
29
28
|
# Files that where loaded with the `import' commant are directly
|
@@ -49,80 +48,6 @@ module Rant
|
|
49
48
|
@__rant_no_value__
|
50
49
|
end
|
51
50
|
|
52
|
-
module MetaUtils
|
53
|
-
# Creates three accessor methods:
|
54
|
-
# obj.attr_name:: Return value of instance variable
|
55
|
-
# @attr_name
|
56
|
-
# obj.attr_name = val:: Set value instance variable
|
57
|
-
# @attr_name to val
|
58
|
-
# obj.attr_name val:: same as above
|
59
|
-
def rant_attr attr_name
|
60
|
-
attr_name = valid_attr_name attr_name
|
61
|
-
attr_writer attr_name
|
62
|
-
module_eval <<-EOD
|
63
|
-
def #{attr_name} val=Rant.__rant_no_value__
|
64
|
-
if val.equal? Rant.__rant_no_value__
|
65
|
-
@#{attr_name}
|
66
|
-
else
|
67
|
-
@#{attr_name} = val
|
68
|
-
end
|
69
|
-
end
|
70
|
-
EOD
|
71
|
-
nil
|
72
|
-
end
|
73
|
-
# Creates three accessor methods:
|
74
|
-
# obj.attr_name?:: Return value, true or false
|
75
|
-
# obj.attr_name:: Set attribute to true
|
76
|
-
# obj.no_attr_name:: Set attribute to false
|
77
|
-
def rant_flag attr_name
|
78
|
-
attr_name = valid_attr_name attr_name
|
79
|
-
module_eval <<-EOD
|
80
|
-
def #{attr_name}?
|
81
|
-
@#{attr_name}
|
82
|
-
end
|
83
|
-
def #{attr_name}
|
84
|
-
@#{attr_name} = true
|
85
|
-
end
|
86
|
-
def no_#{attr_name}
|
87
|
-
@#{attr_name} = false
|
88
|
-
end
|
89
|
-
EOD
|
90
|
-
end
|
91
|
-
# Creates accessor methods like #rant_attr for the attribute
|
92
|
-
# attr_name. Additionally, values are converted with to_str
|
93
|
-
# before assignment to instance variables happens.
|
94
|
-
def string_attr attr_name
|
95
|
-
attr_name = valid_attr_name attr_name
|
96
|
-
module_eval <<-EOD
|
97
|
-
def #{attr_name}=(val)
|
98
|
-
if val.respond_to? :to_str
|
99
|
-
@#{attr_name} = val.to_str
|
100
|
-
else
|
101
|
-
raise ArgumentError,
|
102
|
-
"string (#to_str) value required", caller
|
103
|
-
end
|
104
|
-
end
|
105
|
-
def #{attr_name} val=Rant.__rant_no_value__
|
106
|
-
if val.equal? Rant.__rant_no_value__
|
107
|
-
@#{attr_name}
|
108
|
-
else
|
109
|
-
self.__send__(:#{attr_name}=, val)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
EOD
|
113
|
-
nil
|
114
|
-
end
|
115
|
-
# attr_name is converted to a string with #to_s and has to
|
116
|
-
# match /^\w+$/. Returns attr_name.to_s.
|
117
|
-
def valid_attr_name attr_name
|
118
|
-
attr_name = attr_name.to_s
|
119
|
-
attr_name =~ /^\w+$/ or
|
120
|
-
raise ArgumentError,
|
121
|
-
"argument has to match /^\w+$/", caller
|
122
|
-
attr_name
|
123
|
-
end
|
124
|
-
end # module MetaUtils
|
125
|
-
|
126
51
|
module RantVar
|
127
52
|
|
128
53
|
class Error < Rant::Error
|
data/lib/rant.rb
CHANGED
data/misc/TODO
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
|
2
2
|
= TODO
|
3
3
|
|
4
|
+
== Don't use +invoke+ result of dependency to check if update is
|
5
|
+
necessary
|
6
|
+
|
7
|
+
It doesn't make sense since:
|
8
|
+
1. The node (prerequisite) could have already been invoked by another
|
9
|
+
node as prerequisite. For the first node, the prerequisite would
|
10
|
+
return true, all following false.
|
11
|
+
2. The node (prerequisite) *can* *not* know if the invoking node is
|
12
|
+
up to date compared to itself.
|
13
|
+
|
14
|
+
== Check +enhance+ for SourceNodes
|
15
|
+
|
16
|
+
Rant fails (infinite recursion) for enhance on SourceNodes.
|
17
|
+
Update: Infinite recursion occurs only when a <tt>require "rant"</tt>
|
18
|
+
was done. Else an appropriate message is printed. Can be
|
19
|
+
considered OK.
|
20
|
+
|
21
|
+
== Implement Rant::FileList#==
|
22
|
+
|
4
23
|
== Update documentation with regards to resolve hooks.
|
5
24
|
|
6
25
|
The argument list for resolve hooks has changed in version 0.4.5.
|
@@ -18,6 +37,8 @@ could get a common source of annoyance/bugs.
|
|
18
37
|
|
19
38
|
Favorite candidate is currently <tt>@</tt>.
|
20
39
|
|
40
|
+
Done (0.4.5), using <tt>@</tt>.
|
41
|
+
|
21
42
|
== Improve SourceNode types
|
22
43
|
|
23
44
|
Currently a SourceNode can only have other SourceNodes or files as
|
@@ -30,4 +30,32 @@ class TestDeprecated_0_5_2 < Test::Unit::TestCase
|
|
30
30
|
assert_match(/\bdeprecated\b/, err)
|
31
31
|
end
|
32
32
|
end
|
33
|
+
def test_ary_arglist
|
34
|
+
in_local_temp_dir do
|
35
|
+
write_to_file "Rantfile", <<-EOF
|
36
|
+
task :default do
|
37
|
+
sys(sys.sp(Env::RUBY_EXE) + " -e \\"puts ARGV\\" " +
|
38
|
+
["a b", "c/d"].arglist + " > a.out")
|
39
|
+
end
|
40
|
+
EOF
|
41
|
+
out, err = assert_rant
|
42
|
+
content = Rant::Env.on_windows? ? "a b\nc\\d\n" : "a b\nc/d\n"
|
43
|
+
assert_file_content "a.out", content
|
44
|
+
assert_match(/\bWARNING\b/, err)
|
45
|
+
assert_match(/\barglist\b/, err)
|
46
|
+
assert_match(/\bsp\b/, err)
|
47
|
+
assert_match(/\bdeprecated\b/, err)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
def test_ary_shell_pathes
|
51
|
+
out, err = capture_std do
|
52
|
+
sp = ["a b", "a/b"].shell_pathes
|
53
|
+
assert sp.respond_to?(:to_ary)
|
54
|
+
assert_equal 2, sp.size
|
55
|
+
end
|
56
|
+
assert_match(/\bWARNING\b/, err)
|
57
|
+
assert_match(/\bshell_pathes\b/, err)
|
58
|
+
assert_match(/\bsp\b/, err)
|
59
|
+
assert_match(/\bdeprecated\b/, err)
|
60
|
+
end
|
33
61
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
require 'tutil'
|
4
|
+
require 'rant/import'
|
5
|
+
|
6
|
+
$test_deprecated_dir ||= File.expand_path(File.dirname(__FILE__))
|
7
|
+
|
8
|
+
class TestDeprecated_0_6_0 < Test::Unit::TestCase
|
9
|
+
include Rant::TestUtil
|
10
|
+
def setup
|
11
|
+
Dir.chdir $test_deprecated_dir
|
12
|
+
end
|
13
|
+
def test_rant_import_option_v
|
14
|
+
out, err = capture_std do
|
15
|
+
assert_equal(0, Rant::RantImport.new("-v").run)
|
16
|
+
end
|
17
|
+
if Rant::VERSION > "0.4.8"
|
18
|
+
assert_match(/-v\bdeprecated\b.*-V.*--version\b/, err)
|
19
|
+
else
|
20
|
+
assert err.empty?
|
21
|
+
end
|
22
|
+
assert_match(/rant-import\s#{Regexp.escape Rant::VERSION}/, out)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
import "sys/more", "autoclean"
|
3
|
+
|
4
|
+
@print = lambda { |t| puts t.name }
|
5
|
+
@write = lambda { |t|
|
6
|
+
sys.write_to_file(t.name, (var[t.name[0,1]]||t.name))
|
7
|
+
}
|
8
|
+
|
9
|
+
task :A => :B, &@print
|
10
|
+
task :B do |t|
|
11
|
+
enhance :A => [:C, :D]
|
12
|
+
@print[t]
|
13
|
+
end
|
14
|
+
task :C, &@print
|
15
|
+
task :D, &@print
|
16
|
+
|
17
|
+
file "a.t" => "b.t", &@write
|
18
|
+
file "b.t" do |t|
|
19
|
+
enhance "a.t" => ["c.t", "d.t"]
|
20
|
+
@write[t]
|
21
|
+
end
|
22
|
+
file "c.t", &@write
|
23
|
+
file "d.t", &@write
|
24
|
+
|
25
|
+
gen AutoClean
|
@@ -0,0 +1,102 @@
|
|
1
|
+
|
2
|
+
import "command", "autoclean"
|
3
|
+
|
4
|
+
@ruby = Env::RUBY_EXE
|
5
|
+
@sh_echo = "#{sys.sp Env::RUBY_EXE} -e \"puts ARGV.join(' ')\""
|
6
|
+
@sh_puts = "#{sys.sp Env::RUBY_EXE} -e \"puts ARGV\""
|
7
|
+
@sh_cat = "#{sys.sp Env::RUBY_EXE} -e \"print ARGF.read\""
|
8
|
+
|
9
|
+
desc "Build a.t"
|
10
|
+
gen Command, "a.t" => ["b.t", "c.t"] do |t|
|
11
|
+
"#@sh_echo #{sys.sp t.prerequisites} > #{t.name}"
|
12
|
+
end
|
13
|
+
gen Command, "f_a.t" do |t|
|
14
|
+
sys "#@sh_echo #{sys.escape "I will fail."} > #{t.name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
var :btxt => "b"
|
18
|
+
var :be, :Bool
|
19
|
+
|
20
|
+
gen Command, "b.t", "$[sh_echo] $(btxt) > $(>)"
|
21
|
+
|
22
|
+
if var[:be]
|
23
|
+
enhance "b.t" => "d.t" do |t|
|
24
|
+
import "sys/more"
|
25
|
+
sys.write_to_file(t.name,
|
26
|
+
File.read(t.name) + File.read(t.source))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
gen Command, "c.t", sys["d???.t"], "$[sh_echo] $(<) > $(>)"
|
31
|
+
|
32
|
+
gen Command, "with space/a.t",
|
33
|
+
["b.t", "with space/b.t"],
|
34
|
+
"$[sh_puts] $(<) > $(>)"
|
35
|
+
|
36
|
+
var :fargs => "/I$(p_ath1)"
|
37
|
+
var :p_ath1 => "a bc"
|
38
|
+
gen Command, "f.t", "$[sh_echo] $[fargs] > $[>]"
|
39
|
+
|
40
|
+
var :eargs => "/I$(epath)"
|
41
|
+
var :epath => "a b/c/"
|
42
|
+
gen Command, "e.t", "$[sh_echo] $[eargs] > ${>}"
|
43
|
+
|
44
|
+
var :gargs => "/I${gpath}"
|
45
|
+
var :gpath => "a b/c/"
|
46
|
+
gen Command, "g.t", "$[sh_echo] $[gargs] > $(>)"
|
47
|
+
|
48
|
+
var :h1 => 1
|
49
|
+
var :h2 => 2
|
50
|
+
gen Command, "h.t", <<end
|
51
|
+
$[sh_echo] ${h1} > $(>)1
|
52
|
+
$[sh_echo] ${h2} > $(>)2
|
53
|
+
$[sh_cat] $(>)1 $(>)2 > $(>)
|
54
|
+
end
|
55
|
+
|
56
|
+
var :rargs => "$(prerequisites) $(source) > $(name)"
|
57
|
+
var :rcmd => "$[sh_echo] " + var[:rargs]
|
58
|
+
gen Rule, :out => [:in1, :in2] do |name, sources|
|
59
|
+
gen Command, name, sources, var[:rcmd]
|
60
|
+
end
|
61
|
+
|
62
|
+
gen Directory, "a.in1"
|
63
|
+
|
64
|
+
var :rc_dep => "puts 'a'"
|
65
|
+
gen Command, "dep1.t", "$(ruby) -e \"$[rc_dep]\" > $(>)"
|
66
|
+
|
67
|
+
gen Command, "t1.t", "dep1.t", "$[sh_echo] making t1 > $(>)"
|
68
|
+
gen Command, "t2.t", "dep1.t", "$[sh_echo] making t2 > $(>)"
|
69
|
+
|
70
|
+
gen Command, "sub1.t/a", "#@sh_echo ${>} > $(>)"
|
71
|
+
gen Command, "sub2.t/a", "$[sh_echo] ${>} > $(>)"
|
72
|
+
gen Directory, "sub2.t"
|
73
|
+
|
74
|
+
task :sub3 do
|
75
|
+
puts "task sub3"
|
76
|
+
end
|
77
|
+
gen Command, "sub3/a", "$[sh_echo] ${>} > $(>)"
|
78
|
+
|
79
|
+
gen Command, "x.t", '[#$[sh_puts] ${a}#] ${b} > $(>)'
|
80
|
+
|
81
|
+
gen Command, "delay.t", "$[sh_echo] ${foo} > $(>)"
|
82
|
+
|
83
|
+
gen Command, "p1.t", '$[sh_puts] ${p1} > $(>)'
|
84
|
+
gen Command, "p2.t", '$[sh_puts] ${p2} > $(>)'
|
85
|
+
gen Command, "p3.t", '$[sh_puts] ${p2} > $(>)'
|
86
|
+
|
87
|
+
var :foo => "foo value"
|
88
|
+
task :change_foo do
|
89
|
+
var[:foo] = "changed"
|
90
|
+
end
|
91
|
+
|
92
|
+
var[:p1] = lambda { |n| "#{n.full_name} $[foo]" }
|
93
|
+
var[:p2] = lambda { var[:foo] << "." }
|
94
|
+
|
95
|
+
if var[:inc_foo]
|
96
|
+
var[:p2].call
|
97
|
+
end
|
98
|
+
|
99
|
+
@h = {:a => "b"}
|
100
|
+
gen Command, "hash.t", "$[sh_puts] ${h} > $(>)"
|
101
|
+
|
102
|
+
gen AutoClean
|