#!/bin/sh # Обновляет вендоренную копию ядра (ma7engine) в панели: # ma7engine/core/browser → <панель>/frontend/src/core (браузерная половина) # ma7engine/core/server → <панель>/backend/core (серверная половина) # # Панель из одной папки, где сервер лежит рядом с фронтом (server.ts в корне, # как в awg-ui), получает серверную часть в <панель>/core. # # Зачем копия, а не алиас прямо на соседнюю папку: контекст сборки образа # панели — её собственный каталог (COPY frontend/ ./ в Dockerfile), и путь, # уходящий выше него, внутри контейнера не разрешится. При копии пути # ./src/core и ./core одинаковы в деве, в tsc --noEmit и в Docker, и Dockerfile # трогать не нужно вообще. # # Файл кладётся в репозиторий потребителя (frontend/scripts/), потому что # вызывать его нужно и тогда, когда ma7engine рядом нет. # # Использование: npm run update (или sh scripts/update.sh) # Где искать ядро: $MA7ENGINE, иначе перебор кандидатов ниже — первый # существующий выигрывает, выбранный путь печатается. set -eu abspath() { (CDPATH= cd -- "$1" 2>/dev/null && pwd); } here=$(abspath "$(dirname -- "$0")") app=$(dirname "$here") # .../<панель>/frontend или корень панели из одной папки panel=$(dirname "$app") # .../<панель> или каталог, где лежат панели # Ядро может лежать где угодно относительно панели: рядом с продуктовым # репозиторием, рядом с остальными панелями или внутри самого репозитория. # Перебираем, вместо того чтобы зашивать одну раскладку — переезд ядра иначе # молча уводит синхронизацию на старую копию. # # Порядок — от ближнего к дальнему: панель, у которой ядро лежит рядом, не # должна утащить копию из каталога уровнем выше (такая копия обычно старая — # именно от неё и уезжает синхронизация молча). CANDIDATES=" $app/../ma7engine $app/../../ma7engine $app/../../../ma7engine $app/../../../admins/ma7engine " find_engine() { if [ -n "${MA7ENGINE:-}" ]; then if [ ! -d "$MA7ENGINE/core/browser" ]; then echo "update: в MA7ENGINE=$MA7ENGINE нет каталога core/browser" >&2 exit 1 fi abspath "$MA7ENGINE" return fi for candidate in $CANDIDATES; do if [ -d "$candidate/core/browser" ]; then abspath "$candidate" return fi done } # Куда класть серверную половину. Панели без своего сервера не получают её вовсе. server_target() { if [ -d "$panel/backend" ]; then echo "$panel/backend/core" elif [ -f "$app/server.ts" ]; then echo "$app/core" fi } # Скрипт обязан запускаться из фронта панели: $app определяется как каталог # уровнем выше scripts/, и запущенный не оттуда он молча создаёт постороннюю # src/core рядом с чем угодно. index.html — маркер vite-фронта. if [ ! -f "$app/index.html" ]; then echo "update: $app не похож на фронт панели (нет index.html)." >&2 echo " Скрипт запускается из <панель>/frontend: npm run update" >&2 exit 1 fi front_to=$app/src/core server_to=$(server_target) engine=$(find_engine) if [ -z "$engine" ]; then # В контейнере ядра нет — оно уже приехало внутри src/core (и backend/core) # вместе с остальными исходниками. Это норма, а не ошибка сборки. if [ -d "$front_to" ] || { [ -n "$server_to" ] && [ -d "$server_to" ]; }; then echo "update: ma7engine рядом не найден, использую уже синхронизированные копии" exit 0 fi echo "update: ma7engine не найден ни в одном из мест:" >&2 for candidate in $CANDIDATES; do echo " $candidate" >&2; done echo " Укажи путь через MA7ENGINE=/путь/к/ma7engine" >&2 exit 1 fi echo "update: ядро — $engine" copy() { # copy <откуда> <куда> <подпись> [ -d "$1" ] || return 0 rm -rf "$2" mkdir -p "$(dirname "$2")" cp -R "$1" "$2" echo " $3: $1 → $2" } copy "$engine/core/browser" "$front_to" "фронт" if [ -n "$server_to" ]; then copy "$engine/core/server" "$server_to" "сервер" fi # Доктор едет вместе с ядром: проверки в панели должны быть те же, что в ядре, # иначе панель отчитывается о соответствии по устаревшему списку. Кладётся # рядом с этим скриптом — оттуда его зовёт `npm run doctor`. if [ -f "$engine/scripts/doctor.mjs" ]; then cp "$engine/scripts/doctor.mjs" "$here/doctor.mjs" echo " доктор: $engine/scripts/doctor.mjs → $here/doctor.mjs" fi