#!/usr/bin/env bash # update.sh - Update-Script für easyname Support Bash-Snippets # Aktualisiert Repository und re-linkt installierte Tools set -euo pipefail # Farben für Output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' NC='\033[0m' # No Color # Script-Verzeichnis ermitteln SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Dry-run Modus DRY_RUN=false # Logging-Funktionen log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_dry_run() { echo -e "${YELLOW}[DRY-RUN]${NC} $1" } # Hilfsfunktionen check_git_repo() { if [[ ! -d "$SCRIPT_DIR/.git" ]]; then log_error "Kein Git-Repository gefunden in $SCRIPT_DIR" log_error "Bitte das Repository ordnungsgemäß klonen!" exit 1 fi } backup_current_state() { local backup_dir="$SCRIPT_DIR/.update_backup_$(date +%Y%m%d_%H%M%S)" if [[ "$DRY_RUN" == "true" ]]; then log_dry_run "Würde Backup erstellen: $backup_dir" return fi log_info "Erstelle Backup des aktuellen Zustands..." mkdir -p "$backup_dir" # Backup wichtiger Dateien falls sie modifiziert wurden for file in "install.sh" "update.sh" "README.md"; do if [[ -f "$SCRIPT_DIR/$file" ]]; then cp "$SCRIPT_DIR/$file" "$backup_dir/" fi done log_success "Backup erstellt: $backup_dir" } update_repository() { log_info "Aktualisiere Repository..." if [[ "$DRY_RUN" == "true" ]]; then log_dry_run "Würde ausführen: git fetch origin" log_dry_run "Würde ausführen: git pull origin main" return fi # Fetch latest changes if ! git fetch origin; then log_error "Fehler beim Fetch der Remote-Änderungen" exit 1 fi # Check if updates available local local_commit local_commit=$(git rev-parse HEAD) local remote_commit remote_commit=$(git rev-parse origin/main) if [[ "$local_commit" == "$remote_commit" ]]; then log_info "Repository ist bereits auf dem neuesten Stand" return 0 fi log_info "Updates gefunden, führe Pull durch..." if ! git pull origin main; then log_error "Fehler beim Pull der Änderungen" log_error "Bitte manuell lösen und erneut versuchen" exit 1 fi log_success "Repository erfolgreich aktualisiert" return 1 # Updates wurden angewendet } find_installed_tools() { local installed_tools=() # Suche nach Symlinks in ~/bin die auf dieses Repository zeigen if [[ -d "$HOME/bin" ]]; then while IFS= read -r -d '' symlink; do local target target=$(readlink "$symlink") # Prüfe ob Symlink auf dieses Repository zeigt if [[ "$target" == "$SCRIPT_DIR"* ]]; then local tool_name tool_name=$(basename "$symlink") installed_tools+=("$tool_name:$target") fi done < <(find "$HOME/bin" -type l -print0 2>/dev/null || true) fi printf '%s\n' "${installed_tools[@]}" } relink_tools() { log_info "Suche installierte Tools..." local installed_tools mapfile -t installed_tools < <(find_installed_tools) if [[ ${#installed_tools[@]} -eq 0 ]]; then log_info "Keine installierten Tools gefunden" return fi log_info "Gefundene Tools: ${#installed_tools[@]}" for tool_info in "${installed_tools[@]}"; do IFS=':' read -r tool_name old_target <<< "$tool_info" local symlink_path="$HOME/bin/$tool_name" log_info "Aktualisiere Symlink für: $tool_name" if [[ "$DRY_RUN" == "true" ]]; then log_dry_run "Würde Symlink aktualisieren: $symlink_path -> $old_target" else # Symlink neu erstellen (aktualisiert automatisch den Pfad) ln -sf "$old_target" "$symlink_path" log_success "$tool_name Symlink aktualisiert" fi done } # Hilfsfunktion show_help() { cat <