タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2010/01/28/PackageProjectorのdir_roles用patch送付 | msakamoto-sf | 2010-01-28 21:51:15 |
日記/2010/01/28/pearhub.org | msakamoto-sf | 2010-01-28 21:46:07 |
予告:第49回PHP勉強会で、JOJOのDIO様がBrainF*ckで"HelloWorld"するようです。 | msakamoto-sf | 2010-01-23 23:55:27 |
日記/2010/01/23/URL短縮サービス | msakamoto-sf | 2010-01-23 23:30:46 |
日記/2010/01/22/習志野市に引っ越しました。 | msakamoto-sf | 2010-01-22 22:52:01 |
PHP | msakamoto-sf | 2010-01-19 21:28:31 |
日記/2010/01/19/ PEAR_PackageProjector のdir_roles有効化patch | msakamoto-sf | 2010-01-19 15:31:47 |
日記/2010/01/19/ PEAR_PackageFileManager_Plugins の File.php で"ignore"がおかしい。 | msakamoto-sf | 2010-01-19 15:19:48 |
日記/2010/01/18/PEAR_PackageProjectorでディレクトリに対してroleを設定できない・・・ | msakamoto-sf | 2010-01-18 23:47:27 |
日記/2010/01/17/Jsphonってcodereposに移動してたんだ・・・。 | msakamoto-sf | 2010-01-17 12:02:39 |
日記/2010/01/19/ PEAR_PackageProjector のdir_roles有効化patch で作成したpatchをソースコード中に書いてあったメールアドレスに送ってみました。
あと念のため、はてなダイアリの方からTBを打ってみました。採用してくれるかな・・・wktk
TB先:
こんなのあったんだ、知らなかったな・・・。SimpleTestとかもこっちに来ちゃってるし。
PEARチャネルサーバはPIRUMというのを使っているらしい。
やっぱり英語で来られちゃうと、きっついよな・・・。
やる夫・やらない夫シリーズでお馴染みの、「でっていう」も参加するよ!
一足早めに「PHPでBrainF*ck」したい人は、openpearから"Acme_BrainPhack"をインストールしよう!
pear channel-discover openpear.org pear install openpear/Acme_BrainPhack
が流行っているの、何でだろう・・・って今まで謎だったんだけれど。
Twitterのせい?140何文字かに収めるため?そう考えれば納得。
Twitterはイマイチ使う気になれないので放置してるけれど。
多分、「お腹いっぱいふわふわ~」とか「しろたんもふもふ~」とかで埋め尽くしそうな気がして。
昨日、千葉県は習志野市に引っ越しました。ようやく片づけも終わりました。
家賃がほぼ半額。前の所が墨田区で賃貸マンションで、今度は学生や単身者向けのワンルームアパートなのでまぁ半額になっちゃいますね・・・。
しばらくここで隠遁します。
はてなダイアリ時代の記事で、今でも見たりアクセスがある記事
日記/2010/01/18/PEAR_PackageProjectorでディレクトリに対してroleを設定できない・・・
で愚痴った、PEAR_PackageProjectorでdir_rolesが使えない点を修正するpatchを作ってみました。
修正行数自体はほんの数行程度なんだけど、この数行を特定するのに随分手間取ってしまった・・・。
あとはこれを作者に送って、OKならSVNに反映→packageリリースしてもらって、openpearの方にも反映して貰って・・・ようやくAcme_BrainPhackがリリース出来ます。testコードをパッケージングしたいばかりに随分遠回りになっちゃった・・・。゚(゚´Д`゚)゚。
Index: PEAR/PackageProjector/Package.php =================================================================== --- PEAR/PackageProjector/Package.php (リビジョン 1535) +++ PEAR/PackageProjector/Package.php (作業コピー) @@ -89,6 +89,14 @@ $this->Installgroups[$groupname] = $groupname; } + public function addDirectoryRole($path, $role) + { + if (isset($this->options['dir_roles'])) { + $this->options['dir_roles'] = array(); + } + $this->options['dir_roles'][$path] = $role; + } + public function addExceptions($path, $role) { if (isset($this->options['exceptions'])) { @@ -159,6 +167,8 @@ $this->pkg->addRelease(); $this->pkg->generateContents(); + // for debug dump: + //$result = $this->pkg->debugPackageFile(); $result = $this->pkg->writePackageFile(); if (PEAR::isError($result)) { throw new PEAR_Exception($result->getMessage(), $result->getCode()); Index: PEAR/PackageProjector/ProjectInfo/Attribute.php =================================================================== --- PEAR/PackageProjector/ProjectInfo/Attribute.php (リビジョン 1535) +++ PEAR/PackageProjector/ProjectInfo/Attribute.php (作業コピー) @@ -192,7 +192,11 @@ $role = $this->_getAttr('role'); if (!is_null($role)) { $handler->buildMessage(5, "Add attribute 'role' of [{$this->path}]... {$role}", true); - $package->addExceptions($this->path, $role); + if (is_dir($fullpath)) { + $package->addDirectoryRole($this->path, $role); + } else { + $package->addExceptions($this->path, $role); + } } // $platform = $this->_getAttr('platform');
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だったかもしれないし・・・。
今日の数時間ほどのhackなので間違ってたらごめんなさい。
PEAR_PackageProjectorを使ってパッケージ作成を試みたのですが、ディレクトリに対してrole設定をできていないような気がします。
PEAR_PackageManagerはPEAR_PackageManager2を呼び出していますが、PEAR_PackageManager2の場合ディレクトリに対してrole指定したい場合は、setOptions()に渡す連想配列で次のように指定します。
$pkg->setOptions(array( 'dir_roles' => array( 'dir1' => 'src', 'dir2' => 'doc', 'dir3' => 'test', ...
こうすることで、'dir1'は"PEAR"ディレクトリに、'dir2'はpear.iniの"doc_dir"で指定されたディレクトリに、'dir3'は同じくpear.iniの"test_dir"で指定されたディレクトリに配置されるようになります。
PEAR_PackageProjectorにおけるファイル/ディレクトリのrole指定はbuild.confで以下のようにします。
[file://(src/ディレクトリに対する相対ディレクトリ)] role = {"php" or "data" or "doc" or "test" or "script" or "src"}
この設定の解析結果を元に呼び出され、内部状態を設定するコードは以下のようです。
PEAR/PackageProjector/Configure/File.php :
public function setting(PEAR_PackageProjector_ProjectInfo $projinfo, $key, $value) { switch($key) { case 'ignore': $projinfo->getAttribute($this->filepath)->setIgnore(true); return true; case 'platform': $projinfo->getAttribute($this->filepath)->setPlatform($value); return true; case 'install': $projinfo->getAttribute($this->filepath)->setInstall($value); return true; case 'commandscript': $projinfo->getAttribute($this->filepath)->setCommandScript($value); return true; case 'role': $projinfo->getAttribute($this->filepath)->setRole($value); return true; } return false; }
$projinfo->getAttribute($this->filepath)
で、filepathに対応するPEAR_PackageProjector_ProjectInfo_Attributeインスタンスが生成され、roleなりignoreなりの属性情報が保存されます。
ここまでは問題無さそうに思えます。ですが、AttributeからsetOptions()に渡すところでdir_rolesとして渡っていないように見えます。
Visitorパターンを使っているようですが、PEAR_PackageProjector_ProjectInfo_Attributeクラスのvisit()メソッドの"role"の所を見てみると、addExceptionとして'exceptions'に入れているようです。
$role = $this->_getAttr('role'); if (!is_null($role)) { $handler->buildMessage(5, "Add attribute 'role' of [{$this->path}]... {$role}", true); $package->addExceptions($this->path, $role); }
これにより、setOptions()で渡す連想配列では"dir_roles"ではなく"exceptions"の方に情報が渡されます。
"exceptions"はファイル一つ一つに対してroleなどを上書く設定ですので、ディレクトリには影響しません。
実際にPackageManager2のソースをあたっても、exceptionsを用いているのはファイルに対する処理で、ディレクトリに対する処理には出てきません。
というわけでどうもこれが怪しい・・・ように思えるのですが、まだPEAR_PackageProjectorも読み切ったわけでもないので、もうちょっと調べてみます。
Xhwlayで、Rendererの一例としてJsphonつかったJSON出力を使ってて、その影響でパッケージの依存関係にJsphon入れてて、でもhawklab止まっちゃってて弱ったナー、どうしようかとずるずる引きずってたのだけれど、codereposの方にhalt氏が移動してくれてたんですね。
依存関係とあとjsphon使ったtestcaseも削り、READMEに一言注意書き入れようかな・・・。
というかsf.net使ってPEARパッケージリリースしたりするのも(パッケージ作成が)しんどいので、Xhwlayもopenpear.orgに移行しようかな・・・。