Auto-commit

This commit is contained in:
2025-08-17 00:31:28 -03:00
parent f05e3d20c5
commit b2b35f41eb
3 changed files with 275 additions and 201 deletions

View File

@ -1,143 +1,151 @@
#!/bin/bash
# =========================================================
# Script: git-subir.sh
# Autor: Nahuel (adaptado con QA)
# Descripción: Automatiza commits y pushes a Gitea con
# soporte de credenciales cifradas.
# =========================================================
echo "🚀 Instalando comando git subir..."
CONFIG="$HOME/.config/git-subir.conf"
# Solicitar datos
read -p "👤 Usuario de Gitea: " USUARIO
read -s -p "🔑 Token o contraseña: " TOKEN
echo ""
read -p "🌐 URL base de la API de Gitea: " API_BASE
# Verificar credenciales antes de cifrar
ENDPOINTS=("$API_BASE/user" "$API_BASE/api/v1/user")
ENDPOINT_VALIDO=""
for URL in "${ENDPOINTS[@]}"; do
RESP=$(curl -s -o /dev/null -w "%{http_code}" -u "$USUARIO:$TOKEN" "$URL")
echo "🔍 Probando $URL → Código: $RESP"
if [ "$RESP" == "200" ]; then
ENDPOINT_VALIDO="$URL"
break
fi
done
if [ -z "$ENDPOINT_VALIDO" ]; then
echo "❌ Error de autenticación. No se encontró endpoint válido."
exit 1
# Cargar configuración si existe
if [[ -f "$CONFIG" ]]; then
source "$CONFIG"
fi
echo "✅ Autenticación exitosa con $ENDPOINT_VALIDO"
# Crear carpeta segura
CONFIG_DIR="$HOME/.config/git-subir"
mkdir -p "$CONFIG_DIR"
# Preguntar si desea cifrar
read -p "🔐 ¿Querés cifrar las credenciales? (s/n): " CIFRAR
if [[ "$CIFRAR" == "s" ]]; then
read -s -p "🔑 Contraseña para cifrado: " CLAVE
echo ""
echo "$USUARIO:$TOKEN:$API_BASE" | openssl enc -aes-256-cbc -pbkdf2 -salt -out "$CONFIG_DIR/credenciales.enc" -pass pass:"$CLAVE"
else
echo "$USUARIO:$TOKEN:$API_BASE" > "$CONFIG_DIR/credenciales.txt"
fi
# Crear script git-subir
cat > "$CONFIG_DIR/git-subir" <<'EOF'
#!/bin/bash
CONFIG_DIR="$HOME/.config/git-subir"
# 🔐 Cargar credenciales
if [ -f "$CONFIG_DIR/credenciales.enc" ]; then
read -s -p "🔑 Ingresá la contraseña de cifrado: " CLAVE
echo ""
CREDS=$(openssl enc -aes-256-cbc -pbkdf2 -d -in "$CONFIG_DIR/credenciales.enc" -pass pass:"$CLAVE" 2>/dev/null)
if [ -z "$CREDS" ]; then
echo "❌ Error al descifrar credenciales."
exit 1
fi
else
CREDS=$(cat "$CONFIG_DIR/credenciales.txt")
fi
USUARIO=$(echo "$CREDS" | cut -d: -f1)
TOKEN=$(echo "$CREDS" | cut -d: -f2)
API_BASE=$(echo "$CREDS" | cut -d: -f3)
# 🔁 Reconfigurar credenciales
if [[ "$1" == "--reconfigurar" ]]; then
read -p "👤 Nuevo usuario: " USUARIO
read -s -p "🔑 Nuevo token: " TOKEN
echo ""
read -p "🌐 Nueva URL base: " API_BASE
read -p "🔐 ¿Cifrar credenciales? (s/n): " CIFRAR
if [[ "$CIFRAR" == "s" ]]; then
read -s -p "🔑 Contraseña para cifrado: " CLAVE
echo ""
echo "$USUARIO:$TOKEN:$API_BASE" | openssl enc -aes-256-cbc -pbkdf2 -salt -out "$CONFIG_DIR/credenciales.enc" -pass pass:"$CLAVE"
rm -f "$CONFIG_DIR/credenciales.txt"
else
echo "$USUARIO:$TOKEN:$API_BASE" > "$CONFIG_DIR/credenciales.txt"
rm -f "$CONFIG_DIR/credenciales.enc"
fi
echo "✅ Credenciales reconfiguradas."
exit 0
fi
# 📂 Verificar si estamos en un repo
git rev-parse --is-inside-work-tree &>/dev/null || {
echo "❌ No estás en un repositorio Git."
exit 1
}
# 🧼 Detectar si el repo está vacío
git rev-parse HEAD &>/dev/null
if [ $? -ne 0 ]; then
echo "📁 El repositorio está vacío."
read -p "¿Querés crear README.md inicial? (s/n): " RESP
if [[ "$RESP" == "s" ]]; then
touch README.md
git add README.md
git commit -m "Commit inicial por git subir"
fi
fi
# 🌐 Verificar remote origin
git remote -v | grep origin >/dev/null || {
read -p "🌐 No hay remote origin. Ingresá URL del remote: " REMOTE
git remote add origin "$REMOTE"
}
# 📦 Detectar cambios sin commitear
if ! git diff-index --quiet HEAD --; then
echo "📦 Hay cambios sin commitear."
read -p "¿Querés hacer commit automático? (s/n): " RESP
if [[ "$RESP" == "s" ]]; then
git add .
git commit -m "Commit automático por git subir"
fi
fi
# 🚀 Intentar push
echo "🚀 Ejecutando git push..."
git push
if [ $? -ne 0 ]; then
echo "⚠️ Push falló. Intentando git pull y reintento..."
git pull --rebase
git push
fi
guardar_config() {
mkdir -p "$(dirname "$CONFIG")"
cat > "$CONFIG" <<EOF
URL=$URL
CRED=$CRED
EOF
}
chmod +x "$CONFIG_DIR/git-subir"
# ---------------------------------------------------------
# Reconfigurar credenciales
# ---------------------------------------------------------
if [[ "$1" == "--reconfigurar" ]]; then
echo "🔄 Reconfigurando credenciales..."
read -p "👤 Usuario de Gitea: " usuario
read -s -p "🔑 Token o contraseña: " token
echo ""
read -p "🌐 URL base de la API de Gitea: " URL
# Instalar en ~/.local/bin
mkdir -p "$HOME/.local/bin"
cp "$CONFIG_DIR/git-subir" "$HOME/.local/bin/git-subir"
chmod +x "$HOME/.local/bin/git-subir"
resp=$(curl -s -u "$usuario:$token" "$URL/api/v1/user")
if echo "$resp" | grep -q "\"login\":\"$usuario\""; then
echo "✅ Autenticación exitosa con $URL/api/v1/user"
else
echo "❌ Falló la autenticación. Abortando."
exit 1
fi
# Asegurar que ~/.local/bin esté en PATH
SHELL_RC="$HOME/.bashrc"
[[ "$SHELL" == */zsh ]] && SHELL_RC="$HOME/.zshrc"
grep -q 'export PATH="$HOME/.local/bin:$PATH"' "$SHELL_RC" || echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$SHELL_RC"
read -p "🔐 ¿Querés cifrar las credenciales? (s/n): " cifrar
if [[ "$cifrar" == "s" ]]; then
read -s -p "🔑 Contraseña para cifrado: " pass
echo ""
CRED=$(echo -n "$usuario:$token" | openssl enc -aes-256-cbc -a -pbkdf2 -pass pass:"$pass")
else
CRED="$usuario:$token"
fi
echo "✅ Instalación completa. Usá 'git subir' desde cualquier repositorio."
guardar_config
echo "✅ Reconfiguración completa."
exit 0
fi
# ---------------------------------------------------------
# Cambiar la clave de cifrado
# ---------------------------------------------------------
if [[ "$1" == "--cambiar-clave" ]]; then
echo "🔐 Cambiando contraseña de cifrado..."
if [[ -z "$CRED" ]]; then
echo "⚠️ No hay credenciales guardadas. Abortando."
exit 1
fi
read -s -p "🔑 Contraseña actual: " oldpass
echo ""
cred_descifrada=$(echo "$CRED" | openssl enc -aes-256-cbc -a -d -pbkdf2 -pass pass:"$oldpass" 2>/dev/null)
if [[ -z "$cred_descifrada" ]]; then
echo "❌ Contraseña incorrecta. Abortando."
exit 1
fi
read -s -p "🔑 Nueva contraseña: " newpass
echo ""
CRED=$(echo -n "$cred_descifrada" | openssl enc -aes-256-cbc -a -pbkdf2 -pass pass:"$newpass")
guardar_config
echo "✅ Contraseña de cifrado actualizada."
exit 0
fi
# ---------------------------------------------------------
# Descifrar credenciales si están cifradas
# ---------------------------------------------------------
if [[ "$CRED" =~ ^[A-Za-z0-9+/=]+$ ]]; then
read -s -p "🔑 Contraseña para descifrado: " pass
echo ""
descifrado=$(echo "$CRED" | openssl enc -aes-256-cbc -a -d -pbkdf2 -pass pass:"$pass" 2>/dev/null)
if [[ -n "$descifrado" ]]; then
CRED="$descifrado"
fi
fi
usuario=$(echo "$CRED" | cut -d: -f1)
token=$(echo "$CRED" | cut -d: -f2)
# Validar URL
if [[ -z "$URL" ]]; then
echo "❌ No se encontró la URL de Gitea en la configuración."
exit 1
fi
echo "📤 Subiendo cambios como $usuario a $URL..."
# ---------------------------------------------------------
# Verificar si es repo git
# ---------------------------------------------------------
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "📁 No estás en un repositorio git. Inicializando..."
git init
read -p "🌐 URL del remoto origin: " remote_url
git remote add origin "$remote_url"
fi
# ---------------------------------------------------------
# Detectar cambios sin commitear
# ---------------------------------------------------------
if [[ -n "$(git status --porcelain)" ]]; then
echo "📦 Hay cambios sin commitear."
read -p "❓ ¿Querés escribir un mensaje de commit? (s/n): " respuesta
if [[ "$respuesta" == "s" ]]; then
mensaje=""
while [[ -z "$mensaje" ]]; do
read -p "📝 Ingresá el mensaje de commit: " mensaje
done
git add -A
git commit -m "$mensaje"
else
git add -A
git commit -m "Auto-commit"
echo "✅ Commit automático generado."
fi
else
echo "✅ No hay cambios pendientes. Continuando con el push..."
fi
# ---------------------------------------------------------
# Push con verificación de upstream
# ---------------------------------------------------------
branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get branch.$branch.remote)
if [[ -z "$remote" ]]; then
echo "⚠️ La rama '$branch' no tiene remoto configurado."
echo "👉 Ejecutando: git push --set-upstream origin $branch"
git push --set-upstream origin "$branch" || { echo "❌ Falló el push."; exit 1; }
else
git push || { echo "❌ Falló el push."; exit 1; }
fi