X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=scripts%2Fdocs-build.sh;h=69f962505d852320488bcb7f7100690b8a398b83;hb=d915f98c1a809f4d4d84335621a96cd036a34b22;hp=1c85bad794ef6f2ca73ba2bfcae49c9293db2dde;hpb=daadc74839ccfb56e54e033739fc73dceb003b80;p=opnfvdocs.git diff --git a/scripts/docs-build.sh b/scripts/docs-build.sh index 1c85bad79..69f962505 100755 --- a/scripts/docs-build.sh +++ b/scripts/docs-build.sh @@ -1,4 +1,4 @@ -#!/bin/bash -e +#!/bin/bash # SPDX-license-identifier: Apache-2.0 ############################################################################## # Copyright (c) 2016 NEC and others. @@ -7,7 +7,8 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -export PATH=$PATH:/usr/local/bin/ + +set +e DOCS_DIR=${DOCS_DIR:-docs} INDEX_RST=${INDEX_RST:-index.rst} @@ -18,33 +19,32 @@ VENV_DIR=${VENV_DIR:-$BUILD_DIR/_venv} OPNFVDOCS_DIR=${OPNFVDOCS_DIR:-$BUILD_DIR/_opnfvdocs} GERRIT_COMMENT=${GERRIT_COMMENT:-} -get_title_script=" -import os -from docutils import core, nodes - -try: - with open('index.rst', 'r') as file: - data = file.read() - doctree = core.publish_doctree(data, - settings_overrides={'report_level': 5, - 'halt_level': 5}) - if isinstance(doctree[0], nodes.title): - title = doctree[0] - else: - for c in doctree.children: - if isinstance(c, nodes.section): - title = c[0] - break - print title.astext() -except: - print 'None'" revision="$(git rev-parse --short HEAD)" rev_full="$(git rev-parse HEAD)" -version="$(git describe --abbrev=0 2> /dev/null || echo draft) ($revision)" +version="$(git tag | tail -1)" project="$(basename $(git rev-parse --show-toplevel))" html_notes=" Revision: $rev_full\n Build date: $(date -u +'%Y-%m-%d')" -default_conf="$OPNFVDOCS_DIR/etc/conf.py" opnfv_logo="$OPNFVDOCS_DIR/etc/opnfv-logo.png" +copyright="$(date +%Y), OPNFV." +copyrightlong="$(date +%Y), OPNFV. Licensed under CC BY 4.0." +error_count=0 + +function set_error() { + # TODO(yujunz) log detail errors + error_count=$((error_count + 1)) +} + +if [ "$(uname)" == "Darwin" ]; then + # Override system $SED/$FIND with gnu $SED and gnu $FIND + # If not found, install with + # $ brew install gnu-sed findutils + echo "macOS detected." + SED="gsed" + FIND="gfind" +else + SED="sed" + FIND="find" +fi function check_rst_doc() { _src="$1" @@ -54,35 +54,39 @@ function check_rst_doc() { # check right now, but these have to be fixed before OPNFV B release. _out=$(doc8 --max-line-length 240 --ignore D000 "$_src") || { _msg='Warning: rst validation (doc8) has failed, please fix the following error(s).' - _errs=$(echo "$_out" | sed -n -e "/^$_src/s/^/ /p") + _errs=$(echo "$_out" | $SED -n -e "/^$_src/s/^/ /p") echo echo -e "$_msg\n$_errs" echo - [[ -n "$GERRIT_COMMENT" ]] && echo -e "$_msg\n$_errs" >> "$GERRIT_COMMENT" + if [ -n "$GERRIT_COMMENT" ]; then + echo -e "$_msg\n$_errs" >> "$GERRIT_COMMENT" + fi } } function add_html_notes() { _src="$1" - find "$_src" -name '*.rst' | while read file + $FIND "$_src" -name '*.rst' | while read file do if grep -q -e ' _sha1_' "$file" ; then # TODO: remove this, once old templates were removed from all repos. echo echo "Warn: '_sha1_' was found in [$file], use the latest document template." - echo " See https://wiki.opnfv.org/documentation/tools ." + echo " See http://artifacts.opnfv.org/opnfvdocs/docs/how-to-use-docs ." echo - sed -i "s/ _sha1_/ $git_sha1/g" "$file" + $SED -i "s/ _sha1_/ $git_sha1/g" "$file" fi - sed -i -e "\$a\\\n..\n$html_notes" "$file" + $SED -i -e "\$a\\\n..\n$html_notes" "$file" done } function prepare_src_files() { mkdir -p "$(dirname $SRC_DIR)" - [[ -e "$SRC_DIR" ]] && rm -rf "$SRC_DIR" + if [ -e "$SRC_DIR" ]; then + rm -rf "$SRC_DIR" + fi cp -r "$DOCS_DIR" "$SRC_DIR" add_html_notes "$SRC_DIR" } @@ -98,6 +102,50 @@ function add_config() { fi } +# Note: User can customize config for specific document by creating 'conf.py' +# in the taeget document dir (e.g. docs/abc/conf.py). This config file does +# not need to cover all config parameter, as all missing parameter will be +# automatically filled by this function. +function prepare_config() { + _src="$1" + _name="$2" + _conf="$_src/conf.py" + + touch "$_conf" + + # default params + # Note: If you want to add a new sphinx extention here, you may need python + # package for it (e.g. python package 'sphinxcontrib-httpdomain' is + # required by 'sphinxcontrib.httpdomain'). If you need such python + # package, add the name of the python package into the requirement + # list 'docs/etc/requirements.txt' . + add_config "$_conf" 'extensions' \ + "['sphinxcontrib.httpdomain', 'sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.napoleon']" + add_config "$_conf" 'needs_sphinx' "'1.3'" + add_config "$_conf" 'numfig' "True" + add_config "$_conf" 'master_doc' "'index'" + add_config "$_conf" 'pygments_style' "'sphinx'" + add_config "$_conf" 'html_use_index' "False" + add_config "$_conf" 'html_last_updated_fmt' "'%b %d, %Y'" + add_config "$_conf" 'html_logo' "'opnfv-logo.png'" + add_config "$_conf" 'html_sidebars' \ + "{'**': ['globaltoc.html', + '$(cd $OPNFVDOCS_DIR; pwd)/etc/pagemenu.html', + 'searchbox.html']}" + + # genarated params + add_config "$_conf" 'release' "u'$version'" + add_config "$_conf" 'version' "u'$version'" + add_config "$_conf" 'project' "u'$project'" + add_config "$_conf" 'copyright' "u'$copyrightlong'" + add_config "$_conf" 'rst_epilog' "u'$html_notes'" + + echo "sphinx config to be used:" + echo + $SED -e "s/^/ /" "$_conf" + echo +} + function is_top_dir() { [[ "$1" == "$DOCS_DIR" ]] } @@ -112,7 +160,7 @@ function generate_name_for_top_dir() { done echo "Error: cannot find name for top directory [$DOCS_DIR]" - exit 1 + set_error } function generate_name() { @@ -128,25 +176,37 @@ function generate_name() { } -check_rst_doc $DOCS_DIR - if [[ ! -d "$OPNFVDOCS_DIR" ]] ; then - echo "Error: $OPNFVDOCS_DIR dir not found. See https://wiki.opnfv.org/documentation/tools ." - exit 1 + echo "Error: $OPNFVDOCS_DIR dir not found." + echo "See http://artifacts.opnfv.org/opnfvdocs/docs/how-to-use-docs ." + set_error fi -prepare_src_files - if ! which virtualenv > /dev/null ; then echo "Error: 'virtualenv' not found. Exec 'sudo pip install virtualenv' first." - exit 1 + set_error +fi + +# workaround for doc8 error in python2.6 +if [[ $(python -V 2>&1) == Python\ 2.6.* ]] && [ -e /usr/bin/python2.7 ]; then + echo "creating venv with Python 2.7 instead of Python 2.6.x ..." + virtualenv "$VENV_DIR" --python=/usr/bin/python2.7 +else + virtualenv "$VENV_DIR" fi -virtualenv "$VENV_DIR" source "$VENV_DIR/bin/activate" pip install -r "$OPNFVDOCS_DIR/etc/requirements.txt" -find $DOCS_DIR -name $INDEX_RST -printf '%h\n' | while read dir +check_rst_doc $DOCS_DIR + +prepare_src_files + +if [ -e "$DOCS_DIR/pre-hook.sh" ]; then + source "$DOCS_DIR/pre-hook.sh" +fi + +$FIND $DOCS_DIR -name $INDEX_RST -printf '%h\n' | while read dir do name=$(generate_name $dir) if is_top_dir "$dir" ; then @@ -156,7 +216,6 @@ do fi build="$BUILD_DIR/$name" output="$OUTPUT_DIR/$name" - conf="$src/conf.py" echo echo "#################${dir//?/#}" @@ -164,57 +223,23 @@ do echo "#################${dir//?/#}" echo - [[ ! -f "$conf" ]] && cp "$default_conf" "$conf" - title=$(cd $src; python -c "$get_title_script") - latex_conf="[('index', '$name.tex', \"$title\", 'OPNFV', 'manual'),]" - add_config "$conf" 'latex_documents' "$latex_conf" - add_config "$conf" 'release' "u'$version'" - add_config "$conf" 'version' "u'$version'" - add_config "$conf" 'project' "u'$project'" - add_config "$conf" 'copyright' "u'$(date +%Y), OPNFV'" + prepare_config "$src" "$name" cp -f $opnfv_logo "$src/opnfv-logo.png" mkdir -p "$output" - sphinx-build -b html -t html -E "$src" "$output" - - # Note: PDF creation may fail in project doc builds. - # We allow this build job to be marked as succeeded with - # failure in PDF creation, but leave message to fix it. - # Any failure has to be fixed before OPNFV B release. { - sphinx-build -b latex -t pdf -E "$src" "$build" && \ - make -C "$build" LATEXOPTS='--interaction=nonstopmode' all-pdf - } && { - mv "$build/$name.pdf" "$output" + sphinx-build -b singlehtml -t singlehtml -E "$src" "$output" } || { - msg="Error: PDF creation for $dir has failed, please fix source rst file(s)." + msg="Error: HTML creation for $dir has failed." echo echo "$msg" echo - [[ -n "$GERRIT_COMMENT" ]] && echo "$msg" >> "$GERRIT_COMMENT" + if [ -n "$GERRIT_COMMENT" ]; then + echo "$msg" >> "$GERRIT_COMMENT" + fi } - # TODO: failures in ODT creation should be handled error and - # cause 'exit 1' before OPNFV B release. - tex=$(find $build -name '*.tex' | head -1) - odt="${tex%.tex}.odt" - if [[ -e $tex ]] && which pandoc > /dev/null ; then - ( - cd $(dirname $tex) - pandoc $(basename $tex) -o $(basename $odt) - ) && { - mv $odt $output/ - }|| { - msg="Error: ODT creation for $dir has failed." - echo - echo "$msg" - echo - } - else - echo "Warn: tex file and/or 'pandoc' are not found, skip ODT creation." - fi - if is_top_dir "$dir" ; then # NOTE: Having top level document (docs/index.rst) is not recommended. # It may cause conflicts with other docs (mostly with HTML @@ -223,8 +248,8 @@ do # docs directory. ( cd $output - find . -type d -print | xargs -I d mkdir -p ../d - find . -type f -print | xargs -I f mv -b f ../f + $FIND . -type d -print | xargs -I d mkdir -p ../d + $FIND . -type f -print | xargs -I f mv -b f ../f ) rm -rf "$output" fi @@ -232,3 +257,5 @@ do done deactivate + +exit $error_count