Eu tenho um repositório SVN com vários subprojetos armazenados nele. No momento, post-commit
apenas percorro todas as pastas possíveis na máquina e executo svn update
cada 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 PROJECTS
linha. Por alguma razão, o array/hash associativo não funcionaria até que eu fizesse isso.