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

时间:2010-02-17 05:14:40

标签: 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 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());
            }
        }

一切都很好,甚至运行良好。但是,我有这个错误:

$ mono subsync.exe -co http://code.djangoproject.com/svn/django/trunk/
svn: Cannot rename file '/home/nubela/Workspace/subsync/subsync/bin/Debug/check_out_folder/.svn/tmp/entries' to '/home/nubela/Workspace/subsync/subsync/bin/Debug/check_out_folder/.svn/entries'

它创建了checkout_folder,这里是冲突的文件:

$ 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

Heres是checkout_folder的内容:

[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下运行(使用单声道,而不是在.NET下)。 Prolly,因为Windows没有令人讨厌的文件文件权限。

Edit2:我已经有chmod 777 -R checkout_folder,并明确chmod 777 2个条目文件。它仍然无法正常工作。怪异。

3 个答案:

答案 0 :(得分:1)

这是SVNKit中的一个错误,它使所有非Windows设置都抛出异常。

详细信息:http://svnkit.com/tracker/view.php?id=360

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

答案 1 :(得分:0)

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

  

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

我首先考察以下内容:

  1. 您使用的是与您的平台兼容的SVNKit版本吗?我认为它名义上是独立于平台的,但你应该确认一下。

  2. SVNKit代码如何尝试重命名文件?我的猜测是它使用File.renameTo(),但您需要确认。

  3. SVNKit代码是否尝试检测平台类型(例如,为了应对平台特定的重命名行为)......并且出错了?

  4. ikvmc-ified代码使用的Java类库的来源是什么?它是一个OpenJDK库吗? GNU Classpath库?别的什么?在您的平台上如何实现I / O堆栈的原生部分?一种理论认为,File.renameTo()的ikvmc-ified版本通过与Linux上标准Java版本的行为不同来破坏SVNKit。

答案 2 :(得分:0)

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

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

Alexander Kitaev, http://svnkit.com/