https://github.com/python/cpython/commit/b4a1974aa2af63c4754846af9abfb436372e19c7
commit: b4a1974aa2af63c4754846af9abfb436372e19c7
branch: main
author: Adam Turner <9087854+aa-tur...@users.noreply.github.com>
committer: AA-Turner <9087854+aa-tur...@users.noreply.github.com>
date: 2025-08-08T02:32:20+01:00
summary:

GH-136155: Fail the EPUB check on fatal errors (#137351)

files:
M .github/workflows/reusable-docs.yml
M Doc/tools/check-epub.py

diff --git a/.github/workflows/reusable-docs.yml 
b/.github/workflows/reusable-docs.yml
index 7b9dc4818577eb..65154aae4c41d5 100644
--- a/.github/workflows/reusable-docs.yml
+++ b/.github/workflows/reusable-docs.yml
@@ -75,18 +75,6 @@ jobs:
           --fail-if-regression \
           --fail-if-improved \
           --fail-if-new-news-nit
-    - name: 'Build EPUB documentation'
-      continue-on-error: true
-      run: |
-        set -Eeuo pipefail
-        make -C Doc/ PYTHON=../python SPHINXOPTS="--quiet" epub
-        pip install epubcheck
-        epubcheck Doc/build/epub/Python.epub &> Doc/epubcheck.txt
-    - name: 'Check for fatal errors in EPUB'
-      if: github.event_name == 'pull_request'
-      continue-on-error: true  # until gh-136155 is fixed
-      run: |
-        python Doc/tools/check-epub.py
 
   # Run "doctest" on HEAD as new syntax doesn't exist in the latest stable 
release
   doctest:
@@ -114,3 +102,30 @@ jobs:
     # Use "xvfb-run" since some doctest tests open GUI windows
     - name: 'Run documentation doctest'
       run: xvfb-run make -C Doc/ PYTHON=../python 
SPHINXERRORHANDLING="--fail-on-warning" doctest
+
+  check-epub:
+    name: 'Check EPUB'
+    runs-on: ubuntu-latest
+    timeout-minutes: 30
+    steps:
+    - uses: actions/checkout@v4
+      with:
+        persist-credentials: false
+    - name: 'Set up Python'
+      uses: actions/setup-python@v5
+      with:
+        python-version: '3'
+        cache: 'pip'
+        cache-dependency-path: 'Doc/requirements.txt'
+    - name: 'Install build dependencies'
+      run: |
+        make -C Doc/ venv
+        python -m pip install epubcheck
+    - name: 'Build EPUB documentation'
+      run: make -C Doc/ PYTHON=../python epub
+    - name: 'Run epubcheck'
+      continue-on-error: true
+      run: epubcheck Doc/build/epub/Python.epub &> Doc/epubcheck.txt
+    - run: cat Doc/epubcheck.txt
+    - name: 'Check for fatal errors in EPUB'
+      run: python Doc/tools/check-epub.py
diff --git a/Doc/tools/check-epub.py b/Doc/tools/check-epub.py
index 693dc239c8ad58..6a10096c117542 100644
--- a/Doc/tools/check-epub.py
+++ b/Doc/tools/check-epub.py
@@ -1,24 +1,30 @@
-import sys
 from pathlib import Path
 
+CPYTHON_ROOT = Path(
+    __file__,  # cpython/Doc/tools/check-epub.py
+    '..',  # cpython/Doc/tools
+    '..',  # cpython/Doc
+    '..',  # cpython
+).resolve()
+EPUBCHECK_PATH = CPYTHON_ROOT / 'Doc' / 'epubcheck.txt'
 
-def main() -> int:
-    wrong_directory_msg = "Must run this script from the repo root"
-    if not Path("Doc").exists() or not Path("Doc").is_dir():
-        raise RuntimeError(wrong_directory_msg)
-
-    with Path("Doc/epubcheck.txt").open(encoding="UTF-8") as f:
-        messages = [message.split(" - ") for message in f.read().splitlines()]
 
-    fatal_errors = [message for message in messages if message[0] == "FATAL"]
+def main() -> int:
+    lines = EPUBCHECK_PATH.read_text(encoding='utf-8').splitlines()
+    fatal_errors = [line for line in lines if line.startswith('FATAL')]
 
     if fatal_errors:
-        print("\nError: must not contain fatal errors:\n")
-        for error in fatal_errors:
-            print(" - ".join(error))
+        err_count = len(fatal_errors)
+        s = 's' * (err_count != 1)
+        print()
+        print(f'Error: epubcheck reported {err_count} fatal error{s}:')
+        print()
+        print('\n'.join(fatal_errors))
+        return 1
 
-    return len(fatal_errors)
+    print('Success: no fatal errors found.')
+    return 0
 
 
-if __name__ == "__main__":
-    sys.exit(main())
+if __name__ == '__main__':
+    raise SystemExit(main())

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: arch...@mail-archive.com

Reply via email to