From 13ca2323a9f498699ba2764746f5eca29f372fc4 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 6 Feb 2020 23:19:03 +0900 Subject: [PATCH] Fix #7095: dirhtml: Cross references are broken via intersphinx and :doc: --- CHANGES | 1 + sphinx/util/inventory.py | 2 +- tests/roots/test-builder-dirhtml/bar.rst | 4 ++ tests/roots/test-builder-dirhtml/conf.py | 0 .../roots/test-builder-dirhtml/foo/foo_1.rst | 4 ++ .../roots/test-builder-dirhtml/foo/foo_2.rst | 4 ++ .../roots/test-builder-dirhtml/foo/index.rst | 9 ++++ tests/roots/test-builder-dirhtml/index.rst | 9 ++++ tests/test_build_dirhtml.py | 47 +++++++++++++++++++ 9 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/roots/test-builder-dirhtml/bar.rst create mode 100644 tests/roots/test-builder-dirhtml/conf.py create mode 100644 tests/roots/test-builder-dirhtml/foo/foo_1.rst create mode 100644 tests/roots/test-builder-dirhtml/foo/foo_2.rst create mode 100644 tests/roots/test-builder-dirhtml/foo/index.rst create mode 100644 tests/roots/test-builder-dirhtml/index.rst create mode 100644 tests/test_build_dirhtml.py diff --git a/CHANGES b/CHANGES index 7e8d70b2b..448fbd7f6 100644 --- a/CHANGES +++ b/CHANGES @@ -83,6 +83,7 @@ Bugs fixed * #6889: autodoc: Trailing comma in ``:members::`` option causes cryptic warning * #7055: linkcheck: redirect is treated as an error * #7090: std domain: Can't assign numfig-numbers for custom container nodes +* #7095: dirhtml: Cross references are broken via intersphinx and ``:doc:`` role Testing -------- diff --git a/sphinx/util/inventory.py b/sphinx/util/inventory.py index 64f4ef4e3..9b647ccac 100644 --- a/sphinx/util/inventory.py +++ b/sphinx/util/inventory.py @@ -122,7 +122,7 @@ class InventoryFile: for line in stream.read_compressed_lines(): # be careful to handle names with embedded spaces correctly - m = re.match(r'(?x)(.+?)\s+(\S*:\S*)\s+(-?\d+)\s+(\S+)\s+(.*)', + m = re.match(r'(?x)(.+?)\s+(\S*:\S*)\s+(-?\d+)\s+?(\S*)\s+(.*)', line.rstrip()) if not m: continue diff --git a/tests/roots/test-builder-dirhtml/bar.rst b/tests/roots/test-builder-dirhtml/bar.rst new file mode 100644 index 000000000..11f287a18 --- /dev/null +++ b/tests/roots/test-builder-dirhtml/bar.rst @@ -0,0 +1,4 @@ +.. _bar: + +bar +=== diff --git a/tests/roots/test-builder-dirhtml/conf.py b/tests/roots/test-builder-dirhtml/conf.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/roots/test-builder-dirhtml/foo/foo_1.rst b/tests/roots/test-builder-dirhtml/foo/foo_1.rst new file mode 100644 index 000000000..6db0ea57e --- /dev/null +++ b/tests/roots/test-builder-dirhtml/foo/foo_1.rst @@ -0,0 +1,4 @@ +.. _foo_1: + +foo/foo_1 +========= diff --git a/tests/roots/test-builder-dirhtml/foo/foo_2.rst b/tests/roots/test-builder-dirhtml/foo/foo_2.rst new file mode 100644 index 000000000..fae7f26ef --- /dev/null +++ b/tests/roots/test-builder-dirhtml/foo/foo_2.rst @@ -0,0 +1,4 @@ +.. _foo_2: + +foo/foo_2 +========= diff --git a/tests/roots/test-builder-dirhtml/foo/index.rst b/tests/roots/test-builder-dirhtml/foo/index.rst new file mode 100644 index 000000000..92d473c6b --- /dev/null +++ b/tests/roots/test-builder-dirhtml/foo/index.rst @@ -0,0 +1,9 @@ +.. _foo: + +foo/index +========= + +.. toctree:: + + foo_1 + foo_2 diff --git a/tests/roots/test-builder-dirhtml/index.rst b/tests/roots/test-builder-dirhtml/index.rst new file mode 100644 index 000000000..274e17793 --- /dev/null +++ b/tests/roots/test-builder-dirhtml/index.rst @@ -0,0 +1,9 @@ +.. _index: + +index +===== + +.. toctree:: + + foo/index + bar diff --git a/tests/test_build_dirhtml.py b/tests/test_build_dirhtml.py new file mode 100644 index 000000000..715db1146 --- /dev/null +++ b/tests/test_build_dirhtml.py @@ -0,0 +1,47 @@ +""" + test_build_dirhtml + ~~~~~~~~~~~~~~~~~~ + + Test dirhtml builder. + + :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import posixpath + +import pytest + +from sphinx.util.inventory import InventoryFile + + +@pytest.mark.sphinx(buildername='dirhtml', testroot='builder-dirhtml') +def test_dirhtml(app, status, warning): + app.build() + + assert (app.outdir / 'index.html').exists() + assert (app.outdir / 'foo/index.html').exists() + assert (app.outdir / 'foo/foo_1/index.html').exists() + assert (app.outdir / 'foo/foo_2/index.html').exists() + assert (app.outdir / 'bar/index.html').exists() + + content = (app.outdir / 'index.html').text() + assert 'href="foo/"' in content + assert 'href="foo/foo_1/"' in content + assert 'href="foo/foo_2/"' in content + assert 'href="bar/"' in content + + # objects.inv (refs: #7095) + f = (app.outdir / 'objects.inv').open('rb') + invdata = InventoryFile.load(f, 'path/to', posixpath.join) + assert 'index' in invdata.get('std:doc') + assert ('Python', '', 'path/to/', '-') == invdata['std:doc']['index'] + + assert 'foo/index' in invdata.get('std:doc') + assert ('Python', '', 'path/to/foo/', '-') == invdata['std:doc']['foo/index'] + + assert 'index' in invdata.get('std:label') + assert ('Python', '', 'path/to/#index', '-') == invdata['std:label']['index'] + + assert 'foo' in invdata.get('std:label') + assert ('Python', '', 'path/to/foo/#foo', 'foo/index') == invdata['std:label']['foo']