Encodage de nom de fichier converti Mercurial

12

J'ai des référentiels Mercurial fonctionnant sur Apache avec mod_wsgi. Les référentiels ont tous les noms de fichiers encodés dans windows-1251. Cet encodage est utilisé pour des raisons historiques: ils ont été convertis en mercurial à partir de svn, windows-1251 est l'encodage Windows par défaut pour les paramètres régionaux russes.

Maintenant, les programmeurs veulent utiliser l' outil Crucible pour la révision du code. Il ne peut pas comprendre les noms de fichiers dans un autre encodage que utf-8. J'ai donc besoin de les convertir de windows-1251 en utf-8. Est-ce que quelqu'un sait comment faire ça? L'extension de conversion Mercurial n'a pas d'options pour convertir les encodages.

hgweb.config:

[web]
#encoding = UTF-8
encoding = windows-1251
#allow_archive = gz, zip, bz2
allow_archive = zip
allow_push = *
push_ssl = false

[extensions]

[collections]
/data/mercurial = /data/mercurial
Selivanov Pavel
la source
1
Noms de fichiers russes?! Vous ne pensez pas à renommer un fichier?
Lazy Badger
1
Je suis administrateur système, pas développeur, mon devoir est de fournir un service de travail stable, pas d'apprendre à l'utiliser.
Selivanov Pavel
Matt Mackall a écrit il y a longtemps, peut-être déjà obsolète # Si vous souhaitez servir des pages avec UTF-8 au lieu de votre jeu de caractères # locale par défaut, vous pouvez le faire en décommentant les lignes suivantes. # Notez que cela entraînera l'interprétation de vos fichiers .hgrc en # UTF-8 et l'affichage de tous vos fichiers repo en utilisant UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger
J'ai écrit dans les commentaires à la réponse ci-dessous: Changer encoding = windows-1251pour encoding = UTF-8juste rendre les noms de fichiers illisibles. C'est parce qu'ils sont stockés dans windows-1251. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" est égal à ce paramètre.
Selivanov Pavel

Réponses:

6

Vous avez raison de dire que l'extension convertie ne prend pas cela en charge actuellement. Autrement dit, vous ne pouvez pas demander à recodage de coder X à l' encodage Y . Cependant, vous pouvez lui demander de renommer les fichiers un par un pour vous! Créez d'abord un fichier appelé rename.pyavec

import sys
for path in sys.stdin:
    old = path[:-1] # strip newline
    new = old.decode("cp1251").encode("utf-8")
    print 'rename "%s" "%s"' % (old, new)

Exécutez ensuite

$ hg manifest --all | python rename.py > rename.txt

Cela crée votre carte de fichiers. Vous pouvez maintenant utiliser

$ hg convert --filemap rename.txt cp1251-repo utf-8-repo

pour convertir le référentiel en un nouveau référentiel. Dans le nouveau référentiel, il semblera que les fichiers ont toujours été enregistrés en utilisant des noms de fichiers UTF-8.

Remarque: Les noms de fichiers sont désormais stockés au format UTF-8 dans le référentiel. Cela signifie que les extractions seront correctes sur les machines Linux modernes. Windows, cependant, n'utilise pas les noms de fichiers UTF-8. L' extension FixUtf-8 doit être utilisée pour que Mercurial convertisse les noms de fichiers UTF-8 en UTF-16 à la volée. Cela créera également des noms de fichiers lisibles sous Windows.

Remarque: Tout le monde devra recloner le nouveau référentiel! La modification d'une partie de l'historique modifie inévitablement tous les hachages des ensembles de modifications. Donc, pour réussir, vous devez soit

  1. faire pousser tout le monde vers le serveur,
  2. convertir les référentiels sur le serveur,
  3. demander aux gens de recloner

ou

  1. faire exécuter tout le monde les commandes ci-dessus sur leurs référentiels locaux
  2. convertir les référentiels sur le serveur

Dans les deux cas, la conversion est déterministe et vos utilisateurs peuvent l'exécuter eux-mêmes s'ils disposent de Python. S'ils n'ont qu'une installation TortoiseHg, alors c'est probablement plus facile si vous les convertissez sur votre serveur.

J'ai cherché à rendre l'extension de conversion prise en charge plus directement et j'ai envoyé un correctif à la liste de diffusion Mercurial pour une assistance plus directe.

Martin Geisler
la source
J'ai publié un patch complet sur la liste de diffusion.
Martin Geisler
Un évangéliste de creuset a quitté notre entreprise, donc le problème a disparu. Merci beaucoup d'avoir écrit du code pour résoudre mon problème et pour l'amélioration de mercurial :) J'essaierai ceci quand j'aurai du temps libre.
Selivanov Pavel
Ah, problème résolu :-) N'hésitez pas à accepter ma réponse après l'avoir essayée.
Martin Geisler
Aucun hg - manifeste tout en mercurial 1.8. J'ai userd hg --manifest -r tip. Tout fonctionne sur une machine Linux: je vois les noms de fichiers appropriés dans le référentiel avec encoding = UTF-8 dans hgweb.config et les noms de fichiers sont corrects dans le référentiel cloné. Sur la machine Windows, j'ai le nom de fichier "Пояснител СЊРЅР ° СЏ Р · Р ° РїРёСЃРєР ° .docx "après le clone.
Selivanov Pavel
Oui, cela est normal - les noms de fichiers ne sont pas recodés lorsque vous clonez sur Windows et votre paiement devient donc une ordure. Utilisez l'extension FixUtf8 pour l'instant.
Martin Geisler
2

J'ai eu le même problème. J'avais besoin de convertir un tas de référentiels, j'ai donc écrit un script qui convertit tous les référentiels donnés en liste.

usage:

hg_convert_filenames_encoding.py [-h] [-i INPUT_ENCODING] [-o OUTPUT_ENCODING] [-b] [-u] [repositories [repositories ...]]

Vous pouvez obtenir de mon référentiel sur BitBucket.

rominf
la source
0

Juste extraction de Mercurial Wiki FYI

Les éléments suivants sont explicitement traités comme des données binaires dans un codage inconnu:

  • contenu du fichier
  • noms de fichiers

Ces éléments doivent être traités comme des données binaires et préservés sans perte dans la mesure du possible.

Ainsi, je suppose que changer simplement le jeu de caractères de présentation encoding =peut faire l'épaisseur

Si cette hypothèse est erronée (c'est toujours possible), essayez l' extension FixUtf8 , lisez attentivement la partie Fixation des noms de fichiers existants à partir du fichier Lisez-moi

Blaireau paresseux
la source
Changer encoding = windows-1251pour encoding = UTF-8rendre les noms de fichiers juste illisibles. FixUtf8 n'a pas aidé non plus.
Selivanov Pavel,
D'ACCORD. Essayez de revenir en arrière encoding = windows-1251 et essayez AddDefaultCharset utf-8dans Apache. Une autre idée - changer WAMP en LAMP avec UTF8 comme locale et ne rien faire avec les noms de fichiers mais avoir à encoding = UTF-8nouveau
Lazy Badger
C'est LAMP. Dans le passé, le référentiel était placé sur WAMP avec Subversion, plus tard, je l'ai converti en Mercurial et déplacé vers une machine Linux, avec les paramètres régionaux UTF-8. encoding = windows-1251a été défini car les données étaient déjà dans cet encodage.
Selivanov Pavel,
relire le wiki! 1251 n'est qu'une couche de présentation, pas de stockage
Lazy Badger
sont explicitement traités comme des données binaires dans un encodage inconnu Et cet encodage est windows-1251, les noms de fichiers y sont stockés. J'ai besoin d'un moyen de les convertir en UTF-8
Selivanov Pavel