|
1 | 1 | #!/bin/sh |
| 2 | + |
2 | 3 | # |
3 | 4 | # This is the shell script for building: |
4 | 5 | # 1. a TAR.GZ package; |
|
27 | 28 | # @link https://www.phpmyfaq.de |
28 | 29 | # @version 2008-09-10 |
29 | 30 |
|
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 |
32 | 99 |
|
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" |
37 | 135 | else |
38 | | - MD5BIN=$(command -v md5sum) |
| 136 | + warn "TCPDF path ${TCPDF_PATH} not found; skipping font cleanup" |
39 | 137 | 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 |
0 commit comments