#!/usr/bin/env bash # 3X-UI_KIT (форк hacker07): подтянуть обновление автора в ветку dev и прогнать проверки. # # Ничего не публикует и ничего не обновляет на серверах: после проверок печатает, что делать # дальше (версия, подпись, тег, push). Запускать с рабочей станции, по шагам. # # bash tools/fork-sync.sh # подтянуть автора и проверить # bash tools/fork-sync.sh --apply # ещё и вписать VERSION/KIT_VERSION (номер версии) # # Логика версии: у автора 1.3 → наш номер 1.3.1; если база та же, а мы что-то доработали — # 1.3.2. Номер обязан строго расти: kit у серверов не принимает откат назад. set -Eeuo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." PY=${PY:-$(command -v python3 || command -v python || true)} [[ -n $PY ]] || { echo "! нужен python3" >&2; exit 1; } apply=no case ${1:-} in --apply) apply=yes ;; "") ;; *) echo "Использование: bash tools/fork-sync.sh [--apply]" >&2; exit 1 ;; esac say() { printf '\n\033[1m==> %s\033[0m\n' "$*"; } die() { printf '! %s\n' "$*" >&2; exit 1; } [[ -z $(git status --porcelain) ]] || die "в рабочей копии есть незакоммиченные правки — сначала закоммить или убери их" say "Забираю ветку автора" git fetch --prune upstream 'refs/heads/main:refs/heads/upstream' author_version=$(git show upstream:VERSION | tr -d '[:space:]') echo "у автора: $author_version" say "Переношу наши правки на свежую ветку автора" git checkout -q dev if ! git rebase upstream; then echo echo "Конфликт при переносе. Это ожидаемо, если автор переписал те же строки." echo " 1) разбери конфликт: git status, правь файлы, git add, git rebase --continue" echo " 2) если проще собрать швы заново: git rebase --abort, затем" echo " git checkout -B dev upstream && $PY tools/fork_apply.py && git commit -am 'fork: швы'" die "остановился, ничего не публикую" fi say "Проверяю, что наши швы ещё на месте" "$PY" tools/fork_apply.py --check say "Проверки кода (как на стороне сервера и в CI автора)" for f in scripts/*.sh tools/*.sh; do bash -n "$f" || die "$f: синтаксис"; done echo " ✓ bash -n" "$PY" -m py_compile scripts/kit-sub.py && echo " ✓ python-скрипты собираются" if grep -qU $'\r' scripts/*.sh tools/*.sh VERSION 2>/dev/null; then die "в файлах есть CRLF — сервер сверяет SHA256, и его сумма не сойдётся. Проверь core.autocrlf (нужен false)" fi echo " ✓ переводы строк LF" if command -v shellcheck >/dev/null; then shellcheck -S warning -e SC1090,SC2034,SC2211 scripts/*.sh tools/release.sh tools/fork-sync.sh && echo " ✓ shellcheck" else echo " – shellcheck не установлен, пропускаю" fi if command -v node >/dev/null; then node --test tools/test/*.test.js >/dev/null && echo " ✓ node --test" else echo " – node нет, пропускаю тесты генераторов" fi "$PY" tools/test/restore_env_test.py >/dev/null && "$PY" tools/test/restore_archive_test.py >/dev/null \ && echo " ✓ тесты копии (--restore)" say "Готово: наши правки лежат на свежем коде автора" git --no-pager log --oneline upstream..dev echo echo "Версия автора: $author_version · наша сейчас: $(tr -d '[:space:]' VERSION "$PY" tools/fork_apply.py >/dev/null echo "Версия сборки → $new (VERSION и KIT_VERSION в трёх скриптах)" fi cat <<'NEXT' Дальше вручную, по шагам: 1) подпись и релиз: bash tools/release.sh ~/.ssh/3x-ui-kit-fork/release_key 2) коммит и тег: git add -A && git commit -m "Релиз v$(cat VERSION): швы форка + подпись" git tag v$(cat VERSION) 3) публикация: git push origin dev v$(cat VERSION) upstream 4) на сервере: kit update --force && kit check NEXT