Как использовать SharpSVN для (быстрой) проверки, существует ли на сервере удаленная папка / файл - PullRequest
5 голосов
/ 08 марта 2010

Скажите, у меня есть svn-репозиторий на https://www.mysvn.com/svn/. Как я могу использовать SharpSVN, чтобы выяснить, существует ли на сервере удаленная папка https://www.mysvn.com/svn/a/b/c?

Мне нужно сделать так, чтобы я мог определить разницу между сбойным соединением (то есть отключением сервера) и просто еще не созданной папкой.

Вызов информации по полному пути https://www.mysvn.com/svn/a/b/c, по-видимому, не дает исключения, которое позволяет мне определить разницу между отсутствием репозитория и просто отсутствующей папкой.

Я мог бы перечислить все файлы для https://www.mysvn.com/svn/, но хранилище может быть настолько большим, что это может занять слишком много времени.

Прямо сейчас я делаю информацию сначала о корневом URL, а затем о полном URL. Если корневой URL-адрес не удается, я рассматриваю его как проблему с сервером, но если это удается, а полный URL-адрес не удается, я предполагаю, что его часть не была создана на сервере. Однако это может дать неправильный ответ, если между двумя проверками или чем-то подобным было потеряно интернет-соединение.

Ответы [ 3 ]

11 голосов
/ 21 декабря 2010

Можно использовать GetInfo и установить для SvnInfoArgs.ThrowOnError значение false.

Использование синтаксиса 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);
    }

Предполагается, однако, что все выданные исключения означают, что удаленный файл не существует.

Возможно, SvnRemoteSession.GetStat - лучший способ решить эту проблему. Мне кажется, это совершенно новая функция. У меня его нет в моей версии библиотеки. http://sharpsvn.open.collab.net/source/browse/sharpsvn/trunk/src/SharpSvn/SvnRemoteSession.h?view=log

Очень раздражает, что библиотека генерирует разные исключения в зависимости от того, какой это тип хранилища.

2 голосов
/ 08 марта 2010

Не svn list https://www.mysvn.com/svn/a/b/c (или, скорее, его эквивалентная привязка) это сделает? Он должен вернуть что-то другое, если путь не найден. Например, клиент командной строки возвращает

svn: URL 'https://www.mysvn.com/svn/a/b/c' non-existent in that revision
1 голос
/ 20 января 2015

В ответ на ответ Стефана для новых читателей, SvnRemoteSession.GetStat, похоже, добился цели:

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