Windows上でPEAR_PackageFileManager2を久しぶりに触っていたら、どうも "ignore" 指定がうまく動かない。 ファイルに対する"ignore"は効くのだけれど、ディレクトリに対する"ignore"がignoreしてくれない。 これはPEAR_PackageFileManager2の問題と言うよりは、PEAR_PackageFileManager_Pluginsに含まれるFile.phpが原因らしい。 PEAR/PackageFileManger/File.php これの _checkIgnore() メソッドが、各ファイルに対して"ignore"するか判定するメソッドになっている。 流れ的には_checkIgnore()の前に_setupIgnore()が呼ばれていて、この中でワイルドカードなどを正規表現に変換している。 どうもその辺が怪しい気がしている。 以前にもPackageFileManager周りでバグを発見しているのだけれど、何となくなんだがWindows上での動作があまりテストされていないような気がする。 http://pear.php.net/bugs/bug.php?id=12023 ↑これが前回見つけたバグ(よく見たら同じFile.phpだし!!)。 原因こそPHP本体のrealpath()のWindows/UNIX間での差異だったのだけれど、そもそもWindows上で動かしていれば自分がレポートするよりも早く直されていた筈で・・・。やっぱりWindows上での動作確認は優先度が低いのかな・・・。゚(゚´Д`゚)゚。 Windows上でPEAR_PackageFileManager_Plugins の checkIgnore() のregressionテストを実行すると、ちょうどディレクトリパスのところだけFAILする。 #pre||> > pear run-tests -r (...)tests\PEAR_PackageFileManager_Plugins\tests\PEAR_PackageFileManager_File\checkIgnore Running 9 tests PASS PEAR_PackageFileManager_File->checkIgnore, multiple non-match[(...)\test_complex_multiple_no.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, multiple match[(...)\test_complex_multiple_pass.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, complex non-match[(...)\test_complex_no.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, empty array[(...)\test_emptyarray.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, non-array[(...)\test_nonarray.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, simple non-match with directory[(...)\test_simple_dir_no.phpt] FAIL PEAR_PackageFileManager_File->checkIgnore, simple directory, match[(...)\test_simple_dir_pass.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, simple non-match[(...)\test_simple_no.phpt] PASS PEAR_PackageFileManager_File->checkIgnore, simple match[(...)\test_simple_pass.phpt] wrote log to "(...)\run-tests.log" TOTAL TIME: 00:04 8 PASSED TESTS 0 SKIPPED TESTS 1 FAILED TESTS: (...)\tests\PEAR_PackageFileManager_Plugins\tests\PEAR_PackageFileManager_File\checkIgnore\test_simple_dir_pass.phpt ||< "test_simple_dir_pass.phpt"中のテストコード本体: #pre||> // 1 = ignore - 0 = include $packagexml->_setupIgnore(array('frog*/'), 1); $packagexml->_setupIgnore(array('frog*/'), 0); $res = $packagexml->_checkIgnore('test.php', 'anything\\froggoes\\test.php', 1); $phpunit->assertNotFalse($res, 'wrongo 1'); $res = $packagexml->_checkIgnore('test.php', 'anything\\froggoes\\test.php', 0); $phpunit->assertNotTrue($res, 'wrongo 2'); ||< "ignore"検出は正規表現(preg_match)を使っているが、ワイルドカードなどを正規表現に変換する_getRegExpableSearchString()メソッドは以前(Pluginsに分離する前、Xhwlayのリリースに使っていた時点)と変わっていない。 少し弄ってみたけど、何か泥沼に入りそうだったので一旦逃亡します・・! UNIX上ならno problemだったかもしれないし・・・。