Mengkonversi file nama Mercurial

12

Saya memiliki repositori Mercurial yang berjalan di Apache dengan mod_wsgi. Repositori memiliki semua nama file yang dikodekan di windows-1251. Pengkodean ini digunakan karena alasan historis: mereka dikonversikan menjadi mercurial from svn, windows-1251 adalah pengodean windows default untuk lokal Rusia.

Sekarang programmer ingin menggunakan alat Crucible untuk review kode. Itu tidak dapat menurunkan nama file dalam pengkodean selain dari utf-8. Jadi saya perlu mengubahnya dari windows-1251 ke utf-8. Adakah yang tahu bagaimana melakukan ini? Ekstensi konversi Mercurial tidak memiliki opsi untuk mengkonversi pengkodean.

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
sumber
1
Nama file Rusia ?! Jangan berpikir tentang ganti nama file?
Lazy Badger
1
Saya administrator sistem, bukan pengembang, tugas saya adalah menyediakan layanan kerja yang stabil, bukan mempelajari cara menggunakannya.
Selivanov Pavel
Matt Mackall menulis sejak lama, mungkin sudah usang # Jika Anda ingin melayani halaman dengan UTF-8 alih-alih # charset locale default Anda, Anda dapat melakukannya dengan menghapus komentar pada baris berikut. # Perhatikan bahwa ini akan menyebabkan file .hgrc Anda ditafsirkan dalam # UTF-8 dan semua file repo Anda ditampilkan menggunakan UTF-8. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger
Saya telah menulis dalam komentar untuk jawaban di bawah ini: Mengubah encoding = windows-1251ke encoding = UTF-8membuat nama file tidak dapat dibaca. Ini karena mereka disimpan di windows-1251. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" sama dengan pengaturan ini.
Selivanov Pavel

Jawaban:

6

Anda benar bahwa ekstensi konversi tidak mendukung ini dengan cara yang baik saat ini. Artinya, Anda tidak bisa meminta untuk recode dari pengkodean X untuk pengkodean Y . Namun, Anda dapat memintanya untuk mengganti nama file satu per satu untuk Anda! Pertama buat file yang disebut rename.pydengan

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)

Lalu lari

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

Ini menciptakan peta file Anda. Anda sekarang dapat menggunakan

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

untuk mengubah repositori menjadi repositori baru. Dalam repositori baru, itu akan terlihat seperti file selalu disimpan menggunakan nama file UTF-8.

Catatan: Nama file sekarang disimpan sebagai UTF-8 di repositori. Ini berarti bahwa checkout akan terlihat bagus di mesin Linux modern. Windows, bagaimanapun, tidak menggunakan nama file UTF-8. The ekstensi FixUtf-8 harus digunakan untuk membuat Mercurial mengkonversi UTF-8 nama file ke UTF-16 dengan cepat. Ini juga akan membuat nama file yang dapat dibaca di Windows.

Catatan: Semua orang harus mengkloning repositori baru! Mengubah bagian mana pun dari riwayat pasti akan mengubah semua hash perubahan juga. Jadi untuk melakukan ini, Anda harus melakukannya juga

  1. membuat semua orang mendorong ke server,
  2. mengonversi repositori di server,
  3. minta orang-orang mengkloning kembali

atau

  1. membuat semua orang menjalankan perintah di atas pada repositori lokal mereka
  2. konversikan repositori di server

Apa pun cara kerjanya karena konversi bersifat deterministik sehingga pengguna Anda dapat menjalankannya sendiri jika mereka memiliki Python. Jika mereka hanya memiliki instalasi TortoiseHg, maka mungkin paling mudah jika Anda mengonversinya di server Anda.

Saya melihat membuat ekstensi ekstensi ini menjadi lebih langsung dan telah mengirim patch ke milis Mercurial untuk mendapatkan lebih banyak dukungan langsung untuk ini.

Martin Geisler
sumber
Saya telah memposting tambalan lengkap di milis.
Martin Geisler
Penginjil yang dapat dipercaya telah meninggalkan perusahaan kami, sehingga masalahnya hilang. Terima kasih banyak untuk menulis kode untuk memperbaiki masalah saya dan peningkatan lincah :) Saya akan mencoba ini ketika saya akan memiliki waktu luang.
Selivanov Pavel
Ah, masalah terpecahkan :-) Jangan ragu untuk menerima jawaban saya ketika Anda sudah mencobanya.
Martin Geisler
Tidak hg - mewujudkan semua dalam lincah 1.8. Saya sudah userd hg --manifest -r tip. Semuanya berfungsi di mesin Linux: Saya melihat nama file yang tepat dalam repo dengan encoding = UTF-8 di hgweb.config dan nama file benar dalam repositori kloning. Pada mesin Windows saya mendapatkan "Пояснител СЊРЅР ° СЏ Р · Р ° РїРёСЃРєР ° .docx "nama file setelah klon.
Selivanov Pavel
Ya, ini yang diharapkan - nama file tidak dikodekan ulang saat Anda mengkloning ke Windows dan checkout Anda menjadi sampah. Gunakan ekstensi FixUtf8 untuk saat ini.
Martin Geisler
2

Saya memiliki masalah yang sama. Saya perlu mengonversi banyak repositori, jadi saya menulis skrip yang mengubah semua repositori yang diberikan sebagai daftar.

pemakaian:

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

Anda bisa dapatkan dari repositori saya di BitBucket.

rominf
sumber
0

Hanya ekstraksi dari Mercurial Wiki FYI

Berikut ini secara eksplisit diperlakukan sebagai data biner dalam penyandian yang tidak dikenal:

  • isi file
  • nama file

Barang-barang ini harus diperlakukan sebagai data biner dan disimpan tanpa kehilangan sedapat mungkin.

Jadi, saya kira, hanya mengubah presentasi charset di encoding =dapat melakukan yang tebal

Jika asumsi ini salah (selalu mungkin), coba Ekstensi FixUtf8 , baca bagian Memperbaiki nama file yang ada dari readme dengan hati-hati

Malas Badger
sumber
Mengubah encoding = windows-1251ke encoding = UTF-8membuat nama file tidak dapat dibaca. FixUtf8 tidak membantu juga.
Selivanov Pavel
BAIK. Coba kembalikan encoding = windows-1251 dan coba AddDefaultCharset utf-8di Apache. Gagasan lain - ubah WAMP ke LAMP dengan UTF8 sebagai lokal dan jangan lakukan apa-apa dengan nama file tetapi miliki encoding = UTF-8lagi
Lazy Badger
Ini adalah LAMP. Di masa lalu repositori ditempatkan pada WAMP dengan Subversion, kemudian saya mengubahnya menjadi Mercurial dan pindah ke mesin Linux, dengan lokal UTF-8. encoding = windows-1251ditetapkan karena data sudah ada dalam pengkodean ini.
Selivanov Pavel
baca kembali Wiki! 1251 hanya lapisan presentasi, bukan penyimpanan
Lazy Badger
secara eksplisit diperlakukan sebagai data biner dalam pengkodean yang tidak dikenal Dan pengkodean ini adalah windows-1251, nama file disimpan di dalamnya. Saya perlu beberapa cara untuk mengubahnya menjadi UTF-8
Selivanov Pavel