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

3

Eu tenho um repositório SVN com muitos subprojetos armazenados nele. No momento, no meu post-commit , apenas percorro todas as pastas possíveis na máquina e executo svn update em cada:

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. Eu estou querendo saber se há uma maneira melhor de identificar qual dos DIRS eu deveria usar e somente atualizar esse.

Existe alguma maneira de fazer isso? Tanto quanto eu posso dizer que não há maneira de determinar qual parte de um repo 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 assim for ...)

    
por Jordan Reiter 27.08.2012 / 19:56

2 respostas

5

I'm wondering if there's a better way of identifying which of the DIRS I should use and only update that one.

svnlook dirs-changed é o que você re 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"
    
por 27.08.2012 / 21:58
1

Aqui está o script que acabei usando, com base 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

Note que a grande coisa que eu tive que adicionar foi a linha declare -A PROJECTS . Por alguma razão, o array / hash associativo não funcionaria até que eu fizesse isso.

    
por 28.08.2012 / 16:07

Tags