diff --git a/CHANGES b/CHANGES index 5a7c980b1..7462381a4 100644 --- a/CHANGES +++ b/CHANGES @@ -61,6 +61,8 @@ Bugs fixed * C, C++: in general fix intersphinx and role lookup types. * #8683: :confval:`html_last_updated_fmt` does not support UTC offset (%z) * #8683: :confval:`html_last_updated_fmt` generates wrong time zone for %Z +* #1112: ``download`` role creates duplicated copies when relative path is + specified Testing -------- diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py index be5e52f49..af3e2b8d5 100644 --- a/sphinx/environment/__init__.py +++ b/sphinx/environment/__init__.py @@ -10,6 +10,7 @@ import os import pickle +import posixpath import warnings from collections import defaultdict from copy import copy @@ -356,9 +357,9 @@ class BuildEnvironment: docdir = path.dirname(self.doc2path(docname or self.docname, base=None)) rel_fn = path.join(docdir, filename) - # the path.abspath() might seem redundant, but otherwise artifacts - # such as ".." will remain in the path - return rel_fn, path.abspath(path.join(self.srcdir, rel_fn)) + + return (posixpath.normpath(rel_fn), + path.normpath(path.join(self.srcdir, rel_fn))) @property def found_docs(self) -> Set[str]: diff --git a/tests/test_environment.py b/tests/test_environment.py index ccf396d9c..9791c2d5b 100644 --- a/tests/test_environment.py +++ b/tests/test_environment.py @@ -138,6 +138,11 @@ def test_env_relfn2path(app): assert relfn == '../logo.jpg' assert absfn == app.srcdir.parent / 'logo.jpg' + # relative path traversal + relfn, absfn = app.env.relfn2path('subdir/../logo.jpg', 'index') + assert relfn == 'logo.jpg' + assert absfn == app.srcdir / 'logo.jpg' + # omit docname (w/ current docname) app.env.temp_data['docname'] = 'subdir/document' relfn, absfn = app.env.relfn2path('images/logo.jpg')