#!/bin/bash # integrate-worktrees.sh — Integra branches de worktrees a master con --no-ff # # Uso: ./integrate-worktrees.sh ... # Ejemplo: ./integrate-worktrees.sh 0026-split-runtime 0027-prune-config-schema # # Para cada slug: # 1. git merge --no-ff issue/ a master # 2. Verificar que master compila después del merge # 3. Si hay conflict o fallo de build, PARAR inmediatamente # # Los slugs deben pasarse en el orden correcto (waves ya resueltas). # NO hace push — eso lo decide el usuario. set -euo pipefail REPO_ROOT="$(git rev-parse --show-toplevel)" if [ $# -eq 0 ]; then echo "ERROR: se necesita al menos un slug" echo "Uso: $0 ..." exit 1 fi # Asegurar que estamos en master echo "=== Cambiando a master ===" cd "$REPO_ROOT" git checkout master MERGED=0 FAILED_AT="" for slug in "$@"; do branch="issue/${slug}" echo "" echo "=== Integrando: ${branch} ===" # Verificar que la branch existe if ! git show-ref --verify --quiet "refs/heads/${branch}"; then echo "FAIL: branch ${branch} no existe" FAILED_AT="$slug" break fi # Merge --no-ff if ! git merge --no-ff "$branch" -m "merge: ${branch} — implementación paralela"; then echo "" echo "CONFLICT: merge de ${branch} tiene conflictos" echo "Resolver manualmente y luego continuar con los slugs restantes" echo "" echo "Para resolver:" echo " 1. git status (ver archivos en conflicto)" echo " 2. Resolver conflictos en cada archivo" echo " 3. git add " echo " 4. git commit" echo "" echo "Slugs pendientes después de ${slug}:" FOUND=0 for remaining in "$@"; do if [ "$FOUND" -eq 1 ]; then echo " - ${remaining}" fi if [ "$remaining" = "$slug" ]; then FOUND=1 fi done exit 1 fi echo "MERGED: ${branch}" # Verificar que master sigue compilando (si BUILD_CMD esta definido) if [ -n "${BUILD_CMD:-}" ]; then echo "--- Verificando build post-merge ($BUILD_CMD) ---" if ! (cd "$REPO_ROOT" && bash -c "$BUILD_CMD" 2>&1); then echo "" echo "FAIL: master no compila despues de mergear ${branch}" echo "Revertir con: git reset --hard HEAD~1" echo "Investigar el problema antes de continuar." FAILED_AT="$slug" break fi echo "OK: build post-merge exitoso" else echo "--- Build post-merge SKIPPED (BUILD_CMD no definido) ---" fi MERGED=$((MERGED + 1)) done echo "" echo "=== Resumen de integración ===" echo "Mergeados: ${MERGED} de $#" if [ -n "$FAILED_AT" ]; then echo "Falló en: ${FAILED_AT}" echo "" echo "Worktrees NO limpiados (resolver primero el fallo)" exit 1 fi # Limpieza de worktrees y branches echo "" echo "=== Limpieza ===" for slug in "$@"; do path="${REPO_ROOT}/worktrees/${slug}" branch="issue/${slug}" if [ -d "$path" ]; then git worktree remove "$path" 2>/dev/null && echo "REMOVED: worktree ${path}" || echo "WARN: no se pudo eliminar worktree ${path}" fi git branch -d "$branch" 2>/dev/null && echo "DELETED: branch ${branch}" || echo "WARN: no se pudo eliminar branch ${branch}" done echo "" echo "=== Integración completa ===" echo "Master tiene ${MERGED} merges nuevos." echo "" echo "Para publicar: git push"