From 61f8cacd91e602cc0332a2d303d8d053cda4781f Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Fri, 21 Nov 2025 12:58:30 +0100 Subject: [PATCH] Add docker-develop/update-and-build.sh --- docker-develop/update-and-build.sh | 232 +++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 docker-develop/update-and-build.sh diff --git a/docker-develop/update-and-build.sh b/docker-develop/update-and-build.sh new file mode 100644 index 0000000..43d06c5 --- /dev/null +++ b/docker-develop/update-and-build.sh @@ -0,0 +1,232 @@ +#!/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."