Меркурійне перетворення кодування імен файлів


12

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

Тепер програмісти хочуть використовувати інструмент Crucible для перегляду коду. Він не може підкреслити імена файлів у будь-якому іншому кодуванні, ніж 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

1
Російські імена ?! Не думаєте про перейменування файлів?
Ледачий борсук

1
Я системний адміністратор, а не розробник, мій обов’язок - забезпечити стабільну працюючу послугу, а не навчитися нею користуватися.
Селіванов Павло

Метт Маккалл писав давно, можливо, вже застарів # Якщо ви хочете подавати сторінки з UTF-8 замість вашої за замовчуванням # locale charset, ви можете це зробити, коментуючи наступні рядки. # Зверніть увагу, що це призведе до інтерпретації ваших .hgrc файлів у # UTF-8, а всі ваші repo-файли відображатимуться за допомогою 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 для більш прямої підтримки для цього.


Я розмістив повний патч у списку розсилки.
Мартін Гейслер

Тигельний євангеліст покинув нашу компанію, тому проблема зникла. Дуже дякую за написання коду, щоб виправити мою проблему та покращити показник :) Я спробую це, коли у мене буде трохи вільного часу.
Селіванов Павло

Ах, проблема вирішена :-) Сміливо прийміть мою відповідь, коли ви її випробували.
Мартін Гейслер

Немає рт.ст. - найдефективніше все у ртутних 1,8. Я користувався hg --manifest -r порадою. Все працює на машині Linux: я бачу відповідні імена файлів у репо з кодуванням = UTF-8 у hgweb.config, а імена файлів є правильними у клонованому сховищі. На машині Windows у мене з'явилося ім'я файлу "оЏясиител СЊРЅР ° С · Р · Р ° РїРёСЃРєР ° .docx "після клонування.
Селіванов Павло

Так, цього варто очікувати - імена файлів не перекодуються, коли ви клонуєтесь до Windows, і тому ваш замовлення стає сміттям. Використовуйте розширення FixUtf8 наразі.
Мартін Гейслер

2

У мене була така ж проблема. Мені потрібно було конвертувати купу сховищ, тому я написав сценарій, який перетворює всі сховища, подані як список.

використання:

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

Ви можете отримати з мого сховища в BitBucket.


0

Тільки видобуток з Mercurial Wiki FYI

Далі явно трактуються як бінарні дані в невідомому кодуванні:

  • вміст файлу
  • назви файлів

Ці предмети слід розглядати як бінарні дані та зберігати без втрат, де це можливо.

Таким чином, я гадаю, що лише зміна презентаційної схеми encoding =може зробити товсту

Якщо це припущення неправильне (це завжди можливо), спробуйте розширення FixUtf8 , прочитайте частину Виправлення існуючих імен файлів з readme уважно


Зміна encoding = windows-1251до encoding = UTF-8тільки з імен файлів нечитабельним. FixUtf8 теж не допомогла.
Селіванов Павло

ДОБРЕ. Спробуйте повернути назад encoding = windows-1251 і спробуйте AddDefaultCharset utf-8в Apache. Ще одна ідея - змінити WAMP на LAMP з UTF8 як локальний і нічого не робити з іменами файлів, але encoding = UTF-8знову
Lazy Badger

Це є ЛАМПИ. У старі часи сховище розміщувалося на WAMP з Subversion, пізніше я перетворив його на Mercurial і перейшов на машину Linux, з локальним UTF-8. encoding = windows-1251було встановлено, оскільки дані вже були в цьому кодуванні.
Селіванов Павло

перечитайте Wiki! 1251 - лише презентаційний шар, а не сховище
Lazy Badger

явно трактуються як бінарні дані в невідомому кодуванні. І це кодування є Windows-1251, в ньому зберігаються назви файлів. Мені потрібен якийсь спосіб перетворити їх на UTF-8
Селіванов Павло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.