From 845683b986894822a3f51145f4ddd96ba1d5821a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Fri, 15 May 2026 02:46:55 +0300 Subject: [PATCH] fix(install): auth tarball download with GITHUB_TOKEN Private repos return 404 on archive/refs/heads/.tar.gz without Authorization. Use api.github.com/.../tarball/ when GITHUB_TOKEN/GH_TOKEN is set; tolerate the SHA-suffixed top dir. Co-authored-by: Cursor --- scripts/install.sh | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/scripts/install.sh b/scripts/install.sh index e35eb5c..601ec40 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -55,19 +55,38 @@ if [[ "${SKIP_DOWNLOAD:-}" != "1" ]]; then --retry-connrefused ) if [[ "${INSTALL_SCRIPT_VERBOSE:-}" == "1" ]]; then CURL_OPTS+=(--progress-bar); fi + # Поддержка GITHUB_TOKEN / GH_TOKEN: для приватных репозиториев публичный + # URL /archive/refs/heads/.tar.gz отдаёт 404 без авторизации. + GH_AUTH_TOKEN="${GITHUB_TOKEN:-${GH_TOKEN:-}}" + if [[ -n "${GH_AUTH_TOKEN}" ]]; then + CURL_OPTS+=(-H "Authorization: Bearer ${GH_AUTH_TOKEN}") + CURL_OPTS+=(-H "X-GitHub-Api-Version: 2022-11-28") + fi CURL_URL="${GITHUB_REPO_URL_OVERRIDE:-}" if [[ -z "${CURL_URL}" ]]; then - CURL_URL="https://github.com/${GITHUB_REPO}/archive/refs/heads/${BRANCH}.tar.gz" + if [[ -n "${GH_AUTH_TOKEN}" ]]; then + # API-tarball работает и для приватных репо, и для публичных. + CURL_URL="https://api.github.com/repos/${GITHUB_REPO}/tarball/${BRANCH}" + else + CURL_URL="https://github.com/${GITHUB_REPO}/archive/refs/heads/${BRANCH}.tar.gz" + fi fi if ! curl "${CURL_OPTS[@]}" "${CURL_URL}" | tar xz -C "${TMP}"; then echo "Ошибка: не удалось скачать или распаковать архив (${CURL_URL})." - echo "Подсказка: проверьте ping/curl до github.com, при необходимости export GITHUB_REPO_URL_OVERRIDE='…' или INSTALL_SCRIPT_VERBOSE=1." + echo "Подсказка: проверьте токен (для приватного репо нужен GITHUB_TOKEN/GH_TOKEN с правом Contents:Read), ping/curl до github.com, при необходимости export GITHUB_REPO_URL_OVERRIDE='…' или INSTALL_SCRIPT_VERBOSE=1." exit 1 fi echo "→ Перенос распакованного дерева в ${INSTALL_DIR}…" + # API-tarball распаковывается в каталог вида `--`, + # archive/refs/heads — в `-`. Поэтому берём первый каталог TMP. + __extracted_dir="$(find "${TMP}" -mindepth 1 -maxdepth 1 -type d | head -n1)" + if [[ -z "${__extracted_dir}" ]]; then + echo "Ошибка: распакованный архив пуст (${CURL_URL})." + exit 1 + fi rm -rf "${INSTALL_DIR}" mkdir -p "$(dirname "${INSTALL_DIR}")" - mv "${TMP}/${REPO_SLUG}-${BRANCH}" "${INSTALL_DIR}" + mv "${__extracted_dir}" "${INSTALL_DIR}" TMP="" echo "→ Источники на месте." fi