2016-07-15 41 views
1

Wenn Sie eine Zusammenführung einrichten, hat der TortoiseSvn-Client eine wunderbare Checkbox mit dem Titel "Nicht-mergable Revisionen ausblenden". Ich möchte die Revisionsliste reproduzieren, die angezeigt wird, wenn sie mit SharpSvn aktiviert wurde.Getting "mergable revisions" mit SharpSvn

TortoiseSvn

Die TortoiseSvn documentation erklärt diese Checkbox:

Wenn Merge-Tracking verwendet wird, wird der Log-Dialog zeigen zuvor Revisionen fusioniert und Revisionen vor der Zeit der gemeinsamen Vorfahren Punkt, also vor dem Zweig wurde kopiert, wie ausgegraut. Mit dem Kontrollkästchen Nicht zusammenführbare Revisionen ausblenden können Sie diese Revisionen vollständig ausfiltern, sodass nur die Revisionen angezeigt werden, die zusammengeführt werden können.

Wie kann ich diese Funktionalität im SharpSvn-Code reproduzieren? Ich brauche eine Liste von SvnLogEventArgs (oder ähnlich), die Kandidaten für die Zusammenführung sind.

Aktueller Status: Ich bin nur so weit gekommen, die Protokolle für beide Zweige zu ziehen. Ich kann nicht herausfinden, wie man das passende svn:mergeinfo Attribut erhält oder was man damit macht, sobald ich es bekomme.

Antwort

1

ich weg gehalten Einstecken und folgende Links, und hier ist, was ich am Ende mit:

using (var client = new SvnClient()) 
{ 
    var release = SvnTarget.FromUri(new Uri(@"https://******/branches/Release")); 
    var trunk = SvnTarget.FromUri(new Uri(@"https://******/trunk")); 

    string trunkMergeinfo, releaseMergeinfo; 
    client.GetProperty(release, "svn:mergeinfo", out releaseMergeinfo); 
    client.GetProperty(trunk, "svn:mergeinfo", out trunkMergeinfo); 
    var relInfos = releaseMergeinfo.Split("\n"); 
    var trunkInfos = trunkMergeinfo.Split("\n"); 

    // This is here because I don't know what will happen once I merge something into trunk. 
    Debug.Assert(relInfos.Except(trunkInfos).Count() == 1,"Too many unknown merge paths"); 

    var trunklist = relInfos.SingleOrDefault(i => i.StartsWith("/trunk:")); 
    var revisions = trunklist.Replace("/trunk:", "").Split(",").SelectMany(t => 
    { 
     // If the log contains a range, break it out to it's specific revisions. 
     if (t.Contains("-")) 
     { 
      var match = Regex.Match(t, @"(\d+)-(\d+)"); 
      var start = int.Parse(match.Groups[1].Value); 
      var end = int.Parse(match.Groups[2].Value); 
      return Enumerable.Range(start, end - start + 1).ToArray(); 
     } 
     else 
      return new[] { int.Parse(t) }; 
    }).Select(x => (long)x); 

    Collection<SvnLogEventArgs> baseRevs; 
    // Why can't this take "trunk" or a property thereof as an argument? 
    client.GetLog(new Uri(@"https://******/trunk"), new SvnLogArgs { Start = 1725, End = SvnRevisionType.Head }, out baseRevs); 
    baseRevs.Reverse().Where(r => !revisions.Contains(r.Revision)).Select(x => x.LogMessage).Dump(); 
} 

Hoffentlich hilft dies jemand anderes, obwohl ich beachten Sie werden feststellen, dass es nicht viel von der Vernunft hat Überprüfen, dass ich den Produktionscode eingegeben habe - das ist die schnell und schmutzig Version.