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

У меня есть репозитории 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

3 ответа

Вы правы, что расширение для преобразования не поддерживает это в настоящее время. То есть вы не можете попросить его перекодировать из кодировки 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 для более прямой поддержки.

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам