Skip to content

Commit 0de421e

Browse files
committed
build: improved build script
1 parent c9dd699 commit 0de421e

File tree

2 files changed

+159
-59
lines changed

2 files changed

+159
-59
lines changed

scripts/git2package.sh

Lines changed: 158 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/bin/sh
2+
23
#
34
# This is the shell script for building:
45
# 1. a TAR.GZ package;
@@ -27,64 +28,163 @@
2728
# @link https://www.phpmyfaq.de
2829
# @version 2008-09-10
2930

30-
# phpMyFAQ Version
31-
. scripts/version.sh
31+
set -eu
32+
if (set -o pipefail 2>/dev/null); then
33+
set -o pipefail
34+
fi
35+
IFS=$(printf ' \t\n')
36+
37+
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
38+
REPO_ROOT=$(CDPATH= cd -- "${SCRIPT_DIR}/.." && pwd)
39+
ORIGINAL_DIR=$(pwd)
40+
cd "${REPO_ROOT}" || exit 1
41+
42+
. "${REPO_ROOT}/scripts/version.sh"
43+
: "${PMF_PACKAGE_FOLDER:=phpmyfaq-${PMF_VERSION}}"
44+
: "${PHP_BIN:=php}"
45+
46+
BUILD_DIR="${REPO_ROOT}/build"
47+
CHECKOUT_DIR="${BUILD_DIR}/checkout/${PMF_PACKAGE_FOLDER}"
48+
PACKAGE_DIR="${BUILD_DIR}/package/${PMF_PACKAGE_FOLDER}"
49+
ARTIFACT_TAR="${REPO_ROOT}/${PMF_PACKAGE_FOLDER}.tar.gz"
50+
ARTIFACT_ZIP="${REPO_ROOT}/${PMF_PACKAGE_FOLDER}.zip"
51+
HASH_MANIFEST="${REPO_ROOT}/hashes-${PMF_VERSION}.json"
52+
TCPDF_PATH="${CHECKOUT_DIR}/phpmyfaq/src/libs/tecnickcom/tcpdf"
53+
54+
log() {
55+
printf '\n[%s] %s\n' "$(date '+%H:%M:%S')" "$*"
56+
}
57+
58+
warn() {
59+
printf '\n[WARN] %s\n' "$*" >&2
60+
}
61+
62+
fail() {
63+
printf '\n[ERROR] %s\n' "$*" >&2
64+
exit 1
65+
}
66+
67+
cleanup() {
68+
cd "${ORIGINAL_DIR}" || true
69+
if [ "${KEEP_BUILD:-0}" = "1" ]; then
70+
warn "KEEP_BUILD=1 set; leaving ${BUILD_DIR} in place"
71+
return
72+
fi
73+
if [ -d "${BUILD_DIR}" ]; then
74+
rm -rf "${BUILD_DIR}"
75+
log "Removed build directory ${BUILD_DIR}"
76+
fi
77+
}
78+
79+
trap cleanup EXIT
80+
81+
require_command() {
82+
command -v "$1" >/dev/null 2>&1 || fail "Required command '$1' not found in PATH"
83+
}
84+
85+
check_prerequisites() {
86+
for cmd in git composer pnpm tar zip "${PHP_BIN}"; do
87+
require_command "$cmd"
88+
done
89+
90+
if [ -z "${MD5BIN:-}" ]; then
91+
if command -v md5 >/dev/null 2>&1; then
92+
MD5BIN=$(command -v md5)
93+
elif command -v md5sum >/dev/null 2>&1; then
94+
MD5BIN=$(command -v md5sum)
95+
else
96+
fail "Neither md5 nor md5sum available; install one or set MD5BIN"
97+
fi
98+
fi
3299

33-
# Determine md5 binary
34-
if [ -z "${MD5BIN}" ]; then
35-
if command -v md5 > /dev/null; then
36-
MD5BIN=$(command -v md5)
100+
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
101+
fail "This script must be run inside a git repository"
102+
fi
103+
}
104+
105+
prepare_directories() {
106+
log "Preparing workspace under ${BUILD_DIR}"
107+
rm -rf "${BUILD_DIR}"
108+
mkdir -p "${CHECKOUT_DIR}" "${PACKAGE_DIR}"
109+
}
110+
111+
checkout_sources() {
112+
log "Checking out current index into ${CHECKOUT_DIR}"
113+
git checkout-index -f -a --prefix="${CHECKOUT_DIR}/"
114+
}
115+
116+
install_php_dependencies() {
117+
log "Installing PHP dependencies"
118+
(cd "${CHECKOUT_DIR}" && COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --prefer-dist --no-progress --no-interaction)
119+
}
120+
121+
install_js_dependencies() {
122+
log "Installing JS dependencies"
123+
(cd "${CHECKOUT_DIR}" && pnpm install --frozen-lockfile)
124+
}
125+
126+
build_frontend() {
127+
log "Running pnpm build:prod"
128+
(cd "${CHECKOUT_DIR}" && pnpm build:prod)
129+
}
130+
131+
strip_tcpdf_assets() {
132+
if [ -d "${TCPDF_PATH}" ]; then
133+
log "Removing TCPDF fonts and examples"
134+
rm -rf "${TCPDF_PATH}/fonts" "${TCPDF_PATH}/examples"
37135
else
38-
MD5BIN=$(command -v md5sum)
136+
warn "TCPDF path ${TCPDF_PATH} not found; skipping font cleanup"
39137
fi
40-
fi
41-
42-
# Package Folder
43-
if [ -z "${PMF_PACKAGE_FOLDER}" ]; then
44-
PMF_PACKAGE_FOLDER="phpmyfaq-${PMF_VERSION}"
45-
fi
46-
47-
current_dir=$(pwd) || exit
48-
49-
printf "\n 🚀 Checkout code into build/ folder\n"
50-
git checkout-index -f -a --prefix="${current_dir}/build/checkout/${PMF_PACKAGE_FOLDER}/"
51-
52-
printf "\n 🚀 Add missing directories\n"
53-
mkdir -p "${current_dir}/build/package/${PMF_PACKAGE_FOLDER}/"
54-
55-
cd "${current_dir}/build/checkout/${PMF_PACKAGE_FOLDER}/" || exit
56-
57-
printf "\n 🚀 Add PHP dependencies\n"
58-
composer install --no-dev --prefer-dist
59-
60-
printf "\n 🚀 Install JS dependencies\n"
61-
pnpm install
62-
63-
printf "\n 🚀 Run \"pnpm build:prod\" to build frontend production build\n"
64-
pnpm build:prod
65-
66-
printf "\n 🚀 Remove fonts and examples from TCPDF\n"
67-
rm -rf "${current_dir}/build/checkout/${PMF_PACKAGE_FOLDER}/phpmyfaq/src/libs/tecnickcom/tcpdf/fonts"
68-
rm -rf "${current_dir}/build/checkout/${PMF_PACKAGE_FOLDER}/phpmyfaq/src/libs/tecnickcom/tcpdf/examples"
69-
70-
printf "\n 🚀 Create md5 hashes for file verification\n"
71-
php scripts/createHashes.php > "${current_dir}/hashes-${PMF_VERSION}.json"
72-
73-
printf "\n 🚀 Prepare packaging\n"
74-
cd "${current_dir}" || exit
75-
mv "${current_dir}/build/checkout/${PMF_PACKAGE_FOLDER}/phpmyfaq" "${current_dir}/build/package/${PMF_PACKAGE_FOLDER}"
76-
77-
printf "\n 🚀 Build packages\n"
78-
tar cfvz "${PMF_PACKAGE_FOLDER}.tar.gz" -C "${current_dir}/build/package/${PMF_PACKAGE_FOLDER}" phpmyfaq
79-
cd "${current_dir}/build/package/${PMF_PACKAGE_FOLDER}" || exit
80-
zip -r "${current_dir}/${PMF_PACKAGE_FOLDER}.zip" phpmyfaq
81-
cd "${current_dir}" || exit
82-
83-
printf "\n 🚀 Create md5sum\n"
84-
$MD5BIN "${PMF_PACKAGE_FOLDER}.tar.gz" > "${PMF_PACKAGE_FOLDER}.tar.gz.md5"
85-
$MD5BIN "${PMF_PACKAGE_FOLDER}.zip" > "${PMF_PACKAGE_FOLDER}.zip.md5"
86-
87-
printf "\n 🚀 Clean up\n"
88-
rm -rf "${current_dir}/build"
89-
90-
printf "\n 🚀 done.\n"
138+
}
139+
140+
generate_hash_manifest() {
141+
log "Generating hash manifest ${HASH_MANIFEST}"
142+
(cd "${CHECKOUT_DIR}" && "${PHP_BIN}" scripts/createHashes.php > "${HASH_MANIFEST}")
143+
}
144+
145+
stage_for_packaging() {
146+
log "Staging files for packaging"
147+
rm -rf "${PACKAGE_DIR}/phpmyfaq"
148+
mv "${CHECKOUT_DIR}/phpmyfaq" "${PACKAGE_DIR}/phpmyfaq"
149+
}
150+
151+
create_packages() {
152+
log "Building ${ARTIFACT_TAR}"
153+
tar czf "${ARTIFACT_TAR}" -C "${PACKAGE_DIR}" phpmyfaq
154+
155+
log "Building ${ARTIFACT_ZIP}"
156+
(cd "${PACKAGE_DIR}" && zip -rq "${ARTIFACT_ZIP}" phpmyfaq)
157+
}
158+
159+
write_checksums() {
160+
log "Creating checksum files"
161+
${MD5BIN} "${ARTIFACT_TAR}" > "${ARTIFACT_TAR}.md5"
162+
${MD5BIN} "${ARTIFACT_ZIP}" > "${ARTIFACT_ZIP}.md5"
163+
164+
if command -v sha256sum >/dev/null 2>&1; then
165+
sha256sum "${ARTIFACT_TAR}" > "${ARTIFACT_TAR}.sha256"
166+
sha256sum "${ARTIFACT_ZIP}" > "${ARTIFACT_ZIP}.sha256"
167+
elif command -v shasum >/dev/null 2>&1; then
168+
shasum -a 256 "${ARTIFACT_TAR}" > "${ARTIFACT_TAR}.sha256"
169+
shasum -a 256 "${ARTIFACT_ZIP}" > "${ARTIFACT_ZIP}.sha256"
170+
else
171+
warn "No SHA256 tool found; skipping .sha256 files"
172+
fi
173+
}
174+
175+
main() {
176+
check_prerequisites
177+
prepare_directories
178+
checkout_sources
179+
install_php_dependencies
180+
install_js_dependencies
181+
build_frontend
182+
strip_tcpdf_assets
183+
generate_hash_manifest
184+
stage_for_packaging
185+
create_packages
186+
write_checksums
187+
log "Packages created: ${ARTIFACT_TAR} and ${ARTIFACT_ZIP}"
188+
}
189+
190+
main

scripts/version.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/bin/sh
22
# Check if PMF_VERSION is not set or empty
3-
if [ -z "${PMF_VERSION}" ]; then
3+
if [ -z "${PMF_VERSION:-}" ]; then
44
PMF_VERSION="4.1.0-beta.2"
55
fi

0 commit comments

Comments
 (0)