Codifica mercuriale del nome file convertito


12

Ho repository Mercurial in esecuzione su Apache con mod_wsgi. I repository hanno tutti i nomi di file codificati in windows-1251. Questa codifica viene utilizzata per motivi storici: sono stati convertiti in mercurial da svn, windows-1251 è la codifica Windows predefinita per le impostazioni locali russe.

Ora i programmatori vogliono usare lo strumento Crucible per la revisione del codice. Non può sottovalutare i nomi dei file in nessuna codifica diversa da utf-8. Quindi devo convertirli da windows-1251 a utf-8. Qualcuno sa come fare questo? L'estensione di conversione Mercurial non ha opzioni per convertire le codifiche.

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

1
Nomi di file russi ?! Non pensi al file-rename?
Lazy Badger,

1
Sono amministratore di sistema, non sviluppatore, il mio dovere è fornire un servizio di lavoro stabile, non imparare come usarlo.
Selivanov Pavel,

Matt Mackall ha scritto molto tempo fa, forse già obsoleto # Se desideri pubblicare pagine con UTF-8 anziché il tuo set di caratteri # locale predefinito, puoi farlo decommentando le seguenti righe. # Notare che ciò comporterà l'interpretazione dei file .hgrc in # UTF-8 e la visualizzazione di tutti i file repo mediante UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger

Ho scritto nei commenti la seguente risposta: Passare encoding = windows-1251a encoding = UTF-8nomi di file appena resi illeggibili. Questo perché sono memorizzati in windows-1251. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" è uguale a questa impostazione.
Selivanov Pavel,

Risposte:


6

Hai ragione sul fatto che l'estensione di conversione non supporta questo in un bel modo attualmente. Cioè, non si può chiedere è di ricodificare da codifica X alla codifica Y . Tuttavia, puoi chiedergli di rinominare i file uno per uno per te! Per prima cosa crea un file chiamato 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)

Quindi corri

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

Questo crea la tua mappa dei file. Ora puoi usare

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

per convertire il repository in un nuovo repository. Nel nuovo repository, sembrerà che i file siano sempre stati salvati usando i nomi dei file UTF-8.

Nota: i nomi dei file sono ora memorizzati come UTF-8 nel repository. Ciò significa che i checkout avranno un bell'aspetto sui moderni computer Linux. Windows, tuttavia, non utilizza i nomi di file UTF-8. L' estensione FixUtf-8 deve essere utilizzata per consentire a Mercurial di convertire al volo i nomi dei file UTF-8 in UTF-16. Questo creerà nomi di file leggibili anche su Windows.

Nota: tutti dovranno ripetere la clonazione del nuovo repository! Cambiare qualsiasi parte della storia inevitabilmente cambia anche tutti gli hash del changeset. Quindi, per farlo, devi farlo

  1. fai spingere tutti sul server,
  2. convertire i repository sul server,
  3. chiedi alle persone di ri-clonare

o

  1. fare in modo che tutti eseguano i comandi sopra nei loro repository locali
  2. convertire i repository sul server

Ad ogni modo funziona poiché la conversione è deterministica e quindi i tuoi utenti possono eseguirla da soli se hanno Python disponibile. Se hanno solo un'installazione di TortoiseHg, probabilmente è più semplice se li converti sul tuo server.

Ho cercato di far che l'estensione di conversione lo supportasse più direttamente e ho inviato una patch alla mailing list di Mercurial per un supporto più diretto.


Ho pubblicato una patch completa sulla mailing list.
Martin Geisler,

L'evangelista del crogiolo ha lasciato la nostra compagnia, quindi il problema è scomparso. Grazie mille per aver scritto il codice per risolvere il mio problema e il miglioramento di mercurial :) Ci proverò quando avrò del tempo libero.
Selivanov Pavel,

Ah, problema risolto :-) Sentiti libero di accettare la mia risposta quando l'hai provata.
Martin Geisler,

No hg - manifesta tutto in mercurial 1.8. Ho userd hg --manifest -r tip. Tutto funziona su una macchina Linux: vedo i nomi dei file corretti nel repository con encoding = UTF-8 in hgweb.config e i nomi dei file sono corretti nel repository clonato. Sul computer Windows ho il nome "Пояснител СЊРЅР ° СЏ Р · Р ° РїРёСЃРєР ° .docx "dopo il clone.
Selivanov Pavel,

Sì, questo è prevedibile: i nomi dei file non vengono ricodificati quando si clona su Windows e quindi il checkout diventa spazzatura. Utilizzare l'estensione FixUtf8 per ora.
Martin Geisler,

2

Ho avuto lo stesso problema. Avevo bisogno di convertire un sacco di repository, quindi ho scritto uno script che converte tutti i repository forniti come elenco.

utilizzo:

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

Puoi ottenere dal mio repository su BitBucket.


0

Solo estrazione da Mercurial Wiki FYI

Di seguito vengono esplicitamente trattati come dati binari in una codifica sconosciuta:

  • contenuto del file
  • nomi dei file

Questi elementi devono essere trattati come dati binari e conservati senza perdita di dati laddove possibile.

Quindi, suppongo, solo cambiare il set di caratteri di presentazione encoding =può fare la differenza

Se questo presupposto è errato (è sempre possibile), prova l'estensione FixUtf8 , leggi la parte Correggere attentamente i nomi di file esistenti da readme


Il passaggio encoding = windows-1251a encoding = UTF-8nomi di file appena resi illeggibili. Anche FixUtf8 non ha aiutato.
Selivanov Pavel,

OK. Prova a tornare indietro encoding = windows-1251 e prova AddDefaultCharset utf-8in Apache. Un'altra idea - cambia WAMP in LAMP con UTF8 come locale e non fare nulla con i nomi dei file ma fallo di encoding = UTF-8nuovo
Lazy Badger,

Questa è LAMPADA. In passato il repository veniva collocato su WAMP con Subversion, successivamente l'ho convertito in Mercurial e spostato su macchina Linux, con impostazioni internazionali UTF-8. encoding = windows-1251è stato impostato perché i dati erano già in questa codifica.
Selivanov Pavel,

rileggere Wiki! 1251 è solo un livello di presentazione, non di archiviazione
Lazy Badger,

sono esplicitamente trattati come dati binari in una codifica sconosciuta E questa codifica è windows-1251, i nomi dei file sono memorizzati in essa. Ho bisogno di un modo per convertirli in UTF-8
Selivanov Pavel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.