From 6ddbcad93b3b3a4871d0622a44cbfc422cc592b5 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sat, 22 Jul 2023 18:13:33 +0200 Subject: [PATCH] Perform metadata check --- include/dwarfs/contextual_option.h | 7 +++++++ src/mkdwarfs_main.cpp | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/dwarfs/contextual_option.h b/include/dwarfs/contextual_option.h index b3b50fd8..6f47bc57 100644 --- a/include/dwarfs/contextual_option.h +++ b/include/dwarfs/contextual_option.h @@ -87,6 +87,13 @@ class contextual_option { return default_ && pred(*default_); } + template + void visit_contextual(T&& visitor) const { + for (auto const& [ctx, val] : contextual_) { + visitor(ctx, val); + } + } + private: std::optional get_optional_impl(context_type const& ctx) const { if (auto it = contextual_.find(ctx); it != contextual_.end()) { diff --git a/src/mkdwarfs_main.cpp b/src/mkdwarfs_main.cpp index 9d6b1c1a..174ff463 100644 --- a/src/mkdwarfs_main.cpp +++ b/src/mkdwarfs_main.cpp @@ -1022,6 +1022,16 @@ int mkdwarfs_main(int argc, sys_char** argv) { compressor_parser); cop.parse(compression); cop.dump(std::cerr); + + compression_opt.visit_contextual([catmgr = options.inode.categorizer_mgr]( + auto cat, block_compressor const& bc) { + if (!bc.check_metadata(catmgr->category_metadata_sample(cat))) { + throw std::runtime_error( + fmt::format("compression '{}' cannot be used for category '{}': " + "insufficient metadata", + bc.describe(), catmgr->category_name(cat))); + } + }); } catch (std::exception const& e) { LOG_ERROR << e.what(); return 1;