ファイル名にリビジョン番号を含めておいて、バックアップ時にリビジョン番号がその番号を超えていれば、バックアップをするしくみ。
【svnbackup.sh】
#!/bin/sh
# バックアップ先ディレクトリ
BACKUP_BASE_DIR=/mnt/sdb1/backups/svn
# リポジトリベースディレクトリ
SVN_BASE_DIR=/var/svn
# リポジトリディレクトリ名リスト
REPO_NAMES="InvestmentSimulator gameProjectFiles private tamu trac_ja"
svn_backup()
{
TARGET_NAME=$1
if [ ! -d "${SVN_BASE_DIR}/${TARGET_NAME}" ]; then
echo ${TARGET_NAME} は、存在しません。
return
fi
# 最新のリビジョンを取得
NEW_REV=`svnlook youngest ${SVN_BASE_DIR}/${TARGET_NAME}`
# 前回バックアップ時のリビジョンを取得
LAST_REV=`get_last_revision ${TARGET_NAME}`
if [ "${LAST_REV}" -ge "${NEW_REV}" ]; then
# 現在のリビジョンが前回バックアップ時のリビジョン以下の場合
echo ${TARGET_NAME} は、前回バックアップ時と同じ状態です。
return
fi
sudo -u www-data svnadmin hotcopy ${SVN_BASE_DIR}/${TARGET_NAME} ${BACKUP_BASE_DIR}/${TARGET_NAME}
(cd ${BACKUP_BASE_DIR}; tar zpcf ${TARGET_NAME}_${NEW_REV}.tar.gz ${TARGET_NAME})
rm -rf ${BACKUP_BASE_DIR}/${TARGET_NAME}
echo ${TARGET_NAME} をバックアップしました。
}
get_last_revision()
{
TARGET_NAME=$1
# 前回のバックアップファイル名を取得
LAST_BACKUP_FILENAME=`basename \`ls -1r ${BACKUP_BASE_DIR}/${TARGET_NAME}* 2>/dev/null | head -1\` 2>/dev/null`
if [ -n "${LAST_BACKUP_FILENAME}" ]; then
# 前回バックアップ時のリビジョンを取得
LAST_REV=`echo ${LAST_BACKUP_FILENAME} | sed -e "s/.*_\([0-9]\+\)\.tar\.gz/\1/"`
echo ${LAST_REV}
else
echo "-1"
fi
}
for reponame in ${REPO_NAMES}
do
svn_backup ${reponame}
done