C# 在C中的ikvmc ed库中使用SVNKit时,SVNException无法重命名文件#

C# 在C中的ikvmc ed库中使用SVNKit时,SVNException无法重命名文件#,c#,java,mono,ikvm,svnkit,C#,Java,Mono,Ikvm,Svnkit,我使用ikvmc将svnkit编译成一个C#(dll)库,并将其链接为对我的项目的引用 我尝试了一个概念验证代码来验证: public void checkOut(Dictionary<string,List<object>> tokens) { string url_str = (string) tokens["checkout"][0]; setupLibrary(); java.io.File

我使用ikvmc将svnkit编译成一个C#(dll)库,并将其链接为对我的项目的引用

我尝试了一个概念验证代码来验证:

public void checkOut(Dictionary<string,List<object>> tokens) {
            string url_str = (string) tokens["checkout"][0];
            setupLibrary();
            java.io.File path = new java.io.File(Path.Combine (Directory.GetCurrentDirectory (), "check_out_folder"));

            SVNURL url = SVNURL.parseURIEncoded(url_str);

            SVNClientManager cm = SVNClientManager.newInstance();
            SVNUpdateClient uc = cm.getUpdateClient();
            try {
                uc.doCheckout(url, path, SVNRevision.UNDEFINED, SVNRevision.HEAD, true);                        
            }
            catch (SVNException e) {
                Console.WriteLine(e.getErrorMessage());
            }
        }
它将创建checkout_文件夹,以下是冲突文件:

$ ls -alR check_out_folder/ | grep entries
-r--r--r-- 1 nubela nubela  204 2010-02-17 13:07 entries
-r--r--r-- 1 nubela nubela  204 2010-02-17 13:07 entries
以下是checkout_文件夹的内容:

[nubela@nubela-netbook check_out_folder]$ ls -al
total 12
drwxr-xr-x 3 nubela nubela 4096 2010-02-17 13:07 ./
drwxrwxr-x 3 nubela nubela 4096 2010-02-17 13:07 ../
drwxr-xr-x 6 nubela nubela 4096 2010-02-17 13:07 .svn/
你知道为什么会发生这种情况,以及我如何克服这种情况吗

编辑:它在windows下工作(使用mono,而不是在.NET下)。因为windows没有令人讨厌的文件权限


Edit2:我已经有了chmod 777-R checkout_文件夹,并且显式地chmod 777了2个条目文件。它仍然不起作用。奇怪。

这可能是很多事情,但首先要指出的是
文件.renameTo()
javadoc说:

此方法行为的许多方面本质上依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果具有目标抽象路径名的文件已存在,则可能无法成功

首先,我将研究以下内容:

  • 您是否使用与您的平台兼容的SVNKit版本?我认为it名义上是独立于平台的,但您应该确认这一点

  • SVNKit代码如何尝试重命名该文件?我猜它使用了
    File.renameTo()
    ,但您需要确认这一点

  • SVNKit代码是否试图检测平台类型(例如,处理特定于平台的重命名行为)。。。而且弄错了

  • ikvmc代码使用的Java类库的源代码是什么?它是OpenJDK库吗?GNU类路径库?还有别的吗?i/o堆栈的本机部分是如何在您的平台上实现的?一种理论是,ikvmc-ified版本的
    File.renameTo()
    与Linux上标准Java版本的行为不同,这破坏了SVNKit


  • 这可能有很多方面,但首先要指出的是,
    File.renameTo()
    javadoc说:

    此方法行为的许多方面本质上依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果具有目标抽象路径名的文件已存在,则可能无法成功

    首先,我将研究以下内容:

  • 您是否使用与您的平台兼容的SVNKit版本?我认为it名义上是独立于平台的,但您应该确认这一点

  • SVNKit代码如何尝试重命名该文件?我猜它使用了
    File.renameTo()
    ,但您需要确认这一点

  • SVNKit代码是否试图检测平台类型(例如,处理特定于平台的重命名行为)。。。而且弄错了

  • ikvmc代码使用的Java类库的源代码是什么?它是OpenJDK库吗?GNU类路径库?还有别的吗?i/o堆栈的本机部分是如何在您的平台上实现的?一种理论是,ikvmc-ified版本的
    File.renameTo()
    与Linux上标准Java版本的行为不同,这破坏了SVNKit


  • SVNKit中的一个bug导致所有非windows设置抛出异常

    详情如下:


    是的,我最终去看了SVNKit的来源。该死的bug。

    是SVNKit中的一个bug导致所有非windows设置都抛出异常

    详情如下:


    是的,我最终去看了SVNKit的来源。该死的bug。

    最后,我们发现它不是SVNKit bug,而是转换器bug。无论出于何种原因,当目标已经存在时,转换后的代码无法重命名文件(与Linux上的JVM行为相反)

    在“src.renameTo(dst);”之前添加“dst.delete();”,解决了这个问题(到目前为止,我不打算将其标准化,因为它破坏了重命名原子性-我认为应该更改转换器来解决这个问题)

    亚历山大·基塔耶夫,

    最后,我们发现这不是一个SVNKit错误,而是一个转换器错误。无论出于何种原因,当目标已经存在时,转换后的代码无法重命名文件(与Linux上的JVM行为相反)

    在“src.renameTo(dst);”之前添加“dst.delete();”,解决了这个问题(到目前为止,我不打算将其标准化,因为它破坏了重命名原子性-我认为应该更改转换器来解决这个问题)

    亚历山大·基塔耶夫,

    您在这个端口上工作了一段时间。你打算发一个到回购协议的链接吗?哈哈,我确实是。我面临着疯狂的障碍。它现在在本地计算机上的工作副本上。一旦我解决了这些问题,回购协议就会启动。我好像离得很近,但离得很远。为什么不能在Linux上重命名呢?如果你能抽出时间在NuGet上构建你的“SVNKit.NET”,或者在github上共享你的构建环境,我将不胜感激。我正在从事一个需要SVN客户端的小型.NET项目,而实际上在.NET上没有与Mono兼容的SVN库。您已经在这个端口上工作了一段时间。你打算发一个到回购协议的链接吗?哈哈,我确实是。我面临着疯狂的障碍。它现在在本地计算机上的工作副本上。一旦我解决了这些问题,回购协议就会启动。我好像离得很近,但离得很远。为什么不能在Linux上重命名呢?如果你能抽出时间在NuGet上构建你的“SVNKit.NET”,或者在github上共享你的构建环境,我将不胜感激。我正在从事一个需要SVN客户端的小型.NET项目,而实际上在.NET上没有与Mono兼容的SVN库。您的权利:)我在bug tracker中发布了此解决方案,不是吗;)您的权利:)我在
    [nubela@nubela-netbook check_out_folder]$ ls -al
    total 12
    drwxr-xr-x 3 nubela nubela 4096 2010-02-17 13:07 ./
    drwxrwxr-x 3 nubela nubela 4096 2010-02-17 13:07 ../
    drwxr-xr-x 6 nubela nubela 4096 2010-02-17 13:07 .svn/