VersionControl_SVN

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 リポジトリの内容を読み込む


<?php
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 のソースが 格納されていれば、この例の出力は以下のようになります。


<?php
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 というフラグが立っていることに注意しましょう。

注意 出力に関する詳細情報はを得るには、配列 $optionsverboseTRUE を設定します。

ひとつのファクトリですべてを支配する

VersionControl_SVN のサブクラスを利用する必要のあるスクリプトは ありませんか? ほんの少しのオーバーヘッドという犠牲を払うことで、 $svn オブジェクトに全機能を読み込むことが できます。VersionControl_SVN::factory() コマンドを使用し、 キーワード __ALL__ を指定すればよいのです。

たとえば、リポジトリ内の現在のファイルの一覧を取得したいなら、 必要なのはサブクラス VersionControl_SVN::VersionControl_SVN_List() だけです。

例 65-4リポジトリ内の現在のファイル一覧を取得する


<?php
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リポジトリ内の現在のファイル一覧を再帰的に取得する


<?php
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 についてもっと知りたくなったなら、以下を参照ください。