|
1 | 1 | #!/usr/bin/env bash |
2 | 2 | # Создаёт GitHub Project (v2) у владельца, линкует репозиторий BirdLense-Hub, |
3 | | -# добавляет поле «Поток» (Backlog → … → Done) поверх стандартного Status. |
| 3 | +# добавляет поле «Поток» (Backlog → … → Done). |
4 | 4 | # |
5 | | -# Требуется один раз расширить gh-токен: |
6 | | -# gh auth refresh -s project -s read:project |
| 5 | +# Аутентификация (любой рабочий вариант): |
| 6 | +# |
| 7 | +# A) OAuth через браузер с нужными scope (надёжнее, чем только refresh): |
| 8 | +# gh auth logout -h github.com |
| 9 | +# gh auth login -h github.com -w -s repo -s read:org -s gist -s project -s read:project |
| 10 | +# |
| 11 | +# B) Классический PAT: https://github.com/settings/tokens/new |
| 12 | +# Включите scope «project» (и «repo», «read:org» как минимум). |
| 13 | +# export GH_TOKEN=ghp_xxxxxxxx |
| 14 | +# bash scripts/github-bootstrap-project.sh |
| 15 | +# |
| 16 | +# Вариант «refresh» часто НЕ добавляет project, если токен fine-grained или кэш не обновился. |
7 | 17 | # |
8 | 18 | set -euo pipefail |
9 | 19 |
|
10 | 20 | OWNER="${GITHUB_PROJECT_OWNER:-Gfermoto}" |
11 | 21 | REPO_FULL="${GITHUB_REPO:-Gfermoto/BirdLense-Hub}" |
12 | 22 | PROJECT_TITLE="${GITHUB_PROJECT_TITLE:-BirdLense Hub — Roadmap}" |
13 | 23 |
|
14 | | -if ! gh project list --owner "$OWNER" --limit 1 >/dev/null 2>&1; then |
15 | | - echo "gh не может читать Projects (нужны scope project / read:project). Выполните:" |
16 | | - echo " gh auth refresh -s project -s read:project" |
17 | | - echo "Затем снова запустите этот скрипт." |
| 24 | +die_help() { |
| 25 | + echo "" |
| 26 | + echo "=== Что сделать ===" |
| 27 | + echo "1) Посмотрите scopes: gh auth status" |
| 28 | + echo " Нужны в списке: project и read:project (или один classic PAT с правом Projects)." |
| 29 | + echo "" |
| 30 | + echo "2) Надёжно: полный вход с scope:" |
| 31 | + echo " gh auth logout -h github.com" |
| 32 | + echo " gh auth login -h github.com -w -s repo -s read:org -s gist -s project -s read:project" |
| 33 | + echo "" |
| 34 | + echo "3) Или classic PAT в переменную (не коммитьте!):" |
| 35 | + echo " export GH_TOKEN=ghp_..." |
| 36 | + echo " bash scripts/github-bootstrap-project.sh" |
| 37 | + echo "" |
18 | 38 | exit 1 |
| 39 | +} |
| 40 | + |
| 41 | +TMPERR=$(mktemp) |
| 42 | +trap 'rm -f "$TMPERR"' EXIT |
| 43 | + |
| 44 | +if ! gh project list --owner "$OWNER" --limit 1 2>"$TMPERR"; then |
| 45 | + echo "Ошибка при gh project list:" |
| 46 | + sed 's/^/ /' "$TMPERR" |
| 47 | + echo "" |
| 48 | + if [[ -n "${GH_TOKEN:-}" ]]; then |
| 49 | + echo "Используется GH_TOKEN: убедитесь, что это классический PAT со scope «project» (fine-grained с ограничением только на репо Projects может не подойти)." |
| 50 | + else |
| 51 | + echo "Токен gh, скорее всего, без scope Projects. «gh auth refresh» иногда не меняет права (fine-grained / старый OAuth)." |
| 52 | + fi |
| 53 | + die_help |
19 | 54 | fi |
20 | 55 |
|
21 | 56 | exists_json=$(gh project list --owner "$OWNER" --format json --limit 50) |
|
33 | 68 | echo "Линкую $REPO_FULL…" |
34 | 69 | gh project link "$proj_num" --owner "$OWNER" --repo "$REPO_FULL" 2>/dev/null || true |
35 | 70 |
|
36 | | -# Доп. поле для канбана (рядом со стандартным полем Status в Projects) |
37 | | -echo "Добавляю поле «Поток» (если ещё нет — при дубликате будет ошибка, её можно игнорировать)…" |
| 71 | +echo "Добавляю поле «Поток» (если ещё нет — при дубликате можно игнорировать)…" |
38 | 72 | gh project field-create "$proj_num" --owner "$OWNER" \ |
39 | 73 | --name "Поток" \ |
40 | 74 | --data-type "SINGLE_SELECT" \ |
|
0 commit comments