diff --git a/sources/COPERNICUS.cpp b/sources/COPERNICUS.cpp index 82f921b..48747a7 100644 --- a/sources/COPERNICUS.cpp +++ b/sources/COPERNICUS.cpp @@ -129,6 +129,9 @@ Error COPERNICUSData::Mirror(const CLArgs& args) const dsets = dlist.Value(); } + michlib::RegExpSimple filter((args.contains("filter") ? args.at("filter") : ".*").Buf()); + if(filter.Compile() != 0) return Error(pref, MString("Can't compile regular expression ") + filter.RegStr()); + CURLRAII chandle; for(const auto& dset: dsets) { @@ -154,20 +157,34 @@ Error COPERNICUSData::Mirror(const CLArgs& args) const while(rpos != rfiles.size() || lpos != lfiles.size()) { if(rpos == rfiles.size()) - while(lpos != lfiles.size()) rem.push_back(lpos++); + while(lpos != lfiles.size()) + { + if(filter.Match(lfiles[lpos].name.Buf())) rem.push_back(lpos); + lpos++; + } if(lpos == lfiles.size()) - while(rpos != rfiles.size()) down.push_back(rpos++); + while(rpos != rfiles.size()) + { + if(filter.Match(rfiles[rpos].name.Buf())) down.push_back(rpos); + rpos++; + } if(rpos == rfiles.size() || lpos == lfiles.size()) continue; if(rfiles[rpos].name < lfiles[lpos].name) - down.push_back(rpos++); + { + if(filter.Match(rfiles[rpos].name.Buf())) down.push_back(rpos); + rpos++; + } else if(lfiles[lpos].name < rfiles[rpos].name) - rem.push_back(lpos++); + { + if(filter.Match(lfiles[lpos].name.Buf())) rem.push_back(lpos); + lpos++; + } else { auto delta = rfiles[rpos].mtime.Epoch() - lfiles[lpos].mtime.Epoch(); if(delta < 0) delta = -delta; - if(delta > 0 || rfiles[rpos].size != lfiles[lpos].size) upd.emplace_back(rpos, lpos); + if((delta > 0 || rfiles[rpos].size != lfiles[lpos].size) && filter.Match(lfiles[lpos].name.Buf())) upd.emplace_back(rpos, lpos); lpos++; rpos++; }