2011-07-20 2 views
0

Nous utilisons Mercurial depuis un moment et tout fonctionne correctement.Mercurial - consigner la commande exécutée

Le seul problème que nous rencontrons est quand quelqu'un exécute une "mauvaise commande".

Un exemple serait, en fusionnant une branche instable dans le tronc stable ou en tirant une branche du même nom sur quelque chose sans aucun rapport avec l'écrasement d'un tas de choses ...

Vous avez journal hg, mais vous obtenez toujours des gens qui ne croira pas la sortie en disant "je n'ai pas fait ça" ... maintenant dans l'intérêt de la honte publique :) et en donnant des privilèges légitimes à la "Vous avez cassé le chapeau construit", je me demande, y at-il un façon d'avoir Mercurial journal commande à chaque son donné à un fichier texte qui nous donnerait quelque chose comme:

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

Eh bien, vous pourriez toujours leur faire honte en exécutant un '' historique | moins »pendant que vous attendez une réponse. – Troy

+0

Cela fonctionnerait mais cela prend du temps, surtout si l'instruction commit est cryptique, il vous reste à comparer beaucoup de nombre de tours. Mais oui ça peut marcher :) – jfrobishow

+0

Vous pourriez ajouter des fonctionnalités de journalisation dans vos crochets de dépôt central. Comme 'mercurial-server' ne – zerkms

Répondre

0

Ok, j'ai eu quelques minutes sur ma main donc j'ai écrit un exe et l'ai appelé hg.exe et renommé exe original de Mercurial à real_hg ...

Un hack moche ne dérange pas la qualité du code s'il vous plaît IL FONCTIONNE!

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

Si vos co-développeurs sont si mal disciplinés qu'ils ne seront pas à la hauteur des erreurs qu'ils font, ce qui fait vous pensez qu'ils voudraient exécuter une "version" mercuriale qui enregistre chaque commande qu'ils font? En outre, cela ne consignera rien si vous utilisez TortoiseHg. –

+0

@Lasse V. Karlsen: n'utilise-t-il pas régulièrement hg.exe? – zerkms

+1

Pour de nombreuses fonctions, il parle directement au code Python, afin d'éviter la surcharge d'un interpréteur Python secondaire. Rappelez-vous que TortoiseHg est aussi écrit en Python. –

Questions connexes