| 294 |
294 |
bool md5sum(const fs::path &path, md5digest &digest)
|
| 295 |
295 |
{
|
| 296 |
296 |
try {
|
| 297 |
|
Exiv2::FileIo io(path.file_string());
|
|
297 |
Exiv2::FileIo io(path.string());
|
| 298 |
298 |
if (io.open() != 0)
|
| 299 |
299 |
return false;
|
| 300 |
300 |
Exiv2::IoCloser closer(io);
|
| ... | ... | |
| 568 |
568 |
|
| 569 |
569 |
fs::path uniquify(const fs::path &dest)
|
| 570 |
570 |
{
|
| 571 |
|
std::string ext = dest.extension();
|
| 572 |
|
std::string fname = dest.stem();
|
|
571 |
std::string ext = dest.extension().string();
|
|
572 |
std::string fname = dest.stem().string();
|
| 573 |
573 |
fs::path parent = dest.parent_path();
|
| 574 |
574 |
|
| 575 |
575 |
unsigned number = 1;
|
| ... | ... | |
| 600 |
600 |
std::vector<std::string>::const_iterator x_iter = params.excludes.begin();
|
| 601 |
601 |
std::vector<std::string>::const_iterator x_end = params.excludes.end();
|
| 602 |
602 |
for( ; x_iter != x_end; ++x_iter ) {
|
| 603 |
|
if(boost::contains(directory.file_string(), *x_iter)) {
|
|
603 |
if(boost::contains(directory.string(), *x_iter)) {
|
| 604 |
604 |
exclude = true;
|
| 605 |
605 |
break;
|
| 606 |
606 |
}
|
| 607 |
607 |
}
|
| 608 |
608 |
if(exclude) {
|
| 609 |
|
info(std::string("excluding directory: ") + directory.file_string() +
|
|
609 |
info(std::string("excluding directory: ") + directory.string() +
|
| 610 |
610 |
" matched: " + *x_iter);
|
| 611 |
611 |
++params.dir_ex_count;
|
| 612 |
612 |
return;
|
| ... | ... | |
| 621 |
621 |
process_directory(p_iter->path(), depth + 1, params);
|
| 622 |
622 |
else {
|
| 623 |
623 |
info(std::string("depth reached, skipping: ") +
|
| 624 |
|
p_iter->path().file_string());
|
|
624 |
p_iter->path().string());
|
| 625 |
625 |
}
|
| 626 |
626 |
}
|
| 627 |
627 |
else if( is_regular_file(*p_iter) ) {
|
| ... | ... | |
| 630 |
630 |
exclude = false;
|
| 631 |
631 |
x_iter = params.excludes.begin();
|
| 632 |
632 |
for( ; x_iter != x_end; ++x_iter ) {
|
| 633 |
|
if(boost::contains(p_iter->path().file_string(), *x_iter)) {
|
|
633 |
if(boost::contains(p_iter->path().string(), *x_iter)) {
|
| 634 |
634 |
exclude = true;
|
| 635 |
635 |
break;
|
| 636 |
636 |
}
|
| 637 |
637 |
}
|
| 638 |
638 |
if(exclude) {
|
| 639 |
|
info(std::string("excluding file: ") + p_iter->path().file_string() +
|
|
639 |
info(std::string("excluding file: ") + p_iter->path().string() +
|
| 640 |
640 |
" matched: " + *x_iter);
|
| 641 |
641 |
++params.file_ex_count;
|
| 642 |
642 |
continue;
|
| ... | ... | |
| 648 |
648 |
if(!dest_subdir.empty())
|
| 649 |
649 |
dest_file = params.dest_dir / dest_subdir;
|
| 650 |
650 |
else if(params.ignore_unsorted) {
|
| 651 |
|
info(std::string("ignoring unsorted: ") + p_iter->path().file_string());
|
|
651 |
info(std::string("ignoring unsorted: ") + p_iter->path().string());
|
| 652 |
652 |
++params.unsorted_ignored_count;
|
| 653 |
653 |
continue;
|
| 654 |
654 |
}
|
| 655 |
655 |
else {
|
| 656 |
|
info(std::string("unsorted file (missing metadata): ") + p_iter->path().file_string());
|
|
656 |
info(std::string("unsorted file (missing metadata): ") + p_iter->path().string());
|
| 657 |
657 |
dest_file = params.unsorted_dir;
|
| 658 |
658 |
++params.unsorted_count;
|
| 659 |
659 |
}
|
| 660 |
660 |
|
| 661 |
|
dest_file /= p_iter->filename();
|
|
661 |
dest_file /= p_iter->path().filename();
|
| 662 |
662 |
|
| 663 |
663 |
if(fs::exists(dest_file)) {
|
| 664 |
664 |
if(params.ignore_dups) {
|
| 665 |
|
info(std::string("ignoring: ") + p_iter->path().file_string() +
|
| 666 |
|
" duplicates: " + dest_file.file_string());
|
|
665 |
info(std::string("ignoring: ") + p_iter->path().string() +
|
|
666 |
" duplicates: " + dest_file.string());
|
| 667 |
667 |
++params.dups_ignored_count;
|
| 668 |
668 |
continue;
|
| 669 |
669 |
}
|
| 670 |
670 |
else {
|
| 671 |
671 |
if(params.force) {
|
| 672 |
|
info(std::string("force removing: ") + dest_file.file_string() + " for: "
|
| 673 |
|
+ p_iter->path().file_string());
|
|
672 |
info(std::string("force removing: ") + dest_file.string() + " for: "
|
|
673 |
+ p_iter->path().string());
|
| 674 |
674 |
if(!params.dry_run)
|
| 675 |
675 |
fs::remove(dest_file);
|
| 676 |
676 |
}
|
| 677 |
677 |
else if(params.rename) {
|
| 678 |
|
info(std::string("renaming: ") + p_iter->path().file_string() +
|
| 679 |
|
" duplicates: " + dest_file.file_string());
|
|
678 |
info(std::string("renaming: ") + p_iter->path().string() +
|
|
679 |
" duplicates: " + dest_file.string());
|
| 680 |
680 |
dest_file = uniquify(dest_file);
|
| 681 |
681 |
}
|
| 682 |
682 |
else {
|
| 683 |
|
info(std::string("duplicate file: ") + p_iter->path().file_string() +
|
| 684 |
|
" of: " + dest_file.file_string());
|
| 685 |
|
dest_file = params.dups_dir / dest_subdir / p_iter->filename();
|
|
683 |
info(std::string("duplicate file: ") + p_iter->path().string() +
|
|
684 |
" of: " + dest_file.string());
|
|
685 |
dest_file = params.dups_dir / dest_subdir / p_iter->path().filename();
|
| 686 |
686 |
// Ugh, more dup possibilities
|
| 687 |
687 |
if(fs::exists(dest_file)) {
|
| 688 |
|
info(std::string("renaming: ") + p_iter->path().file_string() +
|
| 689 |
|
" duplicates: " + dest_file.file_string());
|
|
688 |
info(std::string("renaming: ") + p_iter->path().string() +
|
|
689 |
" duplicates: " + dest_file.string());
|
| 690 |
690 |
dest_file = uniquify(dest_file);
|
| 691 |
691 |
}
|
| 692 |
692 |
}
|
| ... | ... | |
| 698 |
698 |
fs::create_directories(dest_file.parent_path());
|
| 699 |
699 |
|
| 700 |
700 |
if(params.symlink) {
|
| 701 |
|
info(std::string("linking from: ") + p_iter->path().file_string() +
|
| 702 |
|
" to: " + dest_file.file_string());
|
|
701 |
info(std::string("linking from: ") + p_iter->path().string() +
|
|
702 |
" to: " + dest_file.string());
|
| 703 |
703 |
if(!params.dry_run) {
|
| 704 |
704 |
// The target of a symlink must be either absolute (aka complete) or
|
| 705 |
705 |
// relative to the location of the link. Easiest solution is to make
|
| ... | ... | |
| 713 |
713 |
}
|
| 714 |
714 |
}
|
| 715 |
715 |
else {
|
| 716 |
|
info(std::string("copying from: ") + p_iter->path().file_string() +
|
| 717 |
|
" to: " + dest_file.file_string());
|
|
716 |
info(std::string("copying from: ") + p_iter->path().string() +
|
|
717 |
" to: " + dest_file.string());
|
| 718 |
718 |
if(!params.dry_run) {
|
| 719 |
719 |
// Copy the file and restore its write time (needed for posix)
|
| 720 |
720 |
std::time_t time = fs::last_write_time(*p_iter);
|
| ... | ... | |
| 730 |
730 |
if(!ok) {
|
| 731 |
731 |
// Should probably find a more appropriate exception for this
|
| 732 |
732 |
throw std::runtime_error(std::string("File verification failed: '")
|
| 733 |
|
+ p_iter->path().file_string() + "' differs from '" +
|
| 734 |
|
dest_file.file_string() + "'");
|
|
733 |
+ p_iter->path().string() + "' differs from '" +
|
|
734 |
dest_file.string() + "'");
|
| 735 |
735 |
}
|
| 736 |
736 |
else {
|
| 737 |
737 |
info(std::string("verification passed"));
|
| ... | ... | |
| 740 |
740 |
}
|
| 741 |
741 |
}
|
| 742 |
742 |
if(params.move) {
|
| 743 |
|
info(std::string("removing: ") + p_iter->path().file_string());
|
|
743 |
info(std::string("removing: ") + p_iter->path().string());
|
| 744 |
744 |
if(!params.dry_run)
|
| 745 |
745 |
fs::remove(*p_iter);
|
| 746 |
746 |
}
|
| ... | ... | |
| 752 |
752 |
++params.ok_count;
|
| 753 |
753 |
}
|
| 754 |
754 |
catch(fs::filesystem_error& e) {
|
| 755 |
|
error(e, std::string("skipping file: " + p_iter->path().file_string()));
|
|
755 |
error(e, std::string("skipping file: " + p_iter->path().string()));
|
| 756 |
756 |
++params.file_err_count;
|
| 757 |
757 |
}
|
| 758 |
758 |
}
|
| 759 |
759 |
}
|
| 760 |
760 |
}
|
| 761 |
761 |
catch(fs::filesystem_error& e) {
|
| 762 |
|
error(e, std::string("skipping directory: " + directory.file_string()));
|
|
762 |
error(e, std::string("skipping directory: " + directory.string()));
|
| 763 |
763 |
++params.dir_err_count;
|
| 764 |
764 |
}
|
| 765 |
765 |
}
|