Fix #10104: gettext: Duplicated locations are output to pot file

When 3rd party extension does not provide line number for each message,
duplicated locations are output to pot file unexpectedly.  This filters
duplicated locations before generationg pot file.
This commit is contained in:
Takeshi KOMIYA 2022-05-23 00:37:45 +09:00
parent cab2d93076
commit 51c84e041f
3 changed files with 24 additions and 1 deletions

View File

@ -21,6 +21,8 @@ Bugs fixed
* #9648: autodoc: ``*args`` and ``**kwargs`` entries are duplicated when
``autodoc_typehints="description"``
* #10443: epub: EPUB builder can't detect the mimetype of .webp file
* #10104: gettext: Duplicated locations are shown if 3rd party extension does
not provide correct information
* #10456: py domain: ``:meta:`` fields are displayed if docstring contains two
or more meta-field
* #9096: sphinx-build: the value of progress bar for paralle build is wrong

View File

@ -57,7 +57,8 @@ class Catalog:
def __iter__(self) -> Generator[Message, None, None]:
for message in self.messages:
positions = [(source, line) for source, line, uuid in self.metadata[message]]
positions = sorted(set((source, line) for source, line, uuid
in self.metadata[message]))
uuids = [uuid for source, line, uuid in self.metadata[message]]
yield Message(message, positions, uuids)

View File

@ -8,9 +8,29 @@ from subprocess import PIPE, CalledProcessError
import pytest
from sphinx.builders.gettext import Catalog, MsgOrigin
from sphinx.util.osutil import cd
def test_Catalog_duplicated_message():
catalog = Catalog()
catalog.add('hello', MsgOrigin('/path/to/filename', 1))
catalog.add('hello', MsgOrigin('/path/to/filename', 1))
catalog.add('hello', MsgOrigin('/path/to/filename', 2))
catalog.add('hello', MsgOrigin('/path/to/yetanother', 1))
catalog.add('world', MsgOrigin('/path/to/filename', 1))
assert len(list(catalog)) == 2
msg1, msg2 = list(catalog)
assert msg1.text == 'hello'
assert msg1.locations == [('/path/to/filename', 1),
('/path/to/filename', 2),
('/path/to/yetanother', 1)]
assert msg2.text == 'world'
assert msg2.locations == [('/path/to/filename', 1)]
@pytest.mark.sphinx('gettext', srcdir='root-gettext')
def test_build_gettext(app):
# Generic build; should fail only when the builder is horribly broken.