Tengo un repositorio SVN con muchos subproyectos almacenados en él. En este momento, post-commit
simplemente recorro todas las carpetas posibles en la máquina y ejecuto svn update
en 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-changed
es 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 PROJECTS
línea. Por alguna razón, la matriz/hash asociativo no funcionaría hasta que hiciera esto.