ceedling 1.1.10 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +3 -0
- data/.simplecov +73 -0
- data/GIT_COMMIT_SHA +1 -1
- data/Gemfile +84 -8
- data/Gemfile.lock +38 -8
- data/README.md +51 -29
- data/Rakefile +768 -16
- data/assets/{project.yml → features/project.yml} +4 -1
- data/assets/fixtures/bullseye_branch_coverage/src/branchy.c +24 -0
- data/assets/fixtures/bullseye_branch_coverage/src/branchy.h +14 -0
- data/assets/fixtures/bullseye_branch_coverage/test/test_branchy.c +18 -0
- data/assets/fixtures/cppcheck_findings/findings.c +23 -0
- data/assets/fixtures/cppcheck_findings/findings.h +13 -0
- data/assets/fixtures/header_include_path_validation/alt_drivers/foo.h +6 -0
- data/assets/fixtures/header_include_path_validation/bar.h +6 -0
- data/assets/fixtures/header_include_path_validation/drivers/foo.h +6 -0
- data/assets/fixtures/header_include_path_validation/dup.h +6 -0
- data/assets/fixtures/header_include_path_validation/other_inc/dup.h +6 -0
- data/assets/fixtures/header_include_path_validation/test_ambiguous_mock.c +15 -0
- data/assets/fixtures/header_include_path_validation/test_bare_mock.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_bogus_mock_path.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_bogus_vanilla_path.c +10 -0
- data/assets/fixtures/header_include_path_validation/test_include_outranks_test_include_path.c +16 -0
- data/assets/fixtures/header_include_path_validation/test_pathed_mock.c +11 -0
- data/assets/fixtures/header_include_path_validation/test_pathed_mock_ambiguous.c +14 -0
- data/assets/fixtures/header_include_path_validation/test_test_include_path_outranks_include.c +17 -0
- data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.h +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/beta/dup.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/beta/dup.h +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/gamma/dup_gamma.c +6 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_alpha.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_bare.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_beta.c +10 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_override.c +19 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive.c +19 -0
- data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive_noop.c +16 -0
- data/assets/fixtures/parent_directory_references/alpha/extra.c +4 -0
- data/assets/fixtures/parent_directory_references/common/helper.c +6 -0
- data/assets/fixtures/parent_directory_references/common/helper.h +6 -0
- data/assets/fixtures/parent_directory_references/unit/test_dotdot_include.c +10 -0
- data/assets/fixtures/parent_directory_references/unit/test_dotdot_source.c +16 -0
- data/assets/fixtures/plain_inline_module.h +9 -0
- data/assets/fixtures/same_named_modules/include/drivers/spi/config.h +6 -0
- data/assets/fixtures/same_named_modules/include/drivers/uart/config.h +6 -0
- data/assets/fixtures/same_named_modules/src/drivers/spi/config.c +8 -0
- data/assets/fixtures/same_named_modules/src/drivers/uart/config.c +10 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs.c +26 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs_mocked.c +20 -0
- data/assets/fixtures/same_named_modules/test/test_both_configs_mocked_traditional.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_both_modules.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_uart_config_bare.c +19 -0
- data/assets/fixtures/same_named_modules/test/test_uart_config_partial_only.c +20 -0
- data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.c +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.h +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.c +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.h +6 -0
- data/assets/fixtures/sources_with_duplicate_basenames/main.c +11 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_baz_bar.c +10 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_both_bars.c +12 -0
- data/assets/fixtures/sources_with_duplicate_basenames/test_foo_bar.c +10 -0
- data/assets/{test_example_file_boom.c → fixtures/test_nosanitize_boom.c} +9 -0
- data/assets/{test_example_file_crash_assert.c → fixtures/test_nosanitize_crash_assert.c} +8 -0
- data/assets/{test_example_file_crash_sigsegv.c → fixtures/test_nosanitize_crash_sigsegv.c} +8 -0
- data/assets/{test_example_file_crash_sigsegv_with_param.c → fixtures/test_nosanitize_crash_sigsegv_with_param.c} +8 -0
- data/assets/fixtures/test_nosanitize_heap_buffer_overflow.c +31 -0
- data/assets/fixtures/test_nosanitize_leak.c +34 -0
- data/assets/fixtures/test_nosanitize_two_findings.c +36 -0
- data/assets/{test_example_file_ub_shift_overflow.c → fixtures/test_nosanitize_ub_shift_overflow.c} +9 -0
- data/assets/fixtures/test_plain_inline_module.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/alpha/calc.c +4 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/beta/calc.c +4 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_alpha.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_ambiguous.c +15 -0
- data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_beta.c +15 -0
- data/assets/fixtures/tests_with_conditional_includes/src/feature_extra2.h +13 -0
- data/assets/fixtures/tests_with_conditional_includes/src/macro_target_extra.h +13 -0
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.c +19 -3
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.h +1 -0
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.c +17 -1
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget.c +12 -4
- data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget_feature.c +8 -5
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.c +7 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.c +16 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/FeatureConfig.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/Gpt.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModuleConfig.h +17 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart1.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart2.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/drivers/widget.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/reader.c +7 -0
- data/assets/fixtures/tests_with_conditional_mocks/src/reader.h +6 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01.c +21 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01_legacy.c +16 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_02.c +31 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_FeatureConfig.c +15 -0
- data/assets/fixtures/tests_with_conditional_mocks/test/test_reader.c +13 -0
- data/assets/fixtures/tests_with_duplicate_test_names/integration/test_foo.c +21 -0
- data/assets/fixtures/tests_with_duplicate_test_names/unit/test_foo.c +21 -0
- data/assets/fixtures/tests_with_fallback_conditionals/src/conditional_module.c +28 -0
- data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/test/test_conditionals.c +8 -1
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_lower.s +2 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_upper.S +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.c +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.h +13 -0
- data/assets/fixtures/tests_with_multiple_assembly_extensions/test/test_counter_module.c +27 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/app/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/drivers/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.c +30 -0
- data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/src/shared/config.h +13 -0
- data/assets/fixtures/tests_with_subdir_includes/test/test_sensor.c +32 -0
- data/bin/actionator.rb +234 -0
- data/bin/app_cfg.rb +7 -0
- data/bin/cli.rb +78 -47
- data/bin/cli_handler.rb +89 -57
- data/bin/cli_helper.rb +90 -49
- data/bin/cli_options_transform.rb +22 -0
- data/bin/{configinator.rb → composinator.rb} +39 -32
- data/bin/mixin_resolvinator.rb +124 -0
- data/bin/mixin_standardizer.rb +31 -61
- data/bin/mixinator.rb +27 -29
- data/bin/mixins.rb +0 -5
- data/bin/objects.yml +20 -7
- data/bin/path_validator.rb +6 -5
- data/bin/projectinator.rb +51 -142
- data/bin/rake_patches.rb +36 -2
- data/bin/recursive_merger.rb +7 -1
- data/bin/versionator.rb +2 -3
- data/ceedling.gemspec +83 -12
- data/docs/BreakingChanges.md +46 -2
- data/docs/CONTRIBUTING.md +45 -29
- data/docs/CeedlingPullRequestChecklist.md +10 -9
- data/docs/Changelog.md +327 -37
- data/docs/KnownIssues.md +30 -4
- data/docs/ReleaseNotes.md +288 -12
- data/docs/SECURITY.md +46 -2
- data/docs/ThrowTheSwitchCodingStandard.md +21 -3
- data/docs/overrides/main.html +32 -0
- data/examples/temp_sensor/mixin/add_bullseye.yml +19 -0
- data/examples/wondrous_forest/README.md +3 -0
- data/examples/wondrous_forest/src/sensors/light/Calibration.c +21 -0
- data/examples/wondrous_forest/src/sensors/light/Calibration.h +14 -0
- data/examples/wondrous_forest/src/sensors/soil/Calibration.c +23 -0
- data/examples/wondrous_forest/src/sensors/soil/Calibration.h +14 -0
- data/examples/wondrous_forest/test/TestCalibration.c +39 -0
- data/lib/ceedling/batchinator.rb +81 -22
- data/lib/ceedling/c_extractor/README.md +61 -0
- data/lib/ceedling/c_extractor/c_extractor.rb +33 -2
- data/lib/ceedling/c_extractor/c_extractor_code_text.rb +18 -10
- data/lib/ceedling/c_extractor/c_extractor_constants.rb +10 -10
- data/lib/ceedling/c_extractor/c_extractor_declarations.rb +14 -14
- data/lib/ceedling/c_extractor/c_extractor_functions.rb +10 -13
- data/lib/ceedling/c_extractor/c_extractor_preprocessing.rb +77 -0
- data/lib/ceedling/c_extractor/c_extractor_types.rb +8 -5
- data/lib/ceedling/ceedling.h +33 -0
- data/lib/ceedling/config/config_matchinator.rb +36 -13
- data/lib/ceedling/config/configurator.rb +366 -530
- data/lib/ceedling/config/configurator_builder.rb +253 -365
- data/lib/ceedling/config/configurator_plugins.rb +68 -102
- data/lib/ceedling/config/configurator_setup.rb +343 -610
- data/lib/ceedling/config/configurator_validator.rb +114 -142
- data/lib/ceedling/config/line_marker_suppressors.rb +67 -0
- data/lib/ceedling/constants.rb +60 -6
- data/lib/ceedling/defaults.rb +28 -14
- data/lib/ceedling/defineinator.rb +9 -4
- data/lib/ceedling/dependencies/README.md +69 -0
- data/lib/ceedling/dependencies/dependency_cache_store.rb +160 -0
- data/lib/ceedling/dependencies/dependency_debug_tree.rb +129 -0
- data/lib/ceedling/dependencies/dependency_differ.rb +127 -0
- data/lib/ceedling/dependencies/dependency_hasher.rb +94 -0
- data/lib/ceedling/dependencies/dependency_path_normalizer.rb +80 -0
- data/lib/ceedling/dependencies/dependency_tracker.rb +405 -0
- data/lib/ceedling/dependencies/dependinator.rb +65 -0
- data/lib/ceedling/dependencies/gcc_dependency_parser.rb +86 -0
- data/lib/ceedling/encodinator.rb +23 -11
- data/lib/ceedling/file_finder.rb +373 -89
- data/lib/ceedling/file_finder_helper.rb +44 -33
- data/lib/ceedling/file_path_collection_utils.rb +17 -4
- data/lib/ceedling/file_path_utils.rb +310 -52
- data/lib/ceedling/file_wrapper.rb +245 -8
- data/lib/ceedling/filename_extension.rb +91 -0
- data/lib/ceedling/flaginator.rb +6 -2
- data/lib/ceedling/generators/generator.rb +192 -70
- data/lib/ceedling/generators/generator_helper.rb +116 -69
- data/lib/ceedling/generators/generator_mocks.rb +13 -8
- data/lib/ceedling/generators/generator_partials.rb +47 -15
- data/lib/ceedling/generators/generator_test_results.rb +29 -17
- data/lib/ceedling/generators/generator_test_results_backtrace.rb +199 -107
- data/lib/ceedling/generators/generator_test_results_sanity_checker.rb +1 -1
- data/lib/ceedling/includes/include_factory.rb +21 -6
- data/lib/ceedling/includes/include_pathinator.rb +40 -4
- data/lib/ceedling/includes/includes.rb +215 -61
- data/lib/ceedling/loginator.rb +13 -4
- data/lib/ceedling/objects.yml +216 -33
- data/lib/ceedling/parsing_parcels.rb +39 -13
- data/lib/ceedling/partials/README.md +53 -0
- data/lib/ceedling/partials/partializer.rb +118 -26
- data/lib/ceedling/partials/partializer_config.rb +141 -8
- data/lib/ceedling/partials/partializer_helper.rb +88 -2
- data/lib/ceedling/partials/partializer_utils.rb +1 -1
- data/lib/ceedling/partials/partials.rb +4 -4
- data/lib/ceedling/path_matcher.rb +163 -0
- data/lib/ceedling/path_mirror.rb +73 -0
- data/lib/ceedling/plugins/plugin.rb +1 -1
- data/lib/ceedling/plugins/plugin_manager.rb +31 -15
- data/lib/ceedling/plugins/plugin_manager_helper.rb +5 -1
- data/lib/ceedling/plugins/plugin_reportinator.rb +36 -7
- data/lib/ceedling/plugins/plugin_reportinator_helper.rb +3 -3
- data/lib/ceedling/plugins/report_log_writer_plugin.rb +66 -0
- data/lib/ceedling/plugins/report_tests_stdout_plugin.rb +18 -5
- data/lib/ceedling/preprocess/README.md +135 -120
- data/lib/ceedling/preprocess/c_comment_scanner.rb +9 -7
- data/lib/ceedling/preprocess/c_preprocessor_conditionals.rb +27 -10
- data/lib/ceedling/preprocess/preprocessinator.rb +253 -217
- data/lib/ceedling/preprocess/preprocessinator_bare_includes_extractor.rb +7 -10
- data/lib/ceedling/preprocess/preprocessinator_code_finder.rb +8 -6
- data/lib/ceedling/preprocess/preprocessinator_comment_stripper.rb +5 -3
- data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +86 -82
- data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +182 -163
- data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +174 -8
- data/lib/ceedling/preprocess/preprocessinator_reconstructor.rb +41 -20
- data/lib/ceedling/quote_include_isolator.rb +129 -0
- data/lib/ceedling/rake_app/rake_task_registry.rb +9 -9
- data/lib/ceedling/rake_app/rake_wrapper.rb +0 -13
- data/lib/ceedling/rake_app/rakefile_component_resolver.rb +24 -12
- data/lib/ceedling/rakefile.rb +2 -1
- data/lib/ceedling/{tasks_base.rake → rakefiles/base/tasks_base.rake} +1 -1
- data/lib/ceedling/{tasks_filesystem.rake → rakefiles/base/tasks_filesystem.rake} +3 -0
- data/lib/ceedling/rakefiles/release/rules_release.rake +52 -0
- data/lib/ceedling/{erb_wrapper.rb → rakefiles/release/tasks_release.rake} +5 -8
- data/lib/ceedling/rakefiles/tests/rules_tests.rake +43 -0
- data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +80 -0
- data/lib/ceedling/{tasks_tests.rake → rakefiles/tests/tasks_tests.rake} +11 -20
- data/lib/ceedling/rakefiles/tests/tasks_tests_generate.rake +55 -0
- data/lib/ceedling/release_invoker/README.md +35 -0
- data/lib/ceedling/release_invoker/release_build_executor.rb +263 -0
- data/lib/ceedling/release_invoker/release_build_planner.rb +80 -0
- data/lib/ceedling/release_invoker/release_invoker.rb +78 -0
- data/lib/ceedling/release_invoker/release_invoker_types.rb +40 -0
- data/lib/ceedling/reportinator.rb +18 -2
- data/lib/ceedling/ruby_expandinator.rb +40 -1
- data/lib/ceedling/setupinator.rb +9 -3
- data/lib/ceedling/system_wrapper.rb +17 -0
- data/lib/ceedling/templateinator.rb +146 -0
- data/lib/ceedling/test_context_extractor.rb +59 -28
- data/lib/ceedling/test_invoker/HEADER_COLLISIONS.md +41 -0
- data/lib/ceedling/test_invoker/PIPELINE.md +142 -0
- data/lib/ceedling/test_invoker/README.md +6 -0
- data/lib/ceedling/test_invoker/mock_locator.rb +49 -0
- data/lib/ceedling/test_invoker/partials_manager.rb +426 -0
- data/lib/ceedling/test_invoker/standin_headerinator.rb +136 -0
- data/lib/ceedling/test_invoker/test_bare_includes_extractinator.rb +117 -0
- data/lib/ceedling/test_invoker/test_build_executor.rb +783 -429
- data/lib/ceedling/test_invoker/test_build_planner.rb +175 -70
- data/lib/ceedling/test_invoker/test_build_setup.rb +132 -241
- data/lib/ceedling/test_invoker/test_build_validations.rb +102 -0
- data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +148 -0
- data/lib/ceedling/test_invoker/test_includes_extractinator.rb +34 -0
- data/lib/ceedling/test_invoker/test_includes_preprocessinator.rb +118 -0
- data/lib/ceedling/test_invoker/test_includes_reconcilinator.rb +149 -0
- data/lib/ceedling/test_invoker/test_invoker.rb +16 -183
- data/lib/ceedling/test_invoker/test_invoker_types.rb +85 -16
- data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +121 -0
- data/lib/ceedling/test_invoker/test_pipeline_manager.rb +303 -0
- data/lib/ceedling/test_invoker/test_runner_generatinator.rb +105 -0
- data/lib/ceedling/test_invoker/test_search_paths.rb +73 -0
- data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +78 -0
- data/lib/ceedling/tool_executor.rb +42 -13
- data/lib/ceedling/tool_executor_helper.rb +1 -1
- data/lib/ceedling/tool_validator.rb +124 -123
- data/lib/ceedling/yaml_wrapper.rb +5 -3
- data/lib/version.rb +19 -2
- data/mkdocs.prerelease.yml +42 -0
- data/mkdocs.yml +10 -2
- data/plugins/bullseye/bullseye.rake +70 -107
- data/plugins/bullseye/config/defaults.yml +12 -54
- data/plugins/bullseye/config/defaults_bullseye.rb +182 -0
- data/plugins/bullseye/lib/bullseye.rb +511 -120
- data/plugins/bullseye/lib/bullseye_constants.rb +100 -0
- data/plugins/command_hooks/lib/command_hooks.rb +117 -199
- data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +72 -27
- data/plugins/cppcheck/config/defaults.yml +6 -1
- data/plugins/cppcheck/config/defaults_cppcheck.rb +5 -1
- data/plugins/cppcheck/cppcheck.rake +7 -1
- data/plugins/cppcheck/lib/cppcheck.rb +175 -26
- data/plugins/cppcheck/lib/cppcheck_constants.rb +12 -0
- data/plugins/cppcheck/lib/cppcheck_reports.rb +5 -1
- data/plugins/dependencies/Rakefile +14 -2
- data/plugins/dependencies/config/defaults.yml +9 -6
- data/plugins/dependencies/dependencies.rake +46 -76
- data/plugins/dependencies/example/boss/project.yml +1 -1
- data/plugins/dependencies/example/supervisor/project.yml +1 -1
- data/plugins/dependencies/example/version.tar.gzip +0 -0
- data/plugins/dependencies/lib/dependencies.rb +232 -427
- data/plugins/dependencies/lib/dependency_commands.rb +72 -0
- data/plugins/dependencies/lib/dependency_environment.rb +57 -0
- data/plugins/dependencies/lib/dependency_spec.rb +145 -0
- data/plugins/fff/.rspec +1 -0
- data/plugins/fff/Rakefile +14 -2
- data/plugins/fff/examples/fff_example/project.yml +1 -1
- data/plugins/fff/lib/fff.rb +30 -9
- data/plugins/fff/lib/fff_mock_generator.rb +142 -128
- data/plugins/fff/spec/fff_mock_header_generator_spec.rb +15 -0
- data/plugins/fff/spec/fff_mock_source_generator_spec.rb +14 -0
- data/plugins/fff/spec/spec_helper.rb +45 -0
- data/plugins/fff/src/fff_unity_helper.h +5 -0
- data/plugins/fff/vendor/fff/fakegen.rb +5 -4
- data/plugins/fff/vendor/fff/fff.h +4 -4
- data/plugins/gcov/config/defaults.yml +5 -0
- data/plugins/gcov/gcov.rake +12 -8
- data/plugins/gcov/lib/console_reportinator.rb +140 -20
- data/plugins/gcov/lib/gcov.rb +155 -60
- data/plugins/gcov/lib/gcov_constants.rb +4 -7
- data/plugins/gcov/lib/gcov_reportinator.rb +90 -0
- data/plugins/gcov/lib/gcov_types.rb +62 -1
- data/plugins/gcov/lib/gcovr_reportinator.rb +255 -213
- data/plugins/gcov/lib/reportgenerator_reportinator.rb +122 -44
- data/plugins/module_generator/Rakefile +4 -4
- data/plugins/module_generator/config/module_generator.yml +0 -1
- data/plugins/module_generator/example/project.yml +1 -1
- data/plugins/module_generator/lib/module_generator.rb +117 -87
- data/plugins/module_generator/lib/module_generator_options.rb +150 -0
- data/plugins/module_generator/lib/module_generator_project.rb +45 -0
- data/plugins/module_generator/lib/module_generator_request.rb +83 -0
- data/plugins/module_generator/lib/module_generator_test_file.rb +68 -0
- data/plugins/module_generator/lib/module_generator_unity.rb +24 -0
- data/plugins/module_generator/module_generator.rake +24 -46
- data/plugins/report_build_warnings_log/config/defaults.yml +4 -1
- data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +47 -55
- data/plugins/report_build_warnings_log/lib/warning_collector.rb +140 -0
- data/plugins/report_build_warnings_log/lib/warning_reports.rb +135 -0
- data/plugins/report_tests_gtestlike_stdout/assets/test_results.template +3 -0
- data/{spec/units/configurator_builder_spec.rb → plugins/report_tests_gtestlike_stdout/config/defaults.yml} +6 -10
- data/plugins/report_tests_gtestlike_stdout/lib/gtestlike_report.rb +168 -0
- data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +25 -1
- data/plugins/report_tests_ide_stdout/assets/test_results.template +50 -0
- data/plugins/report_tests_ide_stdout/config/defaults.yml +13 -0
- data/plugins/report_tests_ide_stdout/lib/ide_report_lines.rb +103 -0
- data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +12 -4
- data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +33 -51
- data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +286 -295
- data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +22 -35
- data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +91 -133
- data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +72 -86
- data/plugins/report_tests_log_factory/lib/tests_reporter.rb +31 -12
- data/plugins/report_tests_pretty_stdout/assets/{template.erb → test_results.template} +8 -8
- data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +18 -48
- data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +13 -2
- data/plugins/sanitize/config/defaults.yml +44 -0
- data/plugins/sanitize/config/defaults_sanitize.rb +20 -0
- data/plugins/sanitize/lib/sanitize.rb +174 -0
- data/plugins/sanitize/lib/sanitize_config.rb +110 -0
- data/plugins/sanitize/lib/sanitize_constants.rb +13 -0
- data/plugins/sanitize/lib/sanitize_findings.rb +85 -0
- data/plugins/sanitize/lib/sanitize_records.rb +115 -0
- data/plugins/sanitize/lib/sanitize_reports.rb +135 -0
- data/plugins/sanitize/sanitize.rake +108 -0
- data/plugins/valgrind/config/defaults.yml +7 -1
- data/plugins/valgrind/config/defaults_valgrind.rb +6 -1
- data/plugins/valgrind/lib/valgrind.rb +202 -39
- data/plugins/valgrind/lib/valgrind_constants.rb +4 -0
- data/plugins/valgrind/lib/valgrind_report.rb +52 -0
- data/plugins/valgrind/valgrind.rake +33 -11
- data/site-local/404.html +248 -14
- data/site-local/configuration/environment-vars.html +248 -14
- data/site-local/configuration/global-collections.html +248 -19
- data/site-local/configuration/index.html +249 -15
- data/site-local/configuration/loading.html +260 -22
- data/site-local/configuration/mixins.html +252 -17
- data/site-local/configuration/parallel-builds.html +248 -14
- data/site-local/configuration/project-file.html +275 -30
- data/site-local/configuration/reference/cexception.html +255 -20
- data/site-local/configuration/reference/cmock.html +281 -14
- data/site-local/configuration/reference/defines.html +262 -19
- data/site-local/configuration/reference/environment.html +251 -17
- data/site-local/configuration/reference/extension.html +361 -16
- data/site-local/configuration/reference/files.html +262 -14
- data/site-local/configuration/reference/flags.html +270 -19
- data/site-local/configuration/reference/index.html +248 -14
- data/site-local/configuration/reference/libraries.html +248 -14
- data/site-local/configuration/reference/mixins.html +248 -14
- data/site-local/configuration/reference/partials.html +249 -19
- data/site-local/configuration/reference/paths.html +275 -15
- data/site-local/configuration/reference/plugins.html +248 -14
- data/site-local/configuration/reference/project.html +291 -14
- data/site-local/configuration/reference/release-build.html +256 -14
- data/site-local/configuration/reference/test-build.html +290 -24
- data/site-local/configuration/reference/test-runner.html +288 -17
- data/site-local/configuration/reference/tools.html +254 -14
- data/site-local/configuration/reference/unity.html +280 -15
- data/site-local/configuration/which-ceedling.html +248 -14
- data/site-local/development/index.html +254 -14
- data/site-local/development/plugins/configuration.html +269 -17
- data/site-local/development/plugins/index.html +267 -15
- data/site-local/development/plugins/plugin-subclass.html +906 -154
- data/site-local/development/plugins/rake-tasks.html +276 -14
- data/site-local/development/releases.html +4708 -0
- data/site-local/development/workflow.html +1030 -51
- data/site-local/getting-started/builds.html +4607 -0
- data/site-local/getting-started/command-line.html +418 -34
- data/site-local/getting-started/example-projects/cipher-quest.html +248 -14
- data/site-local/getting-started/example-projects/index.html +249 -15
- data/site-local/getting-started/example-projects/temp-sensor.html +248 -14
- data/site-local/getting-started/example-projects/wondrous-forest.html +248 -14
- data/site-local/getting-started/index.html +255 -14
- data/site-local/getting-started/installation.html +258 -22
- data/site-local/getting-started/quick-start.html +251 -15
- data/site-local/help.html +255 -14
- data/site-local/index.html +292 -22
- data/site-local/overview/build-system.html +249 -15
- data/site-local/overview/index.html +248 -14
- data/site-local/overview/test-environments.html +257 -14
- data/site-local/overview/tools-and-frameworks.html +248 -14
- data/site-local/plugins/beep.html +251 -14
- data/site-local/plugins/bullseye/index.html +5079 -0
- data/site-local/plugins/bullseye/licensing.html +4840 -0
- data/site-local/plugins/command-hooks.html +265 -27
- data/site-local/plugins/compile-commands-json-db.html +256 -17
- data/site-local/plugins/cppcheck.html +1081 -262
- data/site-local/plugins/dependencies.html +934 -242
- data/site-local/plugins/fff.html +296 -15
- data/site-local/plugins/gcov/examples.html +251 -14
- data/site-local/plugins/gcov/gcovr.html +567 -65
- data/site-local/plugins/gcov/index.html +251 -14
- data/site-local/plugins/gcov/overview.html +259 -18
- data/site-local/plugins/gcov/reportgenerator.html +386 -38
- data/site-local/plugins/gcov/reporting.html +348 -100
- data/site-local/plugins/gcov/setup.html +253 -15
- data/site-local/plugins/gcov/tool-versions.html +301 -19
- data/site-local/plugins/gcov/troubleshooting.html +273 -36
- data/site-local/plugins/index.html +294 -36
- data/site-local/plugins/module-generator.html +779 -195
- data/site-local/plugins/report-build-warnings-log.html +578 -33
- data/site-local/plugins/report-tests-gtestlike-stdout.html +467 -84
- data/site-local/plugins/report-tests-ide-stdout.html +654 -51
- data/site-local/plugins/report-tests-log-factory.html +337 -70
- data/site-local/plugins/report-tests-pretty-stdout.html +251 -14
- data/site-local/plugins/report-tests-raw-output-log.html +251 -14
- data/site-local/plugins/report-tests-teamcity-stdout.html +251 -14
- data/site-local/plugins/sanitize.html +5332 -0
- data/site-local/plugins/valgrind.html +416 -26
- data/site-local/{plugins/bullseye.html → project/index.html} +297 -217
- data/site-local/project/release-history.html +251 -17
- data/site-local/project/sbom.html +4726 -0
- data/site-local/project/upgrade.html +250 -16
- data/site-local/reference/build-directives.html +257 -14
- data/site-local/reference/command-line.html +373 -16
- data/site-local/reference/environment-vars.html +248 -14
- data/site-local/reference/gcov-plugin.html +492 -18
- data/site-local/reference/global-collections.html +249 -15
- data/site-local/reference/index.html +248 -14
- data/site-local/reference/partials-macros.html +258 -14
- data/site-local/reference/project-configuration.html +248 -14
- data/site-local/sitemap.xml.gz +0 -0
- data/{docs/mkdocs/snapshot/assets → site-local/snapshot/assets/features}/project.yml +4 -1
- data/site-local/snapshot/examples/cipher_quest/index.html +248 -14
- data/site-local/snapshot/examples/temp_sensor/index.html +248 -14
- data/site-local/snapshot/examples/wondrous_forest/index.html +265 -25
- data/site-local/snapshot/plugins/bullseye/config/defaults.yml +24 -0
- data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +182 -0
- data/site-local/snapshot/plugins/gcov/config/defaults.yml +5 -0
- data/site-local/testing-guide/build-directives.html +332 -22
- data/site-local/testing-guide/conventions.html +678 -153
- data/site-local/testing-guide/frameworks.html +248 -14
- data/site-local/testing-guide/index.html +248 -21
- data/site-local/testing-guide/partials/configuration.html +248 -14
- data/site-local/testing-guide/partials/conventions.html +316 -17
- data/site-local/testing-guide/partials/directives.html +456 -48
- data/site-local/testing-guide/partials/example.html +248 -14
- data/site-local/testing-guide/partials/index.html +255 -14
- data/site-local/testing-guide/partials/overview.html +248 -14
- data/site-local/testing-guide/partials/variables.html +248 -14
- data/site-local/testing-guide/test-cases.html +248 -14
- data/site-local/testing-guide/test-sample.html +248 -14
- data/site-local/testing-guide/test-suite-anatomy.html +248 -14
- data/spec/integration/actionator_file_operations_spec.rb +287 -0
- data/spec/integration/analysis_tool_output_spec.rb +204 -0
- data/spec/{units/c_extractor/c_extractor_integration_spec.rb → integration/c_extractor_composition_spec.rb} +196 -17
- data/spec/integration/command_hooks_plugin_spec.rb +152 -0
- data/spec/integration/compile_commands_json_db_spec.rb +76 -0
- data/spec/integration/configurator_pipeline_spec.rb +180 -0
- data/spec/integration/configurator_plugins_spec.rb +122 -0
- data/spec/integration/configurator_validation_spec.rb +98 -0
- data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +396 -0
- data/spec/integration/dependencies/dependency_tracker_core_spec.rb +244 -0
- data/spec/integration/dependencies/dependency_tracker_diagnose_spec.rb +224 -0
- data/spec/integration/dependencies/dependency_tracker_filename_handling_spec.rb +118 -0
- data/spec/integration/dependencies/dependency_tracker_gcc_deps_spec.rb +199 -0
- data/spec/integration/dependencies/dependency_tracker_pruning_spec.rb +167 -0
- data/spec/integration/dependencies_plugin_spec.rb +473 -0
- data/spec/integration/erb_dependency_removed_spec.rb +167 -0
- data/spec/integration/includes_extraction_spec.rb +612 -0
- data/spec/integration/mixin_loading_spec.rb +414 -0
- data/spec/integration/module_generator_spec.rb +436 -0
- data/spec/integration/partials_fallback_preprocessing_spec.rb +316 -0
- data/spec/integration/partials_header_composition_spec.rb +889 -0
- data/spec/integration/partials_module_resolution_spec.rb +372 -0
- data/spec/integration/partials_symbol_linkage_spec.rb +371 -0
- data/spec/integration/preprocessing_transient_io_retry_spec.rb +135 -0
- data/spec/integration/quote_include_isolator_spec.rb +167 -0
- data/spec/integration/report_build_warnings_log_spec.rb +170 -0
- data/spec/integration/report_tests_log_factory_spec.rb +100 -0
- data/spec/integration/sanitizer_exclusions_spec.rb +126 -0
- data/spec/integration/system_harness_sanitizers_spec.rb +104 -0
- data/spec/integration/test_build_parallel_barrier_spec.rb +89 -0
- data/spec/integration/test_executable_manifest_spec.rb +118 -0
- data/spec/integration/test_includes_extractinator_spec.rb +293 -0
- data/spec/integration/tool_executor_spec.rb +224 -0
- data/spec/integration/tool_validator_spec.rb +133 -0
- data/spec/integration/vendor_copy_transient_io_retry_spec.rb +130 -0
- data/spec/manual/stress_test.rb +1 -1
- data/spec/support/config_yaml_helper.rb +17 -0
- data/spec/support/fixtures/sanitizer_reports/clang_asan_heap.txt +45 -0
- data/spec/support/fixtures/sanitizer_reports/clang_ubsan_shift.txt +5 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_heap.txt +47 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_leak.txt +10 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_segv.txt +6 -0
- data/spec/support/fixtures/sanitizer_reports/gcc_ubsan_shift.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__all_pass.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_branches_only.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_functions_only.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__coverage_none.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__empty.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__gcov_context.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__mixed_all.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_matching.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_multiline.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_no_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_failure_nonmatching.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_ignore_no_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__one_ignore_with_message.txt +6 -0
- data/spec/support/fixtures/templates/bullseye__stdout_only.txt +6 -0
- data/spec/support/fixtures/templates/ide__all_pass.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_branches_only.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_functions_only.txt +10 -0
- data/spec/support/fixtures/templates/ide__coverage_none.txt +10 -0
- data/spec/support/fixtures/templates/ide__empty.txt +8 -0
- data/spec/support/fixtures/templates/ide__gcov_context.txt +28 -0
- data/spec/support/fixtures/templates/ide__mixed_all.txt +29 -0
- data/spec/support/fixtures/templates/ide__one_failure_matching.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_failure_multiline.txt +17 -0
- data/spec/support/fixtures/templates/ide__one_failure_no_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_failure_nonmatching.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_ignore_no_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__one_ignore_with_message.txt +15 -0
- data/spec/support/fixtures/templates/ide__stdout_only.txt +16 -0
- data/spec/support/fixtures/templates/pretty__all_pass.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_branches_only.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_functions_only.txt +8 -0
- data/spec/support/fixtures/templates/pretty__coverage_none.txt +8 -0
- data/spec/support/fixtures/templates/pretty__empty.txt +6 -0
- data/spec/support/fixtures/templates/pretty__gcov_context.txt +31 -0
- data/spec/support/fixtures/templates/pretty__mixed_all.txt +35 -0
- data/spec/support/fixtures/templates/pretty__one_failure_matching.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_failure_multiline.txt +17 -0
- data/spec/support/fixtures/templates/pretty__one_failure_no_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_failure_nonmatching.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_ignore_no_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__one_ignore_with_message.txt +15 -0
- data/spec/support/fixtures/templates/pretty__stdout_only.txt +15 -0
- data/spec/support/fixtures/valgrind_reports/sigsegv.log +51 -0
- data/spec/support/fixtures/valgrind_reports/sigsegv.xml +182 -0
- data/spec/support/include_guard_helper.rb +20 -0
- data/spec/support/integration/configurator_integration_helper.rb +159 -0
- data/spec/support/integration/dependency_tracker_integration_helper.rb +136 -0
- data/spec/support/integration/partials_generation_integration_helper.rb +726 -0
- data/spec/support/integration/spec_integration_helper.rb +285 -0
- data/spec/support/integration/test_includes_harness.rb +259 -0
- data/spec/support/integration/tool_executor_integration_helper.rb +55 -0
- data/spec/support/spec_helper.rb +41 -0
- data/spec/support/system/sanitizers/asan_ubsan.yml +82 -0
- data/spec/support/system/sanitizers/asan_ubsan_leaks.yml +57 -0
- data/spec/support/system/simplecov_boot.rb +66 -0
- data/spec/support/system/spec_system_helper.rb +376 -16
- data/spec/support/system/system_context.rb +181 -59
- data/spec/support/template_render_cases.rb +166 -0
- data/spec/system/bracket_path_handling_spec.rb +175 -0
- data/spec/system/build_output_mirroring_spec.rb +89 -0
- data/spec/system/build_recovery_spec.rb +382 -0
- data/spec/system/bullseye_deployment_spec.rb +102 -0
- data/spec/system/cli_surface_spec.rb +245 -0
- data/spec/system/command_hooks_spec.rb +117 -0
- data/spec/system/conditional_include_macro_visibility_spec.rb +32 -124
- data/spec/system/conditional_mock_includes_spec.rb +181 -0
- data/spec/system/cppcheck_deployment_spec.rb +26 -8
- data/spec/system/delta_builds_spec.rb +751 -0
- data/spec/system/deployment_as_gem_spec.rb +7 -0
- data/spec/system/deployment_as_vendor_spec.rb +29 -145
- data/spec/system/dumpconfig_spec.rb +137 -0
- data/spec/system/encoding_stress_spec.rb +7 -4
- data/spec/system/example_cipher_quest_spec.rb +25 -100
- data/spec/system/example_temp_sensor_spec.rb +30 -172
- data/spec/system/example_wondrous_forest_spec.rb +25 -62
- data/spec/system/extension_multiple_values_spec.rb +75 -0
- data/spec/system/files_paths_reporting_spec.rb +154 -0
- data/spec/system/gcov_deployment_spec.rb +72 -3
- data/spec/system/header_include_path_validation_spec.rb +222 -0
- data/spec/system/implicit_source_header_correspondence_disambiguation_spec.rb +100 -0
- data/spec/system/include_path_reconciliation_spec.rb +64 -0
- data/spec/system/mixin_ordering_spec.rb +30 -415
- data/spec/system/mocks_partials_configuration_validation_spec.rb +126 -0
- data/spec/system/parent_directory_reference_spec.rb +114 -0
- data/spec/system/partials_module_disambiguation_spec.rb +143 -0
- data/spec/system/pinned_thread_count_spec.rb +102 -0
- data/spec/system/plugin_delta_builds_spec.rb +179 -0
- data/spec/system/preprocessing_encoding_spec.rb +87 -4
- data/spec/system/preprocessing_fallback_conditionals_spec.rb +19 -25
- data/spec/system/preprocessing_parameterized_tests_spec.rb +2 -2
- data/spec/system/rake_release_task_path_disambiguation_spec.rb +97 -0
- data/spec/system/rake_test_task_path_disambiguation_spec.rb +118 -0
- data/spec/system/report_and_tooling_plugins_spec.rb +327 -0
- data/spec/system/ruby_replacement_spec.rb +1 -1
- data/spec/system/same_named_modules_spec.rb +115 -0
- data/spec/system/sanitize_deployment_spec.rb +64 -0
- data/spec/system/shuffle_tests_spec.rb +139 -0
- data/spec/system/sibling_header_collision_spec.rb +620 -0
- data/spec/system/subdir_include_preservation_spec.rb +63 -0
- data/spec/system/support/bullseye_common_test_cases.rb +369 -0
- data/spec/system/support/bullseye_helpers.rb +70 -0
- data/spec/system/support/common_test_cases.rb +167 -43
- data/spec/system/support/cppcheck_common_test_cases.rb +80 -0
- data/spec/system/support/cppcheck_helpers.rb +10 -8
- data/spec/system/support/gcov_common_test_cases.rb +173 -37
- data/spec/system/support/gcov_helpers.rb +3 -3
- data/spec/system/support/gcov_partials_test_cases.rb +48 -2
- data/spec/system/support/sanitize_common_test_cases.rb +222 -0
- data/spec/system/support/sanitize_helpers.rb +27 -0
- data/spec/system/support/valgrind_common_test_cases.rb +116 -16
- data/spec/system/support/valgrind_helpers.rb +3 -4
- data/spec/system/test_pipeline_stop_points_spec.rb +160 -0
- data/spec/system/test_runner_system_include_spec.rb +19 -41
- data/spec/system/test_source_file_directive_spec.rb +235 -0
- data/spec/system/upgrade_as_vendor_spec.rb +25 -46
- data/spec/system/valgrind_deployment_spec.rb +41 -0
- data/spec/units/batchinator_spec.rb +314 -0
- data/spec/units/bin/actionator_spec.rb +412 -0
- data/spec/units/bin/app_cfg_spec.rb +90 -0
- data/spec/units/bin/cli_handler_spec.rb +204 -0
- data/spec/units/bin/cli_helper_spec.rb +238 -10
- data/spec/units/bin/cli_options_transform_spec.rb +49 -0
- data/spec/units/bin/composinator_spec.rb +236 -0
- data/spec/units/bin/{projectinator_mixin_spec.rb → mixin_resolvinator_spec.rb} +122 -83
- data/spec/units/bin/mixin_standardizer_spec.rb +4 -3
- data/spec/units/bin/mixinator_spec.rb +58 -22
- data/spec/units/bin/path_validator_spec.rb +112 -0
- data/spec/units/bin/projectinator_spec.rb +223 -0
- data/spec/units/bin/rake_patches_spec.rb +52 -0
- data/spec/units/bin/recursive_merger_spec.rb +22 -0
- data/spec/units/bin/versionator_spec.rb +104 -0
- data/spec/units/c_extractor/c_extractor_code_text_spec.rb +4 -4
- data/spec/units/c_extractor/c_extractor_declarations_spec.rb +70 -0
- data/spec/units/c_extractor/c_extractor_functions_spec.rb +75 -1
- data/spec/units/c_extractor/c_extractor_preprocessing_spec.rb +158 -0
- data/spec/units/c_extractor/c_extractor_spec.rb +236 -6
- data/spec/units/ceedling/templateinator_golden_spec.rb +84 -0
- data/spec/units/ceedling/templateinator_spec.rb +188 -0
- data/spec/units/config/configurator_builder_spec.rb +444 -0
- data/spec/units/config/configurator_plugins_spec.rb +160 -0
- data/spec/units/config/configurator_setup_spec.rb +706 -6
- data/spec/units/config/configurator_spec.rb +952 -0
- data/spec/units/config/configurator_validator_spec.rb +259 -0
- data/spec/units/config/line_marker_suppressors_spec.rb +89 -0
- data/spec/units/config_matchinator_spec.rb +103 -0
- data/spec/units/defineinator_spec.rb +158 -0
- data/spec/units/dependencies/dependency_cache_store_spec.rb +364 -0
- data/spec/units/dependencies/dependency_debug_tree_spec.rb +189 -0
- data/spec/units/dependencies/dependency_differ_spec.rb +139 -0
- data/spec/units/dependencies/dependency_hasher_spec.rb +141 -0
- data/spec/units/dependencies/dependency_path_normalizer_spec.rb +111 -0
- data/spec/units/dependencies/dependency_tracker_spec.rb +905 -0
- data/spec/units/dependencies/dependinator_spec.rb +99 -0
- data/spec/units/dependencies/gcc_dependency_parser_spec.rb +152 -0
- data/spec/units/encodinator_spec.rb +92 -0
- data/spec/units/file_finder_helper_spec.rb +99 -15
- data/spec/units/file_finder_spec.rb +495 -0
- data/spec/units/file_path_collection_utils_spec.rb +9 -0
- data/spec/units/file_path_utils_spec.rb +736 -0
- data/spec/units/file_wrapper_spec.rb +447 -0
- data/spec/units/filename_extension_spec.rb +120 -0
- data/spec/units/flaginator_spec.rb +114 -0
- data/spec/units/generators/generator_helper_spec.rb +113 -0
- data/spec/units/generators/generator_mocks_spec.rb +131 -0
- data/spec/units/generators/generator_partials_spec.rb +336 -160
- data/spec/units/generators/generator_spec.rb +317 -0
- data/spec/units/generators/generator_test_results_backtrace_spec.rb +169 -9
- data/spec/units/generators/generator_test_results_sanity_checker_spec.rb +14 -6
- data/spec/units/generators/generator_test_results_spec.rb +65 -8
- data/spec/units/generators/generator_test_runner_spec.rb +1 -1
- data/spec/units/includes/include_factory_spec.rb +53 -0
- data/spec/units/includes/include_pathinator_spec.rb +269 -0
- data/spec/units/includes/include_spec.rb +8 -4
- data/spec/units/includes/includes_spec.rb +326 -18
- data/spec/units/mock_locator_spec.rb +74 -0
- data/spec/units/parsing_parcels_spec.rb +65 -0
- data/spec/units/partials/partializer_config_spec.rb +284 -18
- data/spec/units/partials/partializer_helper_spec.rb +122 -0
- data/spec/units/partials/partializer_spec.rb +346 -71
- data/spec/units/partials/partializer_utils_spec.rb +4 -4
- data/spec/units/partials_manager_spec.rb +539 -0
- data/spec/units/path_matcher_spec.rb +193 -0
- data/spec/units/path_mirror_spec.rb +103 -0
- data/spec/units/plugin_manager_spec.rb +77 -0
- data/spec/units/plugin_reportinator_spec.rb +78 -3
- data/spec/units/plugins/bullseye_spec.rb +1068 -0
- data/spec/units/plugins/command_hooks_spec.rb +157 -0
- data/spec/units/plugins/compile_commands_json_db_spec.rb +145 -0
- data/spec/units/plugins/console_reportinator_spec.rb +370 -0
- data/spec/units/plugins/cppcheck_spec.rb +330 -4
- data/spec/units/plugins/cppunit_tests_reporter_spec.rb +118 -0
- data/spec/units/plugins/dependencies_spec.rb +295 -0
- data/spec/units/plugins/dependency_commands_spec.rb +83 -0
- data/spec/units/plugins/dependency_environment_spec.rb +64 -0
- data/spec/units/plugins/dependency_spec_spec.rb +170 -0
- data/spec/units/plugins/gcov_reportinator_spec.rb +272 -0
- data/spec/units/plugins/gcov_spec.rb +521 -0
- data/spec/units/plugins/gcovr_reportinator_spec.rb +795 -0
- data/spec/units/plugins/gtestlike_report_spec.rb +363 -0
- data/spec/units/plugins/html_tests_reporter_spec.rb +158 -0
- data/spec/units/plugins/ide_report_lines_spec.rb +229 -0
- data/spec/units/plugins/json_tests_reporter_spec.rb +87 -0
- data/spec/units/plugins/junit_tests_reporter_spec.rb +237 -0
- data/spec/units/plugins/module_generator_options_spec.rb +185 -0
- data/spec/units/plugins/module_generator_project_spec.rb +55 -0
- data/spec/units/plugins/module_generator_request_spec.rb +107 -0
- data/spec/units/plugins/module_generator_spec.rb +214 -0
- data/spec/units/plugins/module_generator_test_file_spec.rb +102 -0
- data/spec/units/plugins/module_generator_unity_spec.rb +37 -0
- data/spec/units/plugins/report_build_warnings_log_spec.rb +199 -0
- data/spec/units/plugins/report_log_writer_plugin_spec.rb +94 -0
- data/spec/units/plugins/report_tests_gtestlike_stdout_spec.rb +274 -0
- data/spec/units/plugins/report_tests_ide_stdout_spec.rb +140 -0
- data/spec/units/plugins/report_tests_log_factory_spec.rb +210 -0
- data/spec/units/plugins/report_tests_pretty_stdout_spec.rb +83 -0
- data/spec/units/plugins/report_tests_raw_output_log_spec.rb +98 -0
- data/spec/units/plugins/report_tests_stdout_plugin_spec.rb +145 -0
- data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +121 -0
- data/spec/units/plugins/reportgenerator_reportinator_spec.rb +410 -0
- data/spec/units/plugins/sanitize_config_spec.rb +119 -0
- data/spec/units/plugins/sanitize_findings_spec.rb +69 -0
- data/spec/units/plugins/sanitize_records_spec.rb +114 -0
- data/spec/units/plugins/sanitize_reports_spec.rb +84 -0
- data/spec/units/plugins/sanitize_spec.rb +300 -0
- data/spec/units/plugins/tests_reporter_spec.rb +89 -0
- data/spec/units/plugins/valgrind_spec.rb +560 -0
- data/spec/units/plugins/warning_collector_spec.rb +185 -0
- data/spec/units/plugins/warning_reports_spec.rb +150 -0
- data/spec/units/preprocess/c_comment_scanner_spec.rb +17 -17
- data/spec/units/preprocess/c_preprocessor_conditionals_spec.rb +94 -0
- data/spec/units/preprocess/preprocessinator_bare_includes_extractor_spec.rb +73 -0
- data/spec/units/preprocess/preprocessinator_code_finder_spec.rb +35 -16
- data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +129 -48
- data/spec/units/preprocess/preprocessinator_file_assembler_spec.rb +292 -9
- data/spec/units/preprocess/preprocessinator_includes_handler_spec.rb +294 -16
- data/spec/units/preprocess/preprocessinator_line_marker_includes_extractor_spec.rb +356 -6
- data/spec/units/preprocess/preprocessinator_reconstructor_spec.rb +58 -4
- data/spec/units/preprocess/preprocessinator_spec.rb +693 -5
- data/spec/units/quote_include_isolator_spec.rb +176 -0
- data/spec/units/rake_app/rake_invocation_tracker_spec.rb +94 -0
- data/spec/units/rake_app/rake_task_registry_spec.rb +263 -0
- data/spec/units/rake_app/rake_utils_spec.rb +54 -0
- data/spec/units/rake_app/rake_wrapper_spec.rb +64 -0
- data/spec/units/rake_app/rakefile_component_resolver_spec.rb +182 -0
- data/spec/units/release_build_executor_spec.rb +404 -0
- data/spec/units/release_build_planner_spec.rb +144 -0
- data/spec/units/release_invoker_spec.rb +127 -0
- data/spec/units/reportinator_spec.rb +35 -0
- data/spec/units/ruby_expandinator_spec.rb +36 -0
- data/spec/units/standin_headerinator_spec.rb +168 -0
- data/spec/units/system_wrapper_spec.rb +16 -0
- data/spec/units/test_build_executor_spec.rb +1653 -8
- data/spec/units/test_build_planner_spec.rb +878 -0
- data/spec/units/test_build_setup_spec.rb +583 -0
- data/spec/units/test_context_extractor_spec.rb +51 -3
- data/spec/units/test_file_preprocessinator_spec.rb +206 -0
- data/spec/units/test_includes_extractinator_spec.rb +764 -0
- data/spec/units/test_invoker/objects_wiring_spec.rb +31 -0
- data/spec/units/test_invoker_spec.rb +147 -0
- data/spec/units/test_invoker_types_spec.rb +182 -0
- data/spec/units/test_pipeline_helpers_spec.rb +100 -0
- data/spec/units/test_pipeline_manager_spec.rb +415 -0
- data/spec/units/test_runner_generatinator_spec.rb +215 -0
- data/spec/units/test_runner_manager_spec.rb +70 -0
- data/spec/units/test_search_paths_spec.rb +84 -0
- data/spec/units/test_source_file_directive_resolver_spec.rb +239 -0
- data/spec/units/tool_executor_helper_spec.rb +1 -1
- data/spec/units/tool_executor_spec.rb +571 -2
- data/spec/units/tool_validator_spec.rb +303 -24
- data/spec/units/version_spec.rb +74 -0
- data/spec/units/yaml_wrapper_spec.rb +4 -1
- data/vendor/cmock/docs/CMock_Summary.md +11 -0
- data/vendor/cmock/lib/cmock_config.rb +1 -0
- data/vendor/cmock/lib/cmock_generator.rb +5 -1
- data/vendor/cmock/test/unit/cmock_generator_main_test.rb +31 -0
- data/vendor/cmock/vendor/unity/auto/generate_module.rb +4 -4
- data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +8 -2
- data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +2 -2
- data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +7 -0
- data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +4 -0
- data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
- data/vendor/cmock/vendor/unity/src/unity_internals.h +21 -7
- data/vendor/cmock/vendor/unity/test/Makefile +9 -2
- data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +1 -0
- data/vendor/cmock/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
- data/vendor/cmock/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
- data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
- data/vendor/cmock/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
- data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +78 -0
- data/vendor/cmock/vendor/unity/test/tests/test_unity_test_summary.rb +58 -0
- data/vendor/diy/lib/diy/factory.rb +5 -4
- data/vendor/diy/lib/diy.rb +5 -4
- data/vendor/diy/sample_code/car.rb +5 -4
- data/vendor/diy/sample_code/chassis.rb +5 -4
- data/vendor/diy/sample_code/diy_example.rb +5 -4
- data/vendor/diy/sample_code/engine.rb +5 -4
- data/vendor/diy/sample_code/objects.yml +5 -4
- data/vendor/diy/test/constructor.rb +5 -4
- data/vendor/diy/test/diy_test.rb +5 -4
- data/vendor/diy/test/factory_test.rb +5 -4
- data/vendor/diy/test/files/broken_construction.yml +5 -4
- data/vendor/diy/test/files/cat/cat.rb +5 -4
- data/vendor/diy/test/files/cat/extra_conflict.yml +5 -4
- data/vendor/diy/test/files/cat/heritage.rb +5 -4
- data/vendor/diy/test/files/cat/needs_input.yml +5 -4
- data/vendor/diy/test/files/cat/the_cat_lineage.rb +5 -4
- data/vendor/diy/test/files/dog/dog_model.rb +5 -4
- data/vendor/diy/test/files/dog/dog_presenter.rb +5 -4
- data/vendor/diy/test/files/dog/dog_view.rb +5 -4
- data/vendor/diy/test/files/dog/file_resolver.rb +5 -4
- data/vendor/diy/test/files/dog/other_thing.rb +5 -4
- data/vendor/diy/test/files/dog/simple.yml +5 -4
- data/vendor/diy/test/files/donkey/foo/bar/qux.rb +5 -4
- data/vendor/diy/test/files/donkey/foo.rb +5 -4
- data/vendor/diy/test/files/factory/beef.rb +5 -4
- data/vendor/diy/test/files/factory/dog.rb +5 -4
- data/vendor/diy/test/files/factory/factory.yml +5 -4
- data/vendor/diy/test/files/factory/farm/llama.rb +5 -4
- data/vendor/diy/test/files/factory/farm/pork.rb +5 -4
- data/vendor/diy/test/files/factory/kitten.rb +5 -4
- data/vendor/diy/test/files/fud/objects.yml +5 -4
- data/vendor/diy/test/files/fud/toy.rb +5 -4
- data/vendor/diy/test/files/functions/attached_things_builder.rb +5 -4
- data/vendor/diy/test/files/functions/invalid_method.yml +5 -4
- data/vendor/diy/test/files/functions/method_extractor.rb +5 -4
- data/vendor/diy/test/files/functions/nonsingleton_objects.yml +5 -4
- data/vendor/diy/test/files/functions/objects.yml +5 -4
- data/vendor/diy/test/files/functions/thing.rb +5 -4
- data/vendor/diy/test/files/functions/thing_builder.rb +5 -4
- data/vendor/diy/test/files/functions/things_builder.rb +5 -4
- data/vendor/diy/test/files/gnu/objects.yml +5 -4
- data/vendor/diy/test/files/gnu/thinger.rb +5 -4
- data/vendor/diy/test/files/goat/base.rb +5 -4
- data/vendor/diy/test/files/goat/can.rb +5 -4
- data/vendor/diy/test/files/goat/goat.rb +5 -4
- data/vendor/diy/test/files/goat/objects.yml +5 -4
- data/vendor/diy/test/files/goat/paper.rb +5 -4
- data/vendor/diy/test/files/goat/plane.rb +5 -4
- data/vendor/diy/test/files/goat/shirt.rb +5 -4
- data/vendor/diy/test/files/goat/wings.rb +5 -4
- data/vendor/diy/test/files/horse/holder_thing.rb +5 -4
- data/vendor/diy/test/files/horse/objects.yml +5 -4
- data/vendor/diy/test/files/namespace/animal/bird.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/cat.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +5 -4
- data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +5 -4
- data/vendor/diy/test/files/namespace/bad_module_specified.yml +5 -4
- data/vendor/diy/test/files/namespace/class_name_combine.yml +5 -4
- data/vendor/diy/test/files/namespace/no_module_specified.yml +5 -4
- data/vendor/diy/test/files/namespace/objects.yml +5 -4
- data/vendor/diy/test/files/namespace/road.rb +5 -4
- data/vendor/diy/test/files/namespace/sky.rb +5 -4
- data/vendor/diy/test/files/namespace/subcontext.yml +5 -4
- data/vendor/diy/test/files/non_singleton/air.rb +5 -4
- data/vendor/diy/test/files/non_singleton/fat_cat.rb +5 -4
- data/vendor/diy/test/files/non_singleton/objects.yml +5 -4
- data/vendor/diy/test/files/non_singleton/pig.rb +5 -4
- data/vendor/diy/test/files/non_singleton/thread_spinner.rb +5 -4
- data/vendor/diy/test/files/non_singleton/tick.rb +5 -4
- data/vendor/diy/test/files/non_singleton/yard.rb +5 -4
- data/vendor/diy/test/files/yak/core_model.rb +5 -4
- data/vendor/diy/test/files/yak/core_presenter.rb +5 -4
- data/vendor/diy/test/files/yak/core_view.rb +5 -4
- data/vendor/diy/test/files/yak/data_source.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_model.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_presenter.rb +5 -4
- data/vendor/diy/test/files/yak/fringe_view.rb +5 -4
- data/vendor/diy/test/files/yak/giant_squid.rb +5 -4
- data/vendor/diy/test/files/yak/krill.rb +5 -4
- data/vendor/diy/test/files/yak/my_objects.yml +5 -4
- data/vendor/diy/test/files/yak/sub_sub_context_test.yml +5 -4
- data/vendor/diy/test/test_helper.rb +5 -4
- data/vendor/unity/auto/generate_module.rb +4 -4
- data/vendor/unity/auto/generate_test_runner.rb +5 -1
- data/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
- data/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
- data/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
- data/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
- data/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
- data/vendor/unity/test/tests/test_generate_test_runner.rb +29 -0
- metadata +770 -287
- data/assets/tests_with_fallback_conditionals/src/conditional_module.c +0 -18
- data/bin/actions_wrapper.rb +0 -51
- data/docs/mkdocs/assets/images/ceedling-logo-circle.png +0 -0
- data/docs/mkdocs/assets/images/ceedling.svg +0 -90
- data/docs/mkdocs/assets/images/favicon.png +0 -0
- data/docs/mkdocs/assets/stylesheets/admonitions.css +0 -152
- data/docs/mkdocs/assets/stylesheets/fixes-local.css +0 -15
- data/docs/mkdocs/assets/stylesheets/styling.css +0 -102
- data/docs/mkdocs/configuration/environment-vars.md +0 -14
- data/docs/mkdocs/configuration/global-collections.md +0 -156
- data/docs/mkdocs/configuration/index.md +0 -75
- data/docs/mkdocs/configuration/loading.md +0 -89
- data/docs/mkdocs/configuration/mixins.md +0 -607
- data/docs/mkdocs/configuration/parallel-builds.md +0 -97
- data/docs/mkdocs/configuration/project-file.md +0 -216
- data/docs/mkdocs/configuration/reference/cexception.md +0 -35
- data/docs/mkdocs/configuration/reference/cmock.md +0 -106
- data/docs/mkdocs/configuration/reference/defines.md +0 -352
- data/docs/mkdocs/configuration/reference/environment.md +0 -55
- data/docs/mkdocs/configuration/reference/extension.md +0 -63
- data/docs/mkdocs/configuration/reference/files.md +0 -154
- data/docs/mkdocs/configuration/reference/flags.md +0 -296
- data/docs/mkdocs/configuration/reference/index.md +0 -176
- data/docs/mkdocs/configuration/reference/libraries.md +0 -82
- data/docs/mkdocs/configuration/reference/mixins.md +0 -24
- data/docs/mkdocs/configuration/reference/partials.md +0 -38
- data/docs/mkdocs/configuration/reference/paths.md +0 -276
- data/docs/mkdocs/configuration/reference/plugins.md +0 -60
- data/docs/mkdocs/configuration/reference/project.md +0 -333
- data/docs/mkdocs/configuration/reference/release-build.md +0 -62
- data/docs/mkdocs/configuration/reference/test-build.md +0 -55
- data/docs/mkdocs/configuration/reference/test-runner.md +0 -61
- data/docs/mkdocs/configuration/reference/tools.md +0 -457
- data/docs/mkdocs/configuration/reference/unity.md +0 -49
- data/docs/mkdocs/configuration/which-ceedling.md +0 -77
- data/docs/mkdocs/development/index.md +0 -61
- data/docs/mkdocs/development/plugins/configuration.md +0 -164
- data/docs/mkdocs/development/plugins/index.md +0 -84
- data/docs/mkdocs/development/plugins/plugin-subclass.md +0 -513
- data/docs/mkdocs/development/plugins/rake-tasks.md +0 -54
- data/docs/mkdocs/development/workflow.md +0 -284
- data/docs/mkdocs/getting-started/command-line.md +0 -477
- data/docs/mkdocs/getting-started/example-projects/cipher-quest.md +0 -65
- data/docs/mkdocs/getting-started/example-projects/index.md +0 -49
- data/docs/mkdocs/getting-started/example-projects/temp-sensor.md +0 -60
- data/docs/mkdocs/getting-started/example-projects/wondrous-forest.md +0 -45
- data/docs/mkdocs/getting-started/index.md +0 -41
- data/docs/mkdocs/getting-started/installation.md +0 -179
- data/docs/mkdocs/getting-started/quick-start.md +0 -86
- data/docs/mkdocs/help.md +0 -49
- data/docs/mkdocs/index.md +0 -222
- data/docs/mkdocs/overview/build-system.md +0 -115
- data/docs/mkdocs/overview/index.md +0 -29
- data/docs/mkdocs/overview/test-environments.md +0 -33
- data/docs/mkdocs/overview/tools-and-frameworks.md +0 -115
- data/docs/mkdocs/plugins/beep.md +0 -134
- data/docs/mkdocs/plugins/bullseye.md +0 -83
- data/docs/mkdocs/plugins/command-hooks.md +0 -268
- data/docs/mkdocs/plugins/compile-commands-json-db.md +0 -42
- data/docs/mkdocs/plugins/cppcheck.md +0 -377
- data/docs/mkdocs/plugins/dependencies.md +0 -310
- data/docs/mkdocs/plugins/fff.md +0 -247
- data/docs/mkdocs/plugins/gcov/examples.md +0 -92
- data/docs/mkdocs/plugins/gcov/gcovr.md +0 -526
- data/docs/mkdocs/plugins/gcov/index.md +0 -74
- data/docs/mkdocs/plugins/gcov/overview.md +0 -145
- data/docs/mkdocs/plugins/gcov/reportgenerator.md +0 -246
- data/docs/mkdocs/plugins/gcov/reporting.md +0 -147
- data/docs/mkdocs/plugins/gcov/setup.md +0 -232
- data/docs/mkdocs/plugins/gcov/tool-versions.md +0 -60
- data/docs/mkdocs/plugins/gcov/troubleshooting.md +0 -78
- data/docs/mkdocs/plugins/index.md +0 -261
- data/docs/mkdocs/plugins/module-generator.md +0 -267
- data/docs/mkdocs/plugins/report-build-warnings-log.md +0 -42
- data/docs/mkdocs/plugins/report-tests-gtestlike-stdout.md +0 -98
- data/docs/mkdocs/plugins/report-tests-ide-stdout.md +0 -63
- data/docs/mkdocs/plugins/report-tests-log-factory.md +0 -454
- data/docs/mkdocs/plugins/report-tests-pretty-stdout.md +0 -56
- data/docs/mkdocs/plugins/report-tests-raw-output-log.md +0 -52
- data/docs/mkdocs/plugins/report-tests-teamcity-stdout.md +0 -96
- data/docs/mkdocs/plugins/sample_html_report.png +0 -0
- data/docs/mkdocs/plugins/valgrind.md +0 -198
- data/docs/mkdocs/project/release-history.md +0 -61
- data/docs/mkdocs/project/upgrade.md +0 -85
- data/docs/mkdocs/reference/build-directives.md +0 -37
- data/docs/mkdocs/reference/command-line.md +0 -323
- data/docs/mkdocs/reference/environment-vars.md +0 -60
- data/docs/mkdocs/reference/gcov-plugin.md +0 -600
- data/docs/mkdocs/reference/global-collections.md +0 -160
- data/docs/mkdocs/reference/index.md +0 -65
- data/docs/mkdocs/reference/partials-macros.md +0 -79
- data/docs/mkdocs/reference/project-configuration.md +0 -46
- data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +0 -210
- data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +0 -283
- data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +0 -92
- data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +0 -32
- data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +0 -136
- data/docs/mkdocs/snapshot.yml +0 -20
- data/docs/mkdocs/testing-guide/build-directives.md +0 -153
- data/docs/mkdocs/testing-guide/conventions.md +0 -616
- data/docs/mkdocs/testing-guide/frameworks.md +0 -192
- data/docs/mkdocs/testing-guide/index.md +0 -80
- data/docs/mkdocs/testing-guide/partials/configuration.md +0 -67
- data/docs/mkdocs/testing-guide/partials/conventions.md +0 -68
- data/docs/mkdocs/testing-guide/partials/directives.md +0 -212
- data/docs/mkdocs/testing-guide/partials/example.md +0 -149
- data/docs/mkdocs/testing-guide/partials/index.md +0 -88
- data/docs/mkdocs/testing-guide/partials/overview.md +0 -81
- data/docs/mkdocs/testing-guide/partials/variables.md +0 -244
- data/docs/mkdocs/testing-guide/test-cases.md +0 -194
- data/docs/mkdocs/testing-guide/test-sample.md +0 -94
- data/docs/mkdocs/testing-guide/test-suite-anatomy.md +0 -58
- data/lib/ceedling/cacheinator.rb +0 -53
- data/lib/ceedling/cacheinator_helper.rb +0 -60
- data/lib/ceedling/dependinator.rb +0 -31
- data/lib/ceedling/makefile.rb +0 -52
- data/lib/ceedling/release_invoker.rb +0 -112
- data/lib/ceedling/rules_release.rake +0 -109
- data/lib/ceedling/rules_tests.rake +0 -40
- data/lib/ceedling/tasks_release.rake +0 -36
- data/plugins/fff/vendor/fff/Makefile +0 -10
- data/plugins/fff/vendor/fff/buildandtest +0 -15
- data/plugins/fff/vendor/fff/examples/Makefile +0 -7
- data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +0 -64
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +0 -32
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +0 -21
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +0 -58
- data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +0 -70
- data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +0 -25
- data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +0 -23
- data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +0 -27
- data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +0 -25
- data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +0 -67
- data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +0 -31
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +0 -56
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +0 -22
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +0 -191
- data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +0 -144
- data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +0 -42
- data/plugins/fff/vendor/fff/gtest/Makefile +0 -22
- data/plugins/fff/vendor/fff/gtest/gtest-all.cc +0 -9118
- data/plugins/fff/vendor/fff/gtest/gtest-main.cc +0 -6
- data/plugins/fff/vendor/fff/gtest/gtest.h +0 -19547
- data/plugins/fff/vendor/fff/test/Makefile +0 -81
- data/plugins/fff/vendor/fff/test/c_test_framework.h +0 -25
- data/plugins/fff/vendor/fff/test/fff_test_c.c +0 -116
- data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +0 -53
- data/plugins/fff/vendor/fff/test/fff_test_global_c.c +0 -84
- data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +0 -31
- data/plugins/fff/vendor/fff/test/global_fakes.c +0 -21
- data/plugins/fff/vendor/fff/test/global_fakes.h +0 -47
- data/plugins/fff/vendor/fff/test/test_cases.include +0 -276
- data/plugins/report_tests_gtestlike_stdout/assets/template.erb +0 -83
- data/site-local/snapshot/assets/project.yml +0 -404
- data/spec/system/partials_types_header_spec.rb +0 -166
- data/spec/units/configurator_spec.rb +0 -232
- /data/assets/{ceedling → features/ceedling} +0 -0
- /data/assets/{ceedling.cmd → features/ceedling.cmd} +0 -0
- /data/assets/{default_gitignore → features/default_gitignore} +0 -0
- /data/assets/{broken_uncovered_file.c → fixtures/broken_uncovered_file.c} +0 -0
- /data/assets/{example_file.c → fixtures/example_file.c} +0 -0
- /data/assets/{example_file.h → fixtures/example_file.h} +0 -0
- /data/assets/{example_file_call.c → fixtures/example_file_call.c} +0 -0
- /data/assets/{example_file_call.h → fixtures/example_file_call.h} +0 -0
- /data/assets/{example_file_with_statics.c → fixtures/example_file_with_statics.c} +0 -0
- /data/assets/{example_file_with_stdio.c → fixtures/example_file_with_stdio.c} +0 -0
- /data/assets/{example_file_with_stdio.h → fixtures/example_file_with_stdio.h} +0 -0
- /data/assets/{fake_crash_test_fixture.rb → fixtures/fake_crash_test_fixture.rb} +0 -0
- /data/assets/{partial_all_module.h → fixtures/partial_all_module.h} +0 -0
- /data/assets/{run_with_ubsan.rb → fixtures/run_with_ubsan.rb} +0 -0
- /data/assets/{same_dir_pairing_module.c → fixtures/same_dir_pairing_module.c} +0 -0
- /data/assets/{same_dir_pairing_module.h → fixtures/same_dir_pairing_module.h} +0 -0
- /data/assets/{same_dir_pairing_module_func.h → fixtures/same_dir_pairing_module_func.h} +0 -0
- /data/assets/{same_dir_pairing_other.c → fixtures/same_dir_pairing_other.c} +0 -0
- /data/assets/{same_dir_pairing_other.h → fixtures/same_dir_pairing_other.h} +0 -0
- /data/assets/{test_example_file.c → fixtures/test_example_file.c} +0 -0
- /data/assets/{test_example_file_2.c → fixtures/test_example_file_2.c} +0 -0
- /data/assets/{test_example_file_source_include.c → fixtures/test_example_file_source_include.c} +0 -0
- /data/assets/{test_example_file_success.c → fixtures/test_example_file_success.c} +0 -0
- /data/assets/{test_example_file_unity_printf.c → fixtures/test_example_file_unity_printf.c} +0 -0
- /data/assets/{test_example_file_verbose.c → fixtures/test_example_file_verbose.c} +0 -0
- /data/assets/{test_example_file_with_mock.c → fixtures/test_example_file_with_mock.c} +0 -0
- /data/assets/{test_example_file_with_stdio.c → fixtures/test_example_file_with_stdio.c} +0 -0
- /data/assets/{test_example_with_parameterized_tests.c → fixtures/test_example_with_parameterized_tests.c} +0 -0
- /data/assets/{test_partial_all_module.c → fixtures/test_partial_all_module.c} +0 -0
- /data/assets/{test_same_dir_pairing.c → fixtures/test_same_dir_pairing.c} +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_config.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/local_flag_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_wrapper.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/project_flag_extra.h +0 -0
- /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.h +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware.c +0 -0
- /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware_special.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.h +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder.c +0 -0
- /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder_partial.c +0 -0
- /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/conditional_module.h +0 -0
- /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/optional_dep.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.h +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_blanks.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_counter.c +0 -0
- /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_decorators.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorA.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorB.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorC.h +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareA.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareB.c +0 -0
- /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareC.c +0 -0
- /data/assets/{uncovered_example_file.c → fixtures/uncovered_example_file.c} +0 -0
- /data/plugins/bullseye/assets/{template.erb → coverage.template} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# The Dependency-Tracking Subsystem
|
|
2
|
+
|
|
3
|
+
This subsystem answers one question for any expensive step in either the test or release pipeline: has anything this target depends on changed since it last built successfully? It answers using content hashes rather than timestamps, so neither pipeline ever duplicates work that doesn't need to be done.
|
|
4
|
+
|
|
5
|
+
It is not itself a pipeline with sequential stages the way `test_invoker`/`release_invoker` are. It's a service both pipelines call into, over and over, as a pure oracle. It never decides *when* to run a build step or *what order* steps happen in -- that's each pipeline's own stage list -- it only answers, at the moment a step is about to run, whether that build step actually needs to run.
|
|
6
|
+
|
|
7
|
+
## The subsystem's shape
|
|
8
|
+
|
|
9
|
+
Two classes matter most, and everything else exists to serve them:
|
|
10
|
+
|
|
11
|
+
- **`Dependinator`** is the thin, Ceedling-specific facade every pipeline actually talks to. Every method it has except one is a one-line passthrough to `DependencyTracker` below; what it actually owns is the convention for where a given pipeline's cache file lives on disk, keyed by a symbolic identifier (`:test`, `:release`, or a plugin's own symbol), and the vocabulary translation at `flush` time from the tracker's own `prune:` parameter to the pipeline-facing `refresh_dependencies:` (see below). Its whole reason for existing is so pipeline code speaks in build verbs -- register this, ask if that's stale, mark this fresh -- and never has to know anything about cache file paths or tracker internals.
|
|
12
|
+
- **`DependencyTracker`** is the actual engine, and it's deliberately generic and application-agnostic -- nothing in it knows what a "test" or a "release" is. It holds this run's registrations in memory and a loaded cache of the previous run's hashes, and its whole job is answering staleness queries against the two.
|
|
13
|
+
|
|
14
|
+
`DependencyTracker`, in turn, composes six narrowly-scoped collaborators, each doing exactly one job and nothing else. Four serve every run:
|
|
15
|
+
|
|
16
|
+
- `DependencyHasher` decides what makes two things count as "the same."
|
|
17
|
+
- `DependencyPathNormalizer` decides what makes two spellings of a path count as "the same target."
|
|
18
|
+
- `DependencyCacheStore` owns the on-disk cache file itself.
|
|
19
|
+
- `GccDependencyParser` turns a compiler's own dependency output into something registerable.
|
|
20
|
+
|
|
21
|
+
The other two, `DependencyDebugTree` and `DependencyDiffer`, serve only the troubleshooting aid described last. The sections below cover each in turn.
|
|
22
|
+
|
|
23
|
+
## The `register` → `stale?` → `mark_fresh` idiom
|
|
24
|
+
|
|
25
|
+
Every call site in both pipelines, regardless of what expensive thing it's guarding -- a preprocessor subprocess, a mock generation, a real compiler or linker invocation -- follows the same three-part shape. `register` tells the tracker what a target depends on: its antecedent files, and a `meta` value carrying anything else that should count toward staleness even though it isn't a file at all -- compile flags, `-D` defines, search paths, a toolchain version string, a coverage-on-or-off flag. An object file's target is the `.o` itself; its files are its source plus whatever headers it actually pulled in; its meta is the flags and defines that, if they change, should force a recompile even though the source file itself didn't change a byte.
|
|
26
|
+
|
|
27
|
+
`register` is additive on purpose. Calling it more than once for the same target unions the file lists and merges the meta rather than replacing what came before, so a target's dependencies can be built up incrementally across more than one call site without either caller needing full knowledge of what the other already supplied. This is exactly what lets a step register its source file and known flags in one call, then separately register the dependencies its tool discovered, described next.
|
|
28
|
+
|
|
29
|
+
### Dependencies discovered by the tool
|
|
30
|
+
|
|
31
|
+
A step can't know every file it depends on until its tool has run, since the headers a C file reaches depend on its `#include`s, its defines, and its search paths. So a step registers the files its *previous* run discovered before asking whether it is stale, then registers what its new run discovered before marking it fresh. A file the previous run read that has since changed makes the step stale. A newly reached file is recorded once the step reruns.
|
|
32
|
+
|
|
33
|
+
Two sources supply these files:
|
|
34
|
+
|
|
35
|
+
- **A compile's `.d` file.** `-MMD -MF` writes gcc's own dependency output, in Makefile dialect, and `register_gcc_deps_file` (or `register_gcc_deps_string`, for content already in hand) parses it with `GccDependencyParser` and `register`s each target it describes with that target's dependency list. A single `.d` file can describe more than one target at once; it's a small manifest, not just one file's dependency list.
|
|
36
|
+
- **A preprocessing run's line markers.** Two stages of the test pipeline preprocess each test file. Stage 4 runs it with `-fdirectives-only`, following its `#include`s, including headers a mock stand-in includes. Stage 11 fully expands it, reading every header it reaches. Each output's line markers name every file it entered. The pipeline registers the project files among them (`Preprocessinator#preprocessed_dependencies`), so editing a header the test reaches reruns the step. Such a header's macro can decide which mocks the test needs (stage 4) or which test cases it has (stage 11). System headers are left out. So are generated files below the build root, such as stand-ins and the mocks that replace them, which derive from project files and would only ever look changed.
|
|
37
|
+
|
|
38
|
+
### Fresh, stale, and invalidated
|
|
39
|
+
|
|
40
|
+
Once a target's inputs are registered, `stale?` is a pure question with no side effects, and `mark_fresh` is the write that happens after a real (re)build succeeds, recording new hashes for the target itself, its meta, and every currently-existing dependency. A dependency that's gone missing is simply left out of what gets recorded -- `stale?` already treats a missing dependency as stale on its own, so there's nothing to gain by recording anything else about it. `invalidate` is the explicit override: it drops a target's cache entry outright, so its next `stale?` answers true whatever the hashes say, while leaving this run's registrations alone.
|
|
41
|
+
|
|
42
|
+
Some steps also produce a file beside their target that a later run trusts, such as a test's cached results or a test file's cached build directives. These are a target's `outputs`, registered after the step produces them and before `mark_fresh`, which records their hashes in the target's cache entry. A fresh target vouches for those outputs: `stale?` reads them from the cache entry, not this run's registrations, and treats the target as stale when any one is missing or altered. Damage to a trusted artifact then costs one rerun of the step that wrote it. Throughout, only a regular file counts as present. A directory named as a dependency, as a truncated `.d` file can do, reads as missing rather than being hashed.
|
|
43
|
+
|
|
44
|
+
## What makes two things "the same"
|
|
45
|
+
|
|
46
|
+
Two decisions make this whole scheme trustworthy rather than merely convenient, and both trade a little efficiency for a lot of certainty.
|
|
47
|
+
|
|
48
|
+
`DependencyHasher` hashes a file's exact on-disk bytes, whitespace included, with no format-aware normalization at all. Whitespace isn't reliably cosmetic: it's syntactically meaningful in YAML, and it can even change whether a C macro's line continuation is recognized. The two ways a hash-based staleness check can be wrong aren't equally bad, either. Reporting something stale when it isn't just costs a wasted rebuild. Reporting it fresh when it isn't means shipping a build that silently doesn't reflect its own source -- exactly the failure this whole subsystem exists to prevent. The same hasher also canonicalizes a `meta` value before hashing it. Hash-key order and Symbol-vs-String keys never matter as a result, while array element order is still preserved, since the order of a flags or defines list can itself be meaningful.
|
|
49
|
+
|
|
50
|
+
`DependencyPathNormalizer` solves a narrower but equally important problem. It resolves a path to its real, on-disk casing before that path is ever used as a cache key. A `#include "Foo.h"` written one way and a file that actually exists on disk as `foo.h` can then never be mistaken for two different targets -- nor can the same real file assembled from project configuration two different ways.
|
|
51
|
+
|
|
52
|
+
## The on-disk cache
|
|
53
|
+
|
|
54
|
+
Each pipeline identifier gets exactly one JSON cache file of its own, never shared with any other identifier. Test and release builds each get their own, and a plugin introducing a third pipeline would get a third, just by choosing its own identifier. This isn't incidental. It's what makes the pruning behavior described below safe at all -- a shared cache would mean a full test run's prune could silently evict every cached release entry along with it.
|
|
55
|
+
|
|
56
|
+
Loading that cache is deliberately forgiving in one direction and strict in another. Any structural surprise in the file as a whole degrades the entire store to empty rather than raising. A missing cache, malformed cache, or incompatible version simply triggers a full rebuild instead of a hard failure. A single malformed *entry* within an otherwise-good file, similarly, only drops that one entry (i.e. requires a rebuild step). On every load, entries whose target has since been deleted from disk are pruned, automatically and unconditionally. This pruning is always safe, even during a partial run that only touches a handful of targets, because it only ever removes an entry once its target is confirmed gone from disk -- never merely unregistered this run. That's exactly what distinguishes it from the opt-in pruning described next. Persisting the cache back out is done via a write-to-temp-file-then-rename, so a reader can never observe a half-written cache.
|
|
57
|
+
|
|
58
|
+
## `refresh_dependencies`: the special feature
|
|
59
|
+
|
|
60
|
+
A normal `flush` just persists whatever this run registered and learned. Passing `refresh_dependencies: true` additionally drops every cache entry whose target was *not* registered at some point during this run, before persisting. In effect, this treats this run's registrations as the complete, authoritative set of everything that should still have a cache entry at all. That's exactly correct for a run that's guaranteed to have touched every target that matters, such as a full `test:all` or a full release build. It's exactly wrong for anything less than that. A single test file, `test:pattern`, `test:path`, or the ad hoc single-file `release:compile:`/`release:assemble:` tasks would each, if this were set true, silently wipe out cache entries for every target the partial run simply didn't happen to touch -- forcing an unnecessary full rebuild on the next real run. Both pipelines are careful to set it only when they can actually make that guarantee.
|
|
61
|
+
|
|
62
|
+
## Debugging a stale/fresh surprise
|
|
63
|
+
|
|
64
|
+
Separately from anything either pipeline does on a normal run, this subsystem carries an opt-in troubleshooting aid for a human trying to understand *why* something did or didn't rebuild. Setting the `CEEDLING_DEP_DEBUG` developer-only environment variable turns on a tiered snapshot mechanism, off by default. `CEEDLING_DEP_DEBUG=meta` captures just the canonicalized meta a target was judged against. `CEEDLING_DEP_DEBUG=full` additionally captures the actual content of the target and its dependencies at the moment they were last marked fresh. Both tiers write into a human-readable file tree alongside the cache, capped in size per file so one enormous generated header can't silently balloon that tree.
|
|
65
|
+
|
|
66
|
+
Those snapshots exist to back one thing: `DependencyTracker#diagnose`, an always-available "explain yourself" query that reports which of a target's self-hash, meta-hash, dependency hashes, or output hashes changed. `diagnose` runs regardless of whether `CEEDLING_DEP_DEBUG` is set. Without a snapshot to compare against, it can still report *that* a given hash changed, but not *what* changed. With one available, from a run where the matching tier was active, it produces an actual before/after diff instead.
|
|
67
|
+
|
|
68
|
+
`DependencyDebugTree` writes and reads those snapshots, and `DependencyDiffer` turns a snapshot and the live content into that diff. The differ uses the `diff-lcs` gem, a development-only dependency that an installed release gem does not require. Without it, the explanation degrades to a plain before/after dump rather than failing.
|
|
69
|
+
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
require 'json'
|
|
9
|
+
require 'ceedling/constants'
|
|
10
|
+
require 'ceedling/dependencies/dependency_hasher'
|
|
11
|
+
|
|
12
|
+
# Loads, validates, and persists DependencyTracker's on-disk cache file.
|
|
13
|
+
#
|
|
14
|
+
# The persisted shape is a single JSON object:
|
|
15
|
+
# {
|
|
16
|
+
# "schema_version": 1,
|
|
17
|
+
# "hash_algorithm": "sha256",
|
|
18
|
+
# "entries": {
|
|
19
|
+
# "<target path>": {
|
|
20
|
+
# "self_hash": "<hex digest>",
|
|
21
|
+
# "meta_hash": "<hex digest>" | null,
|
|
22
|
+
# "deps": { "<dep path>": "<hex digest>", ... },
|
|
23
|
+
# "outputs": { "<output path>": "<hex digest>", ... } # only when present
|
|
24
|
+
# },
|
|
25
|
+
# ...
|
|
26
|
+
# }
|
|
27
|
+
# }
|
|
28
|
+
#
|
|
29
|
+
# Loading never raises: a cache file that is missing, unreadable, malformed
|
|
30
|
+
# JSON, structurally wrong, schema-mismatched, or hand-edited into garbage is
|
|
31
|
+
# all treated as "cache absent" (an empty store, i.e. a full rebuild) --
|
|
32
|
+
# reading a stale/foreign/corrupt cache file is a routine, expected outcome
|
|
33
|
+
# (another Ceedling version, an interrupted write, manual editing), not an
|
|
34
|
+
# exceptional one, and misinterpreting an ambiguous cache as valid risks
|
|
35
|
+
# answering `stale?` *incorrectly* rather than merely rebuilding more than
|
|
36
|
+
# strictly necessary.
|
|
37
|
+
#
|
|
38
|
+
# A single corrupt *entry* does not invalidate the whole cache, though: only
|
|
39
|
+
# that one entry is dropped (that one target is simply treated as stale),
|
|
40
|
+
# since a schema mismatch calls every entry's shape into question but one
|
|
41
|
+
# malformed entry very likely reflects isolated damage.
|
|
42
|
+
#
|
|
43
|
+
# Entry pruning: an entry whose target no longer exists on disk (a deleted
|
|
44
|
+
# or renamed source/object file) is dropped silently on load -- this is
|
|
45
|
+
# routine build-tree drift, not corruption, so unlike a malformed entry it
|
|
46
|
+
# is not logged as a warning. This is a conservative, always-safe prune:
|
|
47
|
+
# it only ever removes entries for targets that are provably gone, so it
|
|
48
|
+
# cannot misfire under a partial build (`ceedling test:some_file.c`) the
|
|
49
|
+
# way pruning based on "was this target registered this run" could -- a
|
|
50
|
+
# target simply not touched by a partial build still exists on disk and so
|
|
51
|
+
# is never pruned here. Broader pruning ("no longer part of the build, but
|
|
52
|
+
# still present on disk") is deliberately not attempted at load time, since
|
|
53
|
+
# that requires knowing the current build's full target manifest -- see
|
|
54
|
+
# DependencyTracker#flush's `prune:` option, which the *caller* opts into
|
|
55
|
+
# only when it knows a run's registrations were comprehensive.
|
|
56
|
+
class DependencyCacheStore
|
|
57
|
+
|
|
58
|
+
CACHE_SCHEMA_VERSION = 1 unless const_defined?(:CACHE_SCHEMA_VERSION, false)
|
|
59
|
+
|
|
60
|
+
constructor :file_wrapper, :loginator
|
|
61
|
+
|
|
62
|
+
# Loads and validates `store_path`, returning
|
|
63
|
+
# `{ 'schema_version', 'hash_algorithm', 'entries', 'pruned' }`. `entries`
|
|
64
|
+
# is always a Hash of target path => entry Hash, with any invalid or
|
|
65
|
+
# deleted-target entries dropped. `pruned` is the list of target paths
|
|
66
|
+
# dropped this load (malformed or deleted) -- callers use it to also clean
|
|
67
|
+
# up any DependencyDebugTree data for those same targets, so the debug
|
|
68
|
+
# tree doesn't outlive the cache entries it exists to explain.
|
|
69
|
+
def load(store_path)
|
|
70
|
+
return empty_store unless @file_wrapper.exist?( store_path )
|
|
71
|
+
|
|
72
|
+
raw = @file_wrapper.read( store_path )
|
|
73
|
+
parsed = JSON.parse( raw )
|
|
74
|
+
|
|
75
|
+
return degrade( store_path, "does not contain a JSON object" ) unless parsed.is_a?( Hash )
|
|
76
|
+
return degrade( store_path, "has an incompatible or missing schema_version" ) unless parsed['schema_version'] == CACHE_SCHEMA_VERSION
|
|
77
|
+
return degrade( store_path, "has an incompatible or missing hash_algorithm" ) unless parsed['hash_algorithm'] == DependencyHasher::HASH_ALGORITHM
|
|
78
|
+
return degrade( store_path, "is missing its entries object" ) unless parsed['entries'].is_a?( Hash )
|
|
79
|
+
|
|
80
|
+
valid_entries = {}
|
|
81
|
+
pruned = []
|
|
82
|
+
parsed['entries'].each do |target, entry|
|
|
83
|
+
if !valid_entry?( entry )
|
|
84
|
+
@loginator.log(
|
|
85
|
+
"Dependency cache entry for '#{target}' in #{store_path} is malformed -- dropping just that entry.",
|
|
86
|
+
Verbosity::COMPLAIN, LogLabels::WARNING
|
|
87
|
+
)
|
|
88
|
+
pruned << target
|
|
89
|
+
elsif !@file_wrapper.exist?( target )
|
|
90
|
+
@loginator.log(
|
|
91
|
+
"Dependency cache entry for '#{target}' in #{store_path} no longer exists on disk -- pruning it.",
|
|
92
|
+
Verbosity::OBNOXIOUS, LogLabels::AUTO
|
|
93
|
+
)
|
|
94
|
+
pruned << target
|
|
95
|
+
else
|
|
96
|
+
valid_entries[target] = entry
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
{
|
|
101
|
+
'schema_version' => CACHE_SCHEMA_VERSION,
|
|
102
|
+
'hash_algorithm' => DependencyHasher::HASH_ALGORITHM,
|
|
103
|
+
'entries' => valid_entries,
|
|
104
|
+
'pruned' => pruned
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
rescue JSON::ParserError => e
|
|
108
|
+
degrade( store_path, "is not valid JSON (#{e.message})" )
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Persists `entries` (a Hash of target path => entry Hash) to `store_path`.
|
|
112
|
+
# Writes to a temp file in the same directory and renames into place so a
|
|
113
|
+
# reader never observes a partially-written cache file, even if two
|
|
114
|
+
# Ceedling invocations somehow raced on the same project.
|
|
115
|
+
def persist(store_path, entries)
|
|
116
|
+
@file_wrapper.mkdir( @file_wrapper.dirname( store_path ) )
|
|
117
|
+
|
|
118
|
+
payload = {
|
|
119
|
+
'schema_version' => CACHE_SCHEMA_VERSION,
|
|
120
|
+
'hash_algorithm' => DependencyHasher::HASH_ALGORITHM,
|
|
121
|
+
'entries' => entries
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
tmp_path = "#{store_path}.tmp.#{Process.pid}"
|
|
125
|
+
@file_wrapper.write( tmp_path, JSON.pretty_generate( payload ) )
|
|
126
|
+
@file_wrapper.mv( tmp_path, store_path )
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
### Private ###
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
def empty_store
|
|
133
|
+
{ 'schema_version' => CACHE_SCHEMA_VERSION, 'hash_algorithm' => DependencyHasher::HASH_ALGORITHM, 'entries' => {}, 'pruned' => [] }
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def degrade(store_path, reason)
|
|
137
|
+
@loginator.log(
|
|
138
|
+
"Dependency cache #{store_path} #{reason} -- treating it as absent (full rebuild for tracked targets).",
|
|
139
|
+
Verbosity::COMPLAIN, LogLabels::WARNING
|
|
140
|
+
)
|
|
141
|
+
empty_store
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def valid_entry?(entry)
|
|
145
|
+
return false unless entry.is_a?( Hash )
|
|
146
|
+
return false unless valid_digest?( entry['self_hash'] )
|
|
147
|
+
return false unless entry['meta_hash'].nil? || valid_digest?( entry['meta_hash'] )
|
|
148
|
+
return false unless valid_digest_map?( entry['deps'] )
|
|
149
|
+
entry['outputs'].nil? || valid_digest_map?( entry['outputs'] )
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def valid_digest_map?(map)
|
|
153
|
+
map.is_a?( Hash ) && map.all? { |path, digest| path.is_a?( String ) && valid_digest?( digest ) }
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def valid_digest?(value)
|
|
157
|
+
value.is_a?( String ) && value.match?( DependencyHasher::DIGEST_RE )
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
require 'yaml'
|
|
9
|
+
require 'time'
|
|
10
|
+
require 'ceedling/exceptions'
|
|
11
|
+
|
|
12
|
+
# Manages DependencyTracker's on-disk debug tree -- a directory, separate
|
|
13
|
+
# from the single hash-only JSON cache file, that exists only when a debug
|
|
14
|
+
# tier is active (or has been at some point) and mirrors every monitored
|
|
15
|
+
# real path (targets and dependencies alike) as its own nested directory,
|
|
16
|
+
# keyed purely by that path:
|
|
17
|
+
#
|
|
18
|
+
# <debug_root>/Users/mkarlesky/project/build/test/out/foo.o/
|
|
19
|
+
# snapshot.yml -- captured at mark_fresh time (see #write_snapshot)
|
|
20
|
+
# diagnosis.yml -- written by DependencyTracker#diagnose, target paths only
|
|
21
|
+
#
|
|
22
|
+
# A path is mirrored by stripping any leading slash and any Windows drive
|
|
23
|
+
# letter's colon, so it reconstructs as a relative directory tree under
|
|
24
|
+
# `debug_root` without colliding with `debug_root`'s own path syntax.
|
|
25
|
+
#
|
|
26
|
+
# YAML (not JSON) specifically because this tree exists for a human to
|
|
27
|
+
# directly browse and read, not for the tracker to parse back at speed --
|
|
28
|
+
# block scalars make multi-line diffs and captured content vastly more
|
|
29
|
+
# readable than escaped JSON strings would.
|
|
30
|
+
class DependencyDebugTree
|
|
31
|
+
|
|
32
|
+
SNAPSHOT_FILENAME = 'snapshot.yml' unless const_defined?(:SNAPSHOT_FILENAME, false)
|
|
33
|
+
DIAGNOSIS_FILENAME = 'diagnosis.yml' unless const_defined?(:DIAGNOSIS_FILENAME, false)
|
|
34
|
+
|
|
35
|
+
constructor :file_wrapper, :yaml_wrapper
|
|
36
|
+
|
|
37
|
+
# Writes a snapshot for `path` (a target or a dependency) under
|
|
38
|
+
# `debug_root`. `hash` is always recorded; `meta` (target-only; a
|
|
39
|
+
# dependency has no meta of its own) and content-capture keywords
|
|
40
|
+
# (`content:`, or `truncated:`/`size:` when content exceeded the capture
|
|
41
|
+
# size cap -- see DependencyTracker::DEBUG_FULL_CAPTURE_SIZE_CAP) are
|
|
42
|
+
# included only when the caller supplies them, so a :meta-tier snapshot
|
|
43
|
+
# simply omits content entirely rather than recording it as empty/nil.
|
|
44
|
+
def write_snapshot(debug_root, path, hash:, meta: nil, content: nil, truncated: false, size: nil)
|
|
45
|
+
snapshot = { 'path' => path, 'captured_at' => timestamp(), 'hash' => hash }
|
|
46
|
+
snapshot['meta'] = meta unless meta.nil?
|
|
47
|
+
snapshot['content'] = content unless content.nil?
|
|
48
|
+
if truncated
|
|
49
|
+
snapshot['truncated'] = true
|
|
50
|
+
snapshot['size'] = size
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
write_yaml( File.join( path_dir( debug_root, path ), SNAPSHOT_FILENAME ), snapshot )
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Reads back a previously-written snapshot for `path`, or nil if none
|
|
57
|
+
# exists, is unreadable, or fails to parse -- callers treat a nil
|
|
58
|
+
# snapshot as "no baseline available to diff against," never as an error.
|
|
59
|
+
def read_snapshot(debug_root, path)
|
|
60
|
+
read_yaml( File.join( path_dir( debug_root, path ), SNAPSHOT_FILENAME ) )
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Writes a target's diagnosis (see DependencyTracker#diagnose) under
|
|
64
|
+
# `debug_root`.
|
|
65
|
+
def write_diagnosis(debug_root, target, diagnosis)
|
|
66
|
+
write_yaml( File.join( path_dir( debug_root, target ), DIAGNOSIS_FILENAME ), diagnosis )
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Removes `path`'s entire debug directory (snapshot, diagnosis, everything
|
|
70
|
+
# under it), if any exists. Called when the corresponding cache entry is
|
|
71
|
+
# pruned (either DependencyCacheStore's load-time existence pruning, or
|
|
72
|
+
# DependencyTracker#flush(prune: true)), so the debug tree doesn't outlive
|
|
73
|
+
# the cache data it exists to explain. Safe to call for a path that was
|
|
74
|
+
# never captured at all.
|
|
75
|
+
def prune(debug_root, path)
|
|
76
|
+
dir = path_dir( debug_root, path )
|
|
77
|
+
@file_wrapper.rm_rf( dir ) if @file_wrapper.exist?( dir )
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# The exact file path `write_snapshot`/`read_snapshot` use for `path`, and
|
|
81
|
+
# likewise for `write_diagnosis`. Public so callers that need to point a
|
|
82
|
+
# human at the right file (or verify one exists, e.g. in specs) use the
|
|
83
|
+
# same path-mirroring logic this class does internally, rather than an
|
|
84
|
+
# independent reimplementation that can silently drift out of sync with
|
|
85
|
+
# it -- notably around the Windows drive-letter handling in `mirror`.
|
|
86
|
+
def snapshot_file(debug_root, path)
|
|
87
|
+
File.join( path_dir( debug_root, path ), SNAPSHOT_FILENAME )
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def diagnosis_file(debug_root, target)
|
|
91
|
+
File.join( path_dir( debug_root, target ), DIAGNOSIS_FILENAME )
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
### Private ###
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def path_dir(debug_root, path)
|
|
98
|
+
File.join( debug_root, mirror( path ) )
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def mirror(path)
|
|
102
|
+
normalized = path.to_s.tr( '\\', '/' )
|
|
103
|
+
normalized = normalized.sub( /\A([A-Za-z]):/, '\1' ) # C:/foo -> C/foo (Windows drive letter)
|
|
104
|
+
normalized.sub( /\A\/+/, '' ) # /foo/bar -> foo/bar (relative under debug_root)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def timestamp
|
|
108
|
+
Time.now.utc.iso8601
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def write_yaml(filepath, structure)
|
|
112
|
+
@file_wrapper.mkdir( @file_wrapper.dirname( filepath ) )
|
|
113
|
+
@file_wrapper.write( filepath, YAML.dump( structure ) )
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Reads and parses `filepath` via the injected FileWrapper (all disk I/O
|
|
117
|
+
# stays mockable) and YamlWrapper#load_string (the same Psych-version-safe
|
|
118
|
+
# parsing used for the main config/cache YAML elsewhere in Ceedling) --
|
|
119
|
+
# but degrades to nil rather than raising, since a missing, unreadable, or
|
|
120
|
+
# corrupt debug artifact is exactly the kind of "nothing to work with"
|
|
121
|
+
# condition callers already handle gracefully (no snapshot captured yet).
|
|
122
|
+
def read_yaml(filepath)
|
|
123
|
+
return nil unless @file_wrapper.exist?( filepath )
|
|
124
|
+
@yaml_wrapper.load_string( @file_wrapper.read( filepath ), source_label: filepath )
|
|
125
|
+
rescue YamlLoadException
|
|
126
|
+
nil
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
# Builds human-readable explanations of *why* a hash comparison failed --
|
|
9
|
+
# the content half for `DependencyTracker#diagnose`. Pure: works entirely on
|
|
10
|
+
# strings and Hashes handed to it, no filesystem access of its own.
|
|
11
|
+
#
|
|
12
|
+
# `diff-lcs` is a soft dependency, declared in the Gemfile for development
|
|
13
|
+
# but deliberately not in ceedling.gemspec (see the Gemfile comment) -- so
|
|
14
|
+
# it is not a hard requirement for an installed release gem. When it is not
|
|
15
|
+
# available, content diffing degrades to a plain before/after dump rather
|
|
16
|
+
# than raising or silently producing nothing.
|
|
17
|
+
class DependencyDiffer
|
|
18
|
+
|
|
19
|
+
unless const_defined?(:DIFF_LCS_AVAILABLE, false)
|
|
20
|
+
begin
|
|
21
|
+
require 'diff/lcs'
|
|
22
|
+
DIFF_LCS_AVAILABLE = true
|
|
23
|
+
rescue LoadError
|
|
24
|
+
DIFF_LCS_AVAILABLE = false
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# First N bytes sniffed for a null byte to decide whether content is text
|
|
29
|
+
# or binary -- a line-oriented diff on binary content is not "readable."
|
|
30
|
+
BINARY_SNIFF_BYTES = 8_000 unless const_defined?(:BINARY_SNIFF_BYTES, false)
|
|
31
|
+
|
|
32
|
+
# Explains why a piece of content changed, given `old_snapshot` (the Hash
|
|
33
|
+
# loaded from a previously-written DependencyDebugTree snapshot, or nil if
|
|
34
|
+
# none exists) and `new_content` (the live content read from disk right
|
|
35
|
+
# now, or nil if the file no longer exists). Returns a Hash with one of:
|
|
36
|
+
# - `{ 'reason' => ... }` when no diff can be produced (no snapshot ever
|
|
37
|
+
# captured, snapshot was truncated, snapshot didn't include content
|
|
38
|
+
# because the debug tier at capture time was only :meta, or the file is
|
|
39
|
+
# now missing).
|
|
40
|
+
# - `{ 'summary' => ... }` for binary content -- byte sizes, not a diff.
|
|
41
|
+
# - `{ 'diff' => ... }` for text content -- a readable line-level diff.
|
|
42
|
+
def diff_content(old_snapshot, new_content)
|
|
43
|
+
return { 'reason' => 'no prior snapshot was captured for this path (enable CEEDLING_DEP_DEBUG=full and rebuild once to establish a baseline)' } if old_snapshot.nil?
|
|
44
|
+
return { 'reason' => "prior snapshot's content was truncated (file exceeded the capture size cap; see 'size' in its snapshot.yml)" } if old_snapshot['truncated']
|
|
45
|
+
return { 'reason' => "prior snapshot did not include content (captured at debug tier :meta, not :full)" } if old_snapshot['content'].nil?
|
|
46
|
+
return { 'reason' => 'file no longer exists' } if new_content.nil?
|
|
47
|
+
|
|
48
|
+
old_content = old_snapshot['content']
|
|
49
|
+
|
|
50
|
+
if binary?( old_content ) || binary?( new_content )
|
|
51
|
+
return { 'summary' => "binary content differs (previously #{old_content.bytesize} bytes, now #{new_content.bytesize} bytes)" }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
{ 'diff' => text_diff( old_content, new_content ) }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Explains why canonicalized meta changed, given `old_meta` (Hash loaded
|
|
58
|
+
# from a snapshot, or nil) and `new_meta` (the live, currently-registered,
|
|
59
|
+
# canonicalized meta). Returns added/removed/changed_keys breakdowns, or a
|
|
60
|
+
# `'reason'` Hash if no prior meta snapshot exists to compare against.
|
|
61
|
+
#
|
|
62
|
+
# Note the result key is `changed_keys`, not `changed` -- callers (see
|
|
63
|
+
# DependencyTracker#diagnose_meta) wrap this in their own `'changed'`
|
|
64
|
+
# boolean flag, and a flat merge of the two would otherwise silently
|
|
65
|
+
# clobber that boolean with this Hash.
|
|
66
|
+
def diff_meta(old_meta, new_meta)
|
|
67
|
+
return { 'reason' => 'no prior meta snapshot was captured for this target (enable CEEDLING_DEP_DEBUG=meta or :full and rebuild once to establish a baseline)' } if old_meta.nil?
|
|
68
|
+
|
|
69
|
+
old_meta ||= {}
|
|
70
|
+
new_meta ||= {}
|
|
71
|
+
|
|
72
|
+
added = new_meta.keys - old_meta.keys
|
|
73
|
+
removed = old_meta.keys - new_meta.keys
|
|
74
|
+
changed = (old_meta.keys & new_meta.keys).select { |key| old_meta[key] != new_meta[key] }
|
|
75
|
+
|
|
76
|
+
{
|
|
77
|
+
'added' => added.each_with_object( {} ) { |key, h| h[key] = new_meta[key] },
|
|
78
|
+
'removed' => removed.each_with_object( {} ) { |key, h| h[key] = old_meta[key] },
|
|
79
|
+
'changed_keys' => changed.each_with_object( {} ) { |key, h| h[key] = { 'old' => old_meta[key], 'new' => new_meta[key] } }
|
|
80
|
+
}
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
### Private ###
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def binary?(content)
|
|
87
|
+
return false if content.nil?
|
|
88
|
+
content.byteslice( 0, BINARY_SNIFF_BYTES ).include?( "\0" )
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def text_diff(old_content, new_content)
|
|
92
|
+
old_lines = old_content.lines
|
|
93
|
+
new_lines = new_content.lines
|
|
94
|
+
|
|
95
|
+
return diff_lcs_text( old_lines, new_lines ) if DIFF_LCS_AVAILABLE
|
|
96
|
+
fallback_text( old_lines, new_lines )
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Readable, line-numbered diff via diff-lcs. Not a byte-for-byte unified
|
|
100
|
+
# diff -- a terser, more directly readable "what actually changed" list,
|
|
101
|
+
# which is what this is for (troubleshooting, not patch generation).
|
|
102
|
+
def diff_lcs_text(old_lines, new_lines)
|
|
103
|
+
lines = []
|
|
104
|
+
|
|
105
|
+
Diff::LCS.sdiff( old_lines, new_lines ).each do |change|
|
|
106
|
+
case change.action
|
|
107
|
+
when '-'
|
|
108
|
+
lines << "- [#{change.old_position + 1}] #{change.old_element.chomp}"
|
|
109
|
+
when '+'
|
|
110
|
+
lines << "+ [#{change.new_position + 1}] #{change.new_element.chomp}"
|
|
111
|
+
when '!'
|
|
112
|
+
lines << "- [#{change.old_position + 1}] #{change.old_element.chomp}"
|
|
113
|
+
lines << "+ [#{change.new_position + 1}] #{change.new_element.chomp}"
|
|
114
|
+
end
|
|
115
|
+
# '=' (unchanged) lines are omitted -- only what actually changed matters here.
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
lines.empty? ? '(content hash differs, but no line-level difference found -- likely a line-ending or encoding change)' : lines.join( "\n" )
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def fallback_text(old_lines, new_lines)
|
|
122
|
+
"diff-lcs is not installed -- showing full before/after content instead of a line diff\n" \
|
|
123
|
+
"--- before ---\n#{old_lines.join}\n" \
|
|
124
|
+
"--- after ---\n#{new_lines.join}"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# =========================================================================
|
|
2
|
+
# Ceedling - Test-Centered Build System for C
|
|
3
|
+
# ThrowTheSwitch.org
|
|
4
|
+
# Copyright (c) 2010-26 Mike Karlesky, Mark VanderVoord, & Greg Williams
|
|
5
|
+
# SPDX-License-Identifier: MIT
|
|
6
|
+
# =========================================================================
|
|
7
|
+
|
|
8
|
+
require 'digest'
|
|
9
|
+
# `Digest::SHA256` is lazily autoloaded from `digest/sha2` on first reference.
|
|
10
|
+
# Every call site below runs inside parallel worker threads (DependencyTracker
|
|
11
|
+
# is exercised from Batchinator-driven thread pools throughout the pipeline);
|
|
12
|
+
# if two threads race to be the first to touch `Digest::SHA256`, Ruby's C
|
|
13
|
+
# extension init for the digest classes can raise "Digest::Base cannot be
|
|
14
|
+
# directly inherited in Ruby". Loading it here, once, single-threaded, at
|
|
15
|
+
# require time settles the class before any worker thread can race on it.
|
|
16
|
+
require 'digest/sha2'
|
|
17
|
+
require 'json'
|
|
18
|
+
|
|
19
|
+
# Computes the two kinds of hashes DependencyTracker persists per target:
|
|
20
|
+
# - A content hash for a single file (the target itself, or one of its
|
|
21
|
+
# dependencies), read via the injected FileWrapper so this class never
|
|
22
|
+
# touches the filesystem directly and is fully mockable in specs.
|
|
23
|
+
# - A hash of an arbitrary, caller-supplied `meta` value (compilation flags,
|
|
24
|
+
# defines, include paths, toolchain version, status booleans, etc.) after
|
|
25
|
+
# canonicalizing it to a stable, order-independent representation so that
|
|
26
|
+
# two logically-identical meta hashes (built in a different key/element
|
|
27
|
+
# order) always hash the same.
|
|
28
|
+
class DependencyHasher
|
|
29
|
+
|
|
30
|
+
HASH_ALGORITHM = 'sha256'.freeze unless const_defined?(:HASH_ALGORITHM, false)
|
|
31
|
+
DIGEST_RE = /\A[0-9a-f]{64}\z/.freeze unless const_defined?(:DIGEST_RE, false)
|
|
32
|
+
|
|
33
|
+
constructor :file_wrapper
|
|
34
|
+
|
|
35
|
+
# SHA-256 hex digest of a file's exact on-disk bytes.
|
|
36
|
+
#
|
|
37
|
+
# Read via `read_binary` rather than `read`: Ruby's default text-mode read
|
|
38
|
+
# silently translates CRLF to LF on Windows but leaves it untouched on
|
|
39
|
+
# Unix-like platforms, so the same file's bytes -- text or binary -- would
|
|
40
|
+
# otherwise hash differently purely depending on which OS is running
|
|
41
|
+
# Ceedling. Reading raw bytes on every platform keeps the hash a function of
|
|
42
|
+
# the file's actual content alone.
|
|
43
|
+
#
|
|
44
|
+
# This intentionally hashes every file byte-for-byte, whitespace included,
|
|
45
|
+
# rather than attempting any whitespace- or format-insensitive normalization
|
|
46
|
+
# (e.g. collapsing indentation, trimming trailing spaces). That's a
|
|
47
|
+
# deliberate choice, not an oversight:
|
|
48
|
+
# - Whitespace is not reliably cosmetic. In C, the exact whitespace inside a
|
|
49
|
+
# string or character literal is program content, not formatting -- and
|
|
50
|
+
# trailing whitespace after a macro's line-continuing backslash can change
|
|
51
|
+
# whether the continuation is even recognized. In YAML, indentation *is*
|
|
52
|
+
# the syntax -- two documents differing only in whitespace can parse to
|
|
53
|
+
# different data entirely.
|
|
54
|
+
# - Deciding which whitespace differences are safe to ignore requires
|
|
55
|
+
# understanding the semantics of the specific file's language -- i.e. a
|
|
56
|
+
# real parser for every format this hasher might ever see -- not a text
|
|
57
|
+
# transform. A byte hash can't be fooled by a parsing bug; a "smart"
|
|
58
|
+
# normalization can silently mask a real change.
|
|
59
|
+
# - The two ways this hash can be wrong aren't equally bad: reporting a
|
|
60
|
+
# target stale when it isn't just costs a wasted rebuild, but reporting it
|
|
61
|
+
# fresh when it isn't means shipping against a build that silently doesn't
|
|
62
|
+
# reflect the source -- exactly the failure this class exists to prevent.
|
|
63
|
+
# Any normalization narrows the margin between those two outcomes in
|
|
64
|
+
# exchange for skipping some rebuilds; that trade isn't worth it here.
|
|
65
|
+
def hash_of_file(path)
|
|
66
|
+
Digest::SHA256.hexdigest( @file_wrapper.read_binary( path ) )
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# SHA-256 hex digest of a canonicalized `meta` value, or nil for nil/empty
|
|
70
|
+
# meta -- distinguishing "no meta was supplied" from "meta hashed to some
|
|
71
|
+
# value" matters to callers deciding whether to store a `meta_hash` at all.
|
|
72
|
+
def hash_of_meta(meta)
|
|
73
|
+
return nil if meta.nil? || (meta.respond_to?(:empty?) && meta.empty?)
|
|
74
|
+
Digest::SHA256.hexdigest( JSON.generate( canonicalize( meta ) ) )
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Recursively normalizes a value for stable hashing:
|
|
78
|
+
# - Hash keys are stringified and sorted, so key order and Symbol-vs-String
|
|
79
|
+
# keys never change the resulting hash.
|
|
80
|
+
# - Arrays are canonicalized element-wise, preserving order (element order
|
|
81
|
+
# in a flags/defines/paths list is meaningful, unlike hash key order).
|
|
82
|
+
# - Everything else (String, Integer, true/false/nil, ...) passes through.
|
|
83
|
+
def canonicalize(obj)
|
|
84
|
+
case obj
|
|
85
|
+
when Hash
|
|
86
|
+
obj.map { |k, v| [k.to_s, canonicalize( v )] }.sort_by { |k, _v| k }.to_h
|
|
87
|
+
when Array
|
|
88
|
+
obj.map { |v| canonicalize( v ) }
|
|
89
|
+
else
|
|
90
|
+
obj
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|