diff --git a/package.json b/package.json index 94a5ecf..32ec469 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "demo": "sh scripts/demo.sh", "new-panel": "node scripts/new-panel.mjs", + "release": "sh scripts/release.sh", "typecheck": "tsc --noEmit", "typecheck:server": "tsc --noEmit -p tsconfig.server.json" }, diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..33fc1a6 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,54 @@ +#!/bin/sh +# Готовит ветки, из которых продукты тянут ядро через `git subtree pull`. +# +# sh scripts/release.sh (или npm run release) +# +# У ядра две половины и два адресата, а `git subtree` работает с одним prefix +# за раз — поэтому каждая половина выделяется в свою ветку с собственной +# историей: +# +# core/browser → ветка dist/browser → <панель>/frontend/src/core +# core/server → ветка dist/server → <панель>/backend/core +# +# `git subtree split` переписывает историю выбранного каталога так, будто он +# всегда был корнем репозитория. Ветки полностью производные: их не правят +# руками и не мержат обратно — правится core/, после чего скрипт гоняется снова. +# +# Почему subtree, а не копирование: копия затирает любую локальную правку и не +# оставляет истории, поэтому «ядро в панели разошлось» выясняется постфактум. +# subtree делает настоящий merge — расхождение видно конфликтом в момент +# обновления, а правку, сделанную в продукте, можно отдать обратно в ядро +# (`git subtree push --prefix=<путь> <ядро> <ветка>`). +set -eu + +here=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +root=$(dirname "$here") +cd "$root" + +if [ -n "$(git status --porcelain)" ]; then + echo "release: рабочее дерево грязное — закоммить или спрячь правки" >&2 + git status --short >&2 + exit 1 +fi + +split() { # split <каталог> <ветка> + printf 'release: %s → %s\n' "$1" "$2" + git subtree split --prefix="$1" -b "$2" -q + printf ' %s\n' "$(git log -1 --format='%h %s' "$2")" +} + +split core/browser dist/browser +split core/server dist/server + +cat </frontend/src/core $root dist/browser --squash + git subtree add --prefix=<панель>/backend/core $root dist/server --squash + + # дальше + git subtree pull --prefix=<панель>/frontend/src/core $root dist/browser --squash + git subtree pull --prefix=<панель>/backend/core $root dist/server --squash +TXT