Escrevendo um gancho SVN que atualiza a cópia do código confirmado

Escrevendo um gancho SVN que atualiza a cópia do código confirmado

Eu tenho um repositório SVN com vários subprojetos armazenados nele. No momento, post-commitapenas percorro todas as pastas possíveis na máquina e executo svn updatecada uma:

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

O problema é que isso é lento e redundante quando estou apenas enviando a subpasta de um dos projetos. Estou me perguntando se existe uma maneira melhor de identificar qual DIRS devo usar eapenasatualize esse.

Existe alguma maneira de fazer isso? Pelo que sei, não há como determinar qual parte de um repositório foi confirmada e, portanto, qual diretório precisa ser atualizado.

A única alternativa é criar um repositório separado para cada projeto? (Provavelmente deveria ter feito isso desde o início, se sim...)

Responder1

Gostaria de saber se existe uma maneira melhor de identificar qual DIRS devo usar e atualizar apenas esse.

svnlook dirs-changedé o que você está procurando:

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

Tente algo assim:

#!/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"

Responder2

Aqui está o script que acabei usando, baseado na ajuda do 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

Observe que a única coisa importante que tive que adicionar foi a declare -A PROJECTSlinha. Por alguma razão, o array/hash associativo não funcionaria até que eu fizesse isso.

informação relacionada