2009-09-30 27 views
7

Like this questionですが、実際にSVNサーバーを照会する必要はありません。これはWebベースのプロジェクトなので、リポジトリを一般公開のビューとして使用するだけです(誰かがこれが悪い考えであると私に知らせることができない限り)。私はこの情報がどこかの.svnフォルダのファイルにあると仮定しますが、どこで、どのように解析すればいいですか?私はSOのような何かをしたい、右下隅に改正を持っている。プログラムでSVNリビジョン番号を取得するには?

PythonまたはPHPでのコードは、手元にある場合、または正しい方向にある場合のみ有効です。

答えて

13

Subversionには、この目的のためにsvnversionツールが含まれています。作業コピーは実際にはローカルで変更されている場合もあれば、複数のリビジョンで構成されている場合もあります。 svnversionはその処理方法を知っています。リンクされたドキュメントの例を参照してください。私はこれはかなり古いですけど、私は私が私のWebアプリケーションのためのPHPでこれを行う方法まで提供しようと思いました

import subprocess 

def svnversion(): 
    p = subprocess.Popen("svnversion", stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    (stdout, stderr) = p.communicate() 
    return stdout 
+0

なぜ 'shell = True'ですか? – lorenzog

+0

@ lorenzog:この回答はほぼ7歳ですので、私は覚えていません。 shell = Trueでなくても動作することを確認したら、教えてください。私はそれを編集します。 –

+0

少なくとも私のためにはうまくいくようです:http://stackoverflow.com/a/37157630/204634(何らかの理由で私は@ - ニックネーム..?) – lorenzog

3

チェックアウトの現在のリビジョン番号は、コマンドラインで "svn info"を使用して取得できます。例えば

:それはローカライズされています

$ svn info 
Chemin : . 
URL : http://.../trunk 
Racine du dépôt : http://... 
UUID du dépôt : 128b9c1a-...-612a326c9977 
Révision : 185 
Type de nœud : répertoire 
Tâche programmée : normale 
Auteur de la dernière modification : ... 
Révision de la dernière modification : 185 
Date de la dernière modification: 2009-09-28 20:12:29 +0200 (lun. 28 sept. 2009) 

注意。をしかし、PHPからこれを使用する場合はXMLがはもっと役立つかもしれないとして、それを取得し、

$ LANG=en svn info 
svn: warning: cannot set LC_CTYPE locale 
svn: warning: environment variable LANG is en 
svn: warning: please check that your locale name is correct 
Path: . 
URL: http://.../trunk 
Repository Root: http://... 
Repository UUID: 128b9c1a-...-612a326c9977 
Revision: 185 
Node Kind: directory 
Schedule: normal 
Last Changed Author: mzeis 
Last Changed Rev: 185 
Last Changed Date: 2009-09-28 20:12:29 +0200 (Mon, 28 Sep 2009) 

を(簡単に解析すること、およびロケールに対応していません):あなたがLinux上でなら、あなたが使用して試みることができる

$ svn info --xml 
<?xml version="1.0"?> 
<info> 
<entry 
    kind="dir" 
    path="." 
    revision="185"> 
<url>http://.../trunk</url> 
<repository> 
<root>http://...</root> 
<uuid>128b9c1a-...-612a326c9977</uuid> 
</repository> 
<wc-info> 
<schedule>normal</schedule> 
<depth>infinity</depth> 
</wc-info> 
<commit 
    revision="185"> 
<author>...</author> 
<date>2009-09-28T18:12:29.130307Z</date> 
</commit> 
</entry> 
</info> 

ちょうどその上simplexml_load_stringを使用し、entryタグのrevision属性を取得します。


各ページビューでこれを行うわけにはいかないことに注意してください。アプリケーションに期待するほど速くはありません。

代わりに、アーカイブを作成するときにリビジョン番号を取得し、後で本番サーバーに送信し、何らかの設定ファイルに保存します。

このようにして、本番サーバーでsvnコマンドを使用する必要はなく、そのサーバーでもチェックアウトする必要はありません。

+0

私は 'svn info'の解析以外の方法を望んでいましたが、これは有効な解決策であると思います。おそらくファイルを解析するよりも一貫性のある情報を生成するでしょう...私が知らなかった '--xml'オプション。物事を楽にするはずです。 – mpen

4

私はたぶんポストコミットフックを使ってウェブサイト内のどこかのテキストファイルにバージョン番号を書き出し、あなたのページを読み込むときにそのファイルを読むだけです。

More on using hooks here

+0

効率的に聞こえるようになりました! – mpen

+0

あなたが皮肉っているのかどうかは分かりませんが、svnへの砲撃や砲撃よりも効率的です。 – glomad

+0

いいえ...全くありません。そのようにすることを意味しなかった:) – mpen

0

あなただけのコマンドラインに支払うとsvn infoを実行することができます。これは混在したリビジョンになる可能性があることを覚えておいてください。 svnを実行して、STDOUTの最後の行でリビジョン番号を指定することもできます。

または、svn APIを使用しますか?また、ファイル内のトークンをWCの現在のリビジョンに置き換えるために使用されるSubWCRevのTortoiseSVNコードを調べることもできます。

2

あなたがpysvnをチェックアウトし、Python実装を探しているなら、あなたは現在のリビジョンを含む詳細情報を取得するためにinfo commandを呼び出すことができます。

entry = info(path) 
3

これは、のために働きますsvnバージョン1.6.2。しかし、SVNのバージョンによって、.svnフォルダの形式が異なることに注意してください。

<?php 

$contents = file_get_contents(dirname(__FILE__) . '/.svn/entries'); 
preg_match("/dir\n(.+)/", $contents, $matches); 
$svnRevision = $matches[1]; 

print "This Directory's SVN Revsion = $svnRevision\n"; 
3

ランスに続いて、1行のコマンドラインがあります。

svn log -q --limit 1 http://svnbox/path/to/repo/trunk \ 
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];' 
1

あなたは、このようのpythonからsvnversionを呼び出すことができますこれをあなたのアプリケーションのPHPファイルに入れ、 "Date Revision Author HeadURL Id"(ファイルのキーワード置換)のSVN Keywordsプロパティを設定します。 SVNは、ソースファイル上のキーワードの交換を行います後

$SVN_rev = "\$LastChangedRevision$"; 
$SVN_headURL = "\$HeadURL$"; 

function stripSVNstuff($s) 
{ 
    $s = substr($s, strpos($s, ":")+1); 
    $s = str_replace("$", "", $s); 
    return trim($s); 
} 

ので、$のSVN_revラインは次のようになります。

$SVN_rev = "\$LastChangedRevision: 6 $"; 

のでstripSVNstuff($ SVN_rev)の出力は "6" になります(引用符なし)。

関連する問題