Fix install.sh branch argument being silently overridden by BRANCH env #27

Merged
forgejo-admin merged 1 commit from feature/23_install_sh_branch_arg into main 2026-09-26 17:57:16 +00:00
Collaborator

Closes #23

Диагноз

Симптом «при любом запуске в BRANCH только main» воспроизводится, когда в окружении экспортирована BRANCH (например, BRANCH=main из dotfiles/обёртки): старая строка BRANCH="${BRANCH:-${1:-$BRANCH_DEFAULT}}" давала приоритет переменной окружения над аргументом — любой переданный аргумент молча игнорировался. Проверено трассировкой bash -x: BRANCH=main bash install.sh feature/mybranch → BRANCH=main.

Дополнительный фактор по таймлайну: аргумент-ветка появилась в main в 20:15 (+05) (PR #12, eeb5e70); установленная в /opt копия обновилась только в 21:05 — запуски до этого всегда ставили main. Теперь установленная копия уже с фиксом, а вопрос «аргумент vs env» закрыт явно.

Что сделано

  • Приоритет разрешения ветки: 1) позиционный аргумент → 2) BRANCH env → 3) main. Аргумент сознательно старше окружения (install.sh <branch> обязан срабатывать даже при BRANCH=main в окружении).
  • Блок разрешения обёрнут маркерами branch-resolution-v1 — тесты гоняют его в изоляции через bash, не запуская установщик.
  • Шапка скрипта: помечено, что аргумент старше BRANCH env.
  • Проверка git ls-remote перед применением — не тронута (шла раньше fetch/reset/clone).

Тесты

Новый test/installsh.test.js (9 тестов): матрица аргумент/env/дефолт — включая сам баг-сценарий из #23 (BRANCH=main + аргумент → аргумент выигрывает), env без аргумента, main как явный выбор, документация трёх форм вызова, ls-remote до применения, bash -n.

npm test   # 43/43 (было 34)

Проверка вживую (bash -x):

BRANCH=main bash -x deploy/install.sh feature/mybranch   # → BRANCH=feature/mybranch
bash -x deploy/install.sh                                # → BRANCH=main
cat deploy/install.sh | bash -s feature/x                # pipe-режим — работает
Closes #23 ## Диагноз Симптом «при любом запуске в BRANCH только main» воспроизводится, когда в окружении экспортирована `BRANCH` (например, `BRANCH=main` из dotfiles/обёртки): старая строка `BRANCH="${BRANCH:-${1:-$BRANCH_DEFAULT}}"` давала **приоритет переменной окружения над аргументом** — любой переданный аргумент молча игнорировался. Проверено трассировкой `bash -x`: `BRANCH=main bash install.sh feature/mybranch` → `BRANCH=main`. Дополнительный фактор по таймлайну: аргумент-ветка появилась в main в 20:15 (+05) (PR #12, `eeb5e70`); установленная в `/opt` копия обновилась только в 21:05 — запуски до этого всегда ставили main. Теперь установленная копия уже с фиксом, а вопрос «аргумент vs env» закрыт явно. ## Что сделано - Приоритет разрешения ветки: **1) позиционный аргумент → 2) `BRANCH` env → 3) `main`**. Аргумент сознательно старше окружения (`install.sh <branch>` обязан срабатывать даже при `BRANCH=main` в окружении). - Блок разрешения обёрнут маркерами `branch-resolution-v1` — тесты гоняют его в изоляции через bash, не запуская установщик. - Шапка скрипта: помечено, что аргумент старше `BRANCH` env. - Проверка `git ls-remote` перед применением — не тронута (шла раньше fetch/reset/clone). ## Тесты Новый `test/installsh.test.js` (9 тестов): матрица аргумент/env/дефолт — включая сам баг-сценарий из #23 (`BRANCH=main` + аргумент → аргумент выигрывает), env без аргумента, `main` как явный выбор, документация трёх форм вызова, ls-remote до применения, `bash -n`. ```bash npm test # 43/43 (было 34) ``` Проверка вживую (bash -x): ```bash BRANCH=main bash -x deploy/install.sh feature/mybranch # → BRANCH=feature/mybranch bash -x deploy/install.sh # → BRANCH=main cat deploy/install.sh | bash -s feature/x # pipe-режим — работает ```
With BRANCH exported in the environment (e.g. BRANCH=main from a wrapper
or dotfiles), the old ${BRANCH:-${1:-main}} resolution made any explicit
branch argument a no-op: the installer kept using the env value (issue #23).

Resolution priority is now: 1) positional argument, 2) BRANCH env,
3) default main. The block is marked and covered by test/installsh.test.js
(arguments/env/priority matrix, marker presence, ls-remote-before-apply,
bash -n). Full suite: 43/43.
Author
Collaborator

Спасибо, мерж принял — фикс разрешения ветки в install.sh теперь в main (merge commit 763c6d8).

Итог по задаче:

  • Приоритет ветки: позиционный аргумент → BRANCH env → main; аргумент больше не молча игнорируется при экспортированном BRANCH.
  • Тесты test/installsh.test.js (9 кейсов, включая баг-сценарий из #23) — весь набор 43/43 зелёный.
  • Issue #23 закрылся автоматически мержем (Closes #23), у него стоит done.

Если при живом прогоне что-то поведёт себя не так, как в трассировке из описания — пишите, разберусь.

Спасибо, мерж принял — фикс разрешения ветки в `install.sh` теперь в `main` (merge commit `763c6d8`). Итог по задаче: - Приоритет ветки: позиционный аргумент → `BRANCH` env → `main`; аргумент больше не молча игнорируется при экспортированном `BRANCH`. - Тесты `test/installsh.test.js` (9 кейсов, включая баг-сценарий из #23) — весь набор 43/43 зелёный. - Issue #23 закрылся автоматически мержем (`Closes #23`), у него стоит `done`. Если при живом прогоне что-то поведёт себя не так, как в трассировке из описания — пишите, разберусь.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
forgejo-admin/watcherenish!27
No description provided.