VersionControl_SVN は、svn コマンドライン
アプリケーションのシンプルなオブジェクト指向インターフェースです。
svn は、フリー/オープンソースのバージョン管理システムである
Subversion の中核となるものです。
Subversion は、ソースコードのツリー・テキストファイル・画像ファイル
-- およそ考えうるあらゆる形式のファイルを
管理するために使用可能です。
VersionControl_SVN の機能には以下のようなものがあります。
VersionControl_SVN を通じてアクセスすることにより、Subversion のような
バージョン管理システムは、ありきたりな
"ソースコード"
リポジトリをはるかにこえた威力を発揮します。
たとえば、バージョン管理機能の恩恵をうけないコンテンツ管理システム
(CMS)がどこにあるというのでしょうか? プログラマでない多くの人々に
とっても、バージョン管理は頭を悩ませる問題です。
VersionControl_SVN を使用することで、特定のユーザを念頭において
彼らが使いやすいように Subversion のインターフェースをカスタマイズ
することが可能となるのです。VersionControl_SVN により、エンドユーザに
変更管理の概念を覚えさせるという負担を強いずに、強力なバージョン管理機能を
使用させることができます。
まずどこかに Subversion リポジトリを作成してください。PHP スクリプトで
どのように書けばよいのかを知りたいことでしょう。数行後に、
VersionControl_SVN::VersionControl_SVN_List() コマンドを使用する例を
示します。
例 65-3
Subversion リポジトリの内容を読み込む
require_once 'VersionControl/SVN.php';
// エラー処理を設定します -- 常にこのようにしておきましょう!
$svnstack = &PEAR_ErrorStack::singleton('VersionControl_SVN');
// 実行時オプションを設定します
$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ARRAY);
// list クラスをファクトリに要求します
$svn = VersionControl_SVN::factory('list', $options);
// 必要なスイッチや引数を定義します
$switches = array('username' => 'user', 'password' => 'pass');
$args = array('svn://svn.example.com/repos/TestProject');
// コマンドを実行します
if ($output = $svn->run($args, $switches)) {
print_r($output);
} else {
if (count($errs = $svnstack->getErrors())) {
foreach ($errs as $err) {
echo '<br />'.$err['message']."<br />\n";
echo "Command used: " . $err['params']['cmd'];
}
}
} |
|
上で使用したリポジトリにもし VersionControl_SVN のソースが
格納されていれば、この例の出力は以下のようになります。
Array
(
[0] => Array
(
[name] => docs
[type] => D
)
[1] => Array
(
[name] => package.xml
[type] => F
)
[2] => Array
(
[name] => SVN.php
[type] => F
)
[3] => Array
(
[name] => SVN
[type] => D
)
[4] => Array
(
[name] => tests
[type] => D
)
) |
上の出力例で、ディレクトリには
D、ファイルには F
というフラグが立っていることに注意しましょう。
注意
出力に関する詳細情報はを得るには、配列 $options
で verbose に TRUE を設定します。
VersionControl_SVN のサブクラスを利用する必要のあるスクリプトは
ありませんか? ほんの少しのオーバーヘッドという犠牲を払うことで、
$svn オブジェクトに全機能を読み込むことが
できます。VersionControl_SVN::factory() コマンドを使用し、
キーワード __ALL__
を指定すればよいのです。
たとえば、リポジトリ内の現在のファイルの一覧を取得したいなら、
必要なのはサブクラス
VersionControl_SVN::VersionControl_SVN_List() だけです。
例 65-4リポジトリ内の現在のファイル一覧を取得する require_once 'VersionControl/SVN.php';
// エラー処理を設定します -- 常にこのようにしておきましょう!
$svnstack = &PEAR_ErrorStack::singleton('VersionControl_SVN');
// 実行時オプションを設定します
$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ARRAY);
// list クラスをファクトリに要求します
$svn = VersionControl_SVN::factory('list', $options);
// 必要なスイッチや引数を定義します
$switches = array('username' => 'user', 'password' => 'pass');
$args = array('svn://svn.example.com/repos/TestProject');
// コマンドを実行します
if ($output = $svn->run($args, $switches)) {
print_r($output);
} else {
if (count($errs = $svnstack->getErrors())) {
foreach ($errs as $err) {
echo '<br />'.$err['message']."<br />\n";
echo "Command used: " . $err['params']['cmd'];
}
}
} |
|
しかし、もしリポジトリ内のファイル一覧を再帰的に取得し、
それらのファイルの更新ログを検索し、注記つきのソースを表示したいと
なると、二通りの方法があります。
例 65-5リポジトリ内の現在のファイル一覧を再帰的に取得する require_once 'VersionControl/SVN.php';
// エラー処理を設定します -- 常にこのようにしておきましょう!
$svnstack = &PEAR_ErrorStack::singleton('VersionControl_SVN');
// 実行時オプションを設定します
$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_RAW);
// 方法その 1: オーバーヘッドを最小にする
// 必要なサブコマンドを個別に指定して svn オブジェクトを作成します
$svn = VersionControl_SVN::factory(array('list', 'log', 'blame'), $options);
// 必要なスイッチや引数を定義します
$switches = array('username' => 'user', 'password' => 'pass');
$args = array('svn://svn.example.com/repos/TestProject');
print_r($svn->list->run($args, $switches));
// 上の出力からファイルを取り出し、だれが何をしたのかを調べます
$args = array('svn://svn.example.com/repos/TestProject/trunk/index.php');
echo "<pre>" . $svn->blame->run($args) . "</pre>";
// 方法その 2: 使用できるすべてのコマンドを支配する
// 全サブコマンドを読み込む - オーバーヘッドが大きくなりますが、これが便利な場合もあるでしょう。
$svn = VersionControl_SVN::factory('__ALL__', $options);
// さあ、必要なコマンドはなんでも実行できます ...
$svn->cat->run($args, $switches);
$svn->info->run($args, $switches);
// ... などなど。 |
|
Subversion についてもっと知りたくなったなら、以下を参照ください。