2011年1月30日日曜日

リポジトリバックアップ用スクリプト

リポジトリバックアップ用スクリプトを書いた。主に自分用に晒しておく。
ファイル名にリビジョン番号を含めておいて、バックアップ時にリビジョン番号がその番号を超えていれば、バックアップをするしくみ。

【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