Назад | Перейти на главную страницу

Mercurial convert кодировка имени файла

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

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

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

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

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

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

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

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

Вы можете получить от мой репозиторий в BitBucket.

Просто извлечение из Mercurial Вики К вашему сведению

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

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

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

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

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