29 const std::string& dest,
31 const bool dest_is_vfat)
33 REQUIRE(
true == source.
exists() );
34 REQUIRE(
true == source.
is_dir() );
37 std::string dest_root;
40 if( dest_stats.
exists() ) {
43 REQUIRE(
true == dest_stats.
is_dir() );
45 dest_is_parent =
false;
48 dest_is_parent =
true;
53 dest_is_parent =
false;
57 jau::fprintf_td(stdout,
"%s: source %s, dest[arg %s, is_parent %d, dest_root %s], copts %s, dest_is_vfat %d\n",
58 title.c_str(), source.
to_string().c_str(),
59 dest.c_str(), dest_is_parent, dest_root.c_str(),
60 to_string(copts).c_str(), dest_is_vfat);
68 REQUIRE(
true == dest_stats.
exists() );
69 REQUIRE(
true == dest_stats.
ok() );
70 REQUIRE(
true == dest_stats.
is_dir() );
76 stats_ptr->
add(element_stats);
91 title.c_str(), to_string(copts).c_str(), to_string(topts).c_str());
107 if( ( !opt_follow_links && !opt_drop_dest_links ) ||
122 }
else if( opt_drop_dest_links ) {
134 }
else if( opt_follow_links ) {
152 struct source_visitor_params {
154 std::string source_folder_path;
157 bool opt_drop_dest_links;
159 struct dest_visitor_params {
161 std::string source_folder_path;
162 std::string dest_folder_path;
163 std::string source_basename;
168 source_visitor_params svp { title, source.
path(), dest_stats, dest_is_vfat, opt_drop_dest_links };
174 dest_visitor_params dvp { _svp->title, _svp->source_folder_path, _svp->dest.path(),
jau::fs::basename( element_stats1.
path() ), element_stats1, _svp->dest_is_vfat,
false };
180 const std::string path2 = element_stats2.
path();
182 const std::string source_folder_basename =
jau::fs::basename( _dvp->source_folder_path );
183 if( basename2 == _dvp->source_basename ||
184 ( source_folder_basename == _dvp->source_basename && _dvp->dest_folder_path == path2 )
187 bool attr_equal, bit_equal;
188 if(
"README_slink08_relext.txt" == basename2 || 0 == basename2.find(
"dead_link") ) {
191 attr_equal = element_stats2.
is_link() &&
196 if( !_dvp->dest_is_vfat ) {
199 element_stats2.
mode() == _dvp->stats.mode() &&
201 element_stats2.
mtime() == _dvp->stats.mtime() &&
202 element_stats2.
uid() == _dvp->stats.uid() &&
203 element_stats2.
gid() == _dvp->stats.gid() &&
204 element_stats2.
size() == _dvp->stats.size();
212 abs( element_stats2.
mtime() - _dvp->stats.mtime() ) <= td &&
213 element_stats2.
uid() == _dvp->stats.uid() &&
215 element_stats2.
size() == _dvp->stats.size();
218 jau::fprintf_td(stdout,
"%s.check: '%s'\n mode %s == %s\n mtime %s == %s, d %s\n uid %s == %s\n gid %s == %s\n size %s == %s\n",
219 _dvp->title.c_str(), basename2.c_str(),
222 element_stats2.
mtime().
to_string().c_str(), _dvp->stats.mtime().to_string().c_str(),
223 abs( element_stats2.
mtime() - _dvp->stats.mtime() ).to_string().c_str(),
224 std::to_string(element_stats2.
uid()).c_str(), std::to_string(_dvp->stats.uid()).c_str(),
225 std::to_string(element_stats2.
gid()).c_str(), std::to_string(_dvp->stats.gid()).c_str(),
229 if( _dvp->stats.is_file() ) {
235 _dvp->match = attr_equal && bit_equal;
236 jau::fprintf_td(stdout,
"%s.check: '%s', match [attr %d, bit %d -> %d]\n\t source %s\n\t dest__ %s\n\n",
237 _dvp->title.c_str(), basename2.c_str(), attr_equal, bit_equal, _dvp->match,
238 _dvp->stats.to_string().c_str(),
247 const bool ignore = element_stats1.
is_link() && _svp->opt_drop_dest_links;
248 jau::fprintf_td(stdout,
"%s.check: %s: '%s', not found!\n\t source %s\n\n",
249 _svp->title.c_str(), ignore ?
"Ignored" :
"Error", dvp.source_basename.c_str(),