From a201c28c1e083e336c7f69bf2a1f6644e537adef Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 14:03:09 +0800 Subject: [PATCH 01/15] Add support check for content filter feature in subscription --- lib/subscription.js | 8 ++++++ rosidl_parser/parser.py | 3 +-- src/rcl_subscription_bindings.cpp | 14 +++++++++++ test/test-subscription-content-filter.js | 32 ++++++++++++++++++++++++ test/types/index.test-d.ts | 1 + types/subscription.d.ts | 6 +++++ 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/lib/subscription.js b/lib/subscription.js index 4042bb3cb..67700f71d 100644 --- a/lib/subscription.js +++ b/lib/subscription.js @@ -144,6 +144,14 @@ class Subscription extends Entity { return this._serializationMode; } + /** + * Check if content filtering is supported for this subscription. + * @returns {boolean} True if the subscription instance supports content filtering; otherwise false. + */ + isContentFilterSupported() { + return rclnodejs.isContentFilterSupported(this.handle); + } + /** * Test if the RMW supports content-filtered topics and that this subscription * has an active wellformed content-filter. diff --git a/rosidl_parser/parser.py b/rosidl_parser/parser.py index 074fb8451..bd53fa556 100644 --- a/rosidl_parser/parser.py +++ b/rosidl_parser/parser.py @@ -47,12 +47,11 @@ def get_json_object_from_msg_spec_object(msg_spec_object): if __name__ == '__main__': if len(sys.argv) < 4: - print('Usage: {} '.format(sys.argv[0]), file=sys.stderr) + print('Wrong number of argments') sys.exit(1) try: parser_method = getattr(parser, sys.argv[1]) spec = parser_method(sys.argv[2], sys.argv[3]) - if sys.argv[1] == 'parse_message_file': json_obj = get_json_object_from_msg_spec_object(spec) elif sys.argv[1] == 'parse_service_file': diff --git a/src/rcl_subscription_bindings.cpp b/src/rcl_subscription_bindings.cpp index c7bdffd91..d93f1c045 100644 --- a/src/rcl_subscription_bindings.cpp +++ b/src/rcl_subscription_bindings.cpp @@ -264,6 +264,18 @@ Napi::Value GetSubscriptionTopic(const Napi::CallbackInfo& info) { return Napi::String::New(env, topic); } +Napi::Value IsContentFilterSupported(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + RclHandle* subscription_handle = + RclHandle::Unwrap(info[0].As()); + rcl_subscription_t* subscription = + reinterpret_cast(subscription_handle->ptr()); + + bool is_supported = rcl_subscription_is_cft_supported(subscription); + return Napi::Boolean::New(env, is_supported); +} + Napi::Value HasContentFilter(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); @@ -476,6 +488,8 @@ Napi::Object InitSubscriptionBindings(Napi::Env env, Napi::Object exports) { exports.Set("rclTakeRaw", Napi::Function::New(env, RclTakeRaw)); exports.Set("getSubscriptionTopic", Napi::Function::New(env, GetSubscriptionTopic)); + exports.Set("isContentFilterSupported", + Napi::Function::New(env, IsContentFilterSupported)); exports.Set("hasContentFilter", Napi::Function::New(env, HasContentFilter)); exports.Set("setContentFilter", Napi::Function::New(env, SetContentFilter)); exports.Set("getContentFilter", Napi::Function::New(env, GetContentFilter)); diff --git a/test/test-subscription-content-filter.js b/test/test-subscription-content-filter.js index 099b4ae15..1b30d92cc 100644 --- a/test/test-subscription-content-filter.js +++ b/test/test-subscription-content-filter.js @@ -480,3 +480,35 @@ describe('subscription content-filtering', function () { done(); }); }); + +describe('subscription isContentFilterSupported', function () { + this.timeout(30 * 1000); + + beforeEach(async function () { + await rclnodejs.init(); + this.node = new Node('cft_support_test_node'); + }); + + afterEach(function () { + this.node.destroy(); + rclnodejs.shutdown(); + }); + + it('isContentFilterSupported returns boolean matching RMW capability', function (done) { + const typeclass = 'std_msgs/msg/Int16'; + const subscription = this.node.createSubscription( + typeclass, + TOPIC, + (msg) => {} + ); + + const supported = subscription.isContentFilterSupported(); + assert.strictEqual(typeof supported, 'boolean'); + + // Validate against known RMW capabilities + const expectedSupported = isContentFilteringSupported(); + assert.strictEqual(supported, expectedSupported); + + done(); + }); +}); diff --git a/test/types/index.test-d.ts b/test/types/index.test-d.ts index f125b5c2b..a908bbf6a 100644 --- a/test/types/index.test-d.ts +++ b/test/types/index.test-d.ts @@ -245,6 +245,7 @@ expectType(rawMessageCallback); expectType(subscription.topic); expectType(subscription.isDestroyed()); +expectType(subscription.isContentFilterSupported()); expectType(subscription.setContentFilter(contentFilter)); expectType( subscription.getContentFilter() diff --git a/types/subscription.d.ts b/types/subscription.d.ts index 5fdf7b825..44dddd1c8 100644 --- a/types/subscription.d.ts +++ b/types/subscription.d.ts @@ -51,6 +51,12 @@ declare module 'rclnodejs' { */ readonly isRaw: boolean; + /** + * Check if content filtering is supported for this subscription. + * @returns True if the subscription instance supports content filtering; otherwise false. + */ + isContentFilterSupported(): boolean; + /** * Test if the RMW supports content-filtered topics and that this subscription * is configured with a well formed content-filter. From 73a4aaa90959fc786303fd6eb9aa958015a543c1 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 14:26:59 +0800 Subject: [PATCH 02/15] Address comments --- src/rcl_subscription_bindings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rcl_subscription_bindings.cpp b/src/rcl_subscription_bindings.cpp index d93f1c045..37fe5b915 100644 --- a/src/rcl_subscription_bindings.cpp +++ b/src/rcl_subscription_bindings.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include From cced5477ad83fdc5df1e06bf6b1690137fc418c4 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 16:15:12 +0800 Subject: [PATCH 03/15] Address comments --- .../workflows/linux-x64-build-and-test.yml | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 86288ab5d..72de2a333 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -40,6 +40,7 @@ jobs: # Rolling Ridley (No End-Of-Life) - docker_image: ubuntu:noble ros_distribution: rolling + ros_tar_url: "https://github.com/ros2/ros2/releases/download/release-rolling-nightlies/ros2-rolling-nightly-linux-amd64.tar.bz2" steps: - name: Setup Node.js ${{ matrix.node-version }} on ${{ matrix.architecture }} uses: actions/setup-node@v6 @@ -48,12 +49,23 @@ jobs: architecture: ${{ matrix.architecture }} - name: Setup ROS2 + if: ${{ !matrix.ros_tar_url }} uses: ros-tooling/setup-ros@v0.7 with: required-ros-distributions: ${{ matrix.ros_distribution }} - use-ros2-testing: ${{ matrix.ros_distribution == 'rolling' }} + + - name: Install ROS2 Rolling Nightly + if: ${{ matrix.ros_tar_url }} + run: | + apt-get update + apt-get install -y build-essential cmake curl tar bzip2 python3 + curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 + mkdir -p /opt/ros2_nightly + tar xjf /tmp/ros2-nightly.tar.bz2 -C /opt/ros2_nightly + rm /tmp/ros2-nightly.tar.bz2 - name: Install test-msgs and mrpt_msgs on Linux + if: ${{ !matrix.ros_tar_url }} run: | sudo apt install ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs # Adjust dependencies based on Ubuntu version @@ -65,7 +77,15 @@ jobs: - uses: actions/checkout@v6 + - name: Build rclnodejs (nightly) + if: ${{ matrix.ros_tar_url }} + run: | + uname -a + source /opt/ros2_nightly/ros2-linux/setup.bash + npm i + - name: Build and test rclnodejs + if: ${{ !matrix.ros_tar_url }} run: | uname -a source /opt/ros/${{ matrix.ros_distribution }}/setup.bash @@ -75,7 +95,7 @@ jobs: npm run clean - name: Test with IDL ROS messages against rolling - if: ${{ matrix.ros_distribution == 'rolling' }} + if: ${{ !matrix.ros_tar_url && matrix.ros_distribution == 'rolling' }} run: | source /opt/ros/${{ matrix.ros_distribution }}/setup.bash npm i @@ -83,7 +103,7 @@ jobs: npm run clean - name: Coveralls - if: ${{ matrix.ros_distribution == 'rolling' && matrix['node-version'] == '24.X' }} + if: ${{ !matrix.ros_tar_url && matrix.ros_distribution == 'rolling' && matrix['node-version'] == '24.X' }} uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} From fdf674615fdd9498b20fe1ea0a7b194998ea0ff1 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 16:34:11 +0800 Subject: [PATCH 04/15] Address comments --- .../workflows/linux-x64-build-and-test.yml | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 72de2a333..d2e721fa4 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -49,23 +49,37 @@ jobs: architecture: ${{ matrix.architecture }} - name: Setup ROS2 - if: ${{ !matrix.ros_tar_url }} + if: ${{ matrix.ros_distribution != 'rolling' }} uses: ros-tooling/setup-ros@v0.7 with: required-ros-distributions: ${{ matrix.ros_distribution }} - name: Install ROS2 Rolling Nightly - if: ${{ matrix.ros_tar_url }} + if: ${{ matrix.ros_distribution == 'rolling' }} + env: + ROS2_ROLLING_DIR: /opt/ros2_rolling run: | - apt-get update - apt-get install -y build-essential cmake curl tar bzip2 python3 - curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 - mkdir -p /opt/ros2_nightly - tar xjf /tmp/ros2-nightly.tar.bz2 -C /opt/ros2_nightly - rm /tmp/ros2-nightly.tar.bz2 + apt-get update && apt-get install -y locales + locale-gen en_US en_US.UTF-8 + update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 + export LANG=en_US.UTF-8 + + apt-get install -y build-essential cmake curl tar bzip2 wget python3 python3-rosdep + + # Download and extract nightly binary + mkdir -p $ROS2_ROLLING_DIR + cd $ROS2_ROLLING_DIR + curl -sL "${{ matrix.ros_tar_url }}" -o ros2-nightly.tar.bz2 + tar xf ros2-nightly.tar.bz2 + rm ros2-nightly.tar.bz2 + + # Install dependencies using rosdep + rosdep init || true + rosdep update + rosdep install --from-paths $ROS2_ROLLING_DIR/ros2-linux/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" - name: Install test-msgs and mrpt_msgs on Linux - if: ${{ !matrix.ros_tar_url }} + if: ${{ matrix.ros_distribution != 'rolling' }} run: | sudo apt install ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs # Adjust dependencies based on Ubuntu version @@ -77,15 +91,18 @@ jobs: - uses: actions/checkout@v6 - - name: Build rclnodejs (nightly) - if: ${{ matrix.ros_tar_url }} + - name: Build and test rclnodejs (nightly) + if: ${{ matrix.ros_distribution == 'rolling' }} run: | uname -a - source /opt/ros2_nightly/ros2-linux/setup.bash + source /opt/ros2_rolling/ros2-linux/setup.bash npm i + npm run lint + npm test + npm run clean - name: Build and test rclnodejs - if: ${{ !matrix.ros_tar_url }} + if: ${{ matrix.ros_distribution != 'rolling' }} run: | uname -a source /opt/ros/${{ matrix.ros_distribution }}/setup.bash @@ -95,15 +112,15 @@ jobs: npm run clean - name: Test with IDL ROS messages against rolling - if: ${{ !matrix.ros_tar_url && matrix.ros_distribution == 'rolling' }} + if: ${{ matrix.ros_distribution == 'rolling' }} run: | - source /opt/ros/${{ matrix.ros_distribution }}/setup.bash + source /opt/ros2_rolling/ros2-linux/setup.bash npm i npm run test-idl npm run clean - name: Coveralls - if: ${{ !matrix.ros_tar_url && matrix.ros_distribution == 'rolling' && matrix['node-version'] == '24.X' }} + if: ${{ matrix.ros_distribution == 'rolling' && matrix['node-version'] == '24.X' }} uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} From a76200ecb69ff99b0319d1e5f9c46e17cc5205f4 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 16:37:31 +0800 Subject: [PATCH 05/15] Address comments --- .../workflows/linux-x64-build-and-test.yml | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index d2e721fa4..b46f85051 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -56,27 +56,13 @@ jobs: - name: Install ROS2 Rolling Nightly if: ${{ matrix.ros_distribution == 'rolling' }} - env: - ROS2_ROLLING_DIR: /opt/ros2_rolling run: | - apt-get update && apt-get install -y locales - locale-gen en_US en_US.UTF-8 - update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 - export LANG=en_US.UTF-8 - - apt-get install -y build-essential cmake curl tar bzip2 wget python3 python3-rosdep - - # Download and extract nightly binary - mkdir -p $ROS2_ROLLING_DIR - cd $ROS2_ROLLING_DIR - curl -sL "${{ matrix.ros_tar_url }}" -o ros2-nightly.tar.bz2 - tar xf ros2-nightly.tar.bz2 - rm ros2-nightly.tar.bz2 - - # Install dependencies using rosdep - rosdep init || true - rosdep update - rosdep install --from-paths $ROS2_ROLLING_DIR/ros2-linux/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" + apt-get update + apt-get install -y build-essential cmake curl tar bzip2 python3 + mkdir -p /opt/ros2_rolling + curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 + tar xf /tmp/ros2-nightly.tar.bz2 -C /opt/ros2_rolling + rm /tmp/ros2-nightly.tar.bz2 - name: Install test-msgs and mrpt_msgs on Linux if: ${{ matrix.ros_distribution != 'rolling' }} From ef17a640293c8e4b1c311ba8382b04ec9f9aca5b Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 17:03:39 +0800 Subject: [PATCH 06/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index b46f85051..c482efead 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -58,12 +58,19 @@ jobs: if: ${{ matrix.ros_distribution == 'rolling' }} run: | apt-get update - apt-get install -y build-essential cmake curl tar bzip2 python3 + apt-get install -y build-essential cmake curl tar bzip2 python3 python3-rosdep software-properties-common + + # Download and extract nightly binary (per https://docs.ros.org/en/rolling/Installation/Alternatives/Ubuntu-Install-Binary.html) mkdir -p /opt/ros2_rolling curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 tar xf /tmp/ros2-nightly.tar.bz2 -C /opt/ros2_rolling rm /tmp/ros2-nightly.tar.bz2 + # Install runtime dependencies using rosdep + rosdep init || true + rosdep update + rosdep install --from-paths /opt/ros2_rolling/ros2-linux/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" + - name: Install test-msgs and mrpt_msgs on Linux if: ${{ matrix.ros_distribution != 'rolling' }} run: | From b228f52e5338976425f602e37dc88b039cd5d5d5 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 17:08:33 +0800 Subject: [PATCH 07/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index c482efead..086bccd6d 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -58,7 +58,8 @@ jobs: if: ${{ matrix.ros_distribution == 'rolling' }} run: | apt-get update - apt-get install -y build-essential cmake curl tar bzip2 python3 python3-rosdep software-properties-common + apt-get install -y build-essential cmake curl tar bzip2 python3 python3-pip software-properties-common + pip3 install --break-system-packages rosdep # Download and extract nightly binary (per https://docs.ros.org/en/rolling/Installation/Alternatives/Ubuntu-Install-Binary.html) mkdir -p /opt/ros2_rolling From 58a8aca799609673478cb166f9d98b09ad733572 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 17:16:59 +0800 Subject: [PATCH 08/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 086bccd6d..b3132ac4a 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -58,10 +58,19 @@ jobs: if: ${{ matrix.ros_distribution == 'rolling' }} run: | apt-get update - apt-get install -y build-essential cmake curl tar bzip2 python3 python3-pip software-properties-common - pip3 install --break-system-packages rosdep + apt-get install -y software-properties-common curl - # Download and extract nightly binary (per https://docs.ros.org/en/rolling/Installation/Alternatives/Ubuntu-Install-Binary.html) + # Enable required repositories (per https://docs.ros.org/en/rolling/Installation/Alternatives/Ubuntu-Install-Binary.html) + add-apt-repository universe + ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}') + curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" + dpkg -i /tmp/ros2-apt-source.deb + + # Install prerequisites + apt-get update + apt-get install -y build-essential cmake tar bzip2 python3 python3-rosdep + + # Download and extract nightly binary mkdir -p /opt/ros2_rolling curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 tar xf /tmp/ros2-nightly.tar.bz2 -C /opt/ros2_rolling @@ -73,7 +82,6 @@ jobs: rosdep install --from-paths /opt/ros2_rolling/ros2-linux/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" - name: Install test-msgs and mrpt_msgs on Linux - if: ${{ matrix.ros_distribution != 'rolling' }} run: | sudo apt install ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs # Adjust dependencies based on Ubuntu version From a2bf1b5ac4dcb9dffe282a0c4544831fd94e7af7 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 17:31:45 +0800 Subject: [PATCH 09/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 2 +- lib/subscription.js | 5 +++++ rosidl_parser/parser.py | 2 +- src/rcl_subscription_bindings.cpp | 4 ++++ test/test-subscription-content-filter.js | 5 +++-- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index b3132ac4a..60a322a40 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -83,7 +83,7 @@ jobs: - name: Install test-msgs and mrpt_msgs on Linux run: | - sudo apt install ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs + sudo apt install -y ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs # Adjust dependencies based on Ubuntu version LIBASOUND_PKG="libasound2" if grep -q "24.04" /etc/os-release; then diff --git a/lib/subscription.js b/lib/subscription.js index 67700f71d..8cd3a2149 100644 --- a/lib/subscription.js +++ b/lib/subscription.js @@ -16,6 +16,7 @@ const rclnodejs = require('./native_loader.js'); const Entity = require('./entity.js'); +const DistroUtils = require('./distro.js'); const { applySerializationMode } = require('./message_serialization.js'); const debug = require('debug')('rclnodejs:subscription'); @@ -146,9 +147,13 @@ class Subscription extends Entity { /** * Check if content filtering is supported for this subscription. + * Requires ROS 2 Rolling or later. * @returns {boolean} True if the subscription instance supports content filtering; otherwise false. */ isContentFilterSupported() { + if (DistroUtils.getDistroId() < DistroUtils.DistroId.ROLLING) { + return false; + } return rclnodejs.isContentFilterSupported(this.handle); } diff --git a/rosidl_parser/parser.py b/rosidl_parser/parser.py index bd53fa556..33b902e27 100644 --- a/rosidl_parser/parser.py +++ b/rosidl_parser/parser.py @@ -47,7 +47,7 @@ def get_json_object_from_msg_spec_object(msg_spec_object): if __name__ == '__main__': if len(sys.argv) < 4: - print('Wrong number of argments') + print('Usage: {} '.format(sys.argv[0]), file=sys.stderr) sys.exit(1) try: parser_method = getattr(parser, sys.argv[1]) diff --git a/src/rcl_subscription_bindings.cpp b/src/rcl_subscription_bindings.cpp index 37fe5b915..078e89abf 100644 --- a/src/rcl_subscription_bindings.cpp +++ b/src/rcl_subscription_bindings.cpp @@ -265,6 +265,7 @@ Napi::Value GetSubscriptionTopic(const Napi::CallbackInfo& info) { return Napi::String::New(env, topic); } +#if ROS_VERSION > 2505 // Rolling only Napi::Value IsContentFilterSupported(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); @@ -276,6 +277,7 @@ Napi::Value IsContentFilterSupported(const Napi::CallbackInfo& info) { bool is_supported = rcl_subscription_is_cft_supported(subscription); return Napi::Boolean::New(env, is_supported); } +#endif Napi::Value HasContentFilter(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); @@ -489,8 +491,10 @@ Napi::Object InitSubscriptionBindings(Napi::Env env, Napi::Object exports) { exports.Set("rclTakeRaw", Napi::Function::New(env, RclTakeRaw)); exports.Set("getSubscriptionTopic", Napi::Function::New(env, GetSubscriptionTopic)); +#if ROS_VERSION > 2505 // Rolling only exports.Set("isContentFilterSupported", Napi::Function::New(env, IsContentFilterSupported)); +#endif exports.Set("hasContentFilter", Napi::Function::New(env, HasContentFilter)); exports.Set("setContentFilter", Napi::Function::New(env, SetContentFilter)); exports.Set("getContentFilter", Napi::Function::New(env, GetContentFilter)); diff --git a/test/test-subscription-content-filter.js b/test/test-subscription-content-filter.js index 1b30d92cc..67f6b9668 100644 --- a/test/test-subscription-content-filter.js +++ b/test/test-subscription-content-filter.js @@ -505,8 +505,9 @@ describe('subscription isContentFilterSupported', function () { const supported = subscription.isContentFilterSupported(); assert.strictEqual(typeof supported, 'boolean'); - // Validate against known RMW capabilities - const expectedSupported = isContentFilteringSupported(); + // isContentFilterSupported requires rolling; on older distros it returns false + const isRolling = DistroUtils.getDistroId() >= DistroUtils.DistroId.ROLLING; + const expectedSupported = isRolling && isContentFilteringSupported(); assert.strictEqual(supported, expectedSupported); done(); From 762b259988ace6678f5cec47d6145e0a61bee89c Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 17:50:49 +0800 Subject: [PATCH 10/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 2 ++ rosidl_parser/parser.py | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 60a322a40..99affd4f5 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -98,6 +98,7 @@ jobs: run: | uname -a source /opt/ros2_rolling/ros2-linux/setup.bash + source /opt/ros/rolling/local_setup.bash npm i npm run lint npm test @@ -117,6 +118,7 @@ jobs: if: ${{ matrix.ros_distribution == 'rolling' }} run: | source /opt/ros2_rolling/ros2-linux/setup.bash + source /opt/ros/rolling/local_setup.bash npm i npm run test-idl npm run clean diff --git a/rosidl_parser/parser.py b/rosidl_parser/parser.py index 33b902e27..074fb8451 100644 --- a/rosidl_parser/parser.py +++ b/rosidl_parser/parser.py @@ -52,6 +52,7 @@ def get_json_object_from_msg_spec_object(msg_spec_object): try: parser_method = getattr(parser, sys.argv[1]) spec = parser_method(sys.argv[2], sys.argv[3]) + if sys.argv[1] == 'parse_message_file': json_obj = get_json_object_from_msg_spec_object(spec) elif sys.argv[1] == 'parse_service_file': From f9a92d8173c55f62c347618d5e60a0ad7ce99ada Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 18:12:22 +0800 Subject: [PATCH 11/15] CI: fix rolling nightly source order and add colcon --- .github/workflows/linux-x64-build-and-test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 99affd4f5..d569d8051 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -68,7 +68,7 @@ jobs: # Install prerequisites apt-get update - apt-get install -y build-essential cmake tar bzip2 python3 python3-rosdep + apt-get install -y build-essential cmake tar bzip2 python3 python3-rosdep python3-colcon-common-extensions # Download and extract nightly binary mkdir -p /opt/ros2_rolling @@ -97,8 +97,8 @@ jobs: if: ${{ matrix.ros_distribution == 'rolling' }} run: | uname -a - source /opt/ros2_rolling/ros2-linux/setup.bash - source /opt/ros/rolling/local_setup.bash + source /opt/ros/rolling/setup.bash + source /opt/ros2_rolling/ros2-linux/local_setup.bash npm i npm run lint npm test @@ -117,8 +117,8 @@ jobs: - name: Test with IDL ROS messages against rolling if: ${{ matrix.ros_distribution == 'rolling' }} run: | - source /opt/ros2_rolling/ros2-linux/setup.bash - source /opt/ros/rolling/local_setup.bash + source /opt/ros/rolling/setup.bash + source /opt/ros2_rolling/ros2-linux/local_setup.bash npm i npm run test-idl npm run clean From c439ddec32a6c175d9afe83ebead767fe1ea0ef6 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Mon, 23 Mar 2026 18:24:55 +0800 Subject: [PATCH 12/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index d569d8051..55ace962a 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -70,16 +70,16 @@ jobs: apt-get update apt-get install -y build-essential cmake tar bzip2 python3 python3-rosdep python3-colcon-common-extensions - # Download and extract nightly binary - mkdir -p /opt/ros2_rolling + # Download and extract nightly binary into /opt/ros/rolling/ curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 - tar xf /tmp/ros2-nightly.tar.bz2 -C /opt/ros2_rolling + mkdir -p /opt/ros/rolling + tar xf /tmp/ros2-nightly.tar.bz2 --strip-components=1 -C /opt/ros/rolling rm /tmp/ros2-nightly.tar.bz2 # Install runtime dependencies using rosdep rosdep init || true rosdep update - rosdep install --from-paths /opt/ros2_rolling/ros2-linux/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" + rosdep install --from-paths /opt/ros/rolling/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" - name: Install test-msgs and mrpt_msgs on Linux run: | @@ -98,7 +98,6 @@ jobs: run: | uname -a source /opt/ros/rolling/setup.bash - source /opt/ros2_rolling/ros2-linux/local_setup.bash npm i npm run lint npm test @@ -118,7 +117,6 @@ jobs: if: ${{ matrix.ros_distribution == 'rolling' }} run: | source /opt/ros/rolling/setup.bash - source /opt/ros2_rolling/ros2-linux/local_setup.bash npm i npm run test-idl npm run clean From 0c534aeb3b0837ab26286d65f9a47e8f33599e35 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Tue, 24 Mar 2026 10:01:41 +0800 Subject: [PATCH 13/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 55ace962a..800326c78 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -66,22 +66,24 @@ jobs: curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" dpkg -i /tmp/ros2-apt-source.deb - # Install prerequisites + # Install prerequisites and apt packages BEFORE nightly tarball apt-get update apt-get install -y build-essential cmake tar bzip2 python3 python3-rosdep python3-colcon-common-extensions + apt-get install -y ros-rolling-test-msgs ros-rolling-mrpt-msgs - # Download and extract nightly binary into /opt/ros/rolling/ + # Extract nightly binary AFTER apt packages so nightly's newer libs overwrite apt's older ones curl -sL "${{ matrix.ros_tar_url }}" -o /tmp/ros2-nightly.tar.bz2 mkdir -p /opt/ros/rolling tar xf /tmp/ros2-nightly.tar.bz2 --strip-components=1 -C /opt/ros/rolling rm /tmp/ros2-nightly.tar.bz2 - # Install runtime dependencies using rosdep + # Install any remaining runtime dependencies using rosdep rosdep init || true rosdep update rosdep install --from-paths /opt/ros/rolling/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" - name: Install test-msgs and mrpt_msgs on Linux + if: ${{ matrix.ros_distribution != 'rolling' }} run: | sudo apt install -y ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs # Adjust dependencies based on Ubuntu version From 1205ac2e9a28d90c65398d6dfc6a157d79b01b05 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Tue, 24 Mar 2026 10:32:20 +0800 Subject: [PATCH 14/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 800326c78..3c85c479b 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -86,6 +86,9 @@ jobs: if: ${{ matrix.ros_distribution != 'rolling' }} run: | sudo apt install -y ros-${{ matrix.ros_distribution }}-test-msgs ros-${{ matrix.ros_distribution }}-mrpt-msgs + + - name: Install Electron test dependencies + run: | # Adjust dependencies based on Ubuntu version LIBASOUND_PKG="libasound2" if grep -q "24.04" /etc/os-release; then From a0cc7ebb3b0850e6e62d7e62cc145a80b3766e47 Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Tue, 24 Mar 2026 13:34:04 +0800 Subject: [PATCH 15/15] Address comments --- .github/workflows/linux-x64-build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linux-x64-build-and-test.yml b/.github/workflows/linux-x64-build-and-test.yml index 3c85c479b..3805bed65 100644 --- a/.github/workflows/linux-x64-build-and-test.yml +++ b/.github/workflows/linux-x64-build-and-test.yml @@ -80,7 +80,7 @@ jobs: # Install any remaining runtime dependencies using rosdep rosdep init || true rosdep update - rosdep install --from-paths /opt/ros/rolling/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" + rosdep install --rosdistro rolling --from-paths /opt/ros/rolling/share --ignore-src -y --skip-keys "cyclonedds fastcdr fastdds iceoryx_binding_c rmw_connextdds rti-connext-dds-7.3.0 urdfdom_headers" - name: Install test-msgs and mrpt_msgs on Linux if: ${{ matrix.ros_distribution != 'rolling' }}