| #!/bin/sh -e |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you 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. |
| # |
| |
| # |
| # ----------------------------------------------------------------------------- |
| # |
| # build.sh: Automatically build the Apache Guacamole website. |
| # |
| # This script invokes Jekyll to build a static copy of the Guacamole website |
| # based on its Markdown and HTML source. If requested, Ruby's HTTP server will |
| # be started to serve the built result for the sake of testing. |
| # |
| # The built results will be available in the "content" subdirectory of the |
| # source tree. |
| # |
| # To stage the results for commit to the "asf-site branch, specify "stage" |
| # instead of an HTTP port number. |
| # |
| # USAGE: |
| # |
| # ./build.sh [HTTP SERVER PORT] |
| # |
| # ----------------------------------------------------------------------------- |
| # |
| |
| ## |
| ## Logs the given message to STDERR. |
| ## |
| ## @param ... |
| ## The message to log to STDERR. |
| ## |
| log() { |
| echo "$*" >&2 |
| } |
| |
| ## |
| ## Verifies that the given file exists and is a directory. If the file does not |
| ## exist or is not a directory, an error message is logged and script execution |
| ## is aborted. |
| ## |
| ## @param NAME |
| ## The name of the file to verify. |
| ## |
| assert_directory() { |
| NAME="$1" |
| if [ ! -d doc ]; then |
| log "FATAL: \"$NAME\" does not exist or is not a directory." |
| exit 1 |
| fi |
| } |
| |
| ## |
| ## Verifies that the given program is installed and within the search path. If |
| ## the program is not installed nor within the search path, an error message is |
| ## logged and script execution is aborted. |
| ## |
| ## @param NAME |
| ## The name of the program to verify. |
| ## |
| assert_program() { |
| NAME="$1" |
| if ! which "$NAME" &> /dev/null; then |
| log "FATAL: \"$NAME\" is not installed." |
| exit 1 |
| fi |
| } |
| |
| ## |
| ## Builds the website using Jekyll. The build result is copied to the "content" |
| ## subdirectory of the current directory. If the "content" directory already |
| ## exists, it will first be recursively removed. |
| ## |
| build() { |
| |
| # Verify required programs are installed |
| assert_program jekyll |
| |
| # Build site |
| jekyll build |
| |
| # Verify expected directories exist |
| assert_directory doc |
| assert_directory _site |
| |
| # Clean out content directory (if present) |
| rm -rf content/; mkdir content |
| |
| # Copy site and docs into place |
| log "Copying \"doc/\" and built site to \"content/\" ..." |
| cp -a doc/ content/ |
| cp -a _site/* content/ |
| |
| # All done |
| log "Done. Full site is now within the \"content/\" directory." |
| |
| } |
| |
| ## |
| ## Serves the "content" directory using Ruby's own HTTP server. |
| ## |
| ## @param PORT |
| ## The port number on which the HTTP server should listen. |
| ## |
| serve() { |
| |
| PORT="$1" |
| |
| # Verify required programs are installed |
| assert_program ruby |
| |
| # Run server |
| ruby -run -e httpd content/ -p "$PORT" |
| |
| } |
| |
| ## |
| ## Stages the current build result for commit to the "asf-site" branch. |
| ## |
| stage() { |
| |
| # Verify required programs are installed |
| assert_program git |
| assert_program mktemp |
| |
| # Move contents to temporary directory |
| TMP="`mktemp -d -p "$PWD"`" |
| mv content/* "$TMP" |
| rmdir content |
| |
| # Change to asf-site |
| git checkout asf-site |
| |
| # Replace contents |
| rm -rf content |
| mv "$TMP" content |
| |
| # Stage for commit |
| git add content/ |
| git clean -xfd . |
| |
| # Done |
| log "Content staged for commit. Use git to commit the results when ready." |
| log "NOTE: The build.sh script will no longer exist. To serve the staged " |
| log "contents, run:" |
| log |
| log " ruby -run -e httpd content/ -p PORT" |
| log |
| log "where PORT is the port number where the HTTP server should listen." |
| |
| } |
| |
| # Verify number of arguments |
| if [ "$#" -gt 1 -o "$1" = "-h" ]; then |
| log "Usage:" |
| log " $0 -h # Display this message" |
| log " $0 # Build website" |
| log " $0 PORT # Build website and serve from the given PORT" |
| log " $0 stage # Build website and stage the contents for asf-site" |
| exit 1 |
| fi |
| |
| # Build in all cases |
| build |
| |
| # Stage for commit (if requested) |
| if [ "$1" = "stage" ]; then |
| stage |
| |
| # Otherwise assume port number and serve |
| elif [ -n "$1" ]; then |
| serve "$1" |
| fi |
| |