Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug fix: mknmz-11 problem



竹迫です.

From: knok@xxxxxxxxxxxxx (NOKUBI Takatsugu)
Date: Wed, 11 Jul 2001 09:08:21 JST
> >> ちょっとこのままだと気持ち悪いので,この修正は取り込んだ方が
> >> 良いと思いますが,他の環境で不具合がありますでしょうか?
> 
>   うーん... <http://www.namazu.org/ml/namazu-devel-ja/msg01499.html>
> のパッチはあくまで test を通すための方便であって、本来は mknmz foo/bar
> とした時は foo/bar が symlink であろうとなかろうと動作すべきではないか
> と思っています。

確かにその通りですね.(^^;

symbolic link は,OSの環境や処理系によって取り扱いが変わってくるので,
ちょっとややこしい部分ではありますが...

>   本当は fix したいところなのですが、今のところ問題をきちんと修正でき
> ていない(というか CVS co した working directory 上では問題が再現しない
> のはなぜだ...)ので、それを明らかにしておくためにも、単にtest を通すた
> めだけのパッチをあてるのは良くないのではないでしょうか。

ということで,ちょっと真面目にこの問題に取り組んだところ,
mknmz で File::Find の find() 関数を呼び出すときの
第2引数が空になってしまっているのが原因のようでした.

以下のような簡単なチェックスクリプトを書いて,実行したところ,

#!/usr/bin/perl
use File::Find;
my @dirs = ();
sub wanted {;}
find(\&wanted, @dirs);

Perl 5.005 以下のバージョンでは何も起こらず
Perl 5.6 以降ではエラーが発生することがわかりました.

# 新しいモジュール内でのエラーチェックが甘いようです...(^^;

実際の mknmz のスクリプトでは,find_target()サブルーチンの中で

	    my $wanted_closure = sub {
		my $fname = "$File::Find::dir/$_";
		add_target($fname, \@flist, \%counts);
	    };
	    find($wanted_closure, @subtargets);

として,サブディレクトリ中のファイルに対しても add_target()
するようにしており,ターゲットが directory の場合は自分自身
のディレクトリを @subtargets に入れて呼び出しています.

しかし,ターゲットが symbolic link である場合は,DirHandle() を
使ってディレクトリをサーチして,ファイルであれば add_target(),
ディレクトリであれば @subtargets に追加して find() を呼び出す
ということをしています.

ここで,symbolic link 以下にサブディレクトリがない場合は,
@subtargets が空のままで上記の find() が呼び出されるので,
Perl5.6以降ではエラーになってしまいます.

cvs から checkout した working directory 上で,問題が発生しなかっ
たのは,ターゲットディレクトリ上に CVS というサブディレクトリが
あったためだと思われます.

試しに,mkdir tests/data/symlink/dummy として make check すると
Perl5.6 以降でも mknmz-11 は PASS します.

<http://www.namazu.org/ml/namazu-devel-ja/msg01499.html> のパッチ
でうまくいくのは,後ろに / がついているものに対して Perl のファイ
ルテスト演算子をかけると,symbolic link ではなく directory として
判断されるためみたいです.

>   BUGS というドキュメントでも作成して、これを含めた既知の問題点をあら
> かじめ列挙しておいた方が良いように思うのですが、いかがでしょう?

そうですね.やはりこの問題は mknmz のバグのようでした.

さきほど mknmz.in に対してバグ修正を stable-2-0 に commit しましたので,
テストしていただけるとありがたいです.

--
  広島市立大学 情報科学部 情報機械システム工学科 知能ロボット講座
     竹迫 良範 <takesako@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>