2010-03-08 16 views
5

Powiedz, że mam repozytorium svn pod adresem https://www.mysvn.com/svn/. Jak mogę użyć SharpSVN do ustalenia, czy zdalny folder https://www.mysvn.com/svn/a/b/c istnieje na serwerze?Jak używać SharpSVN do (szybkiego) sprawdzenia, czy zdalny folder/plik istnieje na serwerze

Potrzebuję zrobić to w sposób, który pozwala mi odróżnić nieudane połączenie (np. Serwer w dół), a folder po prostu nie został jeszcze utworzony.

Wywołanie informacji na pełnej ścieżce https://www.mysvn.com/svn/a/b/c wydaje się nie dawać wyjątku, który pozwala mi odróżnić brak repozytorium i tylko brakujący folder.

Mogę wyświetlić wszystkie pliki dla https://www.mysvn.com/svn/, ale repozytorium może być z łatwością tak duże, że może to zająć zbyt długo.

W tej chwili robię informację o pierwszym URL-u roota, a następnie o pełnym adresie URL. Jeśli adres URL roota nie powiedzie się, traktuję go jak problem z serwerem, ale jeśli mu się to uda i pełny adres URL zawodzi, zakładam, że część ścieżki nie została utworzona na serwerze. Może to jednak dać złą odpowiedź, jeśli połączenie internetowe zostało utracone między dwiema kontrolami lub podobnymi.

Odpowiedz

2

Czy nie byłby to svn list https://www.mysvn.com/svn/a/b/c (a raczej jego równoważne powiązanie) zrób to? Powinien zwrócić coś innego, jeśli ścieżka nie zostanie znaleziona. Na przykład, klient linii poleceń zwraca

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

obecnie Im testowania lokalnych repozytoriach systemu plików (czyli url jest „file: /// ”), iw tym przypadku SharpSvn.SvnClient.List daje mi "Wyjątek SharpSvn.SvnRepositoryIOException: Nie można otworzyć sesji ra_local pod adresem URL" , gdy dostarczę mu adres URL repozytorium dołączony fałszywą ścieżką względną. Dokładnie ten sam wyjątek jest zgłaszany przy podawaniu całkowicie fałszywego adresu URL. – Ziphnor

11

Czy jest możliwe użycie GetInfo i ustawić SvnInfoArgs.ThrowOnError false.

Korzystanie składni SharpSVN:

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); 
    } 

Zakłada to jednak, że wszystkie wyjątki, które są rzucane oznacza, że ​​zdalny plik nie istnieje.

Może SvnRemoteSession.GetStat jest lepszym sposobem na rozwiązanie tego problemu. Jestem całkiem nową funkcją, jak się wydaje. Nie mam go w mojej wersji biblioteki. http://sharpsvn.open.collab.net/source/browse/sharpsvn/trunk/src/SharpSvn/SvnRemoteSession.h?view=log

To bardzo irytujące, że biblioteka generuje różne wyjątki w zależności od tego, jakie to jest repozytorium.

1

obserwuję się z odpowiedzią Stefana dla nowych czytelników, SvnRemoteSession.GetStat wydaje rade:

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); 
} 
Powiązane problemy