web-dev-qa-db-ja.com

SVNリビジョン番号をプログラムに自動的に取得する

SVNの下にpythonプロジェクトがあり、実行時にバージョン番号を表示したいのですが、これを行う方法はありますか(コミット時に短いスクリプトを自動的に実行するなど)。バージョンファイルを更新したり、PythonでSVNリポジトリにクエリを実行したりできますか?)

18
Smashery

Pythonの詳細についてはわかりませんが、ファイルのどこかに文字列$ Revision $を入れ、SVN構成にenable-auto-props = trueがあると、次のようになります。 $ Revision:144 $のように書き直されました。その後、スクリプトでこれを解析できます。

この方法で使用できるプロパティキーワードの数 があります。

これにはオーバーヘッドはありません。文字列はコミットまたは更新時にファイルにハードコードされているため、SVNリポジトリにクエリを実行します。

Pythonでこれをどのように解析するかはわかりませんが、PHPで:

$revString = '$Revision: 144$';
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) {
    echo 'Revision is ' . $matches[1];
}
27
Ciaran McNulty

PHP回答に似ていますが、少しPythonicです。これをモジュールの__init__.pyに入れてください:

__version__ = filter(str.isdigit, "$Revision: 13 $")

必ずRevisionプロパティを追加してください。

svn propset svn:keywords Revision __init__.py
15
Will

または、次のようにすることができます。

import re,subprocess

svn_info = subprocess.check_output("svn info")

print (re.search(ur"Revision:\s\d+", svn_info)).group()

私のプロジェクトでは"Revision: 2874"が出力されます

またはこのように:

print (subprocess.check_output("svnversion")).split(":")[0]

私のプロジェクトでは"2874"が出力されます

7
German Petrov

ファイル hooks/pre-commitリポジトリには、コミットが成功する前に実行されるスクリプトまたはプログラムがあります。これを、コミット時に適切なバージョン番号でファイルを更新するスクリプトにするだけです(スクリプトの実行時にリビジョン番号がスクリプトに渡されます)。事前コミットフックの作成例を含むチュートリアルは次のとおりです。 http://wordaligned.org/articles/a-Subversion-pre-commit-hook

4
Eli Courtwright

Djangoにこれを可能にするコードのスニペットがあります、私はそれを見ることをお勧めします。 http://code.djangoproject.com/browser/Django/trunk /Django/utils/version.py

4
David

これを行うには、プロジェクトをビルドするときに小さなスクリプトを実行するだけです。スクリプトは、sedと組み合わせてsvn infoを呼び出して、裸のリビジョンデータを取得し、その番号をrevision.txtファイルに挿入します。

Hudsonビルドサーバーは、ビルドスクリプトを呼び出す直前に、SVNリビジョン番号を環境変数として設定するため、さらに簡単になります。

3
zedoo

チェックアウト pysvn 。 Subversionランタイム機能のためにPythonで拡張機能を公開します。

3
Konstantinos

実行時のセクションが少しあいまいだと思います-どこから実行したときですか? SVNチェックアウトからまたはリリースされたコードから?すべてのソリューションは、SVNバージョンをPythonソース、またはリポジトリ内の別のバージョンファイルのどこかに何らかの形で挿入することで機能します。

フレッシュチェックアウト時にバージョンファイルが変更されるため、配布前にクリーンチェックアウトを行う必要があります。したがって、プログラムがどこで実行されているかについての私の質問は残っています。

1
whatnick

これはPythonで私のために働いた:

すべてのsvn情報を取得します。

svn_info = subprocess.check_output('svn info').decode("utf-8") 
print(svn_info)

検索を行い、数を分割します。

revisionNum = re.search("Revision:\s\d+", svn_info)
print(revisionNum.group().split(":")[1])
0
tzg

'svn info --xml'からの出力をxml要素に解析することにより、プログラムでこれを行うことができます。

def get_svn_rev(dir: Union[str, Path]) -> str:
    """Get the svn revision of the given directory"""
    dir = str(dir)
    svn_info_cmd = ['svn', 'info', '--xml', dir]
    print(' '.join(svn_info_cmd))
    svn_info_process = subprocess.run(svn_info_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if svn_info_process.returncode:
        eprint(svn_info_process.stderr.decode().strip())
        raise subprocess.CalledProcessError(returncode=svn_info_process.returncode, cmd=svn_info_cmd,
                                            output=svn_info_process.stdout,
                                            stderr=svn_info_process.stderr)
    else:
        info = ElementTree.fromstring(svn_info_process.stdout.decode().strip())
        entry = info.find('entry')
        revision = entry.get('revision')

    return revision
0
Craig