基本的には、以下のサイトを参考にした
CakePHPのcore部分をgit submodule化してgithubで管理する - JavaScriptとかPerlとかPHPとかさくらVPSとか勉強する

一応流れを書いておく
# cakephp clone
git clone git://github.com/cakephp/cakephp.git project
cd project


# 不要なディレクトリの削除&gitディレクトリの作り直し
rm -r .git
rm -r lib
git init


# cakephpをsubmoduleで追加
git submodule add git://github.com/cakephp/cakephp.git
git submodule update --init


# app/webroot/index.phpを編集
vi app/webroot/index.php

//define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');
+ define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'cakephp' . DS . 'lib');


# app/webroot/test.phpを編集
vi app/webroot/test.php

//define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');
+ define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'cakephp' . DS . 'lib');


# app/Console/cake.phpを編集
vi app/Console/cake.php
...

$ds = DIRECTORY_SEPARATOR;
$dispatcher = 'Cake' . $ds . 'Console' . $ds . 'ShellDispatcher.php';

if (function_exists('ini_set')) {
$root = dirname(dirname(dirname(__FILE__)));
+ // for managing cakephp's core-code by git-submodule
- ini_set('include_path', $root . $ds. 'lib' . PATH_SEPARATOR . ini_get('include_path'));
+ ini_set('include_path', $root . $ds . 'cakephp' . $ds . 'lib' . PATH_SEPARATOR . ini_get('include_path'));
}

...

+ // for managing cakephp's core-code by git-submodule
+ $idx = array_search('-app', $argv);
+ if ($idx === false) {
+ $argv[] = '-app';
+ $argv[] = $root . $ds . 'app';
+ }

unset($paths, $path, $dispatcher, $root, $ds);

return ShellDispatcher::run($argv);


# 変更をcommit
git add . git commit -m 'Initial commit'


大まかにはリンク先と異なるところは、app/Console/cake.phpを触っているところかな?
上のように修正すれば、わざわざcakephp/lib/Cake/Console/cake.phpを実行しなくてもいいし、パラメータも設定しなくてもいいので、スッキリします。
例えばbakeする場合はこんな感じ。
php cakephp/lib/Cake/Console/cake.php -app ../app bake
↓ php app/Console/cake.php bake

よりドキュメント通りに動くほうが良いと思うので、こっちの方がいいんじゃないかな?
CakePHP2.x系からはConsole部分もappディレクトリ内に出来たので、こうやって気楽にカスタマイズ出来るのが素敵だわ‐。
CakePHP1.3.6でテストをしようとすると以下のようなエラーが表示された。
Warning (2): htmlentities() [function.htmlentities]: charset `ANSI_X3.4-1968' not supported, assuming iso-8859-1 [CORE/cake/tests/lib/reporter/cake_html_reporter.php, line 376]

そもそもなんで「ANSI_X3.4-1968」みたいな文字コードセットしているのか良くわからないんだけども、コードを追っていったらこんなことじゃなかろうかと。

# /cake/tests/lib/reporter/cake_html_reporter.php

function CakeHtmlReporter($charset = 'utf-8', $params = array()) {
- $params = array_map(array($this, '_htmlEntities'), $params);
- $this->CakeBaseReporter($charset, $params);
+ $this->CakeBaseReporter($charset, $params);
+ $params = array_map(array($this, '_htmlEntities'), $params); }

順番入れ替えただけなんだけどね。
本体の方に手を入れるのは嫌なんだけど、まあテストなんで。

CakePHPもいずれPHPUnitに移行するらしいので、この辺はもうメンテされないかもね。
バージョンアップするまでは。

まあ、扱いづらくて困るんだけど。
もしかしたら、php.iniの設定でうまく動くようにもなったのかもしれないけど、忘れてもた。
時間のあるときに調べてみよう。

2011/01/27 追記
CakePHP 1.3.7にアップデートしたら修正されてました。
さすがだわー。
CakePHP1.3でAuthコンポーネントを使用しているControllerでtestActionを使うと、ログインしていなければ、普通にログイン画面へリダイレクトされる。
これじゃテストにならない。

いろいろ試行錯誤してみたけど、直接Sessionにログインユーザーの情報をセットしてあげれば良いみたい。

■参考サイト
Testing CakePHP Controllers the hard way | Mark Story

$this->{Controller名}->Session->write('Auth.User', array(
'id' => 'hogehoge',
'username' => 'hogehoge',
'role' => 'hogehoge',
));
$this->testAction($url, array(...));


まさかのやり方。
これは知らないと出来ないと思うんだけどなー。
日本語サイトでは情報は皆無だったので、英語サイトで探してみたらすぐ見つかった。
英語サイトも読むようにしなければ。
CakePHP1.3でControllerのテストは基本的にtestAction()使わないと始まらないんだよね。

とあるメールフォームで確認画面かどうかを
$this->param['form']['confirm']

を見て、切り替えたりしているんだけど、$this->paramへの値の渡し方がわからない。
マニュアル見ても$this->dataしか載ってない気が。。。
頑張ってcake_test_case.phpのtestActionメソッドの箇所も読んでみたけど難しそうかなーと思って、駄目元でちょうど開催されていたCakePHPのIRC集会で聞いてみたら、なんと解決策が!
さすが猛者が集まるIRC!
$this->testAction($url, array('method' => ... , 'form' => array('hoge' => 'value')))


formって入れちゃえば良いのね。
結果これでちゃんと動きました。
動いたことを踏まえてソースを読んでみると、349行目にこんな記述が。

# cake_test_case.php
$params = array_diff_key($params, array('data' => null, 'method' => null, 'return' => null));


多分、form以外も受け取ってくれそうな感じがする(未検証)。

IRCで快く相談に乗ってくださったnojimageさんありがとうございました!
めちゃくちゃ助かりました!
勉強になりました!
第5回CakePHP勉強会@Tokyo 東海サテライト」に行ってきました。
個人的に非常に久しぶりの勉強会ということで、ドキドキしながら会場に向かいました。

第5回CakePHP勉強会@Tokyo自体がUstreamで配信されるということで、家でも見れたんだけど、名古屋でCakePHPのイベントは初めてだし、PHPerと絡みたいと思って行ってきました。

冒頭に少しだけ東京の会場から呼び掛けがあり、ちょっとテレビ中継みたいで楽しかった。
時代の進化はすごい、昔はテレビ局しかできなかったことが、今は素人が出来てしまうんだから。

サテライトというやり方は、最初どうなのかなって思ったんだけど、結構良かったんじゃないかというのが、僕の感想。
発表の合間合間に、前の発表に関する意見交換があったりして、一人で見ていると「あれってなんだろ?」ってのが、みんなの反応が見られるというのが新鮮でした。
もっと、ヤジみたいなのがあっても良かったのかなと。
どうせ聞こえないんだしさ。
行儀良すぎだったかな。

次回は同じ会場が使えない可能性が高いということで、開催が難しいかもしれないとのこと。
なんとか続けてもらえたらなと思います。

以下、第5回CakePHP勉強会@Tokyoの感想
■CakePHP1.3の概要(仮) 市川さん(@cakephper)
・結構知っていることも多かったかなという印象。
・CakePHP1.3のバリデーションにdatetimeを入れてくれても良かった気が・・・。
・プレゼン資料も文字が大きめで分かりやすかった。

■Ktai Library on CakePHP1.3(仮) 滝下さん(@ecworks_masap)
・来週名古屋に来ていただけるということで楽しみ!
・ざっくりとした内容の発表で、これまた大体知っている感じでした。
 けど、作者の方からの説明ってのは、やっぱり空気感が伝わって良いなとも思いました。

■コアライブラリのエレガントなハック 清水紘己さん(hiromi)
・正直難しかったし、良くわからなかった。
・すごく深い階層の話をしていて、ソースを追っていない部分に関しては全くわからなかったのが残念。
・発表者の方も言っていたけど、僕は今のところCakePHPのコアライブラリに関するハックというのは、懐疑的かな。多分、そこまでしないといけないような仕様の場合は、他のフレームワークを使うだろうし、既にあるシステムの場合でもな・・・。
・CakePHP2.0になると、そういった部分が考慮されてくるのかな?


■ツイート君というtwitterの外部アプリを作った際に、直面した様々な問題についての説明。
・顔は一切写らなかったのでわからなかったけど、イケメンそうだった。
・ツイート君の解析アルゴリズムはすげー気になったけど難しそう。
・CakePHPって簡単!と言われると、そうそうと思いつつも誰でも使いこなせる危機感も同時に募るのが・・・。

今回の一番の収穫は、名古屋にもCakePHPをひっそりと使っている人が、少しだけいた事を確認できたことかな。
懇親会もプログラミングの話から、仕事についての話まで幅広く話すことが出来て良かったなと。
今後は僕も何かしらサポート出来たらなと思いました。