#!/usr/bin/env bash set -euo pipefail GITHUB_USER="ai5590" TOKEN_VAR_NAME="GIT_AI5590_CLASSIC_API_KEY" print_line() { echo "------------------------------------------------------------" } abort() { echo echo "Ошибка: $1" >&2 exit 1 } require_command() { command -v "$1" >/dev/null 2>&1 || abort "Не найдена команда '$1'. Установи её и запусти скрипт снова." } get_token() { if [[ -z "${GIT_AI5590_CLASSIC_API_KEY:-}" ]]; then abort "Не задана переменная окружения ${TOKEN_VAR_NAME}. Перед запуском выполни: export ${TOKEN_VAR_NAME}=\"ТВОЙ_GITHUB_TOKEN\"" fi } show_intro() { print_line echo "Этот скрипт создаст новый репозиторий в GitHub в аккаунте '${GITHUB_USER}'," echo "затем инициализирует git в текущей папке (если нужно)," echo "добавит файлы, кроме самого этого скрипта, создаст первый commit и отправит проект в GitHub." echo echo "Скрипт работает с содержимым ТЕКУЩЕЙ папки:" echo " $(pwd)" echo echo "Для авторизации используется переменная окружения:" echo " ${TOKEN_VAR_NAME}" print_line echo } ask_repo_name() { local repo_name read -r -p "Введите имя нового репозитория в GitHub: " repo_name repo_name="$(echo "$repo_name" | xargs)" [[ -n "$repo_name" ]] || abort "Имя репозитория не может быть пустым." if [[ ! "$repo_name" =~ ^[A-Za-z0-9._-]+$ ]]; then abort "Имя репозитория содержит недопустимые символы. Разрешены: буквы, цифры, точка, дефис, подчёркивание." fi REPO_NAME="$repo_name" } ask_visibility() { local answer echo read -r -p "Сделать репозиторий публичным? [y/N]: " answer answer="${answer:-N}" case "$answer" in y|Y|yes|YES|да|Да|ДА) REPO_PRIVATE="false" REPO_VISIBILITY_TEXT="public" ;; *) REPO_PRIVATE="true" REPO_VISIBILITY_TEXT="private" ;; esac } ask_confirmation() { echo print_line echo "Будет выполнено:" echo "1. Создание GitHub-репозитория '${GITHUB_USER}/${REPO_NAME}' (${REPO_VISIBILITY_TEXT})" echo "2. Подготовка git в текущей папке" echo "3. Commit файлов из текущей папки, кроме самого этого скрипта" echo "4. Push в ветку main" print_line echo read -r -p "Продолжить? [y/N]: " confirm confirm="${confirm:-N}" case "$confirm" in y|Y|yes|YES|да|Да|ДА) ;; *) echo "Отменено пользователем."; exit 0 ;; esac } check_not_inside_wrong_git_repo() { if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then local top top="$(git rev-parse --show-toplevel)" if [[ "$top" != "$(pwd)" ]]; then abort "Ты запустил скрипт внутри уже существующего git-репозитория, но не в его корне. Корень репозитория: $top Либо перейди в корень этого репозитория, либо запусти скрипт в папке, которая не вложена в другой git-репозиторий." fi fi } create_github_repo() { echo echo "Создаю репозиторий в GitHub..." local http_code local response_body_file response_body_file="$(mktemp)" http_code="$( curl -sS \ -o "$response_body_file" \ -w "%{http_code}" \ -X POST "https://api.github.com/user/repos" \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${GIT_AI5590_CLASSIC_API_KEY}" \ -H "X-GitHub-Api-Version: 2022-11-28" \ -d "$(cat </dev/null 2>&1; then echo "Git уже инициализирован." else git init echo "Git инициализирован." fi get_script_paths if [[ "$SCRIPT_INSIDE_PROJECT" == "true" ]]; then echo "Скрипт находится внутри проекта и будет исключён из commit:" echo " $SCRIPT_RELATIVE_PATH" git add . ":!$SCRIPT_RELATIVE_PATH" else git add . fi if git diff --cached --quiet; then echo "В staged нет изменений. Возможно, файлы уже были закоммичены ранее." else git commit -m "Initial commit" echo "Создан commit: Initial commit" fi git branch -M main local remote_url="https://${GITHUB_USER}:${GIT_AI5590_CLASSIC_API_KEY}@github.com/${GITHUB_USER}/${REPO_NAME}.git" if git remote get-url origin >/dev/null 2>&1; then echo "Remote 'origin' уже существует. Обновляю URL..." git remote set-url origin "$remote_url" else git remote add origin "$remote_url" fi } push_to_github() { echo echo "Отправляю проект в GitHub..." git push -u origin main echo echo "Готово." echo "Репозиторий: https://github.com/${GITHUB_USER}/${REPO_NAME}" } cleanup_remote_url() { echo echo "Убираю токен из remote URL, чтобы он не светился в git config..." local safe_url="https://github.com/${GITHUB_USER}/${REPO_NAME}.git" git remote set-url origin "$safe_url" echo "Теперь origin = ${safe_url}" } main() { require_command git require_command curl require_command realpath get_token check_not_inside_wrong_git_repo show_intro ask_repo_name ask_visibility ask_confirmation create_github_repo prepare_git_repo push_to_github cleanup_remote_url } main "$@"