Tema: CVS -> HG/Mercurial (how-to)
Autorius: Laimis
Data: 2009-02-24 23:44:57
Sveiki,

Visa tai jei kam nors prisireiktų tiesiogiai perkelti CVS repozitoriją 
(su visa istorija) į hg išsaugant korektišką CVS log'ų koduotę (kad ir 
kokia ji bebūtų -- cp1257, cp1251, cp1252, kt.), t.y. korektiškai 
perkoduojant į utf-8, nes pagal Mercurial fromcvs how-to:

http://www.selenic.com/mercurial/wiki/index.cgi/fromcvs

*nepavyks*, juoba, jei tai daroma Windows OS.

Be Mercurial (TortoiseHg), reikės:
Cygwin'o, Ruby (cygwin; native suknistas (neveikia) rcsparse 
kompiliavimas, o jei dar ir MS kompiliatoriaus neturite...), Python'o 
(native).

Rubygems:
http://www.rubygems.org/

ruby-rbtree
(gem install rbtree)

rcsparse
http://ww2.fs.ei.tum.de/~corecode/hg/rcsparse

fromcvs:
http://ww2.fs.ei.tum.de/~corecode/hg/fromcvs

Redaguojam fromcvs/tohg.rb; pačioje pradžioje pridedam
"require 'rubygems'" eilutę.

Atridename Python'ui Mercurial kiaušinį. Pradžioje tam (easy_install) 
reikės setuptools:
http://pypi.python.org/pypi/setuptools/
http://pypi.python.org/pypi/setuptools/#windows
(*Cygwin note*)

Tuomet:
easy_install.exe mercurial

Būtinai nustatome aplinkos (environment) kintamąjį (tą jau turbūt 
padarėme anksčiau, naudodamiesi hg; antraip hg log'ai gali būti tik ascii):
HGENCODING=utf-8


Atrodytų lyg ir viskas, lyg ir galima būtų pradėti (pagal hg fromcvs 
how-to)...:
"
export LANG=en_US.UTF-8
cd fromcvs
hg init /path/to/hgdest
ruby tohg.rb /path/to/cvsroot modulename /path/to/hgdest
"

STOP. Lokalę liesti/keisti beprasmiška, reikia taisyti kelius (nors mes 
cygwin'e, tačiau aktualų darbą atlieka native python'as):

ruby tohg.rb C:\\path\\to\\cvsroot modulename C:\\path\\to\\hgdest

Na, na...? Važiuoja! Tačiau ir nuvažiuoja (su išdarkytais log'ais)...

Taigis taigis, kaipgis... Ir ką gi mes randame (po gana prailgusio 
krapštymosi):
fromcvs/fromcvs.rb::convtooutf8()

   def convtoutf8(str)
     encs = ['utf-8', 'iso8859-15']

     encs.each do |enc|
       begin
         return Iconv::conv('utf-8', enc, str)
       rescue StandardError
       end
     end

Tai bent užslėptas perliukas! Log'ai kažkodėl įsiūtai perkoduojami iš 
'utf-8' (nors labai tikėtina yra visiškai kitokioje, 8 bitų koduotėje), 
arba dar "geriau" (iso-8859-15) į 'utf-8'. Artūrai Šlajau, užsiimk, 
juk/kai mokslai tokie nemieli... ;-)

Čia greitai (iki kol tai bus ištaisyta), pačią pirmą ir reikia įsiūti 
CVS log'ų koduotę, t.y. iš kurios konvertuojama į 'utf-8' (manuoju 
atveju tai buvo 'cp1257'):
     encs = ['cp1257', 'utf-8', 'iso8859-15']

Viskas, dabar jau tikrai (nu)važiuos.

Žinoma, galima buvo tiesiog (vienkartiniam importui būtų kur kas 
greičiau) perkoduoti CVS repozitorijos RCS failus, arba bandyti kitą 
kelią (CVS->SVN->HG -- ar tikrai nebūtų panašių problemų?), tačiau 
pradėjus krapšytis norėjosi pabaigti.
Tikiuosi kam nors bus naudinga.