Menu

#508 qemu build problem after docutils update to 0.22

closed-fixed
nobody
None
5
2025-09-18
2025-08-04
No

After updating docutils in pkgsrc to 0.22 (with sphinx 8.2.3), qemu 10.0.3 (https://gitlab.com/qemu-project/qemu) stopped building. The output is not very clear:

[5596/6204] Generating docs/QEMU manual with a custom command
FAILED: [code=2] docs/docs.stamp
/scratch/emulators/qemu/work/.tools/bin/env CONFDIR=/usr/pkg/etc/qemu/qemu /scratch/emulators/qemu/work/qemu-10.0.3/build/pyvenv/bin/sphinx-build -q -j auto -Dversion=10.0.3 -Drelease= -Ddepfile=docs/docs.d -Ddepfile_sta
mp=docs/docs.stamp -b html -d /scratch/emulators/qemu/work/qemu-10.0.3/build/docs/manual.p /scratch/emulators/qemu/work/qemu-10.0.3/docs /scratch/emulators/qemu/work/qemu-10.0.3/build/docs/manual
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
/scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:70: CRITICAL: Inconsistent title style: skip from level 1 to 3.

Valid requests
^^^^^^^^^^^^^^

Established title styles: =/= - ^ [docutils]
/scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:73: CRITICAL: Inconsistent title style: skip from level 1 to 4.
                                                                                                                                                                                                          10:17:35 [41/1829]
Clock management:
"""""""""""""""""

Established title styles: =/= - ^ " [docutils]
/scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:107: CRITICAL: Inconsistent title style: skip from level 1 to 4.

PIO and memory access:
""""""""""""""""""""""

Established title styles: =/= - ^ " [docutils]
/scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:215: CRITICAL: Inconsistent title style: skip from level 1 to 4.

IRQ management:
"""""""""""""""

Established title styles: =/= - ^ " [docutils]
/scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:239: CRITICAL: Inconsistent title style: skip from level 1 to 4.

Setting interrupt level:
""""""""""""""""""""""""

Established title styles: =/= - ^ " [docutils]

Sphinx parallel build error!

Versions
========

* Platform:         netbsd11; (NetBSD-11.99.1-amd64-x86_64-64bit-ELF)
* Python version:   3.13.5 (CPython)
* Sphinx version:   8.2.3
* Docutils version: 0.22
* Jinja2 version:   3.1.6
* Pygments version: 2.19.2

Last Messages
=============


    reading sources... [ 91%]
    system/s390x/protvirt .. system/target-loongarch

    reading sources... [ 94%]
    system/target-m68k .. system/target-sparc64

    reading sources... [ 97%]
    system/target-xtensa .. tools/qemu-nbd

Loaded Extensions
=================

* sphinx.ext.mathjax (8.2.3)
* alabaster (1.0.0)
* sphinxcontrib.applehelp (2.0.0)
* sphinxcontrib.devhelp (2.0.0)
* sphinxcontrib.htmlhelp (2.1.0)
* sphinxcontrib.serializinghtml (2.0.0)
* sphinxcontrib.qthelp (2.0.0)
* depfile (1.0)
* hxtool (1.0)
* kerneldoc (1.0)
* qapi_domain (1.0)
* qapidoc (2.0)
* qmp_lexer (unknown version)
* dbusdoc (1.0)
* sphinxcontrib.jquery (4.1)
* sphinx_rtd_theme (unknown version)

Traceback
=========

      File "/usr/pkg/lib/python3.13/site-packages/sphinx/util/parallel.py", line 137, in _join_one
        raise SphinxParallelError(*result)
    sphinx.errors.SphinxParallelError: TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'


The full traceback has been saved in:
/tmp/sphinx-err-gj6pt4nj.log

To report this error to the developers, please open an issue at <https://github.com/sphinx-doc/sphinx/issues/>. Thanks!
Please also report this if it was a user error, so that a better error message can be provided next time.

The full traceback from the log lists docutils code as the origin of the breakage:

Traceback
=========

    (Error in parallel process)
    Traceback (most recent call last):
      File "/usr/pkg/lib/python3.13/site-packages/sphinx/util/parallel.py", line 83, in _process
        ret = func(arg)  # type: ignore[call-arg]
      File "/usr/pkg/lib/python3.13/site-packages/sphinx/builders/__init__.py", line 603, in read_process
        self.read_doc(docname, _cache=False)
        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/sphinx/builders/__init__.py", line 648, in read_doc
        publisher.publish()
        ~~~~~~~~~~~~~~~~~^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/core.py", line 269, in publish
        self.document = self.reader.read(self.source, self.parser,
                        ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
                                         self.settings)
                                         ^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/sphinx/io.py", line 103, in read
        self.parse()
        ~~~~~~~~~~^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/readers/__init__.py", line 101, in parse
        self.parser.parse(self.input, document)
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/sphinx/parsers.py", line 86, in parse
        self.statemachine.run(inputlines, document, inliner=self.inliner)
        ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 165, in run
        results = StateMachineWS.run(self, input_lines, input_offset,
                                     input_source=document['source'])
      File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 235, in run
        context, next_state, result = self.check_line(
                                      ~~~~~~~~~~~~~~~^
            context, state, transitions)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 447, in check_line
        return method(match, context, next_state)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2356, in explicit_markup
        self.explicit_list(blank_finish)
        ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2381, in explicit_list
        newline_offset, blank_finish = self.nested_list_parse(
                                       ~~~~~~~~~~~~~~~~~~~~~~^
              self.state_machine.input_lines[offset:],
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ...<2 lines>...
              blank_finish=blank_finish,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
              match_titles=self.state_machine.match_titles)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 312, in nested_list_parse
        state_machine.run(block, input_offset, memo=self.memo,
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          node=node, match_titles=match_titles)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 191, in run
        results = StateMachineWS.run(self, input_lines, input_offset)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 235, in run
        context, next_state, result = self.check_line(
                                      ~~~~~~~~~~~~~~~^
            context, state, transitions)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 447, in check_line
        return method(match, context, next_state)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2659, in explicit_markup
        nodelist, blank_finish = self.explicit_construct(match)
                                 ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2366, in explicit_construct
        return method(self, expmatch)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2103, in directive
        return self.run_directive(
               ~~~~~~~~~~~~~~~~~~^
            directive_class, match, type_name, option_presets)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2153, in run_directive
        result = directive_instance.run()
      File "/scratch/emulators/qemu/work/qemu-10.0.3/docs/sphinx/qapidoc.py", line 620, in run
        contentnode = self.transmogrify(schema)
      File "/scratch/emulators/qemu/work/qemu-10.0.3/docs/sphinx/qapidoc.py", line 549, in transmogrify
        nested_parse_with_titles(self.state, content, contentnode)
        ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/sphinx/util/nodes.py", line 378, in nested_parse_with_titles
        ret = state.nested_parse(content, content_offset, node, match_titles=True)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 275, in nested_parse
        state_machine.run(block, input_offset, memo=self.memo,
        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          node=node, match_titles=match_titles)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 191, in run
        results = StateMachineWS.run(self, input_lines, input_offset)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 235, in run
        context, next_state, result = self.check_line(
                                      ~~~~~~~~~~~~~~~^
            context, state, transitions)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 447, in check_line
        return method(match, context, next_state)
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 3024, in text
        self.section(title.lstrip(), source, style, lineno + 1, messages)
        ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 321, in section
        self.new_subsection(title, lineno, messages)
        ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 370, in new_subsection
        self.parent += section_node
      File "/usr/pkg/lib/python3.13/site-packages/docutils/nodes.py", line 736, in __radd__
        return other + self.children
               ~~~~~~^~~~~~~~~~~~~~~
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'

Even with the "CRITICAL: Inconsistent title style" problems fixed, the build stops.
Any ideas what the problem is or how to fix it?
Thanks.

Related

Bugs: #509
Bugs: #510
Bugs: #511

Discussion

1 2 > >> (Page 1 of 2)
  • Günter Milde

    Günter Milde - 2025-08-07

    The reason is an incompatibility of Sphinx or one of the Sphinx extensions with the new section parsing algorithm introduced in commit [r10093] with updates in [r10129], [r10131], [r10131].

    The unhelpful "TypeError" is displayed because Sphinx carries on after a CRITICAL problem which leads to follow-up problems (here, self.parent beeing None instead of an Element instance).

    The error reported by Docutils gives some hints. Let's dissect the first message:

    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:70: CRITICAL: Inconsistent title style: skip from level 1 to 3.
    
    Valid requests
    ^^^^^^^^^^^^^^
    
    Established title styles: =/= - ^ [docutils]
    

    It provides the source file and line (system/qtest.c, line 70) and a reason (Inconsistent title style: skip from level 1 to 3.).

    How does it come to this conclusion:

    • The parser keeps a record of section adornment styles in the memo
      attribute of the document object. These are the "Established title
      styles" (under- and overline with = for level 1, underline
      with - for level 2, and underline with ^ for level 3.
      The new section header uses an underline with ^.
      Hence, the new section should be at level 3.

    • The current section level is determined scanning the parent elements
      of the current element for <section> elements.
      Level 1 means that one parent section was found.

    As the level (depth) of a section element is determined from its physical nesting level, it is impossible to represent a level 3 section inside a level 1 section in the doctree.

    Why does the Docutils update trigger this problem?

    The source is a docstring in a C file. Some extension must have been used to extract it and include it (together with other docstrings) in a wrapper document.

    When including a source, there are two strategies to handle section adornment styles:
    1. enforce a consistent style hierarchy across all included parts,
    2. establish a new style hierarchy for the included parts.

    It seems as if with previous Docutisl versions there was strategy 2 and now its stratagy 1.
    This is most likely not intended but a side effect of the changes to the inner working of the parser.
    To fix it, we would need to know which extension is used to extract the docstrings and cooperate with its developers.

     

    Related

    Commit: [r10093]
    Commit: [r10129]
    Commit: [r10131]


    Last edit: Günter Milde 2025-08-19
  • Thomas Klausner

    Thomas Klausner - 2025-08-07

    Thank you for the analysis!

    When building qemu, I have the following sphinx packages installed:

    sphinxcontrib-applehelp-2.0.0
    sphinxcontrib-devhelp-2.0.0
    sphinxcontrib-htmlhelp-2.1.0
    sphinxcontrib-jsmath-1.0.1
    sphinxcontrib-qthelp-2.0.0
    sphinxcontrib-serializinghtml-2.0.0
    sphinx-8.2.3
    sphinxcontrib-jquery-4.1
    sphinx-rtd-theme-3.0.2

    I think there might be second problem though. When I remove the whole comment that causes the CRITICAL errors, i.e. use the following diff:

    --- system/qtest.c.orig 2025-08-07 13:27:16.627161116 +0000
    +++ system/qtest.c
    @@ -61,197 +61,6 @@ static void *qtest_server_send_opaque;
    
     #define FMT_timeval "%.06f"
    
    -/**
    - * DOC: QTest Protocol
    - *
    - * Line based protocol, request/response based.  Server can send async messages
    - * so clients should always handle many async messages before the response
    - * comes in.
    - *
    - * Valid requests
    - * ^^^^^^^^^^^^^^
    - *
    - * Clock management:
    - * """""""""""""""""
    - *
    - * The qtest client is completely in charge of the QEMU_CLOCK_VIRTUAL.  qtest commands
    - * let you adjust the value of the clock (monotonically).  All the commands
    - * return the current value of the clock in nanoseconds.
    - *
    - * If the commands FAIL then time wasn't advanced which is likely
    - * because the machine was in a paused state or no timer events exist
    - * in the future. This will cause qtest to abort and the test will
    - * need to check its assumptions.
    - *
    - * .. code-block:: none
    - *
    - *  > clock_step
    - *  < OK VALUE
    - *
    - * Advance the clock to the next deadline.  Useful when waiting for
    - * asynchronous events.
    - *
    - * .. code-block:: none
    - *
    - *  > clock_step NS
    - *  < OK VALUE
    - *
    - * Advance the clock by NS nanoseconds.
    - *
    - * .. code-block:: none
    - *
    - *  > clock_set NS
    - *  < OK VALUE
    - *
    - * Advance the clock to NS nanoseconds (do nothing if it's already past).
    - *
    - * PIO and memory access:
    - * """"""""""""""""""""""
    - *
    - * .. code-block:: none
    - *
    - *  > outb ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > outw ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > outl ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > inb ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > inw ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > inl ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > writeb ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > writew ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > writel ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > writeq ADDR VALUE
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > readb ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > readw ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > readl ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > readq ADDR
    - *  < OK VALUE
    - *
    - * .. code-block:: none
    - *
    - *  > read ADDR SIZE
    - *  < OK DATA
    - *
    - * .. code-block:: none
    - *
    - *  > write ADDR SIZE DATA
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > b64read ADDR SIZE
    - *  < OK B64_DATA
    - *
    - * .. code-block:: none
    - *
    - *  > b64write ADDR SIZE B64_DATA
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > memset ADDR SIZE VALUE
    - *  < OK
    - *
    - * ADDR, SIZE, VALUE are all integers parsed with strtoul() with a base of 0.
    - * For 'memset' a zero size is permitted and does nothing.
    - *
    - * DATA is an arbitrarily long hex number prefixed with '0x'.  If it's smaller
    - * than the expected size, the value will be zero filled at the end of the data
    - * sequence.
    - *
    - * B64_DATA is an arbitrarily long base64 encoded string.
    - * If the sizes do not match, the data will be truncated.
    - *
    - * IRQ management:
    - * """""""""""""""
    - *
    - * .. code-block:: none
    - *
    - *  > irq_intercept_in QOM-PATH
    - *  < OK
    - *
    - * .. code-block:: none
    - *
    - *  > irq_intercept_out QOM-PATH
    - *  < OK
    - *
    - * Attach to the gpio-in (resp. gpio-out) pins exported by the device at
    - * QOM-PATH.  When the pin is triggered, one of the following async messages
    - * will be printed to the qtest stream::
    - *
    - *  IRQ raise NUM
    - *  IRQ lower NUM
    - *
    - * where NUM is an IRQ number.  For the PC, interrupts can be intercepted
    - * simply with "irq_intercept_in ioapic" (note that IRQ0 comes out with
    - * NUM=0 even though it is remapped to GSI 2).
    - *
    - * Setting interrupt level:
    - * """"""""""""""""""""""""
    - *
    - * .. code-block:: none
    - *
    - *  > set_irq_in QOM-PATH NAME NUM LEVEL
    - *  < OK
    - *
    - * where NAME is the name of the irq/gpio list, NUM is an IRQ number and
    - * LEVEL is an signed integer IRQ level.
    - *
    - * Forcibly set the given interrupt pin to the given level.
    - *
    - */
    -
     static int hex2nib(char ch)
     {
         if (ch >= '0' && ch <= '9') {
    

    then the CRITICAL warnings are gone, but the build still fails.

    FAILED: [code=2] docs/docs.stamp
    /scratch/emulators/qemu/work/.tools/bin/env CONFDIR=/usr/pkg/etc/qemu/qemu /scratch/emulators/qemu/work/qemu-10.0.3/build/pyvenv/bin/sphinx-build -q -j auto -Dversion=10.0.3 -Drelease= -Ddepfile=docs/docs.d -Ddepfile_sta
    mp=docs/docs.stamp -b html -d /scratch/emulators/qemu/work/qemu-10.0.3/build/docs/manual.p /scratch/emulators/qemu/work/qemu-10.0.3/docs /scratch/emulators/qemu/work/qemu-10.0.3/build/docs/manual
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:1: warning: 'QTest Protocol' not found
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    
    Sphinx parallel build error!
    
    Versions
    ========
    
    * Platform:         netbsd11; (NetBSD-11.99.1-amd64-x86_64-64bit-ELF)
    * Python version:   3.13.5 (CPython)
    * Sphinx version:   8.2.3
    * Docutils version: 0.22
    * Jinja2 version:   3.1.6
    * Pygments version: 2.19.2
    
    Last Messages
    =============
    
    
        reading sources... [ 76%]
        system/i386/hyperv .. system/images
    
        reading sources... [ 79%]
        system/index .. system/multi-process
    
        reading sources... [ 82%]
        system/mux-chardev .. system/ppc/powernv
    
    Loaded Extensions
    =================
    
    * sphinx.ext.mathjax (8.2.3)
    * alabaster (1.0.0)
    * sphinxcontrib.applehelp (2.0.0)
    * sphinxcontrib.devhelp (2.0.0)
    * sphinxcontrib.htmlhelp (2.1.0)
    * sphinxcontrib.serializinghtml (2.0.0)
    * sphinxcontrib.qthelp (2.0.0)
    * depfile (1.0)
    * hxtool (1.0)
    * kerneldoc (1.0)
    * qapi_domain (1.0)
    * qapidoc (2.0)
    * qmp_lexer (unknown version)
    * dbusdoc (1.0)
    * sphinxcontrib.jquery (4.1)
    * sphinx_rtd_theme (unknown version)
    
    Traceback
    =========
    
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/util/parallel.py", line 137, in _join_one
            raise SphinxParallelError(*result)
        sphinx.errors.SphinxParallelError: TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'
    
    
    The full traceback has been saved in:
    /tmp/sphinx-err-kigsym_t.log
    
    To report this error to the developers, please open an issue at <https://github.com/sphinx-doc/sphinx/issues/>. Thanks!
    Please also report this if it was a user error, so that a better error message can be provided next time.
    [5593/6204] Compiling C object libqemu-xtensaeb-softmmu.a.p/target_xtensa_core-dsp3400.c.o
    ninja: build stopped: subcommand failed.
    *** Error code 2
    

    The traceback from the log file:

    Traceback
    =========
    
        (Error in parallel process)
        Traceback (most recent call last):
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/util/parallel.py", line 83, in _process
            ret = func(arg)  # type: ignore[call-arg]
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/builders/__init__.py", line 603, in read_process
            self.read_doc(docname, _cache=False)
            ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/builders/__init__.py", line 648, in read_doc
            publisher.publish()
            ~~~~~~~~~~~~~~~~~^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/core.py", line 269, in publish
            self.document = self.reader.read(self.source, self.parser,
                            ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
                                             self.settings)
                                             ^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/io.py", line 103, in read
            self.parse()
            ~~~~~~~~~~^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/readers/__init__.py", line 101, in parse
            self.parser.parse(self.input, document)
            ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/parsers.py", line 86, in parse
            self.statemachine.run(inputlines, document, inliner=self.inliner)
            ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 165, in run
            results = StateMachineWS.run(self, input_lines, input_offset,
                                         input_source=document['source'])
          File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 235, in run
            context, next_state, result = self.check_line(
                                          ~~~~~~~~~~~~~~~^
                context, state, transitions)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 447, in check_line
            return method(match, context, next_state)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2356, in explicit_markup
            self.explicit_list(blank_finish)
            ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2381, in explicit_list
            newline_offset, blank_finish = self.nested_list_parse(
                                           ~~~~~~~~~~~~~~~~~~~~~~^
                  self.state_machine.input_lines[offset:],
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            ...<2 lines>...
                  blank_finish=blank_finish,
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
                  match_titles=self.state_machine.match_titles)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 312, in nested_list_parse
            state_machine.run(block, input_offset, memo=self.memo,
            ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              node=node, match_titles=match_titles)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 191, in run
            results = StateMachineWS.run(self, input_lines, input_offset)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 235, in run
            context, next_state, result = self.check_line(
                                          ~~~~~~~~~~~~~~~^
                context, state, transitions)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 447, in check_line
            return method(match, context, next_state)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2659, in explicit_markup
            nodelist, blank_finish = self.explicit_construct(match)
                                     ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2366, in explicit_construct
            return method(self, expmatch)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2103, in directive
            return self.run_directive(
                   ~~~~~~~~~~~~~~~~~~^
                directive_class, match, type_name, option_presets)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 2153, in run_directive
            result = directive_instance.run()
          File "/scratch/emulators/qemu/work/qemu-10.0.3/docs/sphinx/qapidoc.py", line 620, in run
            contentnode = self.transmogrify(schema)
          File "/scratch/emulators/qemu/work/qemu-10.0.3/docs/sphinx/qapidoc.py", line 549, in transmogrify
            nested_parse_with_titles(self.state, content, contentnode)
            ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/sphinx/util/nodes.py", line 378, in nested_parse_with_titles
            ret = state.nested_parse(content, content_offset, node, match_titles=True)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 275, in nested_parse
            state_machine.run(block, input_offset, memo=self.memo,
            ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              node=node, match_titles=match_titles)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 191, in run
            results = StateMachineWS.run(self, input_lines, input_offset)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 235, in run
            context, next_state, result = self.check_line(
                                          ~~~~~~~~~~~~~~~^
                context, state, transitions)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/statemachine.py", line 447, in check_line
            return method(match, context, next_state)
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 3024, in text
            self.section(title.lstrip(), source, style, lineno + 1, messages)
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 321, in section
            self.new_subsection(title, lineno, messages)
            ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/usr/pkg/lib/python3.13/site-packages/docutils/parsers/rst/states.py", line 370, in new_subsection
            self.parent += section_node
          File "/usr/pkg/lib/python3.13/site-packages/docutils/nodes.py", line 736, in __radd__
            return other + self.children
                   ~~~~~~^~~~~~~~~~~~~~~
        TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'
    

    looks to me the same as before. So it looks like the CRITICAL errors are not the root cause of this.

     
  • Günter Milde

    Günter Milde - 2025-08-08

    You are right. As also seen in [#509], the CRITICAL errors are just on top of the problem (and helped to find the reasong beeing some "docstring reading" extension (plus docstrings that include section headings) beeing incompatible with Docutils 0.22.
    (Unfortunately, the new section algorithm was only tested with Sphinx, not with Sphinx extensions and docstrings containing section headings.)

     

    Related

    Bugs: #509

  • Günter Milde

    Günter Milde - 2025-08-08

    What is strange, though is that Sphinx' autodoc extension does not have a problem with the new section parsing algorithm. Which extension does the extraction of docstrings rsp. the combination of the docstrings into a document?

     
  • Thomas Klausner

    Thomas Klausner - 2025-08-08

    I've tried the attached patch, and with it, the qemu build succeeds, even without the patch I included above.
    There are still a lot of warnings:

    [6203/6204] Generating docs/QEMU manual with a custom command
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:70: CRITICAL: Inconsistent title style: skip from level 1 to 3.
    
    Valid requests
    ^^^^^^^^^^^^^^
    
    Established title styles: =/= - ^ [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:73: CRITICAL: Inconsistent title style: skip from level 1 to 4.
    
    Clock management:
    """""""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:107: CRITICAL: Inconsistent title style: skip from level 1 to 4.
    
    PIO and memory access:
    """"""""""""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:215: CRITICAL: Inconsistent title style: skip from level 1 to 4.
    
    IRQ management:
    """""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:239: CRITICAL: Inconsistent title style: skip from level 1 to 4.
    
    Setting interrupt level:
    """"""""""""""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/qapi-schema.json:3: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Introduction
    ************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/error.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    **********
    QMP errors
    **********
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/common.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Common data types
    *****************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/sockets.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Socket data types
    *****************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/run-state.json:5: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    VM run state
    ************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/crypto.json:5: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Cryptography
    ************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/job.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***************
    Background jobs
    ***************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/block.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *************
    Block devices
    *************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/char.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Character devices
    *****************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/dump.json:7: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Dump guest memory
    *****************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/net.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***********
    Net devices
    ***********
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/ebpf.json:7: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    eBPF Objects
    ************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/rocker.json:4: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ********************
    Rocker switch device
    ********************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/tpm.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *************************************
    TPM (trusted platform module) devices
    *************************************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/ui.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    **************
    Remote desktop
    **************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/ui.json:796: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****
    Input
    *****
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/authz.json:4: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ******************
    User authorization
    ******************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/migration.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *********
    Migration
    *********
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/transaction.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Transactions
    ************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/trace.json:9: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *******
    Tracing
    *******
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/compat.json:4: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ********************
    Compatibility policy
    ********************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/control.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *******************
    QMP monitor control
    *******************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/introspect.json:12: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    QMP introspection
    *****************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/qom.json:12: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***********************
    QEMU Object Model (QOM)
    ***********************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/qdev.json:7: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ****************************
    Device infrastructure (qdev)
    ****************************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/machine-common.json:7: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ********************
    Common machine types
    ********************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/machine.json:7: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ********
    Machines
    ********
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/replay.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *************
    Record/replay
    *************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/yank.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Yank feature
    ************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/misc.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***********
    Miscellanea
    ***********
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/audio.json:9: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****
    Audio
    *****
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/acpi.json:8: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ****
    ACPI
    ****
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/pci.json:8: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***
    PCI
    ***
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/stats.json:11: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    **********
    Statistics
    **********
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/virtio.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    **************
    Virtio devices
    **************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/vfio.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    VFIO devices
    ************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/cryptodev.json:7: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ********************
    Cryptography devices
    ********************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/cxl.json:4: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***********
    CXL devices
    ***********
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../qapi/uefi.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *******************
    UEFI Variable Store
    *******************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/qapi-schema.json:16: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Introduction
    ************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/common.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Common data types
    *****************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/sockets.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Socket data types
    *****************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/crypto.json:5: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Cryptography
    ************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/job.json:4: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***************
    Background jobs
    ***************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/qapi-schema.json:53: CRITICAL: Cannot skip from level 1 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *************
    Block devices
    *************
    
    Established title styles: */* [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/char.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    Character devices
    *****************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/authz.json:4: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ******************
    User authorization
    ******************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/transaction.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ************
    Transactions
    ************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/control.json:5: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *******************
    QMP monitor control
    *******************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/introspect.json:12: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    *****************
    QMP introspection
    *****************
    
    Established title styles: */* = [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../storage-daemon/qapi/../../qapi/qom.json:12: CRITICAL: Cannot skip from level 2 to 1. Current element has only {len(self.parent_sections) parent sections. (Mismatch of `memo.section_styles`, and the root node of a nested parser?)
    
    ***********************
    QEMU Object Model (QOM)
    ***********************
    
    Established title styles: */* = [docutils]
    

    but they don't break the build.

    Thank you!

     
  • Günter Milde

    Günter Milde - 2025-08-11

    Yes, Docutils now checks, whether the new "self.parent" after switching the section level is valid and reports these CRITICAL system messages (downgraded to ERROR in [r10198].

    However, there is still a serious problem: an incompatibility with "qapidoc" rsp sphinx.util.nodes.nested_parse_with_titles().
    This should be fixed in [r10200].

    Can you re-try?
    If it still fails, please run with a "docutils.conf" file in the project directory that sets
    halt_level to 3?

    For added robustness, I recommend that "qapidoc" switches from using sphinx.util.nodes.nested_parse_with_titles() to sphinx.util.parsing.nested_parse_to_nodes() as recommended in the docstring of nested_parse_with_titles();

    This function is retained for compatibility and will be deprecated in
    Sphinx 8. Prefer nested_parse_to_nodes().

    ( The difference is, that nested_parse_to_nodes() does not have a node argument but instead adds the new nodes to a "dummy node" and finally just returnes its children.)

     

    Related

    Commit: [r10198]
    Commit: [r10200]


    Last edit: Günter Milde 2025-08-11
  • Thomas Klausner

    Thomas Klausner - 2025-08-11

    I added the second patch (r10200) as well, and qemu still builds fine. The warnings are now:

    [6203/6204] Generating docs/QEMU manual with a custom command                                                                                                                                            23:12:53 [659/1913]
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../include/hw/qdev-core.h:20: CRITICAL: Inconsistent title style: skip from level 0 to 2.
    
    Realization
    -----------
    
    Established title styles: =/= - [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../include/hw/qdev-core.h:55: CRITICAL: Inconsistent title style: skip from level 0 to 2.
    
    Hiding a device
    ---------------
    
    Established title styles: =/= - [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:70: CRITICAL: Inconsistent title style: skip from level 0 to 3.
    
    Valid requests
    ^^^^^^^^^^^^^^
    
    Established title styles: =/= - ^ [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:73: CRITICAL: Inconsistent title style: skip from level 0 to 4.
    
    Clock management:
    """""""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:107: CRITICAL: Inconsistent title style: skip from level 0 to 4.
    
    PIO and memory access:
    """"""""""""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:215: CRITICAL: Inconsistent title style: skip from level 0 to 4.
    
    IRQ management:
    """""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    /scratch/emulators/qemu/work/qemu-10.0.3/docs/../system/qtest.c:239: CRITICAL: Inconsistent title style: skip from level 0 to 4.
    
    Setting interrupt level:
    """"""""""""""""""""""""
    
    Established title styles: =/= - ^ " [docutils]
    
     
  • Günter Milde

    Günter Milde - 2025-08-13
     
  • Günter Milde

    Günter Milde - 2025-08-13

    Did you check the generated HTML for missing section headings?
    While the build runs without crashing, there are still serious errors.

    Unfortunately, I cannot replicate or trace the reason.
    Here is what I found so far:

    The error is in docstrings that are collected by a Sphinx extension (qapidoc?).

    The error message tells, that the parser expects a consistent hierarchy of title adornment styles (i.e. sections in docstrings under/overlined with *, subsections underlined with -). Docstrings using this style (e.g. /scratch/emulators/qemu/work/qemu-10.0.3/qapi/pci.json) don't report an error any more.

    The mystery is, that Sphinx "autodoc" and (as far as I can see in the source) "qapidoc" set up a "fresh" title style hierarchy for docstrings (with the auxiliary functions nested_parse_with_titles() rsp. nested_parse_to_nodes()).
    Nevertheless, the docstrings in include/hw/qdev-core.h and system/qtest.c are parsed with a non-empty section title style hierarchy.

    The traceback of a run with a "docutils.conf" file in the project directory that sets
    halt_level to 3 may give some hints.

    As a workaround, you may consider "normalizing" the section title adornments in include/hw/qdev-core.h and system/qtest.c.

     
    • Anonymous

      Anonymous - 2025-08-14

      The docstrings in this case are not from the qapidoc sphinx extension, but from docs/sphinx/kerneldoc.py (which we have borrowed from the Linux kernel's sphinx documentation).

       
      • Günter Milde

        Günter Milde - 2025-08-15

        Looking at docs/sphinx/kerneldoc.py, I see that it uses Docutil's RSTState.nested_parse() which (up to now) forces a consistent title style hierarchy.
        OTOH, quapidoc uses Sphinx's nested_parse_with_titles() that starts a new title style hierarchy.
        Could you check, if the remaining CRITICAL errors also show up with Docutils 0.21?

         
  • Thomas Klausner

    Thomas Klausner - 2025-08-13

    I've now reported this to the qemu project at
    https://gitlab.com/qemu-project/qemu/-/issues/3077

     
  • Günter Milde

    Günter Milde - 2025-08-14

    I am working on a fix...

     
  • Thomas Klausner

    Thomas Klausner - 2025-08-15

    The precedence errors are there with docutils 0.21 as well:

    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    

    but none of the CRITICAL ones.

     

    Last edit: Thomas Klausner 2025-08-15
    • Peter Maydell

      Peter Maydell - 2025-08-15

      Those "possible precedence problem" warnings are from the kernel-doc perl script -- I guess that you're using a new version of Perl which emits the warnings. They shouldn't be relevant to this docutils issue, I think.

      (We're going to upgrade our kernel-doc script to the kernel's current one, which is a complete rewrite in Python; that will fix these warnings as a side effect.)

       
  • Günter Milde

    Günter Milde - 2025-08-15

    Could you re-try with a checkout or snapshot of [r10204] that introduces independent section title style hierarchies for nested parsing?

     

    Related

    Commit: [r10204]

  • Thomas Klausner

    Thomas Klausner - 2025-08-17

    I applied all changes since the 0.22 release to my copy (except the version bump in init.py) There are no CRITICAL errors, the section of the build looks like this:

    [6203/6204] Generating docs/QEMU manual with a custom command
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    [6204/6204] Generating docs/QEMU man pages with a custom command
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    Possible precedence problem between ! and pattern match (m//) at /scratch/emulators/qemu/work/qemu-10.0.3/docs/../scripts/kernel-doc line 1597.
    
     
  • Günter Milde

    Günter Milde - 2025-08-18

    Good news.
    The remaining warnings are from a different issue (see the comment by Peter Maydell).
    I will do some more testing and cleanups. Then we can release a new Docutils version.
    Thank you for report and testing.

     
  • Günter Milde

    Günter Milde - 2025-09-06
    • status: open --> open-fixed
     
  • Günter Milde

    Günter Milde - 2025-09-06

    This should be fixed in [r10227]. Could you re-try?

     

    Related

    Commit: [r10227]

  • Thomas Klausner

    Thomas Klausner - 2025-09-14

    Just to confirm, with the code changes between 0.22 and r10233 applied to 0.22, qemu still builds.

     
  • Günter Milde

    Günter Milde - 2025-09-15

    Thank you for testing. so it should be fine with Docutils 0.22.1.rc1.

     
  • Günter Milde

    Günter Milde - 2025-09-18
    • status: open-fixed --> closed-fixed
     
  • Günter Milde

    Günter Milde - 2025-09-18

    Fixed in Docutils 0.22.1.
    Please reopen if there are still problems.
    Thank you for reporting and tests.

     
1 2 > >> (Page 1 of 2)

Log in to post a comment.