Написание SVN-хука, который обновляет копию зафиксированного кода

Написание SVN-хука, который обновляет копию зафиксированного кода

У меня есть репозиторий SVN с множеством подпроектов, хранящихся в нем. Прямо сейчас в моем post-commitя просто прохожусь по всем возможным папкам на машине и запускаю svn updateдля каждой:

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

Проблема в том, что это медленно и избыточно, когда я просто фиксирую подпапку одного из проектов. Мне интересно, есть ли лучший способ определить, какой из DIRS мне следует использовать итолькообновите это.

Есть ли способ это сделать? Насколько я могу судить, нет способа определить, какая часть репозитория была зафиксирована и, следовательно, какой каталог нужно обновить.

Является ли единственной альтернативой создание отдельного репозитория для каждого проекта? (Вероятно, следовало бы сделать это с самого начала, если так...)

решение1

Мне интересно, есть ли лучший способ определить, какой из каталогов мне следует использовать, и обновлять только его.

svnlook dirs-changedэто то, что вы ищете:

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

Попробуйте что-то вроде этого:

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

решение2

Вот скрипт, который я в итоге использовал, основываясь на справке 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

Обратите внимание, что единственной большой вещью, которую мне пришлось добавить, была declare -A PROJECTSстрока. По какой-то причине ассоциативный массив/хеш не работал, пока я этого не сделал.

Связанный контент