2010-03-08 18 views
5

Digamos que tengo un repositorio svn en https://www.mysvn.com/svn/. ¿Cómo puedo usar SharpSVN para averiguar si la carpeta remota https://www.mysvn.com/svn/a/b/c existe en el servidor?Cómo usar SharpSVN para (rápidamente) verificar si existe una carpeta/archivo remoto en el servidor

Necesito hacerlo de una manera que me permita diferenciar entre una conexión fallida (es decir, el servidor inactivo) y la carpeta simplemente no se ha creado aún.

La información de llamada en la ruta completa https://www.mysvn.com/svn/a/b/c no parece dar una excepción que me permita distinguir entre ningún repositorio y solo una carpeta faltante.

Podría enumerar todos los archivos para https://www.mysvn.com/svn/ pero el repositorio puede ser tan grande que puede llevar demasiado tiempo.

Ahora estoy haciendo una información en la primera URL de la raíz y luego en la url completa. Si la url raíz falla, la trato como un problema del servidor, pero si tiene éxito y la url completa falla, asumo que es porque parte de la ruta no se ha creado en el servidor. Sin embargo, esto podría dar la respuesta incorrecta si se pierde la conexión a Internet entre los dos controles o similar.

Respuesta

2

¿No sería svn list https://www.mysvn.com/svn/a/b/c (o más bien, su enlace equivalente) hacerlo? Debería devolver algo diferente si no se encuentra el camino. Por ejemplo, el cliente de línea de comando devuelve

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

Actualmente estoy probando con los repositorios de sistemas de ficheros locales (es decir, la url es "file: /// "), y en este caso SharpSvn.SvnClient.List me da una "SharpSvn.SvnRepositoryIOException: no se puede abrir una sesión ra_local a la URL" cuando la paso por la url del repositorio anexado con una ruta relativa falsa. Exactamente la misma excepción se produce al dar una url completamente falsa. – Ziphnor

11

Es posible utilizar GetInfo y establecer el SvnInfoArgs.ThrowOnError a falso.

Utilizando la sintaxis 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); 
    } 

Esto supone sin embargo que todas las excepciones lanzadas significa que el archivo remoto no existe.

Tal vez SvnRemoteSession.GetStat es una mejor manera de resolver esto. Es una característica bastante nueva, como parece. No lo tengo en mi versión de la biblioteca. http://sharpsvn.open.collab.net/source/browse/sharpsvn/trunk/src/SharpSvn/SvnRemoteSession.h?view=log

Es muy irritante que la biblioteca arroje diferentes excepciones según el tipo de repositorio que sea.

1

Siguiendo con la respuesta de Stefan para los nuevos lectores, SvnRemoteSession.GetStat parece hacer el truco:

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