diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 75c0e8e..dcb6c07 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -1,7 +1,11 @@ +# Pre-commit hook: ROS 2 package.xml validator +# We set `pass_filenames: false` because the validator scans the entire package directory +# (reading CMakeLists.txt, launch files, etc.) to verify dependencies. It must run +# regardless of which specific file in the package triggered the commit. - id: format-package-xml - name: Format package.xml files - description: Verify the package xml schema and ordering of dependencies + name: Format package.xml + description: Validate schema, enforce standard ordering, and sync dependencies with CMake and launch files. entry: package-xml-validator language: python - files: ^.*package\.xml$|^.*CMakeLists\.txt$ + pass_filenames: false args: [--compare-with-cmake, --auto-fill-missing-deps] diff --git a/package_xml_validation/helpers/validation_steps.py b/package_xml_validation/helpers/validation_steps.py index d7fc4d7..98e52bc 100644 --- a/package_xml_validation/helpers/validation_steps.py +++ b/package_xml_validation/helpers/validation_steps.py @@ -91,7 +91,6 @@ def perform_check(self, root, xml_file: str) -> ValidationResult: if not self.formatter.check_for_non_existing_tags(root, xml_file): message = f"Unknown tags found in {xml_file}." - result.errors.append(message) result.critical_errors.append(message) result.valid = False @@ -436,7 +435,6 @@ def perform_check(self, root, xml_file: str) -> ValidationResult: f"Unresolvable ROS dependencies found in {pkg_name}/package.xml: " f"{', '.join(unresolvable)}" ) - result.errors.append(message) result.critical_errors.append(message) result.valid = False return result @@ -485,9 +483,10 @@ def perform_check(self, root, xml_file: str) -> ValidationResult: message = ( f"Cannot check for CMake dependencies, {cmake_file} does not exist." ) - result.errors.append(message) if not self.config.auto_fill_missing_deps: result.critical_errors.append(message) + else: + result.errors.append(message) result.valid = False return result @@ -560,10 +559,11 @@ def check_dependency_group( f"Missing {dependency_label} in {pkg_name}/package.xml compared to " f"{pkg_name}/CMakeList.txt:{deps}" ) - result.errors.append(message) result.valid = False if not self.config.auto_fill_missing_deps: result.critical_errors.append(message) + else: + result.errors.append(message) else: self.formatter.add_dependencies(root, missing_deps, dependency_tag) result.warnings.append( @@ -582,7 +582,6 @@ def check_dependency_group( else: message = f"Unable to resolve {dependency_label} '{dep}' via rosdep resolve, mapping, or rosdep search." if self.config.strict_cmake_checking: - result.errors.append(message) result.valid = False result.critical_errors.append(message) else: