https://github.com/python/cpython/commit/773cd81028473aa75f722aeff3b2477a6d310798
commit: 773cd81028473aa75f722aeff3b2477a6d310798
branch: 3.13
author: Stan Ulbrych <[email protected]>
committer: hugovk <[email protected]>
date: 2026-02-21T14:24:53+02:00
summary:

[3.13] `compute-changes.py`: Fix & test `process_changed_files()` (GH-144674) 
(#145014)

Co-authored-by: Stan Ulbrych <[email protected]>
Co-authored-by: Chris Eibl <[email protected]>

files:
A Lib/test/test_tools/test_compute_changes.py
M .github/CODEOWNERS
M Tools/build/compute-changes.py

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 52892c5d0c7f1d..18367a64f47a0c 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -6,6 +6,8 @@
 
 # GitHub
 .github/**                    @ezio-melotti @hugovk @webknjaz
+Tools/build/compute-changes.py              @AA-Turner @hugovk @webknjaz
+Lib/test/test_tools/test_compute_changes.py @AA-Turner @hugovk @webknjaz
 
 # pre-commit
 .pre-commit-config.yaml       @hugovk
diff --git a/Lib/test/test_tools/test_compute_changes.py 
b/Lib/test/test_tools/test_compute_changes.py
new file mode 100644
index 00000000000000..8c1acc73df3617
--- /dev/null
+++ b/Lib/test/test_tools/test_compute_changes.py
@@ -0,0 +1,134 @@
+"""Tests to cover the Tools/build/compute-changes.py script."""
+
+import importlib
+import os
+import unittest
+from pathlib import Path
+from unittest.mock import patch
+
+from test.test_tools import skip_if_missing, imports_under_tool
+
+skip_if_missing("build")
+
+with patch.dict(os.environ, {"GITHUB_DEFAULT_BRANCH": "main"}):
+    with imports_under_tool("build"):
+        compute_changes = importlib.import_module("compute-changes")
+
+process_changed_files = compute_changes.process_changed_files
+Outputs = compute_changes.Outputs
+ANDROID_DIRS = compute_changes.ANDROID_DIRS
+MACOS_DIRS = compute_changes.MACOS_DIRS
+WASI_DIRS = compute_changes.WASI_DIRS
+RUN_TESTS_IGNORE = compute_changes.RUN_TESTS_IGNORE
+UNIX_BUILD_SYSTEM_FILE_NAMES = compute_changes.UNIX_BUILD_SYSTEM_FILE_NAMES
+LIBRARY_FUZZER_PATHS = compute_changes.LIBRARY_FUZZER_PATHS
+
+
+class TestProcessChangedFiles(unittest.TestCase):
+
+    def test_windows(self):
+        f = {Path(".github/workflows/reusable-windows.yml")}
+        result = process_changed_files(f)
+        self.assertTrue(result.run_tests)
+        self.assertTrue(result.run_windows_tests)
+
+    def test_docs(self):
+        for f in (
+            ".github/workflows/reusable-docs.yml",
+            "Doc/library/datetime.rst",
+            "Doc/Makefile",
+        ):
+            with self.subTest(f=f):
+                result = process_changed_files({Path(f)})
+                self.assertTrue(result.run_docs)
+                self.assertFalse(result.run_tests)
+
+    def test_ci_fuzz_stdlib(self):
+        for p in LIBRARY_FUZZER_PATHS:
+            with self.subTest(p=p):
+                if p.is_dir():
+                    f = p / "file"
+                elif p.is_file():
+                    f = p
+                else:
+                    continue
+                result = process_changed_files({f})
+                self.assertTrue(result.run_ci_fuzz_stdlib)
+
+    def test_android(self):
+        for d in ANDROID_DIRS:
+            with self.subTest(d=d):
+                result = process_changed_files({Path(d) / "file"})
+                self.assertTrue(result.run_tests)
+                self.assertTrue(result.run_android)
+                self.assertFalse(result.run_windows_tests)
+
+    def test_macos(self):
+        f = {Path(".github/workflows/reusable-macos.yml")}
+        result = process_changed_files(f)
+        self.assertTrue(result.run_tests)
+        self.assertTrue(result.run_macos)
+
+        for d in MACOS_DIRS:
+            with self.subTest(d=d):
+                result = process_changed_files({Path(d) / "file"})
+                self.assertTrue(result.run_tests)
+                self.assertTrue(result.run_macos)
+                self.assertFalse(result.run_windows_tests)
+
+    def test_wasi(self):
+        f = {Path(".github/workflows/reusable-wasi.yml")}
+        result = process_changed_files(f)
+        self.assertTrue(result.run_tests)
+        self.assertTrue(result.run_wasi)
+
+        for d in WASI_DIRS:
+            with self.subTest(d=d):
+                result = process_changed_files({d / "file"})
+                self.assertTrue(result.run_tests)
+                self.assertTrue(result.run_wasi)
+                self.assertFalse(result.run_windows_tests)
+
+    def test_unix(self):
+        for f in UNIX_BUILD_SYSTEM_FILE_NAMES:
+            with self.subTest(f=f):
+                result = process_changed_files({f})
+                self.assertTrue(result.run_tests)
+                self.assertFalse(result.run_windows_tests)
+
+    def test_msi(self):
+        for f in (
+            ".github/workflows/reusable-windows-msi.yml",
+            "Tools/msi/build.bat",
+        ):
+            with self.subTest(f=f):
+                result = process_changed_files({Path(f)})
+                self.assertTrue(result.run_windows_msi)
+
+    def test_all_run(self):
+        for f in (
+            ".github/workflows/some-new-workflow.yml",
+            ".github/workflows/build.yml",
+        ):
+            with self.subTest(f=f):
+                result = process_changed_files({Path(f)})
+                self.assertTrue(result.run_tests)
+                self.assertTrue(result.run_android)
+                self.assertTrue(result.run_macos)
+                self.assertTrue(result.run_ubuntu)
+                self.assertTrue(result.run_wasi)
+
+    def test_all_ignored(self):
+        for f in RUN_TESTS_IGNORE:
+            with self.subTest(f=f):
+                self.assertEqual(process_changed_files({Path(f)}), Outputs())
+
+    def test_wasi_and_android(self):
+        f = {Path(".github/workflows/reusable-wasi.yml"), Path("Android/file")}
+        result = process_changed_files(f)
+        self.assertTrue(result.run_tests)
+        self.assertTrue(result.run_wasi)
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/Tools/build/compute-changes.py b/Tools/build/compute-changes.py
index db8a6758d29a5b..37410dcd971d4e 100644
--- a/Tools/build/compute-changes.py
+++ b/Tools/build/compute-changes.py
@@ -220,19 +220,27 @@ def process_changed_files(changed_files: Set[Path]) -> 
Outputs:
 
         if file.parent == GITHUB_WORKFLOWS_PATH:
             if file.name in ("build.yml", "reusable-cifuzz.yml"):
-                run_tests = run_ci_fuzz = run_ci_fuzz_stdlib = True
+                run_tests = run_ci_fuzz = run_ci_fuzz_stdlib = 
run_windows_tests = True
                 has_platform_specific_change = False
+                continue
             if file.name == "reusable-docs.yml":
                 run_docs = True
+                continue
+            if file.name == "reusable-windows.yml":
+                run_tests = True
+                run_windows_tests = True
+                continue
             if file.name == "reusable-windows-msi.yml":
                 run_windows_msi = True
+                continue
             if file.name == "reusable-macos.yml":
                 run_tests = True
                 platforms_changed.add("macos")
+                continue
             if file.name == "reusable-wasi.yml":
                 run_tests = True
                 platforms_changed.add("wasi")
-            continue
+                continue
 
         if not doc_file and file not in RUN_TESTS_IGNORE:
             run_tests = True

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to