У меня есть репозиторий 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 мне следует использовать и только обновите это.
Как это сделать? Насколько я могу судить, невозможно определить, какая часть репо была зафиксирована и, следовательно, какой каталог необходимо обновить.
Единственная альтернатива - создать отдельный репозиторий для каждого проекта? (Наверное, следовало сделать это с самого начала, если так ...)
Мне интересно, есть ли лучший способ определить, какой из DIRS мне следует использовать, и обновить только его.
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"
Вот сценарий, который я в итоге использовал, основываясь на помощи 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
линия. По какой-то причине ассоциативный массив / хеш не работал, пока я этого не сделал.