#!/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. set -eu readonly WORKING_DIR=$(mktemp -d) : ${HOST:=localhost} : ${PORT:=12345} TARGET= SERVING_PREFIX= usage() { cat < [] Builds docs as static web pages in . Replaces absolute paths in the resulting HTML with , or, if it is not specified, with . --share Binds jekyll to the machine's hostname, instead of localhost (useful for review). --help This message. EOF } build_tree() { bazel build //site:jekyll-tree.tar rm -rf ${WORKING_DIR:-sentinel}/* tar -xf "$(bazel info bazel-genfiles)/site/jekyll-tree.tar" -C $WORKING_DIR } build_static() { build_tree TMP_TARGET=$(mktemp -d) jekyll build --source $WORKING_DIR --destination "$TMP_TARGET" REPLACEMENT=$(echo $SERVING_PREFIX | sed s/\\//\\\\\\//g) find $TMP_TARGET -name '*.html' | xargs sed -i s/href=\\\"\\//href=\"$REPLACEMENT\\//g find $TMP_TARGET -name '*.html' | xargs sed -i s/src=\\\"\\//src=\"$REPLACEMENT\\//g cp -R $TMP_TARGET/* $TARGET echo "Static pages copied to $TARGET" echo "Should be served from $SERVING_PREFIX" } build_and_serve() { build_tree echo "Serving docs.bazel.build site at $HOST:$PORT" jekyll serve --host "$HOST" --detach --quiet --port "$PORT" --source "$WORKING_DIR" } check() { which $1 > /dev/null || (echo "$1 not installed. Please install $1."; exit 1) } kill_jekyll() { pid="$(lsof "-tiTCP:$PORT" -sTCP:LISTEN)" || true if [ ! -z "$pid" ]; then kill "$pid" fi # I found I got bind errors sometimes if I didn't wait a second for the server to # actually shut down. sleep 2 } main() { check jekyll old_version="Jekyll 0.11.2" if expr match "$(jekyll --version)" "$old_version" > /dev/null; then # The ancient version that apt-get has. echo "ERROR: Running with an old version of Jekyll, update " \ "to 2.5.3 with \`sudo gem install jekyll -v 2.5.3\`" exit 1 fi kill_jekyll while true; do build_and_serve echo "Type q to quit, r to rebuild docs and restart jekyll" read -n 1 -s user_input if [ "$user_input" == "q" ]; then kill_jekyll echo "Quitting" exit 0 elif [ "$user_input" == "r" ]; then kill_jekyll echo "Rebuilding docs and restarting jekyll" fi done } while [[ $# -gt 0 ]] do key="$1" case $key in --port) PORT="$2" shift ;; --share) HOST="$HOSTNAME" ;; --target) TARGET="$2" shift SERVING_PREFIX="${2:-}" build_static exit 0 ;; --help|help) usage exit 0 ;; *) usage exit 1 esac shift done cleanup() { rm -rf $WORKING_DIR kill_jekyll } trap cleanup EXIT main