From ec811793765b484ae2ec21ee41c7cd5a1f1959ee Mon Sep 17 00:00:00 2001 From: root Date: Thu, 25 Jun 2026 19:34:02 +0200 Subject: [PATCH] fix: flexible branch handling - works with any branch name - Add detect_branch() function with smart fallback per repo - Auto-detect branches: tries exact match, capitalization variants, development/Development, main/master, remote branches - Never crashes on missing branch - warns and skips instead - Remove hardcoded branch validation (now accepts any branch name) - Add branch switcher to interactive menu (option 6) - Shows current branch and site URL in menu header - git_update() now uses git pull origin instead of generic pull - Update help text for --branch option --- update-Nitrov3.sh | 132 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 99 insertions(+), 33 deletions(-) diff --git a/update-Nitrov3.sh b/update-Nitrov3.sh index 07b26e9..2240647 100755 --- a/update-Nitrov3.sh +++ b/update-Nitrov3.sh @@ -393,14 +393,10 @@ preflight() { export NITRO_SITE_URL fi - # Branch + # Branch — accept any branch name, auto-detect per repo later if [ -z "${NITRO_BRANCH:-}" ]; then - read -r -p " Enter branch (main/dev) [main]: " NITRO_BRANCH + read -r -p " Enter branch [main]: " NITRO_BRANCH NITRO_BRANCH="${NITRO_BRANCH:-main}" - case "$NITRO_BRANCH" in - main|dev|master|staging) ;; - *) die "Invalid branch '$NITRO_BRANCH'. Use main, dev, master, or staging." ;; - esac export NITRO_BRANCH fi } @@ -1619,22 +1615,69 @@ clean_node_modules() { fi } +detect_branch() { + local repo="$1" preferred="$2" + cd "$repo" 2>/dev/null || { echo "main"; return; } + + # Try exact match first + if git rev-parse --verify "$preferred" &>/dev/null; then + echo "$preferred" + return + fi + + # Try common variants: dev -> Dev -> development -> Development + local variants=("$preferred" "${preferred^}" "development" "Development" "main" "master" "Main" "Master") + for v in "${variants[@]}"; do + if git rev-parse --verify "$v" &>/dev/null; then + echo "$v" + return + fi + done + + # Try remote branches + local remote_branch=$(git branch -r 2>/dev/null | grep -oP "origin/\K${preferred}" | head -1 || echo "") + if [ -n "$remote_branch" ]; then + echo "$remote_branch" + return + fi + + # Last resort: current branch or main + local current=$(git branch --show-current 2>/dev/null || echo "main") + echo "${current:-main}" +} + git_update() { local repo="$1" branch="$2" - cd "$repo" + cd "$repo" || { warn "Cannot access $repo"; return 1; } + git stash --include-untracked 2>/dev/null || true local old_head old_head=$(git rev-parse HEAD 2>/dev/null || echo "") - if ! git checkout "$branch" 2>/dev/null; then - local alt="${branch^}" - if [ "$alt" != "$branch" ] && git checkout "$alt" 2>/dev/null; then - info "Branch '$branch' not found, using '$alt' instead" - branch="$alt" - else - die "Branch '$branch' (or '$alt') not found in $repo" - fi + + # Detect best available branch + local resolved_branch + resolved_branch=$(detect_branch "$repo" "$branch") + + if [ "$resolved_branch" != "$branch" ]; then + info "Branch '$branch' not available in $(basename "$repo"), using '$resolved_branch' instead" fi - git pull 2>/dev/null || die "Git pull failed in $repo" + + if ! git checkout "$resolved_branch" 2>/dev/null; then + # Fallback: try to find ANY branch + local fallback=$(git branch -r 2>/dev/null | head -1 | sed 's/origin\///' | xargs || echo "main") + warn "Could not checkout '$resolved_branch', trying '$fallback'" + if ! git checkout "$fallback" 2>/dev/null; then + warn "No suitable branch found in $(basename "$repo"), skipping" + return 1 + fi + resolved_branch="$fallback" + fi + + if ! git pull origin "$resolved_branch" 2>/dev/null && ! git pull 2>/dev/null; then + warn "Git pull failed in $(basename "$repo") (branch: $resolved_branch)" + return 1 + fi + [ "$(git rev-parse HEAD 2>/dev/null)" != "$old_head" ] } @@ -1648,6 +1691,7 @@ cmd_interactive() { echo -e " ${C_BOLD}${C_CYAN}╔══════════════════════════════════════════════════════════════╗${C_RESET}" echo -e " ${C_BOLD}${C_CYAN}║ MAIN CONTROL PANEL ║${C_RESET}" echo -e " ${C_CYAN}╠══════════════════════════════════════════════════════════════╣${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_DIM}Branch: ${C_CYAN}${NITRO_BRANCH:-main}${C_RESET} │ Site: ${C_CYAN}${NITRO_SITE_URL:-?}${C_RESET} ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_GREEN}${C_BOLD}1)${C_RESET} ${E_ROCKET} Full Update ${C_DIM}(pull + build + deploy)${C_RESET} ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_GREEN}${C_BOLD}2)${C_RESET} ${E_GEAR} Update Emulator Only ${C_DIM}(Java backend)${C_RESET} ${C_CYAN}║${C_RESET}" @@ -1655,14 +1699,15 @@ cmd_interactive() { echo -e " ${C_CYAN}║${C_RESET} ${C_GREEN}${C_BOLD}4)${C_RESET} ${E_GEAR} Update Renderer Only ${C_DIM}(Nitro renderer)${C_RESET} ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_GREEN}${C_BOLD}5)${C_RESET} ${E_GEAR} Sync Configs Only ${C_DIM}(URL merge)${C_RESET} ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}6)${C_RESET} ${E_DB} Database Manager ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}7)${C_RESET} ${E_SHIELD} Backup / Restore ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}8)${C_RESET} ${E_WRENCH} Service Manager ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}9)${C_RESET} ${E_CHART} System Status ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}10)${C_RESET} ${E_HEART} Health Check ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}11)${C_RESET} ${E_BROOM} Cache Cleanup ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}12)${C_RESET} ${E_EYE} View Logs ${C_CYAN}║${C_RESET}" - echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}13)${C_RESET} ${E_GEAR} Configuration ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_MAGENTA}${C_BOLD}6)${C_RESET} ${E_GIT} Switch Branch ${C_DIM}(main/dev/staging)${C_RESET} ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}7)${C_RESET} ${E_DB} Database Manager ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}8)${C_RESET} ${E_SHIELD} Backup / Restore ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}9)${C_RESET} ${E_WRENCH} Service Manager ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}10)${C_RESET} ${E_CHART} System Status ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}11)${C_RESET} ${E_HEART} Health Check ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}12)${C_RESET} ${E_BROOM} Cache Cleanup ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}13)${C_RESET} ${E_EYE} View Logs ${C_CYAN}║${C_RESET}" + echo -e " ${C_CYAN}║${C_RESET} ${C_YELLOW}${C_BOLD}14)${C_RESET} ${E_GEAR} Configuration ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_RED}${C_BOLD}0)${C_RESET} Exit ${C_CYAN}║${C_RESET}" echo -e " ${C_CYAN}║${C_RESET} ${C_CYAN}║${C_RESET}" @@ -1678,8 +1723,29 @@ cmd_interactive() { 3) SELECTIVE_UPDATE="client"; cmd_update ;; 4) SELECTIVE_UPDATE="renderer"; cmd_update ;; 5) SELECTIVE_UPDATE="configs"; cmd_update ;; - 6) cmd_database ;; - 7) + 6) + echo "" + echo -e " ${C_BOLD}Current branch: ${C_CYAN}${NITRO_BRANCH:-main}${C_RESET}" + echo "" + echo -e " ${C_GREEN}1)${C_RESET} main" + echo -e " ${C_GREEN}2)${C_RESET} dev" + echo -e " ${C_GREEN}3)${C_RESET} staging" + echo -e " ${C_GREEN}4)${C_RESET} Type custom branch name" + echo "" + echo -en " Select branch [1-4]: " + local branch_choice + read -r branch_choice + case "$branch_choice" in + 1) NITRO_BRANCH="main" ;; + 2) NITRO_BRANCH="dev" ;; + 3) NITRO_BRANCH="staging" ;; + 4) echo -en " Enter branch name: "; read -r NITRO_BRANCH ;; + *) warn "Invalid selection" ;; + esac + [ -n "${NITRO_BRANCH:-}" ] && ok "Branch set to: $NITRO_BRANCH" + ;; + 7) cmd_database ;; + 8) local sub_choice sub_choice=$(select_menu "Backup & Restore" "Create Backup" "Restore Backup" "View Backups" "Return") case "$sub_choice" in @@ -1689,12 +1755,12 @@ cmd_interactive() { 4|*) ;; esac ;; - 8) cmd_services ;; - 9) cmd_status ;; - 10) cmd_health ;; - 11) cmd_clean ;; - 12) cmd_logs ;; - 13) cmd_config ;; + 9) cmd_services ;; + 10) cmd_status ;; + 11) cmd_health ;; + 12) cmd_clean ;; + 13) cmd_logs ;; + 14) cmd_config ;; 0|q|Q) echo -e "\n ${C_GREEN}Goodbye!${C_RESET}\n"; cursor_show; exit 0 ;; *) warn "Invalid selection" ;; esac @@ -1736,7 +1802,7 @@ show_help() { echo -e " ${C_CYAN}--force, -f${C_RESET} Force update even if up to date" echo -e " ${C_CYAN}--verbose, -v${C_RESET} Show debug output" echo -e " ${C_CYAN}--quiet, -q${C_RESET} Suppress output except errors" - echo -e " ${C_CYAN}--branch, -b${C_RESET} Git branch (main/dev/staging)" + echo -e " ${C_CYAN}--branch, -b${C_RESET} Git branch (any branch, auto-detects per repo)" echo -e " ${C_CYAN}--url, -u${C_RESET} Site URL" echo -e " ${C_CYAN}--only=${C_RESET} Selective update: emulator|client|renderer|configs" echo -e " ${C_CYAN}--version, -V${C_RESET} Show version"