home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

日記/2010/01/19/ PEAR_PackageFileManager_Plugins の File.php で"ignore"がおかしい。

日記/2010/01/19/ PEAR_PackageFileManager_Plugins の File.php で"ignore"がおかしい。

日記 / 2010 / 01 / 19 /  PEAR_PackageFileManager_Plugins の File.php で"ignore"がおかしい。
id: 558 所有者: msakamoto-sf    作成日: 2010-01-19 15:18:04
カテゴリ: PHP 

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する。

> 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"中のテストコード本体:

// 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だったかもしれないし・・・。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-01-19 15:19:48
md5:75461f21d25a6e055f4c96a5ee2bf42a
sha1:2bdd63ba397b4995d7aabb5907e87dd16e804b1d
コメント
コメントを投稿するにはログインして下さい。