-rw-r--r-- | lib/file_factory.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/file_factory.cc b/lib/file_factory.cc new file mode 100644 index 0000000..c6b5748 --- a/dev/null +++ b/lib/file_factory.cc @@ -0,0 +1,55 @@ +#ifdef USE_PCH + #include "pch.h" +#else + #include <sys/types.h> + #include <sys/stat.h> + #include <unistd.h> + #include <konforka/exception.h> + using namespace std; + #include "sitecing/file_factory.h" +#endif + +namespace sitecing { + + bool file_factory::is_uptodate(const string& dst,file_list_t* deps) { + file_list_t deplist; + file_list_t *fl = deps?deps:&deplist; + get_dependencies(dst,*fl); + struct stat stdst; + if(stat(dst.c_str(),&stdst)) + return false; + for(file_list_t::const_iterator i=fl->begin();i!=fl->end();i++) { + struct stat stdep; + if(stat(i->c_str(),&stdep)) + return false; + if(stdst.st_mtime<stdep.st_mtime) + return false; + if(!is_uptodate(*i)) + return false; + } + return true; + } + + void file_factory::make(const string& dst) { + try { + depth++; + if(depth>25) + throw konforka::exception(CODEPOINT,"recursed too deeply."); + file_list_t deps; + if(!is_uptodate(dst,&deps)) { + for(file_list_t::const_iterator i=deps.begin();i!=deps.end();i++) + make(*i); + build(dst); + } + depth--; + }catch(konforka::exception& ke) { + depth--; + ke.see(CODEPOINT); + throw; + }catch(...) { + depth--; + throw; + } + } + +} |