2007-05-01 (Tue) [長年日記]
▲ リポジトリ壊れた
WebDAVで外部に公開していたsvnリポジトリが、いつのまにか壊れていた。リポジトリタイプはfsfs。普通にチェックアウトできていたので気がつかなかったが、ふと思い立ってダンプしてみると最後まで終わらずにエラーで止まる。db/revs以下を見てみると途中のリビジョン情報のいくつかが消えて失われているようだ。
恐らくfsfsが不安定だったバージョンの時期に発生しているのだろうけれど、チェックアウトもアップデートもできていたので気づくのが遅れてしまった。また、バックアップも--delete付きでrsyncを走らせていたため、消滅したファイルはバックアップ先でも消滅してしまっていた。
直近のリビジョンは取得できることと、以前のダンプファイルがあるので大事には至らなかったが、 やっぱし定期的にダンプしたものもバックアップしておいたほうがよさそう。
ということで複数のリポジトリをぐるぐるとダンプして回るRakeを作って対処してみた。
# -*- mode: ruby -*-
#
require 'rake'
require 'date'
SVNADMIN_CMD = '/usr/local/bin/svnadmin'
BACKUP_DIR = '/home/svn/backups'
SVNROOT_BASE = '/home/svn'
SVNROOTS = ['foo1', 'foo2']
desc "svn repository backups"
task :svnbackup do
SVNROOTS.each do |root|
svndump root
end
end
def svndump(root)
Dir["#{SVNROOT_BASE}/#{root}/**"].each do |dir|
mkdir "#{BACKUP_DIR}/#{root}" unless File.directory?("#{BACKUP_DIR}/#{root}")
sh "#{SVNADMIN_CMD} dump #{dir} > #{BACKUP_DIR}/#{root}/#{File.basename(dir)}-#{Date.today.strftime('%Y-%m-%d')}.dump"
end
Dir["#{BACKUP_DIR}/#{root}/**/*.dump"].each do |file|
sh "/usr/bin/gzip -9 -f #{file}"
end
end
▲ ソースコードの色づけ
実はリポジトリ壊れたのに気がついたのは、結構前のことなので単になにかのソース貼り付けたかっただけだったりして。
前々からソースコードを貼り付けたときにシンタックスのハイライトが欲しいと思っていて、綺麗に整形して行番号や印刷やクリップボードやらと機能的なdp.SyntaxHighlighterが気になりまくりであったが、elisp未対応なので、よくelispコードを貼ってる白井さんのために断念。
Gonzuiから分かれたLangScanを使うことにしてみた。対応言語がやけに多くてとても良い。
使い方
こんな感じに書くと
{{code(<<-'EOS', 'elisp')
(lambda (x) (+ x 1))
EOS
}}
こうなります。
(lambda (x) (+ x 1))
Rubyだと
{{code(<<-'EOS', 'ruby')
class Duck
def hello
p "hello."
end
end
EOS
}}
こんな感じ。
class Duck
def hello
p "hello."
end
end
codelist.rbプラグイン
codeプラグインは、こちらのcodelist.rbにちょこっと手を入れて使ってる。
2番目の引数で言語を指定するが、言語をあらわす文字列でもLangScanのシンボルを直接渡してもどちらでも動くようにした。
対応言語と文字列一覧は以下。
"autoconf" == LangScan::Autoconf "automake" == LangScan::Automake "bf" == LangScan::Brainfuck "c" == LangScan::C "csharp" == LangScan::Csharp "css" == LangScan::CSS "d" == LangScan::D "eiffel" == LangScan::Eiffel "elisp" == LangScan::EmacsLisp "io" == LangScan::Io "java" == LangScan::Java "js" == LangScan::JavaScript "lua" == LangScan::Lua "ocaml" == LangScan::OCaml "perl" == LangScan::Perl "php" == LangScan::PHP "python" == LangScan::Python "rpmspec" == LangScan::RPMSpec "ruby" == LangScan::Ruby "scheme" == LangScan::Scheme "sh" == LangScan::Shell "text" == LangScan::Text
変更したcodelist.rbプラグイン
require 'langscan'
module LangScan
def self.choose_by_abbrev(hint)
::LangScan::LangScanRegistry.each_value {|scanner|
return scanner if hint.downcase == scanner.abbrev
}
::LangScan::Text
end
end
Highlight_type = [
:fundef, :funcall, :classdef, :moduledef, :comment, :string,
:keyword, :const, :character, :type
]
add_header_proc do
%Q[\n]
end
def codelist(file)
scanner = LangScan.choose(file)
scanner = LangScan::Text unless scanner
code(File.open(file).readlines.join, scanner)
end
def code(content, scanner = LangScan::Text)
scanner = LangScan.choose_by_abbrev(scanner) if scanner.kind_of? String
contents = []
scanner.scan(content) {|f|
text = if Highlight_type.include?(f.type)
"#{CGI.escapeHTML(f.text)}"
else
CGI.escapeHTML(f.text)
end
f.text = text
contents.push(f)
}
contents.sort! {|a, b| a.byteno <=> b.byteno }
ret = "\n"
contents.each {|f|
ret << f.text
}
ret << "\n"
return ret
end
行番号対応はそのうち...





