Дело в том что у нас еть изрядно распухший проект состоящий нынче уже из ~10 подпроектов, и это не предел. Предложение установить билд-сервер пока наткнулось на некие проблемы, в частности мотивации 8). Но не суть важно, суть в том что в svn проекты лежат в таком виде
/mainProj
/subA
/trunk
/branches
/1.0
/subB
/subC
/trunk
/slaveProj
/subA
/subB
Т.е. крупный главный проект, внутрях которого сидят подпроекты, причем так как разработчиков немного то «ответвления» есть не везде. И проект основанный на главном, кой тоже состоит из пачки подпроектов.
Задача: выбирать из репозитория все дерево исходников, автоматически определяя есть ли «trunk», и складировать в директорию в виде удобном для дальнейшей сборки одной командой: build.xml и настроен так что, вызвав build он потянет за собой ../subB и ../mainProj/subA - именно это накладывает определенную иерархию директорий.
Решение из двух скриптов:
#--- lib.sh
#!/bin/bash
#list subprojects
# $1 - svn url
listProjects(){
svn list "$1"
}
#checkout project
# $2 - project url on svn repository
# $3 - local project path
checkoutProject(){
URL=$1
for DIR in `svn list "$URL"`; do
if [[ "$DIR" == "trunk/" ]]; then
#project has trunk and branches
#we need trunk
URL="${URL}trunk/"
fi
done;
echo "Checkout project at \"$URL\" to \"$2\""
svn checkout "$URL" "$2"
}
#checkout projects
# $1 - svn url
# $2 - root dir
# $3 - exceptions (not required)
checkoutProjects(){
echo "SNV repository url: $1"
echo "Working root directoy: $2"
echo "Exceptions regexp: $3"
if [[ ! -d $2 ]]; then
mkdir $2
fi;
for PROJ in `listProjects "$1"` ; do
echo "Project $PROJ:"
if [[ ! -n "$3" || !( "$PROJ" =~ $3 ) ]] ; then
checkoutProject "$1/$PROJ" "$2/$PROJ"
else
echo "skipped by EXCEPTION regular expression."
fi;
done;
}
#-- install.sh --
#!/bin/bash
PROJ_NAME="mainProj"
if [[ ! -n "$SVN_REPO" ]]; then
SVN_REPO="svn://192.168.1.1"
fi;
SVN_URL="$SVN_REPO/$PROJ_NAME"
ROOT_DIR="./$PROJ_NAME"
EXCEPT='^(install)/$' #like `^(install|docs)/$`
include(){
TEMP_FILE=${1//'/'/'_'}
svn cat "$1" > "$TEMP_FILE"
. "$TEMP_FILE"
}
include "$SVN_URL/install/lib.sh"
checkoutProjects "$SVN_URL" "$ROOT_DIR" "$EXCEPT"
Для slaveProject пришется еще один скрип
#!/bin/bash
if [[ ! -n "$SVN_REPO" ]]; then
SVN_REPO="svn://192.168.1.1"
fi;
include(){
TEMP_FILE=${1//'/'/'_'}
svn cat "$1" > "$TEMP_FILE"
. "$TEMP_FILE"
}
include "$SVN_REPO/mainProj/install/lib.sh"
include "$SVN_REPO/mainProj/install/install.sh"
PROJ_NAME="SlaveProj"
SVN_URL="$SVN_REPO/slave-proj"
ROOT_DIR="./$PROJ_NAME"
EXCEPT='^(install)/$' #like `^(install|docs)/$`
checkoutProjects "$SVN_URL" "$ROOT_DIR" "$EXCEPT"
он вытягивает сначала нужные lib.sh а затем mainProject и свой проект, все работает.
Вопрос: как разруливать подобные ситуации без вышеприведенного велосипедостроения?