コミットされたコードのコピーを更新する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

どの 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"

答え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

追加しなければならなかった大きな点の 1 つは、declare -A PROJECTS行であることに注意してください。何らかの理由で、これを実行するまで連想配列/ハッシュは機能しませんでした。

関連情報