Codificação de nome de arquivo do Mercurial convert

10

Eu tenho repositórios do Mercurial rodando no Apache com mod_wsgi. Repositórios possuem todos os nomes de arquivos codificados no windows-1251. Esta codificação é usada por razões históricas: eles foram convertidos para o mercurial a partir do svn, o windows-1251 é a codificação padrão do windows para o idioma russo.

Agora, os programadores querem usar a ferramenta Crucible para revisão de código. Não pode undersand nomes de arquivos em qualquer outra codificação que 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
    
por Selivanov Pavel 06.10.2011 / 15:58

3 respostas

6

Você está certo de que a extensão de conversão não suporta isso de uma maneira boa atualmente. Ou seja, você não pode pedir para recodificar a partir da 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.py com

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)

Em seguida, execute

$ 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, parecerá que os arquivos sempre foram salvos usando nomes de arquivos UTF-8.

Nota: Os nomes dos arquivos agora são armazenados como UTF-8 no repositório. Isso significa que os checkouts 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 com que o Mercurial converta os nomes dos arquivos UTF-8 em UTF-16 em tempo real. Isso também criará nomes de arquivos legíveis no Windows.

Nota: Todos terão de voltar a clonar o novo repositório! Alterar qualquer parte do histórico inevitavelmente altera todos os hashes de changesets também. Então, para isso, você precisa

  1. faça todo mundo empurrar para o servidor,
  2. converta os repositórios no servidor,
  3. as pessoas re-clonam

ou

  1. faça todo mundo executar os comandos acima em seus repositórios locais
  2. converta os repositórios no servidor

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

Eu olhei para tornar o suporte à extensão convertida mais diretamente e enviei um patch para o Mercurial lista de discussão para mais suporte direto para isso.

    
por 19.12.2011 / 18:51
2

Eu tive o mesmo problema. Eu precisava converter um monte de repositórios, então eu escrevi um script que converte todos os repositórios dados como lista.

uso:

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

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

    
por 06.08.2013 / 18:21
0

Basta extrair de Wiki Mercurial FYI

The following are explicitly treated as binary data in an unknown encoding:

  • file contents
  • file names

These items should be treated as binary data and preserved losslessly wherever possible.

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

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

    
por 07.10.2011 / 01:59