This was originally observed when buiding Python 3.3 docs (more precisely, library/unittest.mock-examples.txt) with Sphinx, but here is a minimal test case:
$ svn info | grep ^Revision
Revision: 7623
$ cat simple.rst
`__iter__ <http://example.com/#__iter__>`_.
$ ./tools/rst2html.py simple.rst --traceback
Traceback (most recent call last):
File "./tools/rst2html.py", line 23, in <module>
publish_cmdline(writer_name='html', description=description)
File "/usr/lib/python2.7/dist-packages/docutils/core.py", line 352, in publish_cmdline
config_section=config_section, enable_exit_status=enable_exit_status)
File "/usr/lib/python2.7/dist-packages/docutils/core.py", line 218, in publish
self.apply_transforms()
File "/usr/lib/python2.7/dist-packages/docutils/core.py", line 199, in apply_transforms
self.document.transformer.apply_transforms()
File "/usr/lib/python2.7/dist-packages/docutils/transforms/__init__.py", line 171, in apply_transforms
transform.apply(**kwargs)
File "/usr/lib/python2.7/dist-packages/docutils/transforms/references.py", line 211, in apply
self.resolve_indirect_target(target)
File "/usr/lib/python2.7/dist-packages/docutils/transforms/references.py", line 227, in resolve_indirect_target
self.nonexistent_indirect_target(target)
File "/usr/lib/python2.7/dist-packages/docutils/transforms/references.py", line 264, in nonexistent_indirect_target
self.indirect_target_error(target, 'which does not exist')
File "/usr/lib/python2.7/dist-packages/docutils/transforms/references.py", line 278, in indirect_target_error
naming += '(id="%s")' % target['ids'][0]
IndexError: list index out of range
This is not a regression, but a problem with the specific kind of reference/reference name.
The anonymous link `__iter__ <http://example.com/#__iter__>`__ works.
The "traditional" link::
`__iter__`_
.. _`__iter__`: http://example.com/#__iter__
fails as well. I suppose there is no support for refnames with leading underscore.
@milde: actually, I agree with the OP. This is definitely a bug, and it is a regression. It worked fine (no error, correct output, both traditional and inline URI) in r7597. A change since then must have introduced this bug (therefore, a regression).
Also, how about always treating references that start with URI scheme (i.e. [a-z]*://) as URIs? This will allow us to keep backwards compatibility, and people are unlikely to use such strings as aliases.
I agree that this is a bug, A more clear test case is::
An `embedded alias <alias_>`_ with unknown reference.
However, I would not call it a regression.
It worked fine before the introduction of embedded alias references because then the embedded
link was a URI while now (without escaping the trailing underline) it is an alias. The correct form ::
`__iter__ <http://example.com/#__iter_\_>`_.
works fine.
I added a fix/workaround in transforms/references.py and a test case.
@David: Could you please look if the fix is OK?
@Dmitry: the suggestion to let a URI scheme override the trailing backslash should be discussed separately
(especially as it does not solve the problem of an embedded alias with missing target).
Thanks, it doesn't fail now (but creates a System Message instead).
> @Dmitry: the suggestion to let a URI scheme override the trailing backslash
> should be discussed separately
> (especially as it does not solve the problem of an embedded alias with
> missing target).
It doesn't solve that, but it makes sure that we don't break existing projects (like Python's documentation). For example, at the moment I don't see any way to make my example work with both "old" and "new" docutils.