Mercurial convierte codificación de nombre de archivo

12

Tengo repositorios Mercurial ejecutándose en Apache con mod_wsgi. Los repositorios tienen todos los nombres de archivo codificados en windows-1251. Esta codificación se utiliza por razones históricas: se convirtieron a mercurial desde svn, windows-1251 es la codificación predeterminada de Windows para la configuración regional rusa.

Ahora los programadores quieren usar la herramienta Crucible para revisar el código. No puede comprender los nombres de archivo en ninguna otra codificación que no sea utf-8. Entonces necesito convertirlos de windows-1251 a utf-8. ¿Alguien sabe como hacer esto? La extensión de conversión de Mercurial no tiene opciones para convertir codificaciones.

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
fuente
1
¿Nombres de archivo rusos? ¿No piensas en cambiar el nombre del archivo?
Lazy Badger
1
Soy administrador del sistema, no desarrollador, mi deber es proporcionar un servicio de trabajo estable, no aprender a usarlo.
Selivanov Pavel
Matt Mackall escribió hace mucho tiempo, tal vez ya está desactualizado # Si desea publicar páginas con UTF-8 en lugar de su # juego de caracteres de configuración regional predeterminado, puede hacerlo descomentando las siguientes líneas. # Tenga en cuenta que esto hará que sus archivos .hgrc se interpreten en # UTF-8 y que todos sus archivos de repositorio se muestren usando UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger
He escrito en los comentarios para responder a continuación: Cambiar encoding = windows-1251a encoding = UTF-8nombres de archivo que no se pueden leer. Esto se debe a que están almacenados en windows-1251. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" es igual a esta configuración.
Selivanov Pavel

Respuestas:

6

Tienes razón en que la extensión de conversión no admite esto de una manera agradable actualmente. Es decir, no se puede pedir a recodificar de codificación de X a la codificación Y . Sin embargo, puede pedirle que cambie el nombre de los archivos uno por uno. Primero cree un archivo llamado rename.pycon

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)

Entonces corre

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

Esto crea su mapa de archivos. Ahora puedes usar

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

para convertir el repositorio en un nuevo repositorio. En el nuevo repositorio, parecerá que los archivos siempre se han guardado utilizando nombres de archivo UTF-8.

Nota: Los nombres de los archivos ahora se almacenan como UTF-8 en el repositorio. Esto significa que los pagos se verán bien en las máquinas Linux modernas. Windows, sin embargo, no utiliza nombres de archivo UTF-8. La extensión FixUtf-8 debe usarse para hacer que Mercurial convierta los nombres de archivo UTF-8 en UTF-16 sobre la marcha. Esto también creará nombres de archivo legibles en Windows.

Nota: ¡ Todos tendrán que volver a clonar el nuevo repositorio! Cambiar cualquier parte de la historia cambia inevitablemente todos los hashes de conjuntos de cambios también. Entonces, para lograr esto, necesitas

  1. hacer que todos empujen al servidor,
  2. convertir los repositorios en el servidor,
  3. hacer que la gente vuelva a clonar

o

  1. hacer que todos ejecuten los comandos anteriores en sus repositorios locales
  2. convertir los repositorios en el servidor

De cualquier forma funciona, ya que la conversión es determinista y sus usuarios pueden ejecutarla ellos mismos si tienen Python disponible. Si solo tienen una instalación de TortoiseHg, entonces probablemente sea más fácil si los convierte en su servidor.

Busqué hacer que la extensión de conversión admita esto más directamente y envié un parche a la lista de correo de Mercurial para obtener un soporte más directo para esto.

Martin Geisler
fuente
He publicado un parche completo en la lista de correo.
Martin Geisler
El evangelista crisol dejó nuestra compañía, por lo que el problema desapareció. Muchas gracias por escribir código para solucionar mi problema y mejorar Mercurial :) Lo intentaré cuando tenga algo de tiempo libre.
Selivanov Pavel
Ah, problema resuelto :-) No dude en aceptar mi respuesta cuando lo haya probado.
Martin Geisler
No hg - manifiesto todo en mercurial 1.8. He utilizado hg --manifest -r tip. Todo funciona en la máquina Linux: veo nombres de archivo adecuados en el repositorio con codificación = UTF-8 en hgweb.config y los nombres de archivo son correctos en el repositorio clonado. En la máquina de Windows tengo "Пояснител СЊРЅР ° СЏ Р · Р ° РїРёСЃРєР ° .docx "nombre de archivo después del clon.
Selivanov Pavel
Sí, esto es de esperarse: los nombres de los archivos no se recodifican cuando clona en Windows, por lo que su pago se convierte en basura. Use la extensión FixUtf8 por ahora.
Martin Geisler
2

Yo tuve el mismo problema. Necesitaba convertir un montón de repositorios, así que escribí un script que convierte todos los repositorios dados como lista.

uso:

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

Puedes obtenerlo desde mi repositorio en BitBucket.

rominf
fuente
0

Solo extracción de Mercurial Wiki FYI

Los siguientes se tratan explícitamente como datos binarios en una codificación desconocida:

  • contenido del archivo
  • nombres de archivo

Estos elementos deben tratarse como datos binarios y conservarse sin pérdidas siempre que sea posible.

Por lo tanto, supongo, sólo cambiando charset presentación en encoding =puede hacer la gruesa

Si esta suposición es incorrecta (siempre es posible), intente FixUtf8 Extension , lea la parte Reparar cuidadosamente los nombres de archivo existentes del archivo Léame

Tejón perezoso
fuente
Cambiar encoding = windows-1251a encoding = UTF-8nombres de archivo recién ilegibles. FixUtf8 tampoco ayudó.
Selivanov Pavel
OKAY. Intente devolver la codificación = windows-1251 e intente AddDefaultCharset utf-8en Apache. Otra idea: cambiar WAMP a LAMP con UTF8 como configuración regional y no hacer nada con los nombres de archivo, pero lo tengo encoding = UTF-8nuevamente
Lazy Badger
Esto es LAMP. En los viejos tiempos, el repositorio se colocaba en WAMP con Subversion, luego lo convertí a Mercurial y me mudé a la máquina Linux, con la configuración regional UTF-8. encoding = windows-1251se configuró porque los datos ya estaban en esta codificación.
Selivanov Pavel
¡vuelve a leer Wiki! 1251 es solo una capa de presentación, no almacenamiento
Lazy Badger
se tratan explícitamente como datos binarios en una codificación desconocida. Y esta codificación es windows-1251, los nombres de archivo se almacenan en ella. Necesito alguna forma de convertirlos a UTF-8
Selivanov Pavel