SVNException не может переименовать файл при использовании SVNKit в библиотеке ikvmc-ed в C # - PullRequest
1 голос
/ 17 февраля 2010

Я использовал 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_ *: 1012 *

[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 записями. Это все еще не работает. Weird.

Ответы [ 3 ]

1 голос
/ 17 февраля 2010

В SVNKit была ошибка, из-за которой все установки, отличные от Windows, выдавали исключение.

Подробнее: http://svnkit.com/tracker/view.php?id=360

И да, в конце концов я пошел посмотреть на источник SVNKit. Блин баг.

0 голосов
/ 17 февраля 2010

Наконец, мы выяснили, что это не ошибка SVNKit, а конвертер. По какой-то причине преобразованный код не смог переименовать файл, когда место назначения уже существует (в отличие от поведения JVM в Linux).

Добавление "dst.delete ();" перед "src.renameTo (dst);" решил проблему (пока я не собираюсь делать ее стандартной, поскольку она нарушает атомарность переименования - я думаю, что преобразователь должен быть изменен, чтобы решить эту проблему).

Александр Китаев, http://svnkit.com/

0 голосов
/ 17 февраля 2010

Это может быть много вещей, но первое, на что нужно обратить внимание, это то, что File.renameTo() javadoc говорит так:

Многие аспекты поведения этого метода по своей природе зависят от платформы: операция переименования может быть не в состоянии переместить файл из одной файловой системы в другую, она может быть не атомарной, и она может не завершиться успешно, если файл с абстрактный путь назначения уже существует.

Я бы начал с изучения следующего:

  1. Используете ли вы версию SVNKit, совместимую с вашей платформой? Я думал, что это номинально не зависит от платформы, но вы должны это подтвердить.

  2. Как код SVNKit пытается переименовать файл? Я предполагаю, что он использует File.renameTo(), но вы должны подтвердить это.

  3. Код SVNKit пытается определить тип платформы (например, чтобы справиться с поведением переименования платформы) ... и ошибается?

  4. Каков источник библиотеки классов Java, используемой вашим кодом ikvmc-ified? Это библиотека OpenJDK? Библиотека GNU Classpath? Что-то другое? И как встроенная часть стека ввода / вывода реализована на вашей платформе? Одна теория заключается в том, что версия File.renameTo() с ikvmc ified нарушает SVNKit, ведя себя иначе, чем поведение стандартной версии Java в Linux.

...