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.
toString().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=title, .source_folder_path=source.
path(), .dest=dest_stats, .dest_is_vfat=dest_is_vfat,
169 .opt_drop_dest_links=opt_drop_dest_links };
175 dest_visitor_params dvp { .title=_svp->title, .source_folder_path=_svp->source_folder_path, .dest_folder_path=_svp->dest.path(),
177 .dest_is_vfat=_svp->dest_is_vfat, .match=
false };
183 const std::string path2 = element_stats2.
path();
186 if( basename2 == _dvp->source_basename ||
187 ( source_folder_basename == _dvp->source_basename && _dvp->dest_folder_path == path2 )
190 bool attr_equal, bit_equal;
191 if(
"README_slink08_relext.txt" == basename2 || basename2.starts_with(
"dead_link") ) {
194 attr_equal = element_stats2.
is_link() &&
199 if( !_dvp->dest_is_vfat ) {
202 element_stats2.
mode() == _dvp->stats.mode() &&
204 element_stats2.
mtime() == _dvp->stats.mtime() &&
205 element_stats2.
uid() == _dvp->stats.uid() &&
206 element_stats2.
gid() == _dvp->stats.gid() &&
207 element_stats2.
size() == _dvp->stats.size();
215 abs( element_stats2.
mtime() - _dvp->stats.mtime() ) <= td &&
216 element_stats2.
uid() == _dvp->stats.uid() &&
218 element_stats2.
size() == _dvp->stats.size();
221 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",
222 _dvp->title.c_str(), basename2.c_str(),
225 element_stats2.
mtime().
toString().c_str(), _dvp->stats.mtime().toString().c_str(),
226 abs( element_stats2.
mtime() - _dvp->stats.mtime() ).toString().c_str(),
227 std::to_string(element_stats2.
uid()).c_str(), std::to_string(_dvp->stats.uid()).c_str(),
228 std::to_string(element_stats2.
gid()).c_str(), std::to_string(_dvp->stats.gid()).c_str(),
232 if( _dvp->stats.is_file() ) {
238 _dvp->match = attr_equal && bit_equal;
239 jau::fprintf_td(stdout,
"%s.check: '%s', match [attr %d, bit %d -> %d]\n\t source %s\n\t dest__ %s\n\n",
240 _dvp->title.c_str(), basename2.c_str(), attr_equal, bit_equal, _dvp->match,
241 _dvp->stats.toString().c_str(),
250 const bool ignore = element_stats1.
is_link() && _svp->opt_drop_dest_links;
251 jau::fprintf_td(stdout,
"%s.check: %s: '%s', not found!\n\t source %s\n\n",
252 _svp->title.c_str(), ignore ?
"Ignored" :
"Error", dvp.source_basename.c_str(),