diff options
author | Jack Lloyd <[email protected]> | 2017-09-28 12:26:25 -0400 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2017-09-28 12:26:25 -0400 |
commit | a5449f0bc63c96ab6d3c7692bd49a685d2cc36f4 (patch) | |
tree | eae595820fbc48d6b4370b34c05ae523feacfe55 | |
parent | d848d6ffbaf715c752da93312f2fce395ffc03b3 (diff) |
Rewrite website generator script in Python
-rw-r--r-- | src/configs/sphinx/conf.py | 2 | ||||
-rwxr-xr-x | src/scripts/ci_build.py | 3 | ||||
-rwxr-xr-x | src/scripts/website.py | 141 | ||||
-rwxr-xr-x | src/scripts/website.sh | 48 |
4 files changed, 144 insertions, 50 deletions
diff --git a/src/configs/sphinx/conf.py b/src/configs/sphinx/conf.py index 05888e064..ffd2ecd39 100644 --- a/src/configs/sphinx/conf.py +++ b/src/configs/sphinx/conf.py @@ -173,7 +173,7 @@ html_last_updated_fmt = '%Y-%m-%d' #html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +html_show_sourcelink = False # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. html_show_sphinx = False diff --git a/src/scripts/ci_build.py b/src/scripts/ci_build.py index ca339db65..7cd676b2d 100755 --- a/src/scripts/ci_build.py +++ b/src/scripts/ci_build.py @@ -201,7 +201,7 @@ def run_cmd(cmd, root_dir): """ Execute a command, die if it failed """ - print("Running '%s':\n" % (' '.join(cmd))) + print("Running '%s' ..." % (' '.join(cmd))) sys.stdout.flush() start = time.time() @@ -357,6 +357,7 @@ def main(args=None): 'src/python/botan2.py', 'src/scripts/ci_build.py', 'src/scripts/install.py', + 'src/scripts/website.py', 'src/scripts/python_unittests.py', 'src/scripts/python_unittests_unix.py'] diff --git a/src/scripts/website.py b/src/scripts/website.py new file mode 100755 index 000000000..cffa570c3 --- /dev/null +++ b/src/scripts/website.py @@ -0,0 +1,141 @@ +#!/usr/bin/python + +""" +Generate the Botan website + +(C) 2017 Jack Lloyd +""" + +import optparse # pylint: disable=deprecated-module +import subprocess +import sys +import errno +import shutil +import tempfile +import os + +def run_and_check(proc, proc_name): + (stdout, stderr) = proc.communicate() + + if proc.returncode != 0: + print("Error running ", proc_name) + print(stdout) + print(stderr) + sys.exit(1) + +def configure_build(botan_dir, build_dir): + + configure = subprocess.Popen([os.path.join(botan_dir, 'configure.py'), + '--with-doxygen', '--with-sphinx', + '--with-build-dir=%s' % (build_dir)], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + run_and_check(configure, 'configure.py') + +def run_doxygen(tmp_dir, output_dir): + doxygen = subprocess.Popen(['doxygen', os.path.join(tmp_dir, 'build/botan.doxy')], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + run_and_check(doxygen, 'doxygen') + shutil.move(os.path.join(tmp_dir, 'build/docs/doxygen'), output_dir) + +def run_sphinx(botan_dir, tmp_dir, output_dir): + + sphinx_config = os.path.join(botan_dir, 'src/configs/sphinx') + sphinx_dir = os.path.join(tmp_dir, 'sphinx') + os.mkdir(sphinx_dir) + + shutil.copyfile(os.path.join(botan_dir, 'readme.rst'), + os.path.join(sphinx_dir, 'index.rst')) + + for f in ['news.rst', os.path.join('doc', 'security.rst')]: + shutil.copy(os.path.join(botan_dir, f), sphinx_dir) + + toc = """.. toctree:: + + index + news + security + Users Manual <https://botan.randombit.net/manual> + API Reference <https://botan.randombit.net/doxygen> +""" + + contents_rst = open(os.path.join(sphinx_dir, 'contents.rst'), 'w') + contents_rst.write(toc) + contents_rst.close() + + sphinx_invoke = ['sphinx-build', '-t', 'website', '-c', sphinx_config, '-b', 'html'] + sphinx_website = subprocess.Popen(sphinx_invoke + [sphinx_dir, output_dir], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + run_and_check(sphinx_website, 'sphinx-build website') + + sphinx_manual = subprocess.Popen(sphinx_invoke + [os.path.join(botan_dir, 'doc/manual'), + os.path.join(output_dir, 'manual')], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + run_and_check(sphinx_manual, 'sphinx-build manual') + + shutil.rmtree(os.path.join(output_dir, '.doctrees')) + shutil.rmtree(os.path.join(output_dir, 'manual', '.doctrees')) + os.remove(os.path.join(output_dir, '.buildinfo')) + os.remove(os.path.join(output_dir, 'manual', '.buildinfo')) + + # share _static subdirs + shutil.rmtree(os.path.join(output_dir, 'manual', '_static')) + os.symlink('../_static', os.path.join(output_dir, 'manual', '_static')) + +def main(args): + parser = optparse.OptionParser() + + parser.add_option('--output-dir', default=None, + help="Where to write output") + + (options, args) = parser.parse_args(args) + + output_dir = options.output_dir + tmp_dir = tempfile.mkdtemp(prefix='botan_website_') + + # assumes we live in src/scripts + botan_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), + "..", "..")) + + if os.access(os.path.join(botan_dir, 'configure.py'), os.X_OK) is False: + print("Can't find configure.py in %s", botan_dir) + sys.exit(1) + + if output_dir is None: + cwd = os.getcwd() + + if os.path.basename(cwd) == 'botan-website': + output_dir = '.' + else: + output_dir = os.path.join(cwd, 'botan-website') + + try: + os.mkdir(output_dir) + except OSError as e: + if e.errno == errno.EEXIST: + pass + else: + raise e + + for subdir in ['_static', '_sources', 'doxygen', 'manual']: + try: + shutil.rmtree(os.path.join(output_dir, subdir)) + except OSError as e: + if e.errno == errno.ENOENT: + pass + else: + print("Error removing dir", e) + sys.exit(1) + + configure_build(botan_dir, tmp_dir) + run_doxygen(tmp_dir, output_dir) + run_sphinx(botan_dir, tmp_dir, output_dir) + + for f in ['doc/pgpkey.txt', 'license.txt']: + shutil.copy(os.path.join(botan_dir, f), output_dir) + + shutil.rmtree(tmp_dir) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/src/scripts/website.sh b/src/scripts/website.sh deleted file mode 100755 index e1fb64028..000000000 --- a/src/scripts/website.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -set -e -# TODO rewrite in Python - -#which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if available - -script_path=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P) -botan_dir=$(cd ${script_path}/../.. && pwd -P) - -SPHINX_CONFIG=${botan_dir}/src/configs/sphinx - -WEBSITE_DIR=./botan-website -TMP_DIR=$(mktemp -d) - -mkdir -p $WEBSITE_DIR - -${botan_dir}/configure.py --with-doxygen --with-sphinx --quiet - -# build doxygen -doxygen build/botan.doxy -mv build/docs/doxygen $WEBSITE_DIR/doxygen - -# build online manual -cp ${botan_dir}/readme.rst $TMP_DIR/index.rst -cp -r ${botan_dir}/news.rst ${botan_dir}/doc/security.rst $TMP_DIR -echo -e ".. toctree::\n\n index\n news\n security\n \ -Users Manual <https://botan.randombit.net/manual>\n \ -API Reference <https://botan.randombit.net/doxygen>" > $TMP_DIR/contents.rst - -sphinx-build -t website -c "$SPHINX_CONFIG" -b "html" $TMP_DIR $WEBSITE_DIR -sphinx-build -t website -c "$SPHINX_CONFIG" -b "html" ${botan_dir}/doc/manual $WEBSITE_DIR/manual -cp ${botan_dir}/license.txt ${botan_dir}/doc/pgpkey.txt $WEBSITE_DIR - -rm -rf $WEBSITE_DIR/.doctrees -rm -f $WEBSITE_DIR/.buildinfo -rm -rf $WEBSITE_DIR/manual/.doctrees -rm -f $WEBSITE_DIR/manual/.buildinfo -rm -rf $WEBSITE_DIR/manual/_static -(cd $WEBSITE_DIR/manual && ln -s ../_static .) - - -# build manual as pdf for download -sphinx-build -t website -c "$SPHINX_CONFIG" -b "latex" ${botan_dir}/doc/manual $TMP_DIR/latex -(cd $TMP_DIR/latex && pdflatex botan.tex && pdflatex botan.tex) -mv $TMP_DIR/latex/botan.pdf $WEBSITE_DIR/manual/botan.pdf - -rm -rf www-src build Makefile - |