#!/usr/bin/env bash set -euo pipefail # ============================================================================ # update-and-build.sh # Location: /docker/develop # # Purpose: # - Laat je een branch kiezen (of via BRANCH= meegeven) # - Onthoudt de laatst gebruikte branch in .last-branch in de repo root # - Commit en pusht altijd lokale wijzigingen (AUTO_COMMIT standaard aan) # - Haalt daarna updates op uit origin/ (git pull --rebase) # - Roept daarna het build-script in de repo aan (build-and-push.sh) met de # gekozen bump type (1/2/3/t) # # Gebruik: # BRANCH= sudo bash /docker/develop/update-and-build.sh [bump] # (BRANCH optioneel; zonder krijg je een menu met keuze, of kun je # handmatig een nieuwe branchnaam intypen) # ============================================================================ REPO_DIR="/docker/develop/backup-v9" # pas aan indien nodig BUILD_SCRIPT_NAME="build-and-push.sh" LAST_BRANCH_FILE=".last-branch" # wordt in REPO_DIR opgeslagen # Omgeving: optionele flags voor non-interactief gebruik AUTO_COMMIT="${AUTO_COMMIT:-1}" # 1 = altijd committen als er wijzigingen zijn AUTO_PUSH="${AUTO_PUSH:-1}" # 1 = push naar origin/ na commit AUTO_CREATE_BRANCH="${AUTO_CREATE_BRANCH:-1}" # 1 = nieuwe branch lokaal maken als hij nog niet bestaat # Commit message (optioneel prefix via COMMIT_MSG_PREFIX) DEFAULT_COMMIT_MSG_PREFIX="${COMMIT_MSG_PREFIX:-Auto-commit local changes before build}" # --- Input: bump type -------------------------------------------------------- BUMP_TYPE="${1:-}" if [[ -z "${BUMP_TYPE}" ]]; then echo "Select bump type: [1] patch, [2] minor, [3] major, [t] test (default: t)" read -r BUMP_TYPE BUMP_TYPE="${BUMP_TYPE:-t}" fi if [[ "$BUMP_TYPE" != "1" && "$BUMP_TYPE" != "2" && "$BUMP_TYPE" != "3" && "$BUMP_TYPE" != "t" ]]; then echo "[ERROR] Invalid bump type '$BUMP_TYPE' (use 1, 2, 3, or t)." exit 1 fi # --- Naar repo gaan ---------------------------------------------------------- echo "[INFO] Switching to repo: $REPO_DIR" cd "$REPO_DIR" # --- Fetch alle branches ----------------------------------------------------- echo "[INFO] Fetching all branches (origin)..." git fetch --all --prune # Lijst met origin branches (zonder origin/ prefix, HEAD gefilterd) mapfile -t BRANCHES < <( git for-each-ref \ --format='%(refname:short)' refs/remotes/origin \ | sed 's|^origin/||' \ | grep -vE '^HEAD$' \ | sort -u ) # Fallback: als er geen origin branches zijn, kijk dan naar lokale branches if [[ "${#BRANCHES[@]}" -eq 0 ]]; then mapfile -t BRANCHES < <( git for-each-ref \ --format='%(refname:short)' refs/heads \ | sort -u ) fi if [[ "${#BRANCHES[@]}" -eq 0 ]]; then echo "[ERROR] Geen branches gevonden (noch lokaal, noch bij origin)." exit 1 fi # --- Bepaal default branch/last branch --------------------------------------- ENV_BRANCH="${BRANCH:-}" LAST_BRANCH="" if [[ -f "$LAST_BRANCH_FILE" ]]; then LAST_BRANCH="$(<"$LAST_BRANCH_FILE")" fi CURRENT_BRANCH="$(git branch --show-current 2>/dev/null || true)" DEFAULT_BRANCH="$CURRENT_BRANCH" if [[ -z "$DEFAULT_BRANCH" ]]; then if [[ -n "$LAST_BRANCH" ]]; then DEFAULT_BRANCH="$LAST_BRANCH" else DEFAULT_BRANCH="${BRANCHES[0]}" fi fi CHOSEN_BRANCH="" # 1) Als BRANCH= in de omgeving is gezet, gebruik die direct if [[ -n "$ENV_BRANCH" ]]; then CHOSEN_BRANCH="$ENV_BRANCH" echo "[INFO] Branch via BRANCH env: $CHOSEN_BRANCH" else echo "[INFO] Beschikbare bestaande branches:" i=1 DEFAULT_INDEX=1 for b in "${BRANCHES[@]}"; do if [[ "$b" == "$DEFAULT_BRANCH" ]]; then echo " [$i] $b (default)" DEFAULT_INDEX="$i" else echo " [$i] $b" fi ((i++)) done echo echo "Je kunt een nummer kiezen voor een bestaande branch," echo "of een nieuwe branch-naam intypen." read -r -p "Selecteer nummer of typ nieuwe branch-naam (leeg = default): " choice # Leeg = default branch if [[ -z "$choice" ]]; then CHOSEN_BRANCH="$DEFAULT_BRANCH" echo "[INFO] Default branch geselecteerd: $CHOSEN_BRANCH" # Als gebruiker een nummer kiest elif [[ "$choice" =~ ^[0-9]+$ ]] && (( choice >= 1 && choice <= ${#BRANCHES[@]} )); then CHOSEN_BRANCH="${BRANCHES[choice-1]}" echo "[INFO] Bestaande branch gekozen: $CHOSEN_BRANCH" else # Anders: dit is een nieuwe branch CHOSEN_BRANCH="$choice" echo "[INFO] Nieuwe branch gekozen: $CHOSEN_BRANCH (wordt aangemaakt als hij nog niet bestaat)" fi fi # Schrijf gekozen branch weg als last-branch echo "$CHOSEN_BRANCH" > "$LAST_BRANCH_FILE" # --- Branch checkout / aanmaken ---------------------------------------------- REMOTE_REF_EXISTS=0 if git show-ref --verify --quiet "refs/remotes/origin/$CHOSEN_BRANCH"; then REMOTE_REF_EXISTS=1 fi LOCAL_REF_EXISTS=0 if git show-ref --verify --quiet "refs/heads/$CHOSEN_BRANCH"; then LOCAL_REF_EXISTS=1 fi if [[ "$LOCAL_REF_EXISTS" -eq 1 ]]; then echo "[INFO] Checkout bestaande lokale branch: $CHOSEN_BRANCH" git switch "$CHOSEN_BRANCH" else if [[ "$REMOTE_REF_EXISTS" -eq 1 ]]; then echo "[INFO] Nieuwe lokale branch maken vanaf origin/$CHOSEN_BRANCH" git switch -c "$CHOSEN_BRANCH" --track "origin/$CHOSEN_BRANCH" else if [[ "$AUTO_CREATE_BRANCH" -eq 1 ]]; then echo "[INFO] Nieuwe lokale branch maken (zonder bestaande remote): $CHOSEN_BRANCH" git switch -c "$CHOSEN_BRANCH" else echo "[ERROR] Branch '$CHOSEN_BRANCH' bestaat niet lokaal en niet bij origin." exit 1 fi fi fi # --- Functie: auto-commit lokale wijzigingen -------------------------------- auto_commit_if_needed() { if [[ "$AUTO_COMMIT" -ne 1 ]]; then return 0 fi # Check of er iets te committen is if [[ -z "$(git status --porcelain)" ]]; then echo "[INFO] Geen lokale wijzigingen om te committen." return 0 fi echo "[INFO] Lokale wijzigingen gedetecteerd in branch '$CHOSEN_BRANCH':" git status --short echo "[INFO] Auto-commit lokale wijzigingen..." git add -A # Commit message opbouwen (met timestamp) local ts ts="$(date +'%Y-%m-%d %H:%M:%S')" local msg="${DEFAULT_COMMIT_MSG_PREFIX} (${ts})" git commit -m "$msg" if [[ "$AUTO_PUSH" -eq 1 ]]; then echo "[INFO] Pushing naar origin/$CHOSEN_BRANCH..." git push -u origin "$CHOSEN_BRANCH" else echo "[INFO] AUTO_PUSH=0, push wordt overgeslagen." fi } # --- Eerst altijd lokale wijzigingen committen (voor git pull) -------------- auto_commit_if_needed # --- Daarna updaten vanaf origin (als remote bestaat) ------------------------ if git rev-parse --verify --quiet "origin/$CHOSEN_BRANCH" >/dev/null; then echo "[INFO] Pulling latest changes from origin/$CHOSEN_BRANCH (rebase)..." if ! git pull --rebase origin "$CHOSEN_BRANCH"; then echo "[ERROR] git pull --rebase gaf een fout. Los eerst conflicten op en probeer opnieuw." exit 1 fi else echo "[INFO] Geen origin/$CHOSEN_BRANCH gevonden; sla git pull over." fi # --- Na pull nogmaals checken of er iets open staat -------------------------- if [[ -n "$(git status --porcelain)" ]]; then echo "[INFO] Er zijn na git pull nog niet-gecommit-te wijzigingen." auto_commit_if_needed fi # --- Build script uitvoeren -------------------------------------------------- if [[ ! -f "./$BUILD_SCRIPT_NAME" ]]; then echo "[ERROR] Build script ./$BUILD_SCRIPT_NAME niet gevonden in $REPO_DIR" exit 1 fi chmod +x "./$BUILD_SCRIPT_NAME" echo "[INFO] Running build: ./$BUILD_SCRIPT_NAME $BUMP_TYPE" "./$BUILD_SCRIPT_NAME" "$BUMP_TYPE" echo "[INFO] Done."