#!/bin/bash # Copyright 2016 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script constructs the final Jekyll tree by combining the static Jekyll # site files with generated documentation, such as the Build Encyclopedia and # Skylark Library. It then constructs the site directory structure for # Bazel documentation at HEAD by moving all documentation into the # /versions/master directory and adding redirects from the root of the site. # This way, URLs of the form https://docs.bazel.build/foo.html will be # redirected to https://docs.bazel.build/versions/master/foo.html. set -eu readonly OUTPUT=${PWD}/$1 shift readonly JEKYLL_BASE=${PWD}/$1 shift readonly SKYLARK_RULE_DOCS=${PWD}/$1 shift readonly BE_ZIP=${PWD}/$1 shift readonly SL_ZIP=${PWD}/$1 shift readonly CLR_HTML=${PWD}/$1 # Create temporary directory that is removed when this script exits. readonly TMP=$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXX") readonly OUT_DIR="$TMP/out" trap "rm -rf ${TMP}" EXIT # TODO: Create a variant of this script for cutting versions of documentation # for Bazel releases. For that case, consider extracting the Git branch or tag # name to be used as the versioned directory name. readonly VERSION="master" readonly VERSION_DIR="$OUT_DIR/versions/$VERSION" # Unpacks the base Jekyll tree, Build Encyclopedia, Skylark Library, and # command line reference. function setup { mkdir -p "$OUT_DIR" cd "$OUT_DIR" tar -xf "${JEKYLL_BASE}" mkdir -p "$VERSION_DIR" mv "$OUT_DIR"/docs/* "$VERSION_DIR" rm -r "$OUT_DIR"/docs # Unpack the Build Encyclopedia into versions/master/be local be_dir="$VERSION_DIR/be" mkdir -p "$be_dir" unzip -qq "$BE_ZIP" -d "$be_dir" mv "$be_dir/be-nav.html" "$OUT_DIR/_includes" # Unpack the Skylark Library into versions/master/skylark/lib local sl_dir="$VERSION_DIR/skylark/lib" mkdir -p "$sl_dir" unzip -qq "$SL_ZIP" -d "$sl_dir" mv "$sl_dir/skylark-nav.html" "$OUT_DIR/_includes" # Copy the command line reference. cp "$CLR_HTML" "$VERSION_DIR" } # Helper function for copying a Skylark rule doc. function copy_skylark_rule_doc { local rule_family=$1 local rule_family_name=$2 local be_dir="$VERSION_DIR/be" ( cat < "$be_dir/${rule_family}.md" } # Copies the READMEs for Skylark rules bundled with Bazel. function unpack_skylark_rule_docs { local tmp_dir=$TMP/skylark mkdir -p $tmp_dir cd "$tmp_dir" tar -xf "${SKYLARK_RULE_DOCS}" copy_skylark_rule_doc docker "Docker" copy_skylark_rule_doc pkg "Packaging" } # Processes a documentation page, such as replacing Blaze with Bazel. function process_doc { local f=$1 local tempf=$(mktemp -t bazel-doc-XXXXXX) chmod +w $f cat "$f" | sed 's,\.md,.html,g;s,Blaze,Bazel,g;s,blaze,bazel,g' > "$tempf" cat "$tempf" > "$f" } # Performs fixup on each doc, such as replacing instances of 'blaze' with # 'bazel'. function process_docs { for f in $(find "$VERSION_DIR" -name "*.html"); do process_doc $f done for f in $(find "$VERSION_DIR" -name "*.md"); do process_doc $f done } # Generates a redirect for a documentation page under /versions/master. function gen_redirect { local output_dir=$OUT_DIR/$(dirname $f) if [[ ! -d "$output_dir" ]]; then mkdir -p "$output_dir" fi local src_basename=$(basename $f) local md_basename="${src_basename%.*}.md" local html_file="${f%.*}.html" local redirect_file="$output_dir/$md_basename" if [[ -e "$redirect_file" ]]; then echo "Cannot create redirect file $redirect_file. File exists." exit 1 fi cat > "$redirect_file" < /dev/null for f in $(find . -name "*.html" -type f); do gen_redirect $f done for f in $(find . -name "*.md" -type f); do gen_redirect $f done popd > /dev/null } # Creates a tar archive containing the final Jekyll tree. function package_output { cd "$OUT_DIR" tar -hcf $OUTPUT $(find . -type f | sort) } function main { setup unpack_skylark_rule_docs process_docs gen_redirects package_output } main