49 lines
1.8 KiB
Bash
Executable File
49 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Пуш в Gitea без ввода пароля. Читает GITEA_USER, GITEA_PASSWORD, GITEA_URL из .env.
|
||
# Использование: ./git-push.sh или ./git-push.sh origin main
|
||
|
||
set -e
|
||
cd "$(dirname "$0")"
|
||
|
||
if [[ ! -f .env ]]; then
|
||
echo "Файл .env не найден." >&2
|
||
exit 1
|
||
fi
|
||
|
||
GITEA_USER= GITEA_PASSWORD= GITEA_URL=
|
||
while IFS= read -r line; do
|
||
line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
||
[[ -z "$line" || "$line" =~ ^# ]] && continue
|
||
if [[ "$line" =~ ^GITEA_USER=(.*)$ ]]; then
|
||
GITEA_USER="${BASH_REMATCH[1]}"
|
||
elif [[ "$line" =~ ^GITEA_PASSWORD=(.*)$ ]]; then
|
||
GITEA_PASSWORD="${BASH_REMATCH[1]}"
|
||
elif [[ "$line" =~ ^GITEA_URL=(.*)$ ]]; then
|
||
GITEA_URL="${BASH_REMATCH[1]}"
|
||
fi
|
||
done < .env
|
||
|
||
[[ -z "$GITEA_USER" || -z "$GITEA_URL" ]] && { echo "В .env задайте GITEA_USER и GITEA_URL." >&2; exit 1; }
|
||
GITEA_URL="${GITEA_URL%/}"
|
||
|
||
# Путь репо из текущего remote (например negodiy/MAX.git)
|
||
REMOTE_PATH=$(git remote get-url origin 2>/dev/null | sed -n 's|.*://[^/]*/||p')
|
||
[[ -z "$REMOTE_PATH" ]] && REMOTE_PATH="negodiy/MAX.git"
|
||
|
||
# URL-кодирование пароля (безопасно для спецсимволов)
|
||
ENCODED_PASS=$(printf '%s' "$GITEA_PASSWORD" | python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.stdin.read(), safe=''))" 2>/dev/null || echo "$GITEA_PASSWORD")
|
||
|
||
HOST="${GITEA_URL#*://}"
|
||
ORIGIN_PLAIN="${GITEA_URL}/${REMOTE_PATH}"
|
||
# Протокол (http или https) + :// + user:pass@ + host/path
|
||
ORIGIN_WITH_CREDS="${GITEA_URL%%://*}://${GITEA_USER}:${ENCODED_PASS}@${HOST}/${REMOTE_PATH}"
|
||
|
||
git remote set-url origin "$ORIGIN_WITH_CREDS"
|
||
if (($#)); then
|
||
git push "$@"
|
||
else
|
||
git push -u origin main
|
||
fi
|
||
git remote set-url origin "$ORIGIN_PLAIN"
|
||
echo "Готово. Пароль из remote убран."
|