2010-03-08 5 views
5

Angenommen, ich habe ein SVN-Repository unter https://www.mysvn.com/svn/. Wie kann ich mit SharpSVN herausfinden, ob der Remote-Ordner https://www.mysvn.com/svn/a/b/c auf dem Server existiert?Wie SharpSVN verwendet wird, um (schnell) zu überprüfen, ob ein Remote-Ordner/eine Datei auf dem Server existiert

Ich muss es auf eine Weise tun, die es mir ermöglicht, den Unterschied zwischen einer fehlgeschlagenen Verbindung (dh Server unten) und dem Ordner einfach noch nicht erstellt zu haben.

Aufruf Informationen über die vollständige https://www.mysvn.com/svn/a/b/c Pfad scheint keine Ausnahme zu geben, die mir den Unterschied zwischen keinem Repository überhaupt und nur einen fehlenden Ordner unterscheiden kann.

Ich könnte alle Dateien für https://www.mysvn.com/svn/ auflisten, aber das Repository kann leicht so groß sein, dass dies zu lange dauern kann.

Im Moment mache ich eine Info über zuerst die Root-URL und dann auf die volle URL. Wenn die Root-URL fehlschlägt, behandle ich sie als ein Serverproblem, aber wenn es erfolgreich ist und die vollständige URL fehlschlägt, nehme ich an, weil ein Teil des Pfades nicht auf dem Server erstellt wurde. Dies könnte jedoch die falsche Antwort geben, wenn die Internetverbindung zwischen den beiden Überprüfungen oder ähnlichem verloren gegangen wäre.

Antwort

2

Würde nicht svn list https://www.mysvn.com/svn/a/b/c (oder vielmehr, die entsprechende Bindung) es tun? Es sollte etwas anderes zurückgegeben werden, wenn der Pfad nicht gefunden wird. Zum Beispiel gibt die Kommandozeilen-Client

svn: URL 'https://www.mysvn.com/svn/a/b/c' non-existent in that revision 
+0

Im derzeit mit lokalen Dateisystem-Repositories Testen (dh die URL "file: /// "), und in diesem Fall SharpSvn.SvnClient.List gibt mir eine "SharpSvn.SvnRepositoryIOException: Kann nicht eine ra_local Sitzung zu URL" öffnen, wenn ich es die URL des Repositorys mit einem falschen relativen Pfad angehängt füttern. Genau die gleiche Ausnahme wird ausgelöst, wenn eine komplett falsche URL angegeben wird. – Ziphnor

11

möglich ist GetInfo zu verwenden und die SvnInfoArgs.ThrowOnError auf false gesetzt.

Mit SharpSvn Syntax:

using (SvnClient sc = new SvnClient()) 
    { 
     Uri targetUri = new Uri(RemoteUriTrunk, relPath); 
     var target = SvnTarget.FromUri(targetUri); 
     Collection<SvnInfoEventArgs> info; 
     bool result = sc.GetInfo(target, new SvnInfoArgs {ThrowOnError = false}, out info); 
     Assert.That(result, Is.False); 
     Assert.That(info, Is.Empty); 
    } 

Dies setzt voraus, aber, dass alle Ausnahmen, die ausgelöst werden, bedeuten, dass die Remote-Datei nicht existiert.

Vielleicht SvnRemoteSession.GetStat ist eine bessere Möglichkeit, dies zu lösen. Ich bin ein ziemlich neues Feature, wie es scheint. Ich habe es nicht in meiner Version der Bibliothek. http://sharpsvn.open.collab.net/source/browse/sharpsvn/trunk/src/SharpSvn/SvnRemoteSession.h?view=log

Es ist sehr irritierend, dass die Bibliothek verschiedene Ausnahmen auslöst, je nachdem, um was für ein Repository es sich handelt.

1

mit Stefan Antwort für neue Leser Anknüpfend, SvnRemoteSession.GetStat den Trick zu tun scheint:

using (var session = new SharpSvn.Remote.SvnRemoteSession()) 
{ 
    SvnUI.Bind(session, new SvnUIBindArgs()); 

    // Throws 'SharpSvn.SvnRepositoryIOForbiddenException' if the server 
    // exists but the repo does not, or the user does not have read access. 
    // (SVN_ERR_RA_DAV_FORBIDDEN) 
    // 
    // Throws 'SharpSvn.SvnSystemException' if the server does not exist 
    // or could not be reached. (WSAHOST_NOT_FOUND) 
    session.Open(remoteUriTrunk); 

    SharpSvn.Remote.SvnRemoteStatEventArgs result; 

    // True if the file or folder exists, false if it does not exist. 
    bool exists = session.GetStat(relPath, out result); 
}