From f997e40713c59065ebdd8d13e09cc60b50110a28 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:05:41 +0200 Subject: [PATCH] [humble] Allow unknown types in bag rewrite (backport #1812) (#1819) * Allow unknown types in bag rewrite (#1812) Signed-off-by: Michael Orlov (cherry picked from commit cd7bd63696604973e23c739afa6387556f3e7781) --- rosbag2_storage_mcap/src/message_definition_cache.cpp | 9 ++++++++- .../test_message_definition_cache.cpp | 11 +++++++++++ .../src/rosbag2_transport/bag_rewrite.cpp | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/rosbag2_storage_mcap/src/message_definition_cache.cpp b/rosbag2_storage_mcap/src/message_definition_cache.cpp index 474aa9b4d7..da172aa26b 100644 --- a/rosbag2_storage_mcap/src/message_definition_cache.cpp +++ b/rosbag2_storage_mcap/src/message_definition_cache.cpp @@ -14,6 +14,7 @@ #include "rosbag2_storage_mcap/message_definition_cache.hpp" +#include #include #include #include @@ -165,7 +166,13 @@ const MessageSpec & MessageDefinitionCache::load_message_spec( namespace_name = "msg"; } const std::string type_name = match[3]; - std::string share_dir = ament_index_cpp::get_package_share_directory(package); + std::string share_dir; + try { + share_dir = ament_index_cpp::get_package_share_directory(package); + } catch (const ament_index_cpp::PackageNotFoundError & e) { + RCUTILS_LOG_WARN_NAMED("rosbag2_storage_mcap", "%s", e.what()); + throw DefinitionNotFoundError(definition_identifier.package_resource_name); + } std::ifstream file{share_dir + "/" + namespace_name + "/" + type_name + extension_for_format(definition_identifier.format)}; if (!file.good()) { diff --git a/rosbag2_storage_mcap/test/rosbag2_storage_mcap/test_message_definition_cache.cpp b/rosbag2_storage_mcap/test/rosbag2_storage_mcap/test_message_definition_cache.cpp index 94632f91fe..2b5a2e01fe 100644 --- a/rosbag2_storage_mcap/test/rosbag2_storage_mcap/test_message_definition_cache.cpp +++ b/rosbag2_storage_mcap/test/rosbag2_storage_mcap/test_message_definition_cache.cpp @@ -147,3 +147,14 @@ TEST(test_message_definition_cache, get_service_message_definitions) ASSERT_EQ(result.first, rosbag2_storage_mcap::internal::Format::MSG); ASSERT_EQ(result.second, "\nstring resp\n"); } + +TEST(test_local_message_definition_source, throw_definition_not_found_for_unknown_msg) +{ + MessageDefinitionCache source; + ASSERT_THROW({ source.get_full_text("rosbag2_test_msgdefs/msg/UnknownMessage"); }, + rosbag2_storage_mcap::internal::DefinitionNotFoundError); + + // Throw DefinitionNotFoundError for not found message definition package name + ASSERT_THROW({ source.get_full_text("not_found_msgdefs_pkg/msg/UnknownMessage"); }, + rosbag2_storage_mcap::internal::DefinitionNotFoundError); +} diff --git a/rosbag2_transport/src/rosbag2_transport/bag_rewrite.cpp b/rosbag2_transport/src/rosbag2_transport/bag_rewrite.cpp index 2ef591131d..70962699b5 100644 --- a/rosbag2_transport/src/rosbag2_transport/bag_rewrite.cpp +++ b/rosbag2_transport/src/rosbag2_transport/bag_rewrite.cpp @@ -103,7 +103,7 @@ setup_topic_filtering( } for (const auto & [writer, record_options] : output_bags) { - rosbag2_transport::TopicFilter topic_filter{record_options}; + rosbag2_transport::TopicFilter topic_filter{record_options, nullptr, true}; auto filtered_topics_and_types = topic_filter.filter_topics(input_topics); // Done filtering - set up writer