Skip to content

Commit 252ad9e

Browse files
authored
Merge pull request #39 from pjump/chained_extensions
Chained extensions
2 parents b89f8a6 + c2ab781 commit 252ad9e

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

lib/rake/task_manager.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def enhance_with_matching_rule(task_name, level=0)
127127
"Rule Recursion Too Deep" if level >= 16
128128
@rules.each do |pattern, args, extensions, block|
129129
if pattern.match(task_name)
130-
task = attempt_rule(task_name, args, extensions, block, level)
130+
task = attempt_rule(task_name, pattern, args, extensions, block, level)
131131
return task if task
132132
end
133133
end
@@ -241,8 +241,8 @@ def trace_rule(level, message) # :nodoc:
241241
end
242242

243243
# Attempt to create a rule given the list of prerequisites.
244-
def attempt_rule(task_name, args, extensions, block, level)
245-
sources = make_sources(task_name, extensions)
244+
def attempt_rule(task_name, task_pattern, args, extensions, block, level)
245+
sources = make_sources(task_name, task_pattern, extensions)
246246
prereqs = sources.map { |source|
247247
trace_rule level, "Attempting Rule #{task_name} => #{source}"
248248
if File.exist?(source) || Rake::Task.task_defined?(source)
@@ -263,15 +263,16 @@ def attempt_rule(task_name, args, extensions, block, level)
263263

264264
# Make a list of sources from the list of file name extensions /
265265
# translation procs.
266-
def make_sources(task_name, extensions)
266+
def make_sources(task_name, task_pattern, extensions)
267267
result = extensions.map { |ext|
268268
case ext
269269
when /%/
270270
task_name.pathmap(ext)
271271
when %r{/}
272272
ext
273273
when /^\./
274-
task_name.ext(ext)
274+
source = task_name.sub(task_pattern, ext)
275+
source == ext ? task_name.ext(ext) : source
275276
when String
276277
ext
277278
when Proc, Method

test/test_rake_rules.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class TestRakeRules < Rake::TestCase
1010
OBJFILE = "abc.o"
1111
FOOFILE = "foo"
1212
DOTFOOFILE = ".foo"
13+
MINFILE = 'abc.min.o'
1314

1415
def setup
1516
super
@@ -385,4 +386,15 @@ def obj.find_prereq(task_name)
385386
assert_equal ["#{OBJFILE} - abc.c"], @runs
386387
end
387388

389+
def test_works_with_chained_extensions_in_rules
390+
create_file(OBJFILE)
391+
rule('.min.o' => ['.o']) do |t|
392+
@runs << t.name
393+
assert_equal OBJFILE, t.source
394+
assert_equal MINFILE, t.name
395+
end
396+
Task[MINFILE].invoke
397+
assert_equal [MINFILE], @runs
398+
end
399+
388400
end

0 commit comments

Comments
 (0)