Codificação de nome de arquivo de conversão mercurial

12

Eu tenho repositórios Mercurial executando no Apache com mod_wsgi. Os repositórios têm todos os nomes de arquivos codificados no windows-1251. Essa codificação é usada por razões históricas: elas foram convertidas em mercurial a partir do svn, o windows-1251 é a codificação padrão do Windows para a localidade russa.

Agora os programadores desejam usar a ferramenta Crisol para revisão de código. Não pode conter nomes de arquivos em nenhuma outra codificação além de utf-8. Então, eu preciso convertê-los do windows-1251 para utf-8. Alguém sabe como fazer isso? A extensão de conversão do Mercurial não tem opções para converter codificações.

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
fonte
1
Nomes de arquivos russos ?! Não pense em renomear arquivos?
Lazy Badger
1
Sou administrador do sistema, não desenvolvedor, meu dever é fornecer um serviço de trabalho estável, não aprender a usá-lo.
Selivanov Pavel
Matt Mackall escreveu há muito tempo, talvez já esteja desatualizado # Se você gostaria de veicular páginas com UTF-8 em vez de seu # locale charset padrão, pode fazê-lo descomentando as seguintes linhas. # Observe que isso fará com que seus arquivos .hgrc sejam interpretados em # UTF-8 e todos os seus arquivos de repositório sejam exibidos usando UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger
Escrevi nos comentários para a resposta abaixo: Alterar encoding = windows-1251para encoding = UTF-8apenas tornar os nomes de arquivos ilegíveis. Isso ocorre porque eles são armazenados no windows-1251. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" é igual a esta configuração.
Selivanov Pavel

Respostas:

6

Você está certo de que a extensão convert não suporta isso de uma maneira agradável atualmente. Ou seja, você não pode pedir-lhe para recode de codificação X para codificar Y . No entanto, você pode pedir para renomear os arquivos um por um para você! Primeiro, crie um arquivo chamado rename.pycom

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)

Então corra

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

Isso cria seu mapa de arquivos. Agora você pode usar

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

para converter o repositório em um novo repositório. No novo repositório, parece que os arquivos sempre foram salvos usando nomes de arquivos UTF-8.

Nota: Os nomes dos arquivos agora estão armazenados como UTF-8 no repositório. Isso significa que as caixas ficarão bem nas máquinas Linux modernas. O Windows, no entanto, não usa nomes de arquivos UTF-8. A extensão FixUtf-8 deve ser usada para fazer o Mercurial converter os nomes de arquivo UTF-8 em UTF-16 em tempo real. Isso criará nomes de arquivos legíveis no Windows também.

Nota: Todo mundo terá que clonar novamente o novo repositório! Alterar qualquer parte da história inevitavelmente altera também todos os hashes dos conjuntos de alterações. Então, para fazer isso, você precisa

  1. fazer todo mundo enviar para o servidor,
  2. converter os repositórios no servidor,
  3. ter pessoas re-clonar

ou

  1. fazer com que todos executem os comandos acima em seus repositórios locais
  2. converter os repositórios no servidor

De qualquer maneira, a conversão é determinística e, portanto, os usuários podem executá-la se tiverem o Python disponível. Se eles tiverem apenas uma instalação do TortoiseHg, provavelmente será mais fácil se você os converter no seu servidor.

Procurei fazer com que a extensão de conversão suporte isso mais diretamente e enviei um patch para a lista de discussão do Mercurial para obter suporte mais direto a isso.

Martin Geisler
fonte
Publiquei um patch completo na lista de discussão.
Martin Geisler
O evangelista do Crisol deixou nossa empresa, então o problema desapareceu. Muito obrigado por escrever um código para resolver meu problema e melhorar o mercurial :) Vou tentar isso quando tiver algum tempo livre.
Selivanov Pavel
Ah, problema resolvido :-) Fique à vontade para aceitar minha resposta quando você a experimentar.
Martin Geisler
Não hg - manifesta tudo no mercurial 1.8. Eu tenho userd hg - manifest -r dica. Tudo funciona na máquina Linux: vejo nomes de arquivos adequados no repositório com codificação = UTF-8 em hgweb.config e os nomes de arquivos estão corretos no repositório clonado. Na máquina Windows, tenho o nome de arquivo "Пояснител СЊРЅР ° СЏ Р · РР РїРёСЃРєР. .Docx "após o clone.
Selivanov Pavel
Sim, isso é de se esperar - os nomes dos arquivos não são recodificados quando você clona no Windows e, portanto, seu checkout se torna lixo. Use a extensão FixUtf8 por enquanto.
Martin Geisler
2

Eu tive o mesmo problema. Eu precisava converter vários repositórios, então escrevi um script que converte todos os repositórios fornecidos como lista.

uso:

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

Você pode obter no meu repositório no BitBucket.

rominf
fonte
0

Apenas extração do Mercurial Wiki FYI

A seguir, são explicitamente tratados como dados binários em uma codificação desconhecida:

  • conteúdo do arquivo
  • nomes de arquivo

Esses itens devem ser tratados como dados binários e preservados sem perdas sempre que possível.

Assim, suponho, apenas alterar o conjunto de caracteres da apresentação encoding =pode fazer a espessura

Se essa suposição estiver errada (sempre é possível), tente a Extensão FixUtf8 , leia a parte Corrigindo cuidadosamente nomes de arquivos existentes no readme

Lazy Badger
fonte
Mudando encoding = windows-1251para encoding = UTF-8apenas os nomes de arquivos ilegíveis. O FixUtf8 também não ajudou.
Selivanov Pavel
ESTÁ BEM. Tente retornar encoding = windows-1251 e tente AddDefaultCharset utf-8no Apache. Outra idéia - mude o WAMP para LAMP com o UTF8 como local e não faça nada com os nomes de arquivos, mas tenha encoding = UTF-8novamente
Lazy Badger
Este é o LAMP. Antigamente, o repositório era colocado no WAMP com Subversion, depois eu o converti para o Mercurial e mudei para a máquina Linux, com localidade UTF-8. encoding = windows-1251foi definido porque os dados já estavam nessa codificação.
Selivanov Pavel 14/10
reler Wiki! 1251 é única camada de apresentação, e não de armazenamento
preguiçoso Badger
são explicitamente tratados como dados binários em uma codificação desconhecida E essa codificação é windows-1251, os nomes de arquivos são armazenados nela. Eu preciso de alguma maneira de convertê-los para UTF-8
Selivanov Pavel