Mercurial - зарегистрировать выполненную команду - PullRequest
0 голосов
/ 21 июля 2011

Мы уже давно используем Mercurial, и все работает нормально.

Единственная проблема, с которой мы сталкиваемся, это когда кто-то запускает «плохую команду».

Примером может служить объединение нестабильной ветви в стабильной магистрали или перетягивание ветки с аналогичным именем поверх чего-то совершенно не связанного с перезаписью множества вещей ...

У вас есть журнал hg, но у вас всегда есть люди, которые не будут верить выводу, говорящему "Я этого не делал" ... теперь в интересах публичного позора :) и предоставляя законные привилегии "Вы сломал встроенную шапку ", мне интересно, есть ли способ, чтобы Mercurial регистрировал каждую команду в текстовом файле, который дал бы нам что-то вроде:

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

1 Ответ

0 голосов
/ 21 июля 2011

Хорошо, у меня было несколько минут, поэтому я написал exe, назвал его hg.exe и переименовал оригинальный exe-файл Mercurial в real_hg ...

Уродливый хак, не обращая внимания на качество кодапожалуйста ЭТО РАБОТАЕТ!

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);
}
...