バックアップ版へ戻すコマンド - revert-from-backup
みんなは毎日バックアップを取っているかな?俺は更新頻度の高い/home以下はちゃんと毎日取っている。
たま〜にだけどファイルを更新してて、動きがおかしくなったからバックアップ版に戻したいということがあるだろう。バージョン管理システムを使えって?もちろん自分が作成したファイルのほぼすべてに使っている。しかし、常用するelispをアップグレードしたら動かなくなったとしたらどうするか?バックアップから書き戻すのが手っ取り早い。
俺の場合ホームディレクトリ /home/rubikitch 以下はDVD-RAMの /d/backup/rubikitch 以下にそのままバックアップされている。たとえば /home/rubikitch/.emacs は /d/backup/rubikitch/.emacs にバックアップされる。しかし、同じパスを二度書くのは面倒だ。そこでこの小さいスクリプトを。
もちろん BACKUP_DIR, HOME_DIR, MOUNT_DIR は環境に応じて書き換えてくれ。
#!/usr/bin/env ruby
BACKUP_DIR = "/d/backup/rubikitch/"
HOME_DIR = ENV['HOME'] + "/"
MOUNT_DIR = "/d"
require 'fileutils'
require 'optparse'
ARGV.options {|o|
o.banner = "revert-from-backup [-m] files..."
o.on("-m", "Mount and unmount backup file system.") {|x| @mount = true }
if ARGV.empty?
print o
exit 1
end
o.parse!
}
def backup_file(file)
file = File.expand_path(file)
if file =~ /^#{Regexp.union(HOME_DIR)}(.+)$/
BACKUP_DIR + $1
else
raise "#{file} is not on home directory."
end
end
def revert_files(files)
files.each do |file|
begin
FileUtils.cp(backup_file(file), file, :verbose => true)
rescue => err
warn err.message
end
end
end
system "mount", MOUNT_DIR if @mount
revert_files ARGV
system "umount", MOUNT_DIR if @mount
使い方は簡単で、
revert-from-backup -m ~/emacs/lisp/hogehoge.el ~/emacs/lisp/foo.el
と書いたら
mount /d cp /d/backup/rubikitch/emacs/lisp/hogehoge.el ~/emacs/lisp/hogehoge.el cp /d/backup/rubikitch/emacs/lisp/foo.el ~/emacs/lisp/foo.el umount /d
が実行される。