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ではなくモノで)。Windows には、ファイルに対する煩わしいファイル アクセス許可がないためです。

Edit2: chmod 777 -R checkout_folder が既にあり、2 つのエントリ ファイルを明示的に chmod 777 します。それでもうまくいきません。変。

4

3 に答える 3

1

Windows 以外のすべてのセットアップで例外がスローされるのは、SVNKit のバグでした。

詳細: http://svnkit.com/tracker/view.php?id=360

はい、最終的にSVNKitのソースを見に行きました。くそーバグ。

于 2010-02-17T08:54:53.813 に答える
0

最後に、これはSVNKitのバグではなく、コンバーターのバグであることがわかりました。何らかの理由で、宛先がすでに存在する場合、変換されたコードはファイルの名前を変更できませんでした(LinuxでのJVMの動作とは異なります)。

「dst.delete();」を追加します 「src.renameTo(dst);」の前 問題を解決しました(これまでのところ、名前の変更のアトミック性が損なわれるため、標準にするつもりはありません。この問題を修正するには、コンバーターを変更する必要があると思います)。

アレクサンダーキタエフ、 http: //svnkit.com/

于 2010-02-17T13:40:49.427 に答える
0

これには多くのことが考えられますが、最初に指摘することは、File.renameTo()javadoc が次のように述べていることです。

このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、あるファイル システムから別のファイル システムにファイルを移動できない可能性があり、アトミックではない可能性があります。もう存在している。

私は次のことを調べることから始めます。

  1. プラットフォームと互換性のあるバージョンの SVNKit を使用していますか? 名目上はプラットフォームに依存しないと思っていましたが、それを確認する必要があります。

  2. SVNKit コードはどのようにファイルの名前を変更しようとしていますか? 私の推測では、それを使用してFile.renameTo()いますが、それを確認する必要があります。

  3. SVNKit コードはプラットフォームの種類を検出しようとしています (たとえば、プラットフォーム固有の名前変更動作に対処するため) ... 間違っていますか?

  4. ikvmc 化されたコードで使用されている Java クラス ライブラリのソースは何ですか? それは OpenJDK ライブラリですか? GNU クラスパス ライブラリ? 他の何か?また、I/O スタックのネイティブ部分はプラットフォームにどのように実装されていますか? 1 つの理論は、 の ikvmc 化されたバージョンがFile.renameTo()、Linux 上の標準 Java バージョンの動作とは異なる動作をすることによって SVNKit を壊しているというものです。

于 2010-02-17T07:12:46.383 に答える