|
|
|
@ -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++; |
|
|
|
|
} |
|
|
|
|