This patch removes the use of Dir#[] when calculating excludes from a
FileList object.
Using Dir#[] scans the filesystem for matching files which can both
create a performance problem and be inaccurate, in case I want to
exclude a non existing patterns, or Dir.chdir was called since the
FileList was generated.
The patch instead uses File#fnmatch? to match the pattern to the list of
files. The patch also removes calculate_exclude_regexp and instead does
all work in #exclude?, the assumption being that it is not normal to
have many exclude patterns anyway nor that their grouping into one
regular expression improves performance greatly.
Ittay
Signed-off-by: Ittay Dror <[EMAIL PROTECTED]>
---
lib/rake.rb | 37 ++++++++++++-------------------------
1 files changed, 12 insertions(+), 25 deletions(-)
diff --git a/lib/rake.rb b/lib/rake.rb
index 5ce88e8..ce09cc6 100755
--- a/lib/rake.rb
+++ b/lib/rake.rb
@@ -1273,7 +1273,6 @@ module Rake
@pending = false
@exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
@exclude_procs = DEFAULT_IGNORE_PROCS.dup
- @exclude_re = nil
@items = []
patterns.each { |pattern| include(pattern) }
yield self if block_given?
@@ -1336,7 +1335,6 @@ module Rake
def clear_exclude
@exclude_patterns = []
@exclude_procs = []
- calculate_exclude_regexp if ! @pending
self
end
@@ -1384,26 +1382,6 @@ module Rake
self
end
- def calculate_exclude_regexp
- ignores = []
- @exclude_patterns.each do |pat|
- case pat
- when Regexp
- ignores << pat
- when /[*?]/
- Dir[pat].each do |p| ignores << p end
- else
- ignores << Regexp.quote(pat)
- end
- end
- if ignores.empty?
- @exclude_re = /^$/
- else
- re_str = ignores.collect { |p| "(" + p.to_s + ")" }.join("|")
- @exclude_re = Regexp.new(re_str)
- end
- end
-
def resolve_add(fn)
case fn
when %r{[*?\[\{]}
@@ -1415,7 +1393,6 @@ module Rake
private :resolve_add
def resolve_exclude
- calculate_exclude_regexp
reject! { |fn| exclude?(fn) }
self
end
@@ -1538,8 +1515,18 @@ module Rake
# Should the given file name be excluded?
def exclude?(fn)
- calculate_exclude_regexp unless @exclude_re
- fn =~ @exclude_re || @exclude_procs.any? { |p| p.call(fn) }
+ return true if @exclude_patterns.any? do |pat|
+ case pat
+ when Regexp
+ fn =~ pat
+ when /[*?]/
+ File.fnmatch? pat, fn, File::FNM_PATHNAME
+ else
+ fn == pat
+ end
+ end
+
+ @exclude_procs.any? { |p| p.call(fn) }
end
DEFAULT_IGNORE_PATTERNS = [
--
1.6.0.36.g3814c
--
--
Ittay Dror <[EMAIL PROTECTED]>
_______________________________________________
Rake-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rake-devel