diff --git a/script/determine-jobs.py b/script/determine-jobs.py index 570b1a762c..a0e04a256e 100755 --- a/script/determine-jobs.py +++ b/script/determine-jobs.py @@ -273,6 +273,9 @@ def detect_memory_impact_config( building a merged configuration with all changed components (like test_build_components.py does) to get comprehensive memory analysis. + For core C++ file changes without component changes, runs a fallback + analysis using a representative component to measure the impact. + Args: branch: Branch to compare against @@ -289,7 +292,7 @@ def detect_memory_impact_config( # Find all changed components (excluding core and base bus components) changed_component_set: set[str] = set() - has_core_changes = False + has_core_cpp_changes = False for file in files: component = get_component_from_path(file) @@ -297,22 +300,23 @@ def detect_memory_impact_config( # Skip base bus components as they're used across many builds if component not in BASE_BUS_COMPONENTS: changed_component_set.add(component) - elif file.startswith("esphome/"): - # Core ESPHome files changed (not component-specific) - has_core_changes = True + elif file.startswith("esphome/") and file.endswith(CPP_FILE_EXTENSIONS): + # Core ESPHome C++ files changed (not component-specific) + # Only C++ files affect memory usage + has_core_cpp_changes = True - # If no components changed but core changed, test representative component + # If no components changed but core C++ changed, test representative component force_fallback_platform = False - if not changed_component_set and has_core_changes: + if not changed_component_set and has_core_cpp_changes: print( - f"Memory impact: No components changed, but core files changed. " + f"Memory impact: No components changed, but core C++ files changed. " f"Testing {MEMORY_IMPACT_FALLBACK_COMPONENT} component on {MEMORY_IMPACT_FALLBACK_PLATFORM}.", file=sys.stderr, ) changed_component_set.add(MEMORY_IMPACT_FALLBACK_COMPONENT) force_fallback_platform = True # Use fallback platform (most representative) elif not changed_component_set: - # No components and no core changes + # No components and no core C++ changes return {"should_run": "false"} # Find components that have tests and collect their supported platforms diff --git a/tests/script/test_determine_jobs.py b/tests/script/test_determine_jobs.py index b479fc03c5..7587dbee69 100644 --- a/tests/script/test_determine_jobs.py +++ b/tests/script/test_determine_jobs.py @@ -545,7 +545,7 @@ def test_detect_memory_impact_config_with_common_platform(tmp_path: Path) -> Non def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None: - """Test memory impact detection with core-only changes (no component changes).""" + """Test memory impact detection with core C++ changes (no component changes).""" # Create test directory structure with fallback component tests_dir = tmp_path / "tests" / "components" @@ -554,7 +554,7 @@ def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None: api_dir.mkdir(parents=True) (api_dir / "test.esp32-idf.yaml").write_text("test: api") - # Mock changed_files to return only core files (no component files) + # Mock changed_files to return only core C++ files (no component files) with ( patch.object(determine_jobs, "root_path", str(tmp_path)), patch.object(helpers, "root_path", str(tmp_path)), @@ -574,6 +574,35 @@ def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None: assert result["use_merged_config"] == "true" +def test_detect_memory_impact_config_core_python_only_changes(tmp_path: Path) -> None: + """Test that Python-only core changes don't trigger memory impact analysis.""" + # Create test directory structure with fallback component + tests_dir = tmp_path / "tests" / "components" + + # api component (fallback component) with esp32-idf test + api_dir = tests_dir / "api" + api_dir.mkdir(parents=True) + (api_dir / "test.esp32-idf.yaml").write_text("test: api") + + # Mock changed_files to return only core Python files (no C++ files) + with ( + patch.object(determine_jobs, "root_path", str(tmp_path)), + patch.object(helpers, "root_path", str(tmp_path)), + patch.object(determine_jobs, "changed_files") as mock_changed_files, + ): + mock_changed_files.return_value = [ + "esphome/__main__.py", + "esphome/config.py", + "esphome/core/config.py", + ] + determine_jobs._component_has_tests.cache_clear() + + result = determine_jobs.detect_memory_impact_config() + + # Python-only changes should NOT trigger memory impact analysis + assert result["should_run"] == "false" + + def test_detect_memory_impact_config_no_common_platform(tmp_path: Path) -> None: """Test memory impact detection when components have no common platform.""" # Create test directory structure