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
This commit is contained in:
root
2026-06-25 19:34:02 +02:00
parent dddfbcdf47
commit ec81179376
+99 -33
View File
@@ -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"