Mezclando ramas con rama principal en SVN

Comparte!

Lo reconozco, me he hecho un asiduo fanático de git, no solo por su flexibilidad y facilidad para aprender y manejarlo sino por todas las bondades a la hora de manejar el despliegue de aplicaciones en ambientes, incluso en producción. Lo importante de todo esto, es manejar, al menos, una tecnología para el control de versiones. No sé si es una buena práctica, una salvación para el “yo del futuro”, evitar al desarrollador desordenado del equipo o una manera más cómoda de manejar tus códigos de fuente. Elige tu razón favorita, lo que es cierto es que hay muchas.

Ahora bien, si en tu trabajo te exigen usar algo distinto, siempre es bueno tener alguna carta bajo la manga. En mi caso, donde trabajo usan SVN. A pesar de que no tiene mucho que envidiarle a git, no es una herramienta que me sea cómoda de usar. Y no sé si es tontera mía, porque con clientes GUI como Tortoise (Windows) o Snail (MacOS) las cosas debieran ser más fáciles e intuitivas. Yo permanezco fiel a la vieja usanza con la línea de comandos. Puede que me sienta “hacker” como de las películas y lo considere más cool. Pero lo cierto es que me acomoda y me tranquiliza más entrar un par de comandos en la terminal, antes que hacer un par de clicks.

Es por eso que contrariando la posibilidad de simplificar mi vida es que opto por llenarme de scripts shell. Y algo que siempre asusta es el proceso de fusión de ramas con la rama principal. De ahí la razón de haber construido este script que permite lograrlo.

El script lo que realiza es,

  1. Autenticación con repositorio SVN
  2. Descarga trunk de repositorio
  3. Mezcla branch con trunk descargado
  4. Renombra branch para marcarlo como mezclado
  5. Elimina archivos descargados

Si tienen Windows, les recomiendo bastante Tortoise SVN

Por línea de comandos pueden instalarlo de las siguientes maneras,

  • brew install subversion (MacOS)
  • yum install mod_dav_svn subversion (CentOS, RHEL)
  • apt-get install subversion (Ubuntu)
###################################################
# Name: Merge working copy into trunk in SVN
# Author: Juane Chomon <hola@juane.cl>
# Version: 1.0.1
# Date: 23/09/2019
# Repository: git@github.com:juanecl/svn-scripts.git
####################################################

DEBUG=false
MSG="Branch renombrado tras merge"
TMP_DIR=~/svn/temp_merge_dir
EDITOR=nano
usage_branch_merge() { echo "Uso: branch.merge [-v] [-t <string>] [-b <string>] [-m <string>]" 1>&2; return 1}

# Se capturan parametros de entrada
while getopts "vt:b:m:" o; do
    case "${o}" in
        v)
            DEBUG=true
            if $DEBUG
            then
                echo "-----------------------------------------------"
                echo "Mezclar copia de trabajo al trunk de SVN - svn.branch.merge() función iniciada"
                echo "-----------------------------------------------"
                echo "INFO: Modo de depuración activado"
            fi
        ;;
        t)
            TRUNK=${OPTARG}
            if $DEBUG
            then
                echo "INFO: TRUNK: $TRUNK"
            fi
        ;;
        b)
            BRANCH=${OPTARG}
            if $DEBUG
            then
                echo "INFO: BRANCH: $BRANCH"
            fi
        ;;
        m)
            MSG=${OPTARG}
            if $DEBUG
            then
                echo "INFO: Mensaje de commit: $MSG"
            fi
        ;;
        *)
            if $DEBUG
            then
                echo "ERROR: Parámetro desconocido."
            fi
        ;;
    esac
done

if [ -z "$BRANCH" ]; then
  echo "No se especifica trunk de base para la mezcla"
  usage_svn_branch_merge
fi

if [ -z "$BRANCH" ]; then
  echo "No se especifica rama a mezclar"
  usage_svn_branch_merge
fi

BRANCH_DIR=`echo $BRANCH | rev | cut -d '/' -f 1 | rev`
MERGED_DIR="MEZCLADO_"$BRANCH_DIR
TRUNK_DIR=`echo $TRUNK | rev | cut -d '/' -f 1 | rev`
NEW_BRANCH=${BRANCH/$BRANCH_DIR/$MERGED_DIR}
LOG="$DEV/logs/svn/$BRANCH_DIR a $TRUNK_DIR - $DATETIME.log"

# Creamos un directorio temporal para trabajar
CURRENT_DIR=$(pwd)
mkdir -p $TMP_DIR
cd $TMP_DIR
echo "Creamos y entramos directorio temporal $TMP_DIR" >> $LOG

# Se verifica existencia de TRUNK 
svn info $TRUNK
error=$?
if [ $error -ne 0 ]; then
    echo "$TRUNK no existe (T)" >> $LOG
    usage_svn_branch_merge
else
    # Descargar repositorio del trunk
    svn checkout $TRUNK
    cd $TRUNK_DIR
    echo "Traemos trunk y entramos al directorio raíz $TRUNK_DIR" >> $LOG
    
    # Se verifica existencia de BRANCH
    svn info $BRANCH
    error=$?
    if [ $error -ne 0 ]; then
        echo "$BRANCH no existe (B)"
        usage_svn_branch_merge
    else
        # Mezclamos con el branch especificado y le hacemos commit al cambio
        svn merge $BRANCH
        svn commit -m "Fusión con master realizada"
        echo "Mezclamos la rama $BRANCH_DIR en el trunk y subimos el cambio" >> $LOG
        
        # Renombramos el branch por el nuevo nombre
        svn mv $BRANCH $NEW_BRANCH
        svn commit -m "$MSG"
        echo "Renombramos el branch para marcarlo como mezclado" >> $LOG
    fi
fi


# Eliminamos directorio temporal
cd $CURRENT_DIR
rm -rf $TMP_DIR
echo "Salimos del directorio temporal y lo eliminamos" >> $LOG

unset EDITOR

Comparte!