5

假设我在https://www.mysvn.com/svn/有一个 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 失败,我认为它是因为部分路径尚未在服务器上创建。但是,如果两次检查或类似检查之间的互联网连接丢失,这可能会给出错误的答案。

4

3 回答 3

13

可以使用 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

库根据它是什么类型的存储库抛出不同的异常,这是非常令人恼火的。

于 2010-12-21T14:10:16.810 回答
2

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
于 2010-03-08T20:50:23.533 回答
1

跟进 Stefan 对新读者的回答, 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);
}
于 2015-01-20T01:03:15.047 回答