WARNING: the mechanism of taking timestamps of directories in order to find out if the content has changed doesn’t work reliably across all kinds of filesystems
# File lib/rgen/util/cached_glob.rb, line 10 def initialize(dir_glob, file_glob) @dir_glob = dir_glob @file_glob = file_glob @root_dirs = [] @dirs = {} @files = {} @timestamps = {} end
returns all files contained in directories matched by dir_glob
which match file_glob
. file_glob
must be relative
to dir_glob
. dir_glob “ a” with file_glob “** .txt”
is basically equivalent with Dir.glob(“ a /*.txt”) the idea is that
the file glob will only be re-eavluated when the content of one of the
directories matched by dir_glob has changed. this will only be faster than
a normal Dir.glob if the number of dirs matched by dir_glob is relatively
large and changes in files affect only a few of them at a time.
# File lib/rgen/util/cached_glob.rb, line 26 def glob root_dirs = Dir.glob(@dir_glob) (@root_dirs - root_dirs).each do |d| remove_root_dir(d) end (@root_dirs & root_dirs).each do |d| update_root_dir(d) if dir_changed?(d) end (root_dirs - @root_dirs).each do |d| update_root_dir(d) end @root_dirs = root_dirs @root_dirs.sort.collect{|d| @files[d]}.flatten end