version control - How do you detect which files were manually merged in mercurial's history? -


i'm part of team newly using mercurial , we've identified when merges occur there many more errors in files manually merged. possible mercurial logs (i.e. after has done merge , pushed merge changeset central repository) detect files manually merged?

note, have no idea if foolproof. also, requires copy of of yet unfinished mercurial library .net, runs on windows, , kinda rough around edges.

note: i'm assuming "were manually merged", mean "files mercurial didn't automatically merge us"

such file still merged or automatic external tool, if above assumption enough, read on.

however, did run through merges in test repository, re-doing merges , asking mercurial use internal merge tool, leaves files unresolved if cannot automatically merged mercurial, , report unresolved files, clean merge, , move on next merge changeset.

the library need (only in source code form @ moment, told unfinished):

i've attached zip file @ bottom everything, test repository, script, , binary copy of library.

the script (i used linqpad write , test this, output test-repository follows):

void main() {     var repo = new repository(@"c:\temp\repo");     var mergechangesets = repo.log(new logcommand()         .withadditionalargument("-r")         .withadditionalargument("merge()")).reverse().toarray();      foreach (var merge in mergechangesets)     {         debug.writeline("analyzing merge #" + merge.revisionnumber +             " between revisions #" + merge.leftparentrevision +             " , #" + merge.rightparentrevision);         // update left parent         repo.update(merge.leftparenthash);         try         {             // perform merge right parent             var mergecmd = new mergecommand();             mergecmd.withrevision = merge.rightparenthash;             repo.execute(mergecmd);              // list of unresolved files             var resolvecmd = new resolvecommand();             repo.execute(resolvecmd);             var unresolvedfiles = new list<string>();             using (var reader = new stringreader(resolvecmd.rawstandardoutput))             {                 string line;                 while ((line = reader.readline()) != null)                     if (line.startswith("u "))                         unresolvedfiles.add(line.substring(2));             }              // report             if (unresolvedfiles.count > 0)             {                 debug.writeline("merge changeset #" + merge.revisionnumber +                     " between revisions #" + merge.leftparentrevision +                     " , #" + merge.rightparentrevision + " had " +                     unresolvedfiles.count + " unresolved file(s)");                 foreach (string filename in unresolvedfiles)                 {                     debug.writeline("  " + filename);                 }             }         }                 {             // repository proper state             repo.update(merge.leftparenthash, new updatecommand().withclean());         }     } }  public class mergecommand : mercurialcommandbase<mergecommand> {     public mergecommand()         : base("merge")     {     }      [nullableargumentattribute(nonnulloption = "--rev")]     public revspec withrevision     {         get;         set;     }      public override ienumerable<string> arguments     {                 {             foreach (var arg in base.arguments)                 yield return arg;             yield return "--config";             yield return "ui.merge=internal:merge";         }     }      protected override void throwonunsuccessfulexecution(int exitcode,         string standardoutput, string standarderroroutput)     {         if (exitcode != 0 && exitcode != 1)             base.throwonunsuccessfulexecution(exitcode, standardoutput,                 standarderroroutput);     } }  public class resolvecommand : mercurialcommandbase<mergecommand> {     public resolvecommand()         : base("resolve")     {     }      public override ienumerable<string> arguments     {                 {             foreach (var arg in base.arguments)                 yield return arg;             yield return "--list";         }     } } 

the sample output:

analyzing merge #7 between revisions #5 , #6 analyzing merge #10 between revisions #9 , #8 merge changeset #10 between revisions #9 , #8 had 1 unresolved file(s)   test1.txt

zip-file (linqpad script, mercurial.net assembly, go compile if don't trust me, , test repository executed against above):

big caveat: run in clone of repository! won't held responsible if corrupts repository, unlikely think be.


Comments

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -