青木です。
Ruby の CVS HEAD を使うと、ページを表示するだけで
データファイルが消滅するようになってしまいました。
まず結論から言うと、問題は tdiary/defaultio.rb にあり、
次のように修正することで回避できます。該当のコードは
rev 1.23 で導入されているので、tDiary 1.5.3 以降すべての
バージョンが対象です。
Index: tdiary/defaultio.rb
===================================================================
RCS file: /cvsroot/tdiary/core/tdiary/defaultio.rb,v
retrieving revision 1.29
diff -u -r1.29 defaultio.rb
--- tdiary/defaultio.rb 12 Jan 2005 01:18:21 -0000 1.29
+++ tdiary/defaultio.rb 24 Mar 2005 08:09:37 -0000
@@ -195,8 +195,8 @@
while l = fh.gets( "\n.\n" )
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 ) )" )
+ _style = headers['Format'] || 'tDiary'
+ diary = eval( "#{style( _style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )
diary.show( headers['Visible'] == 'true' ? true : false )
diaries[headers['Date']] = diary
rescue NameError
最近の CVS HEAD では、self. を省略してローカル変数と同じ名前の
メソッドを呼ぶと、そのローカル変数の指すオブジェクトに対して
call を呼ぶようになります。つまり
m = a
m(b)
は
a.call(b)
と同じ意味です。この仕様変更のため、style(style) が例外に
なっていました。これが発端となり、次のような連鎖が起こって
データファイルが消滅します。
1. 上記のような Ruby の仕様変更により style(style) が
style.call(style) になり、NoMethodError (< NameError) が発生する
2. rescue で例外が無視されて、記事がないことになる
3. 一ヶ月分の記事で同様の問題が起こる
4. その月のデータファイルには記事が入っていないと判断される
5. TDiary::DefaultIO#transaction の以下のコードでファイルが削除される
if diaries.empty?
File::delete( @dfile )
# also delete parser cache
@tdiary.store_parser_cache( date, nil, nil)
end
個人的には 2. が問題だと思います。
-------------------------------------------------------------------
青木峰郎
|