blob: aa7a2a0752dda7e15203c9ef200bf2e114b1c15b [file] [log] [blame]
#!/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