Browse Source

Added filter parameter for the COPERNICUS source. Now we can select subset of files for mirroring.

master
Michael Uleysky 5 months ago
parent
commit
6d6b77f7d3
  1. 27
      sources/COPERNICUS.cpp

27
sources/COPERNICUS.cpp

@ -129,6 +129,9 @@ Error COPERNICUSData::Mirror(const CLArgs& args) const
dsets = dlist.Value(); 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; CURLRAII chandle;
for(const auto& dset: dsets) for(const auto& dset: dsets)
{ {
@ -154,20 +157,34 @@ Error COPERNICUSData::Mirror(const CLArgs& args) const
while(rpos != rfiles.size() || lpos != lfiles.size()) while(rpos != rfiles.size() || lpos != lfiles.size())
{ {
if(rpos == rfiles.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()) 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(rpos == rfiles.size() || lpos == lfiles.size()) continue;
if(rfiles[rpos].name < lfiles[lpos].name) 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) 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 else
{ {
auto delta = rfiles[rpos].mtime.Epoch() - lfiles[lpos].mtime.Epoch(); auto delta = rfiles[rpos].mtime.Epoch() - lfiles[lpos].mtime.Epoch();
if(delta < 0) delta = -delta; 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++; lpos++;
rpos++; rpos++;
} }

Loading…
Cancel
Save