1

我使用 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

以下是 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 条目文件。它仍然不起作用。奇怪的。

4

3 回答 3

1

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

详情:http ://svnkit.com/tracker/view.php?id=360

是的,我最终去看了 SVNKit 的源代码。该死的虫子。

于 2010-02-17T08:54:53.813 回答
0

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

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

我将首先研究以下内容:

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

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

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

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

于 2010-02-17T07:12:46.383 回答
0

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

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

亚历山大·基塔耶夫, http: //svnkit.com/

于 2010-02-17T13:40:49.427 回答