|  | #!/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 <<EOF | 
|  | --- | 
|  | layout: documentation | 
|  | title: ${rule_family_name} Rules | 
|  | --- | 
|  | EOF | 
|  | cat "$TMP/skylark/$rule_family/README.md"; ) > "$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" <<EOF | 
|  | --- | 
|  | layout: redirect | 
|  | redirect: /versions/$VERSION/$html_file | 
|  | --- | 
|  | EOF | 
|  | } | 
|  |  | 
|  | # During setup, all documentation under docs are moved to the /versions/master | 
|  | # directory as the documentation from HEAD. | 
|  | # | 
|  | # This function henerates a redirect from the root of the site for the given | 
|  | # doc page under /versions/master so that https://docs.bazel.build/foo.html | 
|  | # will be redirected to https://docs.bazel.build/versions/master/foo.html | 
|  | function gen_redirects { | 
|  | pushd "$VERSION_DIR" > /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 |