3 Stimmen

Implementierung eines schnelleren svn cat mit SvnClient

Ich bin auf der Suche nach einem schnelleren Weg zum Abrufen von Dateien aus SVN als svn cat in .NET.

Zurzeit lasse ich für jede Revision einen svn cat-Prozess laufen, aber der ist extrem langsam.

Dann habe ich es 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 jede Iteration ist noch langsamer als svn cat.

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

4voto

Sander Rijken Punkte 21069

Dazu können Sie den Befehl FileVersions verwenden. Dieser holt eine komplette Datei und alle anderen Dateien unter Verwendung der Unterschiede zwischen den einzelnen Revisionen in einer einzigen Verbindung. Das sollte einen schönen Leistungsschub bringen.

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 mir nicht ganz sicher, wann es eingeführt wurde, aber Codeplex mit SvnBridge zum Beispiel unterstützt es nicht. Wenn ich mich richtig erinnere, wird der Delegat in diesem Fall nur einmal aufgerufen, in diesem Fall müssen Sie zu Ihrer ersten Lösung zurückkehren. Unter normalen Umständen wird der Delegat für jede Revision zwischen Start und Ende aufgerufen.

Siehe Methode WalkMe (und andere) in dieser Testfall um weitere Einzelheiten über die Verwendung zu erfahren (Benutzername guest, kein Passwort).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X