みなさんはtDiaryの日記データをどのようにバックアップしているのでしょうか。cronでアーカイブしていたり、dbi_ioでデータベースに保存して、データベースの内容をアーカイブしていたりしているのでしょうか。
開発者の人なら日記のデータもソースコードと同じようにバックアップしたいですよね。つまり、バージョン管理をして、レポジトリの内容をアーカイブするバックアップです。そんな人はこのようなSubversionIOはいかがでしょうか。保存する毎にSubversionリポジトリに日記データをコミットします。
require 'tdiary/defaultio'
module TDiary
class SubversionIO < DefaultIO
def transaction( date, &block )
dirty = TDiaryBase::DIRTY_NONE
result = super( date ) do |diaries|
dirty = block.call( diaries )
diaries = diaries.reject {|_, diary| /\A\s*\Z/ =~ diary.to_src}
dirty
end
unless (dirty & TDiaryBase::DIRTY_DIARY).zero?
run( "svn", "add", File.dirname( @dfile ) )
run( "svn", "add", @dfile )
Dir.chdir( @data_path ) do
run( "svn", "ci", "-m", "update #{date.strftime('%Y-%m-%d')}" )
end
end
result
end
private
def run( *command )
command = command.collect {|arg| escape_arg( arg )}.join(' ')
result = `#{command} 2>&1`
unless $?.success?
raise "Failed to run #{command}: #{result}"
end
result
end
def escape_arg( arg )
"'#{arg.gsub( /'/, '\\\'' )}'"
end
end
end
# Local Variables:
# ruby-indent-level: 3
# tab-width: 3
# indent-tabs-mode: t
# End:
使い方は以下の2ステップです。
-
tdiary.confで@io_classに指定する
-
日記のデータディレクトリをSubversionのワーキングコピーにする
tdiary.confの設定
まず、上記のソースコードをsubversionio.rbとしてどこかに保存してください。ここでは/home/tdiary/lib/以下に保存したとします。
次にtdiary.confに以下の内容を追記します。
subversion_io_dir = "/home/tdiary/lib" # <- 保存した場所にあわせて変更
require "#{subversion_io_dir}/subversionio"
@io_class = TDiary::SubversionIO
データディレクトリの設定
データディレクトリ(tdiary.conf内の@data_pathで指定したディレクトリ)は/home/tdiary/data/として進めます。また、作業しているユーザはtDiaryのCGIを動かすユーザとします。(ここではtdiaryユーザ)
まず、レポジトリに日記データ用のパスを作ります。既存のSubversionリポジトリを利用する場合は、例えばこのようになります。
[tdiary]% svn mkdir -m 'create tDiary data path' https://.../repos/tdiary-data
ローカルに新しくSubversionのリポジトリを作成して、そこに日記データをコミットするようにする場合はこのようになります。新しく作成するリポジトリは/home/tdiary/repos/に作ることにします。
[tdiary]% svnadmin create /home/tdiary/repos
Subversionリポジトリから日記データ保存用のパスを、tDiaryのデータディレクトリにチェックアウトします。今すでにあるtDiaryのデータディレクトリはどこかによけておきます。
[tdiary]% mv /home/tdiary/data /home/tdiary/data.bak
[tdiary]% svn co file:///home/tdiary/repos /home/tdiary/data
既存のデータをワーキングコピーに移動し、日記データだけをレポジトリにコミットします。
[tdiary]% cd /home/tdiary/data
[tdiary]% cp -rp ../data.bak/* ./
[tdiary]% svn add 200*
[tdiary]% svn add 199* # <- もし2000年より前のデータがあるなら
[tdiary]% svn ci -m 'import'
完了
以上で設定は完了です。日記を保存するとリポジトリにコミットされます。
制限
日記本文しか対応していません。ツッコミや画像には対応していません。
svnコマンドをインストールしている必要があります。
tDiary本体のコーディングスタイルに合わせているためタブインデントになっています。
ライセンス
AGPL3あるいは3以降の新しいバージョンのAGPL