diff --git a/bin/glcli_install.sh b/bin/glcli_install.sh new file mode 100755 index 0000000..c492b17 --- /dev/null +++ b/bin/glcli_install.sh @@ -0,0 +1,411 @@ +#!/bin/bash +# ------------------------------------------------------------------ +# [Author] Cortana Rosero One +# [Title] glcli_install.sh - Instalador de GitLab CLI +# [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) +# +# AGPL License +# Modified date: 14/03/2025 +# ------------------------------------------------------------------ + +# Función para verificar si se está ejecutando como root +check_root() { + if [ "$(id -u)" -ne 0 ]; then + echo "Este script requiere privilegios de administrador." + echo "Intentando escalar privilegios..." + + # Verificar si sudo está disponible + if command -v sudo &> /dev/null; then + echo "Usando sudo para escalar privilegios..." + sudo "$0" "$@" + exit $? + elif command -v doas &> /dev/null; then + echo "Usando doas para escalar privilegios..." + doas "$0" "$@" + exit $? + else + echo "ERROR: No se encontró sudo ni doas. Por favor ejecute este script como root." + exit 1 + fi + fi +} + +# Función para detectar la distribución +detect_distro() { + if [ -f /etc/os-release ]; then + . /etc/os-release + DISTRO=$ID + elif type lsb_release >/dev/null 2>&1; then + DISTRO=$(lsb_release -si | tr '[:upper:]' '[:lower:]') + elif [ -f /etc/lsb-release ]; then + . /etc/lsb-release + DISTRO=$DISTRIB_ID + elif [ -f /etc/debian_version ]; then + DISTRO="debian" + else + DISTRO=$(uname -s) + fi + + echo "Distribución detectada: $DISTRO" +} + +# Función para instalar glab mediante Homebrew en macOS y Linux +install_glab_homebrew() { + echo "Instalando GitLab CLI mediante Homebrew..." + + # Verificar si Homebrew está instalado + if ! command -v brew &> /dev/null; then + echo "Homebrew no está instalado. Instalando Homebrew..." + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # Verificar si la instalación fue exitosa + if ! command -v brew &> /dev/null; then + echo "ERROR: No se pudo instalar Homebrew." + return 1 + fi + fi + + # Instalar GitLab CLI + brew install gitlab-glab/tap/glab + + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante Homebrew." + return 0 + else + echo "ERROR: No se pudo instalar GitLab CLI mediante Homebrew." + return 1 + fi +} + +# Función para instalar glab en sistemas basados en Debian/Ubuntu +install_glab_debian() { + echo "Instalando GitLab CLI en sistema basado en Debian/Ubuntu..." + + # Verificar si curl está instalado + if ! command -v curl &> /dev/null; then + apt update && apt install -y curl + fi + + # Intentar primero usando apt + if command -v gpg &> /dev/null; then + echo "Agregando repositorio oficial de GitLab..." + curl -s https://gitlab.com/gitlab-org/cli/-/raw/main/scripts/install.sh | bash + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante script oficial." + return 0 + fi + fi + + # Si el método anterior falla, probar con Homebrew + echo "Intentando instalar mediante Homebrew..." + install_glab_homebrew + return $? +} + +# Función para instalar glab en sistemas basados en Red Hat/Fedora +install_glab_redhat() { + echo "Instalando GitLab CLI en sistema basado en Red Hat/Fedora..." + + # Verificar si dnf está instalado + if command -v dnf &> /dev/null; then + # Intentar primero usando el repositorio oficial + if command -v gpg &> /dev/null; then + echo "Usando script oficial de instalación..." + curl -s https://gitlab.com/gitlab-org/cli/-/raw/main/scripts/install.sh | bash + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante script oficial." + return 0 + fi + fi + + # Si el método anterior falla, probar con snap + if command -v snap &> /dev/null; then + echo "Intentando instalar mediante snap..." + snap install glab + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante snap." + return 0 + fi + fi + fi + + # Si los métodos anteriores fallan, probar con Homebrew + echo "Intentando instalar mediante Homebrew..." + install_glab_homebrew + return $? +} + +# Función para instalar glab en Arch Linux +install_glab_arch() { + echo "Instalando GitLab CLI en Arch Linux..." + + # Intentar primero usando el repositorio oficial + if command -v pacman &> /dev/null; then + # Verificar si glab está en los repositorios + if pacman -Ss glab | grep -q "^community/glab"; then + pacman -Sy --noconfirm glab + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente desde los repositorios oficiales." + return 0 + fi + fi + + # Si no está en los repositorios, intentar con yay (AUR) + if command -v yay &> /dev/null; then + yay -S --noconfirm glab + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente desde AUR." + return 0 + fi + fi + fi + + # Si los métodos anteriores fallan, probar con Homebrew + echo "Intentando instalar mediante Homebrew..." + install_glab_homebrew + return $? +} + +# Función para instalar glab en sistemas basados en SUSE +install_glab_suse() { + echo "Instalando GitLab CLI en sistema basado en SUSE..." + + # Intentar primero usando el script oficial + if command -v gpg &> /dev/null; then + echo "Usando script oficial de instalación..." + curl -s https://gitlab.com/gitlab-org/cli/-/raw/main/scripts/install.sh | bash + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante script oficial." + return 0 + fi + fi + + # Si el método anterior falla, probar con snap + if command -v snap &> /dev/null; then + echo "Intentando instalar mediante snap..." + snap install glab + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante snap." + return 0 + fi + fi + + # Si los métodos anteriores fallan, probar con Homebrew + echo "Intentando instalar mediante Homebrew..." + install_glab_homebrew + return $? +} + +# Función para instalar directamente usando Go +install_glab_go() { + echo "Intentando instalar GitLab CLI mediante Go..." + + # Verificar si Go está instalado + if ! command -v go &> /dev/null; then + echo "Go no está instalado. Se requiere Go para este método de instalación." + return 1 + fi + + # Instalar GitLab CLI mediante Go + go install gitlab.com/gitlab-org/cli/cmd/glab@main + + if [ $? -eq 0 ]; then + echo "GitLab CLI instalado correctamente mediante Go." + echo "Asegúrese de que \$GOPATH/bin esté en su PATH." + echo "Por ejemplo, puede agregar lo siguiente a su ~/.bashrc o ~/.zshrc:" + echo "export PATH=\$PATH:\$HOME/go/bin" + return 0 + else + echo "ERROR: No se pudo instalar GitLab CLI mediante Go." + return 1 + fi +} + +# Función para instalar usando método binario genérico +install_glab_binary() { + echo "Instalando GitLab CLI usando binarios precompilados..." + + # Crear directorio temporal + TMP_DIR=$(mktemp -d) + cd "$TMP_DIR" || return 1 + + # Detectar arquitectura + ARCH=$(uname -m) + case "$ARCH" in + x86_64) + ARCH="amd64" + ;; + aarch64|arm64) + ARCH="arm64" + ;; + *) + echo "Arquitectura no soportada: $ARCH" + return 1 + ;; + esac + + # Detectar sistema operativo + OS=$(uname -s | tr '[:upper:]' '[:lower:]') + + # Obtener la última versión + LATEST_VERSION=$(curl -s https://api.github.com/repos/profclems/glab/releases/latest | grep "tag_name" | cut -d'"' -f4) + if [ -z "$LATEST_VERSION" ]; then + LATEST_VERSION="v1.25.0" # Versión de respaldo si no se puede obtener la última + fi + + # Construir URL de descarga + DOWNLOAD_URL="https://github.com/profclems/glab/releases/download/${LATEST_VERSION}/glab_${LATEST_VERSION:1}_${OS}_${ARCH}.tar.gz" + + echo "Descargando GitLab CLI desde: $DOWNLOAD_URL" + + # Descargar y extraer + curl -L "$DOWNLOAD_URL" -o glab.tar.gz + if [ $? -ne 0 ]; then + echo "ERROR: No se pudo descargar GitLab CLI." + cd - > /dev/null + rm -rf "$TMP_DIR" + return 1 + fi + + tar xzf glab.tar.gz + if [ $? -ne 0 ]; then + echo "ERROR: No se pudo extraer el archivo de GitLab CLI." + cd - > /dev/null + rm -rf "$TMP_DIR" + return 1 + fi + + # Instalar binario + mv bin/glab /usr/local/bin/glab + chmod +x /usr/local/bin/glab + + # Limpiar + cd - > /dev/null + rm -rf "$TMP_DIR" + + # Verificar instalación + if command -v glab &> /dev/null; then + echo "GitLab CLI instalado correctamente mediante binarios precompilados." + return 0 + else + echo "ERROR: No se pudo instalar GitLab CLI mediante binarios precompilados." + return 1 + fi +} + +# Función para verificar si glab está instalado +check_glab() { + if command -v glab &> /dev/null; then + echo "GitLab CLI ya está instalado." + echo "Versión actual:" + glab --version + read -p "¿Desea reinstalar o actualizar? (s/n): " REINSTALL + if [[ ! "$REINSTALL" =~ ^[Ss]$ ]]; then + echo "Operación cancelada." + exit 0 + fi + fi +} + +# Función principal +main() { + # Verificar si ya está instalado + check_glab + + # Verificar privilegios de root (excepto en macOS) + if [ "$(uname -s)" != "Darwin" ]; then + check_root "$@" + fi + + # Detectar la distribución + detect_distro + + # Intentar instalar según la distribución + install_success=false + + case $DISTRO in + ubuntu|debian|linuxmint|pop|elementary|raspbian) + install_glab_debian + if [ $? -eq 0 ]; then + install_success=true + fi + ;; + fedora|rhel|centos|rocky|almalinux) + install_glab_redhat + if [ $? -eq 0 ]; then + install_success=true + fi + ;; + arch|manjaro|endeavouros) + install_glab_arch + if [ $? -eq 0 ]; then + install_success=true + fi + ;; + opensuse*|suse|sles) + install_glab_suse + if [ $? -eq 0 ]; then + install_success=true + fi + ;; + darwin) + install_glab_homebrew + if [ $? -eq 0 ]; then + install_success=true + fi + ;; + *) + echo "Distribución no soportada directamente: $DISTRO" + echo "Intentando métodos alternativos..." + ;; + esac + + # Si no se pudo instalar con el método específico para la distribución, intentar métodos alternativos + if [ "$install_success" = false ]; then + echo "Intentando métodos alternativos de instalación..." + + # Intentar instalar con Go + if command -v go &> /dev/null; then + install_glab_go + if [ $? -eq 0 ]; then + install_success=true + fi + fi + + # Si aún no se ha instalado, probar con binarios precompilados + if [ "$install_success" = false ]; then + install_glab_binary + if [ $? -eq 0 ]; then + install_success=true + fi + fi + + # Si todos los métodos fallan + if [ "$install_success" = false ]; then + echo "No se pudo instalar GitLab CLI con ninguno de los métodos disponibles." + echo "Por favor, visite https://gitlab.com/gitlab-org/cli para instrucciones de instalación manual." + exit 1 + fi + fi + + # Verificar la instalación + if command -v glab &> /dev/null; then + echo "GitLab CLI instalado correctamente." + glab --version + + # Sugerir autenticación + echo "" + echo "Para autenticarse con GitLab, ejecute:" + echo "glab auth login" + echo "" + echo "Para más información, visite: https://gitlab.com/gitlab-org/cli/blob/main/docs/index.md" + else + echo "ERROR: La instalación de GitLab CLI falló." + exit 1 + fi +} + +# Ejecutar función principal +main "$@" + +exit 0 \ No newline at end of file