2011-07-20 7 views
0

しばらくの間水銀を使用していて、すべて正常に動作しています。Mercurial - 実行されたコマンドを記録する

私たちが遭遇する唯一の問題は、誰かが「悪いコマンド」を実行した場合です。

の例では、安定したトランクに不安定なブランチをマージするか、原料の束を上書き完全に無関係なものの上に似た名前の枝を引っ張って、だろう...

あなたはHGのログを持っていますが、常に人々を得ますそれは "私はそれをしなかった"と言っている出力を信じません...今公衆のshamingの利益の:)と "あなたはビルドされた帽子を壊した"正当な特権を与える、私は疑問に思っています私たちに何かを与えるテキストファイルに与えられたすべてのコマンドをMercurialに記録させる方法:

hg pull -b something 
hg merge TotallyWrongBranch 
hg ci -m "I didn't do it!" -u bsimpson 
+0

さて、あなたは "歴史|あなたが答えを待つ間、「少ない」。 – Troy

+0

それはうまくいくでしょうが、コミットステートメントが暗黙のうちに多くのレヴェル番号を比較して残っていると特に時間がかかります。しかしええ、それは働くことができます:) – jfrobishow

+0

あなたは、中央リポジトリのフックにログ機能を追加することができます。 'mercurial-server'のように – zerkms

答えて

0

私は数分私はexeを書いてhg.exeという名前をつけ、Mercurialの元のexeをreal_hgに改名しました。

醜いハックはコードの品質に気をつけませんIT WORKS!

public static StreamWriter sw; 

static void Main(string[] args) 
{ 
    sw = new StreamWriter("hgCommandLog.txt", true); 
    StringBuilder sbArguments = new StringBuilder(); 
    if (args.Length > 0) 
    { 
     for (int i = 0; i < args.Length; i++) 
     { 
      sbArguments.Append(args[i]); 
      sbArguments.Append(" "); 
     } 
    } 
    //Console.WriteLine("arg:" + sbArguments.ToString()); 
    //Console.WriteLine("Session ID = " + System.Diagnostics.Process.GetCurrentProcess().SessionId.ToString()); 
    //Console.WriteLine("hello ->"+Environment.GetEnvironmentVariable("CLIENTNAME")); 

    string sessionID = System.Diagnostics.Process.GetCurrentProcess().SessionId.ToString(); 
    string clientName = Environment.GetEnvironmentVariable("CLIENTNAME"); 

    //log the command to sw 
    sw.WriteLine(DateTime.Now.ToString() + "\t" + clientName + "("+sessionID+")\t" + "hg " + sbArguments.ToString()); 
    sw.Flush(); 

    // Start the child process. 
    Process p = new Process(); 
    // Redirect the output stream of the child process. 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.FileName = "real_hg"; 
    p.StartInfo.Arguments = sbArguments.ToString(); 

    p.StartInfo.CreateNoWindow = true; 
    p.ErrorDataReceived += outputReceived; 
    p.OutputDataReceived += outputReceived; 
    p.EnableRaisingEvents = true; 

    p.Start(); 
    // Do not wait for the child process to exit before 
    // reading to the end of its redirected stream. 
    p.BeginOutputReadLine(); 
    //p.BeginErrorReadLine(); 
    p.WaitForExit(); 

    sw.Close(); 
} 

static void outputReceived(object sender, DataReceivedEventArgs e) 
{ 
    sw.WriteLine("\t"+e.Data); 
    Console.WriteLine(e.Data); 
} 
+1

あなたの共同開発者は、間違いを犯さないようにひどく訓練されている場合、彼らは彼らがするすべてのコマンドを記録する水銀の "バージョン"を実行したいと思いますか?また、TortoiseHgを使用すると、これは何もログに記録されません。 –

+0

@Lasse V. Karlsen:通常のhg.exeは使用しませんか? – zerkms

+1

多くの関数では、Pythonコードと直接通信し、セカンダリPythonインタプリタを回転させるオーバーヘッドを回避します。 TortoiseHgはPythonでも書かれています。 –

関連する問題