Escribir un gancho SVN que actualice la copia del código confirmado

Escribir un gancho SVN que actualice la copia del código confirmado

Tengo un repositorio SVN con muchos subproyectos almacenados en él. En este momento, post-commitsimplemente recorro todas las carpetas posibles en la máquina y ejecuto svn updateen cada una de ellas:

REPOS="$1"
REV="$2"
DIRS=("/path/to/local/copy/firstproject" "/path/to/local/copy/anotherproject" ... "/path/to/local/copy/spam")
LOGNAME=`/usr/bin/whoami`

for DIR in ${DIRS[@]}
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

El problema es que esto es lento y redundante cuando solo estoy confirmando la subcarpeta de uno de los proyectos. Me pregunto si hay una mejor manera de identificar cuál de los DIRS debo usar ysoloactualiza ese.

Hay alguna manera de hacer esto? Hasta donde puedo decir, no hay forma de determinar qué parte de un repositorio se confirmó y, por lo tanto, qué directorio debe actualizarse.

¿La única alternativa es crear un repositorio separado para cada proyecto? (Probablemente debería haberlo hecho desde el principio, si es así...)

Respuesta1

Me pregunto si hay una mejor manera de identificar cuál de los DIRS debo usar y solo actualizar ese.

svnlook dirs-changedes lo que estás buscando:

# svnlook dirs-changed -r 40270 /path/to/the/repo
project1/foo/bar

Pruebe algo como esto:

#!/usr/local/bash4/bin/bash

typeset -A IP
typeset -A DOCROOT

PROJECTS="project1 project2"

IP=([project1]="ip1" [project2]="ip2")
DOCROOT=([project1]="/var/www/html/project1/" [project2]="/var/www/html/project2/")

REPO="$1"
REV="$2"

USER='deployer'

PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`

ssh -t "$USER@${IP[$PROJECT]}" "cd ${DOCROOT[$PROJECT]} && svn up"

Respuesta2

Aquí está el script que terminé usando, basado en la ayuda de Quanta:

REPO="$1"
REV="$2"
declare -A PROJECTS
PROJECTS=(\
    [project1]="/path/to/projects/project1 /path/to/projects/project1-devel" \
    [project2]="/path/to/projects/project2 /path/to/projects/project2-devel" \
    [project3]="/path/to/projects/project3 /path/to/projects/project3-devel" \
)

PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
DIRS=${PROJECTS[$PROJECT]}

for DIR in $DIRS
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

Tenga en cuenta que lo más importante que tuve que agregar fue la declare -A PROJECTSlínea. Por alguna razón, la matriz/hash asociativo no funcionaría hasta que hiciera esto.

información relacionada