1

Subversion 1.6 では.svn、すべての作業コピー ディレクトリにディレクトリがありました。次のコードを使用すると、シェルへのアクセスや実行を必要とせずに現在のリビジョン番号をすばやく取得できます。

public function getSubversionRevision() {
    if(file_exists("../.svn/entries")) {
        $svn = File("../.svn/entries");
        return (int)$svn[3];
    }
    return false;
}

Subversion 1.7 では、このコードが壊れています。.svnローカル リポジトリごとにディレクトリが 1 つだけになりました。このディレクトリにはファイルがありますが、entries私にとって役立つものはもうありません。必要なものはすべて SQLite データベースにあるようです。具体的にはwc.db。PHP の SQLite 関数を使用して必要な情報を取得できると思いますが、これはすべての (またはほぼすべての) ページの読み込みで実行するにはコストが高すぎるように思えます。

何か案は?関数を分割しexec、Subversion バイナリがインストールされている (そして $PATH に!) ことを期待するのは、最後の手段です。.svn要約すると、レポジトリのルート (チェックアウトの場所によって異なる可能性があります) にディレクトリを配置し、そこにあるファイル (おそらくwc.db) を費用対効果の高い方法で解析する方法を見つける必要があります。

4

5 に答える 5

2

SVN ライブラリSVNを使用してみてください。これにより、SVN リポジトリを介してリポジトリ情報とより多くの機能にアクセスできるようになります。受け取る
関数svn_statusと svn リポジトリ情報の配列を見てください。

Array (
    [0] => Array (
        [path] => /home/bob/wc/sandwich.txt
        [text_status] => 8 // item was modified
        [repos_text_status] => 1 // no information available, use update
        [prop_status] => 3 // no changes
        [repos_prop_status] => 1 // no information available, use update
        [name] => sandwich.txt
        [url] => http://www.example.com/svnroot/deli/trunk/sandwich.txt
        [repos] => http://www.example.com/svnroot/
        [revision] => 123 // <-- Current Revision
        //..
    )
)
于 2012-07-27T06:07:08.167 に答える
1

TheHostingToolでSubversion1.7リビジョン検索の不器用な(しかし比較的徹底的な)実装を実装しました。説明については、コミットメッセージを確認してください。この関数は、/ trunk(/trunk/includes/class_main.php)の1つ後のディレクトリであるclass_main.phpに含まれています。特定のニーズに合わせて相対パスを調整する必要があります。これは、他の場所で使用するためにclass_main.phpにある関数のわずかに変更されたバージョンです。

public function getSubversionRevision() {
    // This will work for Subverson 1.6 clients and below
    if(file_exists("../.svn/entries")) {
        $svn = File("../.svn/entries");
        return (int)$svn[3];
    }
    // Check the previous directories recursively looking for wc.db (Subversion 1.7)
    $searchDepth = 3; // Max search depth
    // Do we have PDO? And do we have the SQLite PDO driver?
    if(!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) {
        $searchDepth = 0; // Don't even bother...
    }
    for($i = 1; $i <= $searchDepth; $i++) {
        $dotdot .= '../';
        if(!file_exists("$dotdot.svn/wc.db")) {
            continue;
        }
        $wcdb = new PDO("sqlite:$dotdot.svn/wc.db");
        $result = $wcdb->query('SELECT "revision" FROM "NODES" WHERE "repos_path" = "'.basename(realpath('..')).'"');
        return (int)$result->fetchColumn();
    }
    if($this->canRun('exec')) {
        exec('svnversion ' . realpath('..'), $out, $return);
        // For this to work, svnversion must be in your PHP's PATH enviroment variable
        if($return === 0 && $out[0] != "Unversioned directory") {
            return (int)$out[0];
        }
    }
    return false;
}

.= '../'1から始めない場合は、代わりにstr_repeatを使用することもできます。または、開始し$dotdotたい場所に事前に定義することもできます。

于 2012-09-10T03:01:21.817 に答える
1

svn update毎回スクリプトを作成し、更新の出力からリビジョン番号をファイルにスクラップできます。次の bash スクリプトは多かれ少なかれそれを行う必要があります。

#!/bin/bash

svn --non-interactive update .. 
svn --non-interactive update .. | perl -p -e "s/.* revision ([\d]*)\./\$1/" > ../version.phtml;
于 2012-07-27T08:42:12.520 に答える
0

または、次のクエリを実行します。

SELECT "changed_revision" FROM "NODES" ORDER BY changed_revision DESC LIMIT 1;

レポ全体の最終リビジョンが気になるなら!:)

于 2013-03-28T18:07:49.060 に答える
0

すみませんが、ポータブルで防弾のソリューションが必要な場合は、PHP 内で Subversion CLI を呼び出してみませんか?

グローバルリビジョンのみを取得したい場合svn infoは、WCの任意のディレクトリ内で使用できます(キャプチャ、出力の解析、およびデータセットの取得)svnversion

于 2013-03-28T21:44:12.013 に答える