daily memorandum 2.3.0
CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ | 本
2004-07-06 (Tue)
_ [tdiary] straycat に引越そうとしたが。。。
style not found
ports から tdiary-2.0.0 を入れて、ksd からデータを移して、 準備おっけー! と思ったら、
(eval):1:in `restore': compile error
(eval):1: parse error
::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )
^ (SyntaxError)
/usr/local/share/examples/tdiary/tdiary/defaultio.rb:187:in `restore'
/usr/local/share/examples/tdiary/tdiary/defaultio.rb:133:in `eval'
/usr/local/share/examples/tdiary/tdiary/defaultio.rb:187:in `restore'
/usr/local/share/examples/tdiary/tdiary/defaultio.rb:133:in `transaction'
/usr/local/share/examples/tdiary/tdiary.rb:1563:in `initialize'
/usr/local/share/examples/tdiary/index.rb:44:in `new'
/usr/local/share/examples/tdiary/index.rb:44
index.rb:2:in `require'
index.rb:2
だそうな。。。
これ、いろいろ調べてみたら、 結局 wiki_style.rb を tdiary/ 以下に入れてなかったのが敗因だった。 tdiary/defaultio.rb に
diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )
という部分があるのだけど、この style( style ) が nil を返していたので。
ただ、このエラーメッセージは非常にわかりにくいし、 そもそも SyntaxError ってのはダメだろう。 もう少しマトモな例外投げられないのか? と思って調べたら、 IOBase#styled_diary_factory() を使えばよさそう。 こいつに少し手を入れて(引数に modified を与えられるようにした)
- diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )
+ diary = styled_diary_factory( headers['Date'], headers['Title'], body, style, Time::at( headers['Last-Modified'].to_i ) )
としたら、、、今度は無限ループしてるんですけど、、、(゜Д゜)
例外はちゃんと投げましょう
ということで、styled_diary_factory() が投げた例外が 最終的にどこで捕捉されるのか調べる。 辿っていくと、結局 index.rb の 48行目で
rescue TDiary::TDiaryError
として捕捉してることがわかる(BadStyleError は TDiaryError のサブクラス)。 が、マズイことに、ここでは捕捉した例外を無視してしまっている。 で、さらにマズイことに、end の後で
tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf ) if not tdiary
としているので、また例外が発生し、それが無視されて、 以下略、みたいな。。。
ぱっち
とりあえず、こんな感じで変更してみた。
diff -ur tdiary-2.0.0.orig/index.rb tdiary-2.0.0/index.rb
--- tdiary-2.0.0.orig/index.rb Mon Mar 15 00:03:59 2004
+++ tdiary-2.0.0/index.rb Wed Jul 7 07:36:46 2004
@@ -46,6 +46,7 @@
rescue TDiary::PermissionError
raise
rescue TDiary::TDiaryError
+ raise
end
tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf ) if not tdiary
diff -ur tdiary-2.0.0.orig/tdiary/defaultio.rb tdiary-2.0.0/tdiary/defaultio.rb
--- tdiary-2.0.0.orig/tdiary/defaultio.rb Sun Apr 6 22:51:59 2003
+++ tdiary-2.0.0/tdiary/defaultio.rb Wed Jul 7 07:36:31 2004
@@ -184,7 +184,7 @@
begin
headers, body = TDiary::parse_tdiary( l )
style = headers['Format'] || 'tDiary'
- diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )
+ diary = styled_diary_factory( headers['Date'], headers['Title'], body, style, Time::at( headers['Last-Modified'].to_i ) )
diary.show( headers['Visible'] == 'true' ? true : false )
diaries[headers['Date']] = diary
rescue NameError
diff -ur tdiary-2.0.0.orig/tdiary.rb tdiary-2.0.0/tdiary.rb
--- tdiary-2.0.0.orig/tdiary.rb Sun Jun 27 01:09:21 2004
+++ tdiary-2.0.0/tdiary.rb Wed Jul 7 07:37:20 2004
@@ -358,11 +358,15 @@
raise StandardError, 'not implemented'
end
- def styled_diary_factory( date, title, body, style = 'tDiary' )
+ def styled_diary_factory( date, title, body, style = 'tDiary', modified = nil )
if style_class = style( style.downcase )
- return style_class::new( date, title, body )
+ if modified then
+ return style_class::new( date, title, body, modified )
+ else
+ return style_class::new( date, title, body )
+ end
else
- raise BadStyleError, "bad style: #{style}"
+ raise BadStyleError, "#{style} style not found"
end
end
これでエラーメッセージはこんな感じになる。
Wiki style not found (TDiary::BadStyleError) /usr/local/share/examples/tdiary/tdiary.rb:369:in `styled_diary_factory' /usr/local/share/examples/tdiary/tdiary/defaultio.rb:188:in `restore' /usr/local/share/examples/tdiary/tdiary/defaultio.rb:133:in `transaction' /usr/local/share/examples/tdiary/tdiary.rb:1563:in `initialize' /usr/local/share/examples/tdiary/index.rb:44:in `new' /usr/local/share/examples/tdiary/index.rb:44 index.rb:2:in `require' index.rb:2
前よりはわかりやすいだろう。そして、何より無限ループしなくなる。
まだ問題はある
このほかにも、条件によっては *.td2 が 消されてしまうという問題もあるみたいで。 まだ再現条件完全にはつかめてないけど、 こっちの方がシンコクやなぁ。 でも、眠いからまた明日。。。
眠死
まとめるのは明日にしようとか思いつつ、日記書いてしまった。 眠いのに。。。 まぁ、忘れないうちにまとめといた方がいいのは確かなんですがね。