Mercurial konwersja kodowania nazw plików

12

Mam repozytoria Mercurial działające na Apache z mod_wsgi. Repozytoria mają wszystkie nazwy plików zakodowane w systemie Windows-1251. To kodowanie jest używane z powodów historycznych: zostały przekonwertowane na mercurial z svn, Windows-1251 jest domyślnym kodowaniem okien dla rosyjskich ustawień regionalnych.

Teraz programiści chcą używać narzędzia Crucible do przeglądania kodu. Nie może przechodzić pod nazwy i nazwy plików w żadnym innym kodowaniu niż utf-8. Muszę więc przekonwertować je z systemu Windows-1251 na utf-8. Czy ktoś wie jak to zrobić? Rozszerzenie konwersji Mercurial nie ma opcji konwersji kodowań.

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
źródło
1
Rosyjskie nazwy plików ?! Nie myślisz o zmianie nazwy pliku?
Lazy Badger
1
Jestem administratorem systemu, a nie programistą, moim obowiązkiem jest zapewnienie stabilnej usługi działania, a nie nauka korzystania z niej.
Selivanov Pavel
Matt Mackall napisał dawno temu, być może już nieaktualny # Jeśli chcesz wyświetlać strony z UTF-8 zamiast domyślnego zestawu znaków # locale, możesz to zrobić, odznaczając poniższe wiersze. # Zauważ, że spowoduje to, że twoje pliki .hgrc zostaną zinterpretowane w # UTF-8, a wszystkie twoje pliki repozytoriów będą wyświetlane za pomocą UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger
Napisałem w komentarzach do poniższej odpowiedzi: Zmiana encoding = windows-1251na encoding = UTF-8właśnie uniemożliwiającą odczytanie nazw plików. Jest tak, ponieważ są one przechowywane w systemie Windows-1251. „UTF-8” os.environ [„HGENCODING”] = ​​„UTF-8” jest równy temu ustawieniu.
Selivanov Pavel

Odpowiedzi:

6

Masz rację, że rozszerzenie konwersji obecnie nie obsługuje tego w przyjemny sposób. Oznacza to, że nie możesz poprosić go do Recode z kodującego X do kodowania Y . Możesz jednak poprosić go o zmianę nazw plików jeden po drugim! Najpierw utwórz plik o nazwie za rename.pypomocą

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)

Następnie uruchomić

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

Spowoduje to utworzenie mapy plików. Możesz teraz użyć

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

przekonwertować repozytorium na nowe repozytorium. W nowym repozytorium będzie wyglądać, jakby pliki były zawsze zapisywane przy użyciu nazw plików UTF-8.

Uwaga: Nazwy plików są teraz przechowywane w repozytorium jako UTF-8. Oznacza to, że kasy będą dobrze wyglądać na nowoczesnych maszynach z systemem Linux. System Windows nie używa jednak nazw plików UTF-8. Należy użyć rozszerzenia FixUtf-8, aby Mercurial mógł konwertować nazwy plików UTF-8 na UTF-16 w locie. Spowoduje to również utworzenie czytelnych nazw plików w systemie Windows.

Uwaga: każdy będzie musiał ponownie sklonować nowe repozytorium! Zmiana dowolnej części historii nieuchronnie zmienia również wszystkie skróty zestawów zmian. Aby to zrobić, musisz albo

  1. nakłaniaj wszystkich do pchania się na serwer,
  2. przekonwertować repozytoria na serwerze,
  3. niech ludzie klonują

lub

  1. każ wszystkim uruchomić powyższe polecenia w swoich lokalnych repozytoriach
  2. przekonwertować repozytoria na serwerze

Tak czy inaczej działa, ponieważ konwersja jest deterministyczna, więc użytkownicy mogą ją uruchomić samodzielnie, jeśli mają dostęp do Pythona. Jeśli mają tylko instalację TortoiseHg, to prawdopodobnie najłatwiej jest przekonwertować je na serwerze.

Spojrzałem na bardziej bezpośrednie wsparcie rozszerzenia konwersji i wysłałem łatkę na listę mailingową Mercurial, aby uzyskać bardziej bezpośrednie wsparcie dla tego.

Martin Geisler
źródło
Zamieściłem pełny patch na liście mailingowej.
Martin Geisler,
Ewangelista Crucible opuścił nasze towarzystwo, więc problem zniknął. Bardzo dziękuję za napisanie kodu, aby naprawić mój problem i ulepszenie rtęci :) Spróbuję tego, gdy będę miał trochę wolnego czasu.
Selivanov Pavel,
Ach, problem rozwiązany :-) Zapraszam do zaakceptowania mojej odpowiedzi, gdy ją wypróbujesz.
Martin Geisler,
Bez hg - manifestuj wszystko w rtęci 1.8. Mam wskazówkę dotyczącą hg --manifest -r. Wszystko działa na komputerze z systemem Linux: widzę poprawne nazwy plików w repozytorium z kodowaniem = UTF-8 w pliku hgweb.config, a nazwy plików są poprawne w sklonowanym repozytorium. Na komputerze z systemem Windows mam po klonowaniu nazwę pliku „џџѕѕЏ» »» »ЊЊЊЊЊЊЊ. .Ocococococococococococococococ.
Selivanov Pavel,
Tak, należy się tego spodziewać - nazwy plików nie są ponownie kodowane po sklonowaniu w systemie Windows, a zatem kasa staje się śmieci. Na razie użyj rozszerzenia FixUtf8.
Martin Geisler,
2

Miałem ten sam problem. Musiałem przekonwertować kilka repozytoriów, więc napisałem skrypt, który konwertuje wszystkie repozytoria podane jako lista.

stosowanie:

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

Możesz pobrać z mojego repozytorium na BitBucket.

rominf
źródło
0

Tylko ekstrakcja z Mercurial Wiki FYI

Następujące elementy są jawnie traktowane jako dane binarne w nieznanym kodowaniu:

  • zawartość pliku
  • nazwy plików

Pozycje te należy traktować jako dane binarne i w miarę możliwości zachować bezstratnie.

Tak więc przypuszczam, że zmiana zestawu znaków prezentacji encoding =może przydać się

Jeśli to założenie jest błędne (zawsze jest to możliwe), spróbuj FixUtf8 Extension , przeczytaj część Naprawianie istniejących nazw plików z readme

Leniwy Borsuk
źródło
Zmiana encoding = windows-1251na encoding = UTF-8właśnie wprowadzone nazwy plików jest nieczytelna. FixUtf8 też nie pomógł.
Selivanov Pavel
OK. Spróbuj powrócić do kodowania = Windows-1251 i spróbuj AddDefaultCharset utf-8w Apache. Kolejny pomysł - zmień WAMP na LAMP z UTF8 jako locale i nie rób nic z nazwami plików, ale encoding = UTF-8znowu
Lazy Badger
To jest LAMPA. W dawnych czasach repozytorium było umieszczane na WAMP z Subversion, później przekonwertowałem je na Mercurial i przeniosłem na maszynę Linux z ustawieniami regionalnymi UTF-8. encoding = windows-1251został ustawiony, ponieważ dane były już w tym kodowaniu.
Selivanov Pavel
ponownie przeczytaj Wiki! 1251 to tylko warstwa prezentacji, a nie pamięć
Lazy Badger
są jawnie traktowane jako dane binarne w nieznanym kodowaniu I to kodowanie to windows-1251, w nim przechowywane są nazwy plików. Potrzebuję sposobu, aby przekonwertować je na UTF-8
Selivanov Pavel