SVNException incapable de renommer le fichier lors de l'utilisation SVNKit dans une bibliothèque ikvmc-ed en C #

StackOverflow https://stackoverflow.com/questions/2278485

  •  21-09-2019
  •  | 
  •  

Question

Je ikvmc utilisé pour compiler svnkit à une bibliothèque C # (dll) et il est lié comme référence à mon projet.

J'ai essayé une preuve de concept de code à la caisse:

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

Tout compile bien, et fonctionne même très bien. Cependant, j'ai cette erreur:

$ 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'

Il crée le checkout_folder, et voici les fichiers en conflit:

$ 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 sont le contenu du 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/

Toute idée pourquoi ce qui se passe et comment je peux surmonter cela?

Edit: Il fonctionne sous Windows (avec mono, pas sous .NET). Prolly parce que les fenêtres ne sont pas les permissions de fichiers gênants pour les fichiers.

Edit2: Je chmod 777 R checkout_folder déjà, et explicitement chmod 777 le fichier 2 entrées. Il ne fonctionne toujours pas. Bizarre.

Était-ce utile?

La solution

Enfin, nous avons compris que ce n'est pas un bug SVNKit, mais plutôt convertisseur à un. Pour une raison quelconque, converti le code n'a pas été en mesure de renommer le fichier quand existe déjà la destination (contrairement au comportement machine virtuelle Java sous Linux).

Ajout "dst.delete ();" avant "src.renameTo (dst);" résolu le problème (jusqu'à présent, je ne vais pas en faire la norme car il casse renommer atomicité - Je pense que le convertisseur devrait être modifié pour résoudre ce problème).

Alexander Kitaev, http://svnkit.com/

Autres conseils

Il était un bogue dans SVNKit qui a fait toutes les configurations non-Windows pour lancer une exception.

Pour plus de détails: http://svnkit.com/tracker/view.php? id = 360

Et oui, je suis finalement allé regarder la source de SVNKit. bug Merde.

Cela pourrait être beaucoup de choses, mais la première chose à souligner est que la javadoc File.renameTo() dit ceci:

  

De nombreux aspects du comportement de cette méthode sont intrinsèquement dépendante de la plate-forme: L'opération de changement de nom pourrait ne pas être en mesure de déplacer un fichier d'un système de fichiers à un autre, il pourrait ne pas être atomique, et il pourrait ne pas réussir si un fichier avec le chemin abstrait de destination existe déjà.

Je commence par regarder dans ce qui suit:

  1. Utilisez-vous une version de SVNKit qui est compatible avec votre plate-forme? Je pensais que c'était la nominalement plate-forme indépendante, mais vous devez confirmer.

  2. Comment est le code SVNKit tente de renommer le fichier? Je suppose qu'il utilise File.renameTo() mais vous devez confirmer.

  3. Le code SVNKit essayant de détecter le type de plate-forme (par exemple pour faire face à un comportement de changement de nom spécifique de la plate-forme) ... et se tromper?

  4. Quelle est la source de la bibliothèque de classes Java qui est utilisé par votre code ikvmc-ified? Est-ce une bibliothèque OpenJDK? Une bibliothèque GNU Classpath? Autre chose? Et comment est la partie native de la pile i / o mis en œuvre sur votre plate-forme? Une théorie est que la version ikvmc-ified de File.renameTo() se brise SVNKit en se comportant différemment au comportement de la version standard de Java sur Linux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top