#include <msp/fs/dir.h>
+#include <msp/fs/stat.h>
#include <msp/fs/utils.h>
#include <msp/strings/format.h>
#include <msp/strings/regex.h>
FileTarget(b, c.get_package(), p)
{
component = &c;
+
+ if(FS::Stat st = FS::lstat(FS::dirname(path)))
+ dir_mtime = st.get_modify_time();
}
void DataTransform::find_dependencies()
{
list<string> files;
Cache &cache = component->get_package().get_cache();
- // XXX Should check directory mtime as well
- if(mtime<cache.get_mtime() && cache.has_key(this, "files"))
+ const Time::TimeStamp &cache_mtime = cache.get_mtime();
+ if(mtime<cache_mtime && dir_mtime<cache_mtime && cache.has_key(this, "files"))
files = cache.get_values(this, "files");
else
{
builder.get_logger().log("files", format("Reading imports from %s", path.str()));
-
- list<string> dir_files = list_files(FS::dirname(path));
IO::File in(path.str());
DataFile::Parser parser(in, path.str());
+
+ vector<string> dir_files;
while(!in.eof())
{
DataFile::Statement st = parser.parse();
if(st.keyword=="for_each")
{
- for(DataFile::Statement::Arguments::const_iterator i=st.args.begin(); i!=st.args.end(); ++i)
+ // There's bound to be at least one file: the transform itself
+ if(dir_files.empty())
+ {
+ FS::Path dir = FS::dirname(path);
+ builder.get_logger().log("files", format("Traversing %s", dir.str()));
+ dir_files = list_files(dir);
+ }
+
+ for(const DataFile::Value &a: st.args)
{
- Regex re(i->get<string>());
- for(list<string>::const_iterator j=dir_files.begin(); j!=dir_files.end(); ++j)
- if(re.match(*j))
- files.push_back(*j);
+ Regex re(a.get<string>());
+ for(const string &f: dir_files)
+ if(re.match(f))
+ files.push_back(f);
}
}
else if(st.keyword=="file" && st.args.size()==1)
cache.set_values(this, "files", files);
}
- for(list<string>::iterator i=files.begin(); i!=files.end(); ++i)
+ for(const string &f: files)
{
- FS::Path file_path = FS::dirname(path)/ *i;
+ FS::Path file_path = FS::dirname(path)/f;
if(Target *tgt = builder.get_vfs().get_target(file_path))
- add_dependency(*tgt);
+ add_transitive_dependency(*tgt);
else
- add_dependency(*new File(builder, *package, file_path));
+ add_transitive_dependency(*new File(builder, *package, file_path));
}
}