Skip to content

Commit

Permalink
Clean up the CNAME file in sphinx.ext.githubpages (#11295)
Browse files Browse the repository at this point in the history
Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
  • Loading branch information
marxin and AA-Turner committed Apr 6, 2023
1 parent c1c2d75 commit 26eb2ef
Showing 1 changed file with 38 additions and 13 deletions.
51 changes: 38 additions & 13 deletions sphinx/ext/githubpages.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,52 @@
from __future__ import annotations

import os
import urllib
import urllib.parse
from typing import Any

import sphinx
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment


def _get_domain_from_url(url: str) -> str:
"""Get the domain from a URL."""
return url and urllib.parse.urlparse(url).hostname or ''


def create_nojekyll_and_cname(app: Sphinx, env: BuildEnvironment) -> None:
if app.builder.format == 'html':
open(os.path.join(app.builder.outdir, '.nojekyll'), 'wb').close()

html_baseurl = app.config.html_baseurl
if html_baseurl:
domain = urllib.parse.urlparse(html_baseurl).hostname
if domain and not domain.endswith(".github.io"):
with open(os.path.join(app.builder.outdir, 'CNAME'), 'w',
encoding="utf-8") as f:
# NOTE: don't write a trailing newline. The `CNAME` file that's
# auto-generated by the Github UI doesn't have one.
f.write(domain)
"""Manage the ``.nojekyll`` and ``CNAME`` files for GitHub Pages.
For HTML-format builders (e.g. 'html', 'dirhtml') we unconditionally create
the ``.nojekyll`` file to signal that GitHub Pages should not run Jekyll
processing.
If the :confval:`html_baseurl` option is set, we also create a CNAME file
with the domain from ``html_baseurl``, so long as it is not a ``github.io``
domain.
If this extension is loaded and the domain in ``html_baseurl`` no longer
requires a CNAME file, we remove any existing ``CNAME`` files from the
output directory.
"""
if app.builder.format != 'html':
return

open(os.path.join(app.builder.outdir, '.nojekyll'), 'wb').close()
cname_path = os.path.join(app.builder.outdir, 'CNAME')

domain = _get_domain_from_url(app.config.html_baseurl)
# Filter out GitHub Pages domains, as they do not require CNAME files.
if domain and not domain.endswith(".github.io"):
with open(cname_path, 'w', encoding="utf-8") as f:
# NOTE: don't write a trailing newline. The `CNAME` file that's
# auto-generated by the GitHub UI doesn't have one.
f.write(domain)
else:
try:
os.unlink(cname_path)
except FileNotFoundError:
pass


def setup(app: Sphinx) -> dict[str, Any]:
Expand Down

0 comments on commit 26eb2ef

Please sign in to comment.