diff --git a/include/dwarfs/inode_manager.h b/include/dwarfs/inode_manager.h index 8ba3d912..9e263b15 100644 --- a/include/dwarfs/inode_manager.h +++ b/include/dwarfs/inode_manager.h @@ -63,8 +63,12 @@ class inode_manager { } std::vector> - category_counts() const { - return impl_->category_counts(); + fragment_category_counts() const { + return impl_->fragment_category_counts(); + } + + std::vector inode_categories() const { + return impl_->inode_categories(); } void scan_background(worker_group& wg, os_access& os, @@ -85,7 +89,8 @@ class inode_manager { virtual void for_each_inode_in_order( std::function const&)> const& fn) const = 0; virtual std::vector> - category_counts() const = 0; + fragment_category_counts() const = 0; + virtual std::vector inode_categories() const = 0; virtual void scan_background(worker_group& wg, os_access& os, std::shared_ptr ino, file const* p) const = 0; diff --git a/src/dwarfs/inode_manager.cpp b/src/dwarfs/inode_manager.cpp index 0bc35e14..db6bd63e 100644 --- a/src/dwarfs/inode_manager.cpp +++ b/src/dwarfs/inode_manager.cpp @@ -477,12 +477,12 @@ class inode_manager_ final : public inode_manager::impl { } std::vector> - category_counts() const override { + fragment_category_counts() const override { std::unordered_map tmp; for (auto const& i : inodes_) { if (auto const& fragments = i->fragments(); !fragments.empty()) { - for (auto const& frag : fragments.span()) { + for (auto const& frag : fragments) { ++tmp[frag.category().value()]; } } @@ -500,6 +500,24 @@ class inode_manager_ final : public inode_manager::impl { return rv; } + std::vector inode_categories() const override { + std::unordered_set tmp; + + for (auto const& i : inodes_) { + if (auto const& fragments = i->fragments(); !fragments.empty()) { + for (auto const& frag : fragments) { + tmp.emplace(frag.category()); + } + } + } + + std::vector rv(tmp.begin(), tmp.end()); + + std::sort(rv.begin(), rv.end()); + + return rv; + } + void scan_background(worker_group& wg, os_access& os, std::shared_ptr ino, file const* p) const override; diff --git a/src/dwarfs/scanner.cpp b/src/dwarfs/scanner.cpp index f4fea788..3d56597b 100644 --- a/src/dwarfs/scanner.cpp +++ b/src/dwarfs/scanner.cpp @@ -606,11 +606,18 @@ void scanner_::scan( << prog.duplicate_files << "/" << prog.files_found << " duplicate files"; - if (options_.inode.categorizer_mgr) { - for (auto const& cc : im.category_counts()) { - LOG_INFO << cc.second << " " - << options_.inode.categorizer_mgr->category_name(cc.first) - << " files"; + if (auto catmgr = options_.inode.categorizer_mgr) { + for (auto const& cc : im.fragment_category_counts()) { + LOG_INFO << cc.second << " " << catmgr->category_name(cc.first) + << " fragments"; + } + + for (auto const& cat : im.inode_categories()) { + std::string str(catmgr->category_name(cat.value())); + if (cat.has_subcategory()) { + str += fmt::format("/{}", cat.subcategory()); + } + LOG_INFO << str; } }