WindowsでSubversionのフックを作成する最良の方法は何ですか? 私の知る限り、使用できるのは実行可能ファイルのみです。それで、最良の選択は何ですか?
- プレーンなバッチ ファイル (非常に限定的ですが、非常に単純なソリューションではおそらく問題ありません)
- コンパイルされた専用の実行可能アプリケーション (一言で言えば大ハンマー?)
- その他のハイブリッドの選択肢 (Powershell スクリプトを実行するバッチ ファイルなど)
私はちょうどこの質問について先延ばしに数日を費やしました。利用可能なサードパーティ製品とたくさんのPERLおよびPythonスクリプトがありますが、私はシンプルなものと慣れ親しんだ言語が欲しかったので、C#コンソールアプリでフックを書くだけで終わりました。それは非常に簡単です:
public void Main(string[] args)
{
string repositories = args[0];
string transaction = args[1];
var processStartInfo = new ProcessStartInfo
{
FileName = "svnlook.exe",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = String.Format("log -t \"{0}\" \"{1}\"", transaction, repositories)
};
var p = Process.Start(processStartInfo);
var s = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (s == string.Empty)
{
Console.Error.WriteLine("Message must be provided");
Environment.Exit(1);
}
Environment.Exit(0);
}
次に、pre-commit.cmdファイルをリポジトリのhooksフォルダーに次の行で追加することにより、precommitでこれを呼び出すことができます。
[path]\PreCommit.exe %1 %2
あなたはこのやり過ぎを考えるかもしれませんが、最終的にはコーディングのほんの数分です。さらに、IMHOが他の言語よりもはるかに好ましい.NET言語スイートの利点を得ることができます。フックを大幅に拡張し、それらに対しても適切なテストを作成します。DOSバッチファイルでこれを行うのは少し難しいです。
ところで、コードはこの投稿から適応されています。
次のような複雑な要件があります。
#5は私たちにとって非常に重要です。新しいフックを介して以前のすべてのコミットをプッシュできるようにするよりも、コミットを中断しないことを知る良い方法はありません. 1234 がリビジョンで 1234-1 がトランザクションであることをフックに理解させ、svnlook などを呼び出すときに適切な引数の変更を行うことは、プロセス中に行った最良の決定でした。
私たちにとって、ナットは十分に大きくなったので、完全に単体テストと回帰テストが可能な C# コンソール exe が最も理にかなっています。ディレクトリ制限をフィードしたり、既存の httpd_authz ファイルを解析して「特権」ユーザーを取得したりする構成ファイルがあります。Windows で .NET 開発労働力を使用していなかったら、おそらくすべて Python で記述していたでしょうが、他の人が将来それをサポートする必要があるかもしれないので、.BAT、.VBS、Powershell の愚かさよりも .NET に行きました。
個人的には、Powershell は .NET とは大きく異なり、「スクリプト」言語としてはほとんど役に立たないと思います。製品の唯一のコマンド ライン サポートが PS (Exchange、Windows 2k8) などを介して提供される場合は良いことですが、テキストを解析したり、通常の .NET オブジェクトにアクセスしたりするだけの場合、PS はクレイジーな構文と愚かなセキュリティ アイアンを追加するだけです。すばやく簡単にできる小さな .NET アプリの幕開けです。
CaptainHook 、「.NET を使用して Subversion フックを作成するためのシンプルなプラグイン フレームワーク」を確認してください。
複雑さに応じて、それぞれの状況は異なります。単にファイルを移動するだけの場合は、簡単なバッチファイルを作成します。もっと複雑なことをしたい場合は、通常、スクリプトの部分をスキップして、それを処理できる簡単なc#プログラムを作成します。
問題は、そのc#プログラムをsvnに入れて、バージョン管理するかどうかです:)
編集:専用のc#アプリケーションの利点は、コードフラグメントを再利用して、フックロギングを処理するために作成した単純なログ出力を含め、後で新しいフックを作成できることです。
単純な php クラスの助けを借りて php 実行可能ファイルがある場合は、ここに示されているように php でフック スクリプトを記述できますhttp://www.devhands.com/2010/01/subversion-hook-php-framework-in/
ネット上には多くの例があるため (通常は Linux 用ですが、違いはわずかです)、Windows 上のPythonでフックを作成しました。SVN と統合されたTracも使用しており、Python 経由でアクセスできる Trac API があり、SVN フック スクリプトから Trac チケットを自動的に作成/変更できます。