2009-05-06 3 views
3

Ich bin auf der Suche nach einem schnelleren Weg, Dateien von SVN als Svn Katze in .NET abrufen.Implementieren Sie eine schnellere SVN-Katze mit SvnClient

Momentan führe ich einen SVN-Cat-Prozess für jede Revision, aber es ist extrem langsam.

Dann habe ich mit SvnClient versucht:

Stream st = Console.OpenStandardOutput(); 

    SvnWriteArgs wargs = new SvnWriteArgs(); 

    for (int i = 3140; i < 3155; ++i) 
    { 
     wargs.Revision = i; 

     client.Write(new SvnUriTarget("http://filezilla.svn.sourceforge.net/svnroot/filezilla/FileZilla3/trunk/README"), st, wargs); 
    } 
    st.Flush(); 

Aber jeder Iteration ist sogar langsamer als svn cat.

Gibt es eine Möglichkeit in SvnClient, eine zuvor geöffnete Verbindung zum SVN-Server "wiederzuverwenden", so dass ein mehrfacher Cat-Betrieb schneller ausgeführt werden kann?

Antwort

4

Sie können dazu den Befehl FileVersions verwenden. Dies ruft eine vollständige Datei und alle anderen Dateien die Unterschiede zwischen den einzelnen Versionen in einer einzelnen Verbindung ab. Dies sollte einen schönen Leistungsschub geben.

public void WriteRevisions(SvnTarget target, SvnRevision from, SvnRevision to) 
{ 
    using(SvnClient client = new SvnClient()) 
    { 
     SvnFileVersionsArgs ea = new SvnFileVersionsArgs 
      { 
       Start = from, 
       End = to 
      }; 

     client.FileVersions(target, ea, 
      delegate(object sender2, SvnFileVersionEventArgs e) 
       { 
        Debug.WriteLine(e.Revision); 
        e2.WriteTo(...); 
       }); 
    } 
} 

Dies erfordert einen Server, der diese Funktion unterstützt. Ich bin nicht ganz sicher, wann es eingeführt wurde, aber Codeplex, das SvnBridge zum Beispiel ausführt, unterstützt es nicht. Wenn ich mich richtig erinnere, wird der Delegierte nur einmal in diesem Fall aufgerufen, in diesem Fall müssen Sie zu Ihrer ersten Lösung zurückkehren. Unter normalen Umständen wird der Delegierte für jede Revision zwischen Anfang und Ende aufgerufen.

Siehe Methode WalkMe (und andere) in this testcase, um weitere Details zu seiner Verwendung zu sehen (Benutzername Gast, kein Passwort).

+0

Ich weiß, das ist sehr alt, aber ... Ich nehme an, die "e2" ist ein Tippfehler, und Shoule "e" sein? Und die Verbindung zum Testfall funktioniert nicht. Und es wäre nett mit Beispielargumenten auf der WriteTo() Methode, anstatt nur "...". – RenniePet