Skip to content

Commit 05eb98c

Browse files
committed
Respect use_directory_urls when generating redirects for an alias
1 parent 79827d4 commit 05eb98c

File tree

10 files changed

+189
-60
lines changed

10 files changed

+189
-60
lines changed

mike/commands.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import http.server
22
import os
3+
import posixpath
34
from jinja2 import Template
45
from pkg_resources import resource_stream
56

@@ -19,10 +20,13 @@ def _redirect_template(user_template=None):
1920
return Template(f.read().decode('utf-8'), autoescape=True)
2021

2122

22-
def _add_redirect_to_commit(commit, template, src, dst):
23+
def _add_redirect_to_commit(commit, template, src, dst,
24+
use_directory_urls=True):
2325
if os.path.splitext(src)[1] == '.html':
2426
reldst = os.path.relpath(dst, os.path.dirname(src))
2527
href = '/'.join(reldst.split(os.path.sep))
28+
if use_directory_urls and posixpath.basename(href) == 'index.html':
29+
href = posixpath.dirname(href) + '/'
2630
commit.add_file(git_utils.FileInfo(src, template.render(href=href)))
2731

2832

@@ -45,7 +49,7 @@ def make_nojekyll():
4549
return git_utils.FileInfo('.nojekyll', '')
4650

4751

48-
def deploy(site_dir, version, title=None, aliases=[], update_aliases=False,
52+
def deploy(cfg, version, title=None, aliases=[], update_aliases=False,
4953
redirect=True, template=None, *, branch='gh-pages', message=None,
5054
prefix=''):
5155
if message is None:
@@ -72,14 +76,16 @@ def deploy(site_dir, version, title=None, aliases=[], update_aliases=False,
7276
with git_utils.Commit(branch, message) as commit:
7377
commit.delete_files([version_str] + list(info.aliases))
7478

75-
for f in git_utils.walk_real_files(site_dir):
76-
canonical_file = f.copy(destdir, site_dir)
79+
for f in git_utils.walk_real_files(cfg.site_dir):
80+
canonical_file = f.copy(destdir, cfg.site_dir)
7781
commit.add_file(canonical_file)
7882
for d in alias_destdirs:
79-
alias_file = f.copy(d, site_dir)
83+
alias_file = f.copy(d, cfg.site_dir)
8084
if redirect:
81-
_add_redirect_to_commit(commit, t, alias_file.path,
82-
canonical_file.path)
85+
_add_redirect_to_commit(
86+
commit, t, alias_file.path, canonical_file.path,
87+
cfg.use_directory_urls
88+
)
8389
else:
8490
commit.add_file(alias_file)
8591

@@ -125,8 +131,8 @@ def delete(versions=None, all=False, *, branch='gh-pages', message=None,
125131
commit.add_file(versions_to_file_info(all_versions, prefix))
126132

127133

128-
def alias(version, aliases, redirect=True, template=None, *, branch='gh-pages',
129-
message=None, prefix=''):
134+
def alias(cfg, version, aliases, redirect=True, template=None, *,
135+
branch='gh-pages', message=None, prefix=''):
130136
all_versions = list_versions(branch, prefix)
131137
try:
132138
real_version = all_versions.find(version, strict=True)[0]
@@ -158,8 +164,10 @@ def alias(version, aliases, redirect=True, template=None, *, branch='gh-pages',
158164
for d in destdirs:
159165
alias_file = canonical_file.copy(d, canonical_dir)
160166
if redirect:
161-
_add_redirect_to_commit(commit, t, alias_file.path,
162-
canonical_file.path)
167+
_add_redirect_to_commit(
168+
commit, t, alias_file.path, canonical_file.path,
169+
cfg.use_directory_urls
170+
)
163171
else:
164172
commit.add_file(alias_file)
165173
commit.add_file(versions_to_file_info(all_versions, prefix))

mike/driver.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def deploy(args):
7878
check_remote_status(args, strict=True)
7979
with mkdocs_utils.inject_plugin(args.config_file) as config_file:
8080
mkdocs_utils.build(config_file, args.version)
81-
commands.deploy(cfg.site_dir, args.version, args.title, args.alias,
81+
commands.deploy(cfg, args.version, args.title, args.alias,
8282
args.update_aliases, args.redirect, args.template,
8383
branch=args.branch, message=args.message,
8484
prefix=args.prefix)
@@ -96,9 +96,9 @@ def delete(args):
9696

9797

9898
def alias(args):
99-
load_mkdocs_config(args)
99+
cfg = load_mkdocs_config(args)
100100
check_remote_status(args, strict=True)
101-
commands.alias(args.version, args.alias, args.redirect, args.template,
101+
commands.alias(cfg, args.version, args.alias, args.redirect, args.template,
102102
branch=args.branch, message=args.message,
103103
prefix=args.prefix)
104104
if args.push:

mike/mkdocs_utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def __init__(self, config_file):
1616
config.get('site_dir', 'site'))
1717
self.remote_name = config.get('remote_name', 'origin')
1818
self.remote_branch = config.get('remote_branch', 'gh-pages')
19+
self.use_directory_urls = config.get('use_directory_urls', True)
1920

2021

2122
@contextmanager

test/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ def git_init():
6868

6969
def commit_files(filenames, message='add file'):
7070
for f in filenames:
71+
dirname = os.path.dirname(f)
72+
if dirname:
73+
os.makedirs(dirname, exist_ok=True)
7174
open(f, 'w').close()
7275
check_call_silent(['git', 'add', f])
7376
check_call_silent(['git', 'commit', '-m', message])
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# MkDocs
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Page
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
site_name: test
2+
theme: mkdocs
3+
use_directory_urls: false
4+
5+
nav:
6+
- Home: index.md
7+
- Page: page.md

test/integration/test_alias.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import os
2+
import re
23
import unittest
34

45
from . import assertPopen, assertOutput
56
from .. import *
67
from mike import git_utils, versions
78

89

10+
def match_redir(url):
11+
return r'window\.location\.replace\("{}"\)'.format(re.escape(url))
12+
13+
914
class AliasTestCase(unittest.TestCase):
1015
def _deploy(self, branch=None, versions=['1.0'], prefix=''):
1116
extra_args = ['-b', branch] if branch else []
@@ -57,6 +62,9 @@ def test_alias(self):
5762
check_call_silent(['git', 'checkout', 'gh-pages'])
5863
self._test_alias()
5964

65+
with open('latest/index.html') as f:
66+
self.assertRegex(f.read(), match_redir('../1.0/'))
67+
6068
def test_alias_copy(self):
6169
self._deploy()
6270
assertPopen(['mike', 'alias', '1.0', 'latest', '--no-redirect'])
@@ -69,9 +77,9 @@ def test_aliases_custom_template(self):
6977
os.path.join(test_data_dir, 'template.html')])
7078
check_call_silent(['git', 'checkout', 'gh-pages'])
7179
self._test_alias()
80+
7281
with open('latest/index.html') as f:
73-
self.assertRegex(f.read(),
74-
r'^Redirecting to \.\./1\.0/index.html$')
82+
self.assertEqual(f.read(), 'Redirecting to ../1.0/')
7583

7684
def test_from_subdir(self):
7785
self._deploy()
@@ -83,15 +91,6 @@ def test_from_subdir(self):
8391
check_call_silent(['git', 'checkout', 'gh-pages'])
8492
self._test_alias()
8593

86-
def test_from_subdir_explicit_branch(self):
87-
self._deploy()
88-
os.mkdir('sub')
89-
with pushd('sub'):
90-
assertPopen(['mike', 'alias', '1.0', 'latest', '-b', 'gh-pages',
91-
'-r', 'origin'])
92-
check_call_silent(['git', 'checkout', 'gh-pages'])
93-
self._test_alias()
94-
9594
def test_branch(self):
9695
self._deploy('branch')
9796
assertPopen(['mike', 'alias', '1.0', 'latest', '-b', 'branch'])
@@ -259,3 +258,22 @@ def test_explicit_remote(self):
259258
check_call_silent(['git', 'checkout', 'mybranch'])
260259
self._test_alias()
261260
self._test_rev('mybranch')
261+
262+
263+
class TestAliasNoDirectoryUrls(AliasTestCase):
264+
def setUp(self):
265+
self.stage = stage_dir('alias_no_directory_urls')
266+
git_init()
267+
copytree(os.path.join(test_data_dir, 'no_directory_urls'), self.stage)
268+
check_call_silent(['git', 'add', 'mkdocs.yml', 'docs'])
269+
check_call_silent(['git', 'commit', '-m', 'initial commit'])
270+
271+
def test_default(self):
272+
self._deploy()
273+
assertPopen(['mike', 'alias', '1.0', 'latest'])
274+
check_call_silent(['git', 'checkout', 'gh-pages'])
275+
276+
with open('latest/index.html') as f:
277+
self.assertRegex(f.read(), match_redir('../1.0/index.html'))
278+
with open('latest/page.html') as f:
279+
self.assertRegex(f.read(), match_redir('../1.0/page.html'))

test/integration/test_deploy.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import os
2+
import re
23
import unittest
34

45
from . import assertPopen, assertOutput
56
from .. import *
67
from mike import git_utils, versions
78

89

10+
def match_redir(url):
11+
return r'window\.location\.replace\("{}"\)'.format(re.escape(url))
12+
13+
914
class DeployTestCase(unittest.TestCase):
1015
def _test_deploy(self, expected_message=None,
1116
expected_versions=[versions.VersionInfo('1.0')],
@@ -65,6 +70,8 @@ def test_aliases(self):
6570
self._test_deploy(expected_versions=[
6671
versions.VersionInfo('1.0', aliases=['latest'])
6772
])
73+
with open('latest/index.html') as f:
74+
self.assertRegex(f.read(), match_redir('../1.0/'))
6875

6976
def test_aliases_copy(self):
7077
assertPopen(['mike', 'deploy', '1.0', 'latest', '--no-redirect'])
@@ -73,17 +80,17 @@ def test_aliases_copy(self):
7380
versions.VersionInfo('1.0', aliases=['latest'])
7481
], redirect=False)
7582

76-
def test_aliases_custom_template(self):
83+
def test_aliases_custom_redirect(self):
7784
assertPopen(['mike', 'deploy', '1.0', 'latest', '-T',
7885
os.path.join(test_data_dir, 'template.html')])
7986
check_call_silent(['git', 'checkout', 'gh-pages'])
8087
self._test_deploy(expected_versions=[
8188
versions.VersionInfo('1.0', aliases=['latest'])
8289
])
8390
check_call_silent(['git', 'checkout', 'gh-pages'])
91+
8492
with open('latest/index.html') as f:
85-
self.assertRegex(f.read(),
86-
r'^Redirecting to \.\./1\.0/index.html$')
93+
self.assertEqual(f.read(), 'Redirecting to ../1.0/')
8794

8895
def test_update(self):
8996
assertPopen(['mike', 'deploy', '1.0', 'latest'])
@@ -320,3 +327,22 @@ def test_explicit_remote(self):
320327
check_call_silent(['git', 'checkout', 'mybranch'])
321328
self._test_deploy()
322329
self._test_rev('mybranch')
330+
331+
332+
class TestDeployNoDirectoryUrls(unittest.TestCase):
333+
def setUp(self):
334+
self.stage = stage_dir('deploy_no_directory_urls')
335+
git_init()
336+
copytree(os.path.join(test_data_dir, 'no_directory_urls'), self.stage)
337+
check_call_silent(['git', 'add', 'mkdocs.yml', 'docs'])
338+
check_call_silent(['git', 'commit', '-m', 'initial commit'])
339+
340+
def test_default(self):
341+
assertPopen(['mike', 'deploy', '1.0', 'latest'])
342+
check_call_silent(['git', 'checkout', 'gh-pages'])
343+
344+
with open('latest/index.html') as f:
345+
self.assertRegex(f.read(), match_redir('../1.0/index.html'))
346+
with open('latest/page.html') as f:
347+
self.assertRegex(f.read(),
348+
match_redir('../1.0/page.html'))

0 commit comments

Comments
 (0)