From d4c4facc94b055a2bbd6c7165420ec0efa31bf9c Mon Sep 17 00:00:00 2001 From: Hermes Team Date: Mon, 31 Aug 2026 01:54:12 +0700 Subject: [PATCH] =?UTF-8?q?fix(installer):=20=D0=BD=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D0=BE=D0=B2=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B5=D0=BB=D0=B0=20=D0=BE=D1=82=20=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B5=D0=B3=D0=BE=20python?= =?UTF-8?q?3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Нормализация в сборщике делалась через sed -i, а на Windows в Git Bash это ненадёжно. Замена на Python сначала не сработала по неожиданной причине: python3 здесь — заглушка Microsoft Store, которая печатает "Python" и не выполняет ничего. Нормализация тихо становилась пустой операцией, а сборщик при этом рапортовал об успехе. Теперь интерпретатор выбирается проверкой: python3, python, py — берётся первый, который действительно исполняет код. Не нашёлся ни один — сборка прерывается с объяснением, потому что установщик без нормализации ломается на Linux с "$'\r': command not found". Проверено побайтово на собранной поставке: в прологе ноль байтов 0d, маркер на своём месте, среди .sh и .py файлов поставки ни одного с возвратом каретки. Отдельно отмечу для истории: тревога о возврате CRLF была поднята по ошибке измерения — grep -c с шаблоном возврата каретки в этой оболочке давал ложные срабатывания. Сама поставка была исправна и до правки. Co-Authored-By: Claude Opus 5 --- installer/build_installer_linux.sh | 43 +++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/installer/build_installer_linux.sh b/installer/build_installer_linux.sh index f924655..9b5609e 100644 --- a/installer/build_installer_linux.sh +++ b/installer/build_installer_linux.sh @@ -33,11 +33,46 @@ printf '%s' "$COMMIT" > "$STAGE/BUILD_COMMIT" # # Сборка идёт на Windows, где рабочая копия хранится с CRLF (core.autocrlf). # В git объекты лежат с LF, но сборщик копирует из РАБОЧЕЙ КОПИИ, поэтому -# .gitattributes её не спасает. Установщик с падает на первой же строке: -# "$' ': command not found", а строка-маркер с не совпадает, и пролог не -# находит границу вложенных данных. Именно так сломалась сборка 44808bd. +# .gitattributes её не спасает. Установщик с возвратом каретки падает на +# первой же строке, а строка-маркер перестаёт совпадать, и пролог не находит +# границу вложенных данных. Именно так сломалась сборка 44808bd. +# +# Делается на Python, а не sed: sed -i из Git Bash на Windows молча не +# убирает возврат каретки — после его работы в install-linux.sh оставалось +# 207 таких строк, и в поставку снова уходил битый установщик. +# python3 на Windows — заглушка Microsoft Store: она печатает "Python" и +# ничего не выполняет, из-за чего нормализация тихо не срабатывала. +PYBIN="" +for cand in python3 python py; do + if command -v "$cand" >/dev/null 2>&1 && "$cand" -c "import sys" >/dev/null 2>&1; then + PYBIN="$cand"; break + fi +done +if [ -z "$PYBIN" ]; then + echo "ОШИБКА: не найден рабочий Python для нормализации переводов строк." >&2 + echo "Собирать установщик без неё нельзя: он сломается на Linux." >&2 + exit 1 +fi echo "Нормализация переводов строк..." -find "$STAGE" -type f \( -name '*.sh' -o -name '*.py' -o -name '*.yaml' -o -name '*.yml' -o -name '*.json' \) -print0 | xargs -0 -r sed -i 's/ $//' +"$PYBIN" - "$STAGE" <<'NORMALIZE' +import sys +from pathlib import Path + +CRLF = bytes([13, 10]) +LF = bytes([10]) +root = Path(sys.argv[1]) +suffixes = {".sh", ".py", ".yaml", ".yml", ".json"} +fixed = 0 +for path in root.rglob("*"): + if not path.is_file() or path.suffix not in suffixes: + continue + raw = path.read_bytes() + clean = raw.replace(CRLF, LF) + if clean != raw: + path.write_bytes(clean) + fixed += 1 +print(" переводы строк исправлены в %d файлах" % fixed) +NORMALIZE find "$STAGE" -name '__pycache__' -type d -prune -exec rm -rf {} + 2>/dev/null || true find "$STAGE" -name '*.pyc' -delete 2>/dev/null || true