Files
ma7engine/scripts/update.sh
T
maenekoandClaude Opus 5 18bd05bcbb ma7engine: ядро, шаблон панели, скаффолдер и доктор
Первый коммит существующего состояния. Ядро кладётся под git ради того,
чтобы половины разъезжались в продуктовые репозитории через git subtree,
а не копированием: subtree делает настоящий merge, хранит историю и умеет
отдавать правки обратно.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
2026-08-26 20:39:37 +03:00

117 lines
5.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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