Skip to content

Commit f8ac3c7

Browse files
authored
Ensure theme files do not override docs_dir files (#1672)
Fixes #1671.
1 parent 00d7383 commit f8ac3c7

3 files changed

Lines changed: 36 additions & 5 deletions

File tree

docs/about/release-notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ your global navigation uses more than one level, things will likely be broken.
5656

5757
### Other Changes and Additions to Version 1.1
5858

59+
* Bugfix: Ensure theme files do not override `docs_dir` files (#1671).
5960
* Bugfix: Do not normalize URL fragments (#1655).
6061
* Add canonical tag to `readthedocs` theme (#1669).
6162

mkdocs/structure/files.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ def filter(name):
7373
return False
7474
return True
7575
for path in env.list_templates(filter_func=filter):
76-
for dir in config['theme'].dirs:
77-
# Find the first theme dir which contains path
78-
if os.path.isfile(os.path.join(dir, path)):
79-
self.append(File(path, dir, config['site_dir'], config['use_directory_urls']))
80-
break
76+
# Theme files do not override docs_dir files
77+
if path not in self:
78+
for dir in config['theme'].dirs:
79+
# Find the first theme dir which contains path
80+
if os.path.isfile(os.path.join(dir, path)):
81+
self.append(File(path, dir, config['site_dir'], config['use_directory_urls']))
82+
break
8183

8284

8385
class File(object):

mkdocs/tests/structure/file_tests.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,34 @@ def test_files(self):
306306
self.assertTrue(extra_file.src_path in files)
307307
self.assertEqual(files.documentation_pages(), [fs[0], fs[1], extra_file])
308308

309+
@tempdir(files=[
310+
'favicon.ico',
311+
'index.md'
312+
])
313+
@tempdir(files=[
314+
'base.html',
315+
'favicon.ico',
316+
'style.css'
317+
])
318+
def test_add_files_from_theme(self, tdir, ddir):
319+
config = load_config(docs_dir=ddir, theme={'name': None, 'custom_dir': tdir})
320+
env = config['theme'].get_env()
321+
files = get_files(config)
322+
self.assertEqual(
323+
[file.src_path for file in files],
324+
['index.md', 'favicon.ico']
325+
)
326+
files.add_files_from_theme(env, config)
327+
self.assertEqual(
328+
[file.src_path for file in files],
329+
['index.md', 'favicon.ico', 'style.css']
330+
)
331+
# Ensure theme file does not override docs_dir file
332+
self.assertEqual(
333+
files.get_file_from_path('favicon.ico').abs_src_path,
334+
os.path.normpath(os.path.join(ddir, 'favicon.ico'))
335+
)
336+
309337
def test_filter_paths(self):
310338
# Root level file
311339
self.assertFalse(_filter_paths('foo.md', 'foo.md', False, ['bar.md']))

0 commit comments

Comments
 (0)