[SVN]更新のあったSubversionリポジトリのみのダンプをとる


管理しているSubversionリポジトリの数が多くなると、日々のバックアップにたいへん時間がかかります
ということで、前日にコミットのあったリポジトリだけダンプするちょっとしたスクリプトを組んでみました



前提条件

リポジトリ群は、以下の様なディレクトリ構成となっているものとします

/home/svn/repos/
      +-- project001
      +-- project002
      +-- project003
             :  :
             :  :

で、ダンプの出力先は、「/home/svn/backup/svn_リポジトリ名_backup」とします。

前日にコミットがあったかどうかの判断方法

リポジトリの状態を調べるコマンド「svnlook」を使って判断することにします
svnlookでリポジトリの最新リビジョンの日時を求める「date」オプションがあります

$ svnlook --help date
date: 使用方法: svnlook date <リポジトリパス>

タイムスタンプを表示します。

有効なオプション:
  -r [--revision]     : リビジョン番号を  と指定します
  -t [--transaction]  : トランザクション名を  と指定します

実際に実行してみると、以下のような結果が得られます

$ svnlook date /home/svn/repos/project001
2015-03-05 10:58:08 +0900 (木, 05  3月 2015)
$

これは最新リビジョンが示すコミット時間になりますので、これをスクリプトでうまく拾えば「前日に更新のあった」という判断はできそうです。

スクリプト

以下が完成したスクリプトです。
毎日cronで夜中に実行すればよいかと思います

#!/bin/sh
REP_BASE=/home/svn/repos
OUT_BASE=/home/svn/backup

#前日を取得(yyyymmdd形式)
LASTDATE=`date -d '1 days ago' '+%Y%m%d'`

files="${REP_BASE}/*"
for repPath in ${files}
do
  if [ -f ${repPath} ]; then
    continue;
  fi
  #リポジトリ名=ディレクトリ名
  repName=`basename ${repPath}`
  #最終コミット日(yyyymmdd形式)
  lastCommitDate=`svnlook date ${repPath} | gawk -F'[- ]' '{printf("%s%s%s",$1,$2,$3)}'`
  #最終コミット日が昨日以前の場合はダンプ採取不要
  if [ ${lastCommitDate} -lt ${LASTDATE} ]; then
    continue
  fi
  dumpFile_="svn_${repName}_backup"
  svnadmin dump ${repPath} > ${OUT_BASE}/${dumpFile_}
done