SHA256
246 lines
6.9 KiB
Bash
246 lines
6.9 KiB
Bash
#!/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 <<JSON
|
|
{
|
|
"name": "${REPO_NAME}",
|
|
"private": ${REPO_PRIVATE},
|
|
"auto_init": false
|
|
}
|
|
JSON
|
|
)"
|
|
)"
|
|
|
|
if [[ "$http_code" != "201" ]]; then
|
|
echo
|
|
echo "GitHub API вернул ошибку. HTTP code: $http_code"
|
|
echo "Ответ сервера:"
|
|
cat "$response_body_file"
|
|
rm -f "$response_body_file"
|
|
abort "Не удалось создать репозиторий '${GITHUB_USER}/${REPO_NAME}'."
|
|
fi
|
|
|
|
rm -f "$response_body_file"
|
|
echo "Репозиторий успешно создан: https://github.com/${GITHUB_USER}/${REPO_NAME}"
|
|
}
|
|
|
|
get_script_paths() {
|
|
SCRIPT_PATH="$(realpath "${BASH_SOURCE[0]}")"
|
|
PROJECT_PATH="$(pwd -P)"
|
|
|
|
SCRIPT_INSIDE_PROJECT="false"
|
|
SCRIPT_RELATIVE_PATH=""
|
|
|
|
case "$SCRIPT_PATH" in
|
|
"$PROJECT_PATH"/*)
|
|
SCRIPT_INSIDE_PROJECT="true"
|
|
SCRIPT_RELATIVE_PATH="${SCRIPT_PATH#$PROJECT_PATH/}"
|
|
;;
|
|
*)
|
|
SCRIPT_INSIDE_PROJECT="false"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
prepare_git_repo() {
|
|
echo
|
|
echo "Подготавливаю git в текущей папке..."
|
|
|
|
if git rev-parse --is-inside-work-tree >/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 "$@" |