Mercurial конвертировать кодировку имени файла

12

У меня есть репозитории Mercurial, работающие на Apache с mod_wsgi. Репозитории имеют все имена файлов, закодированные в windows-1251. Эта кодировка используется по историческим причинам: они были преобразованы в Mercurial из SVN, Windows-1251 является кодировкой Windows по умолчанию для русской локали.

Теперь программисты хотят использовать инструмент Crucible для проверки кода. Он не может понимать имена файлов в любой другой кодировке, кроме utf-8. Поэтому мне нужно конвертировать их из windows-1251 в utf-8. Кто-нибудь знает как это сделать? Расширение Mercurial для конвертации не имеет опций для конвертации кодировок.

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
Русские имена файлов ?! Не думаете о переименовании файлов?
Ленивый барсук
1
Я системный администратор, а не разработчик, моя обязанность - обеспечить стабильно работающий сервис, а не научиться им пользоваться.
Селиванов Павел
Мэтт Маккалл написал давно, возможно, уже устарел # Если вы хотите обслуживать страницы с UTF-8 вместо вашей # кодировки локали по умолчанию, вы можете сделать это, раскомментировав следующие строки. # Обратите внимание, что это приведет к тому, что ваши файлы .hgrc будут интерпретироваться в # UTF-8, а все ваши файлы репо будут отображаться с использованием UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Ленивый барсук
Я написал в комментариях к ответу ниже: изменение encoding = windows-1251на encoding = UTF-8только что сделанное имя файла нечитаемым. Это потому, что они хранятся в Windows-1251. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" равно этому параметру.
Селиванов Павел

Ответы:

6

Вы правы, что расширение для преобразования не поддерживает это в настоящее время. То есть, вы не можете попросить его перекодировать из кодирующей X кодирования Y . Тем не менее, вы можете попросить его переименовать файлы один за другим для вас! Сначала создайте файл rename.pyс именем

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)

Тогда беги

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

Это создает вашу файловую карту. Теперь вы можете использовать

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

преобразовать репозиторий в новый репозиторий. В новом хранилище будет выглядеть, как будто файлы всегда сохранялись с использованием имен файлов UTF-8.

Примечание. Имена файлов теперь хранятся в хранилище как UTF-8. Это означает, что проверки будут хорошо смотреться на современных машинах Linux. Windows, однако, не использует имена файлов UTF-8. Расширение FixUtf-8 должно использоваться, чтобы Mercurial конвертировал имена файлов UTF-8 в UTF-16 на лету. Это также создаст читаемые имена файлов в Windows.

Примечание: каждый должен будет повторно клонировать новый репозиторий! Изменение любой части истории неизбежно приводит также к изменению всех хэшей наборов изменений. Так что, чтобы осуществить это, вам нужно либо

  1. заставить всех подтолкнуть к серверу,
  2. конвертировать репозитории на сервере,
  3. заставить людей переклонировать

или

  1. заставить всех запускать вышеуказанные команды в своих локальных репозиториях
  2. конвертировать репозитории на сервере

Любой способ работает, так как преобразование является детерминированным, и поэтому ваши пользователи могут запускать его самостоятельно, если у них есть Python. Если у них установлена ​​только TortoiseHg, то, вероятно, проще всего конвертировать их на свой сервер.

Я рассмотрел вопрос о том, чтобы сделать поддержку расширений преобразования более прямой, и отправил исправление в список рассылки Mercurial для более прямой поддержки.

Мартин Гайслер
источник
Я разместил полный патч в списке рассылки.
Мартин Гайслер
Тигельный евангелист покинул нашу компанию, поэтому проблема исчезла. Большое спасибо за написание кода для решения моей проблемы и улучшения Mercurial :) Я попробую это, когда у меня будет немного свободного времени.
Селиванов Павел
Ах, проблема решена :-) Не стесняйтесь принять мой ответ, когда вы его опробовали.
Мартин Гейслер
Нет hg --manifest все в Mercurial 1.8. Я использовал hg --manifest -r tip. Все работает на машине Linux: я вижу правильные имена файлов в репозитории с кодировкой = UTF-8 в hgweb.config и имена файлов верны в клонированном репозитории. На компьютере с Windows у меня есть имя файла «клон» после «клонирования» («џРѕСЏСЃРЅРёС‚ел. ».»).
Селиванов Павел
Да, этого следовало ожидать - имена файлов не перекодируются, когда вы клонируете в Windows, и поэтому ваша проверка становится мусором. Используйте расширение FixUtf8 на данный момент.
Мартин Гейслер
2

У меня такая же проблема. Мне нужно было конвертировать кучу репозиториев, поэтому я написал скрипт, который конвертирует все репозитории, представленные в виде списка.

использование:

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

Вы можете получить из моего хранилища на BitBucket.

rominf
источник
0

Просто извлечение из Mercurial Wiki FYI

Следующее явно обрабатывается как двоичные данные в неизвестной кодировке:

  • содержимое файла
  • имена файлов

Эти элементы должны рассматриваться как двоичные данные и сохраняться без потерь везде, где это возможно.

Таким образом, я полагаю, просто изменение представления кодового в encoding =может сделать толстое

Если это предположение неверно (это всегда возможно), попробуйте FixUtf8 Extension , прочитайте часть. Исправление существующих имен файлов из readme.

Ленивый Барсук
источник
Изменение encoding = windows-1251к encoding = UTF-8только из имен файлов нечитаемым. FixUtf8 тоже не помог.
Селиванов Павел
ОК. Попробуйте вернуть обратно кодировку = windows-1251 и попробуйте AddDefaultCharset utf-8в Apache. Другая идея - изменить WAMP на LAMP с UTF8 в качестве локали и ничего не делать с именами файлов, но encoding = UTF-8повторить
Lazy Badger
Это является ЛАМПЫ. В прежние времена хранилище было помещено на WAMP с Subversion, позже я преобразовал его в Mercurial и переехал на Linux-машину с языком UTF-8. encoding = windows-1251был установлен, потому что данные уже были в этой кодировке.
Селиванов Павел
перечитайте вики! 1251 - это только слой представления, а не хранилище
Lazy Badger
явно обрабатываются как двоичные данные в неизвестной кодировке. И эта кодировка - windows-1251, в ней хранятся имена файлов. Мне нужен какой-то способ конвертировать их в UTF-8
Селиванов Павел