139 lines
3.3 KiB
Bash
Raw Normal View History

2025-02-17 15:19:09 +01:00
#!/bin/bash
# Copyright (C) 2025 Nicolás Ortega Froysa <nicolas@ortegas.org> All rights reserved.
# Author: Nicolás Ortega Froysa <nicolas@ortegas.org>
#
# This software is provided 'as-is', without any express or implied
# warranty. In no event will the authors be held liable for any damages
# arising from the use of this software.
#
# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it
# freely, subject to the following restrictions:
#
# 1. The origin of this software must not be misrepresented; you must not
# claim that you wrote the original software. If you use this software
# in a product, an acknowledgment in the product documentation would be
# appreciated but is not required.
#
# 2. Altered source versions must be plainly marked as such, and must not be
# misrepresented as being the original software.
#
# 3. This notice may not be removed or altered from any source
# distribution.
2025-02-18 09:29:31 +01:00
set -euo pipefail
2025-02-17 15:19:09 +01:00
SOURCE_DIR="src"
OUTPUT_DIR="output"
JOBS=1
2025-03-03 13:30:51 +01:00
SERVER_FLAG=0
2025-02-17 15:19:09 +01:00
2025-02-17 15:37:59 +01:00
function print_usage() {
echo "$0 [-o <output dir>] [-s <source dir>] [-j <num>]"
2025-03-03 13:30:51 +01:00
echo "$0 -S [-o <output dir>]"
2025-02-17 15:37:59 +01:00
}
2025-03-04 10:10:16 +01:00
function print_help() {
printf "PHP Site Generator\n\n"
printf "SYNOPSIS:\n"
print_usage
printf "\nOPTIONS:\n"
printf "\t-o <output dir> Output directory\n"
printf "\t-s <source dir> Source directory\n"
printf "\t-j <num> Number of jobs to run\n"
printf "\t-S Run a server on localhost:8080\n"
printf "\t-h Show help information\n"
printf "\n"
}
2025-03-03 13:30:51 +01:00
while getopts "o:s:j:Sh" opt
2025-02-17 15:37:59 +01:00
do
case "$opt" in
o)
OUTPUT_DIR="$(realpath --relative-base=./ "${OPTARG}")"
2025-02-17 15:37:59 +01:00
;;
s)
SOURCE_DIR="$(realpath --relative-base=./ "${OPTARG}")"
2025-02-17 15:37:59 +01:00
;;
j)
JOBS="${OPTARG}"
if ! [[ $JOBS =~ ^[0-9]+$ ]]
then
>&2 echo "Jobs option '$JOBS' is not an integer."
print_usage
exit 1
fi
;;
2025-03-03 13:30:51 +01:00
S)
SERVER_FLAG=1
;;
2025-02-17 15:37:59 +01:00
h)
2025-03-04 10:10:16 +01:00
print_help
2025-02-17 15:37:59 +01:00
exit
;;
*)
print_usage
exit 1
;;
esac
done
2025-03-03 13:30:51 +01:00
if [ $SERVER_FLAG -eq 1 ]
then
php -S localhost:8080 -t "$OUTPUT_DIR"
exit
fi
# Make these variables visible within parallel
export OUTPUT_DIR
export SOURCE_DIR
function process_file() {
2025-02-20 13:46:18 +01:00
local file="$1"
local DEST_FILE="${OUTPUT_DIR}/${file/#${SOURCE_DIR}\//}"
2025-02-20 13:46:18 +01:00
local DEST_DIR
if [[ $file = *.php ]]
2025-02-17 15:19:09 +01:00
then
DEST_FILE="${DEST_FILE::-4}"
2025-02-20 13:46:18 +01:00
DEST_DIR="$(dirname "$DEST_FILE")"
if ! [ -d "$DEST_DIR" ]
then
mkdir -p "$DEST_DIR"
fi
2025-02-17 15:19:09 +01:00
echo -n "Generating $DEST_FILE ... "
php "$file" > "$DEST_FILE"
echo "done"
else
2025-02-20 13:46:18 +01:00
DEST_DIR="$(dirname "$DEST_FILE")"
if ! [ -d "$DEST_DIR" ]
then
mkdir -p "$DEST_DIR"
fi
2025-02-17 15:19:09 +01:00
echo -n "Copying target $DEST_FILE ... "
cp "$file" "$DEST_FILE"
echo "done"
fi
}
2025-03-04 11:37:28 +01:00
function delete_file() {
local file="$1"
FILE_PATH=$(realpath --relative-base=./ "$OUTPUT_DIR/$file")
echo "Deleting file $FILE_PATH"
rm "$FILE_PATH"
}
# Make functions usable to parallel
export -f process_file
2025-03-04 11:37:28 +01:00
export -f delete_file
find "$SOURCE_DIR" -type f -not -name '*.cfg.php' |
parallel -j"${JOBS}" process_file
SOURCE_FILE_LIST=$(cd "$SOURCE_DIR" && find . -type f -and -not -name '*.cfg.php' | sed 's/.php$//')
OUTPUT_FILE_LIST=$(cd "$OUTPUT_DIR" && find . -type f)
2025-03-04 11:37:28 +01:00
echo "${SOURCE_FILE_LIST[@]}" "${OUTPUT_FILE_LIST[@]}" | tr ' ' '\n' | sort | uniq -u |
parallel -j"${JOBS}" delete_file