fix(install): auth tarball download with GITHUB_TOKEN

Private repos return 404 on archive/refs/heads/<branch>.tar.gz
without Authorization. Use api.github.com/.../tarball/<ref> when
GITHUB_TOKEN/GH_TOKEN is set; tolerate the SHA-suffixed top dir.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Андрей Бобырев
2026-05-15 02:46:55 +03:00
parent 39a74e5f0a
commit 845683b986

View File

@@ -55,19 +55,38 @@ if [[ "${SKIP_DOWNLOAD:-}" != "1" ]]; then
--retry-connrefused --retry-connrefused
) )
if [[ "${INSTALL_SCRIPT_VERBOSE:-}" == "1" ]]; then CURL_OPTS+=(--progress-bar); fi if [[ "${INSTALL_SCRIPT_VERBOSE:-}" == "1" ]]; then CURL_OPTS+=(--progress-bar); fi
# Поддержка GITHUB_TOKEN / GH_TOKEN: для приватных репозиториев публичный
# URL /archive/refs/heads/<branch>.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:-}" CURL_URL="${GITHUB_REPO_URL_OVERRIDE:-}"
if [[ -z "${CURL_URL}" ]]; then 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 fi
if ! curl "${CURL_OPTS[@]}" "${CURL_URL}" | tar xz -C "${TMP}"; then if ! curl "${CURL_OPTS[@]}" "${CURL_URL}" | tar xz -C "${TMP}"; then
echo "Ошибка: не удалось скачать или распаковать архив (${CURL_URL})." 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 exit 1
fi fi
echo "→ Перенос распакованного дерева в ${INSTALL_DIR}" echo "→ Перенос распакованного дерева в ${INSTALL_DIR}"
# API-tarball распаковывается в каталог вида `<owner>-<repo>-<sha7>`,
# archive/refs/heads — в `<repo>-<branch>`. Поэтому берём первый каталог 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}" rm -rf "${INSTALL_DIR}"
mkdir -p "$(dirname "${INSTALL_DIR}")" mkdir -p "$(dirname "${INSTALL_DIR}")"
mv "${TMP}/${REPO_SLUG}-${BRANCH}" "${INSTALL_DIR}" mv "${__extracted_dir}" "${INSTALL_DIR}"
TMP="" TMP=""
echo "→ Источники на месте." echo "→ Источники на месте."
fi fi