TortoiseHg
TortoiseHg to GUI do Mercuriala. Choć nazwa niedwuznacznie nawiązuje do TortoiseSVN, to program działa i wygląda nieco inaczej. Pod Windows też się co prawda integruje z systemem jako "shell extension", ale głównym narzędziem jest jednak wygodny Workbench, wyświetlający w jednym miejscu historię (wraz z grafem), listy plików, diffy i inne.
W przeciewieństwie Do TortoiseSVN, który działa tylko na Windows, TortoiseHg, czy raczej jego elementy, mogą działać także na innych platformach. Ale zbudowanie tego na Linuksie nie należy do najłatwiejszych zadań. Przeszkadza fatalna dokumentacja, a raczej jej brak. Nie wiadomo, jakie są zależności, co i jak budować (albo nie). Chociaż ostatnio coś drgnęło jakby ku lepszemu, prawdopodobnie dzięki marudzeniu jednego gościa na liście dyskusyjnej mercuriala. Oczywiście nakrzyczano na niego, zwymyślano od trolli, ale na stronach TortoiseHg coś drgnęło - podano podstawowe instrukcje i zależności i powstały dodatkowe repozytoria...
Nawiasem mówiąc, mają chyba najbardziej absurdalne wiki jakie widziałem. Oczywiście, każdy może edytować, ale żeby to zrobić, należy ściągnąć źródła stron poprzez sklonowanie repozytorium mercurialowego, pozmieniać a następnie wysłać patche na listę dyskusyjną...
Spis treści |
[edytuj] TortoiseHg, thg, strony, projekty, wiki, repozytoria
Jest tu pewien bajzel i chwilę mi zajęło zorientowanie się, o co chodzi. Więc wygląda to tak. Jest sobie project TortoiseHg:
hostowany na bitbuckecie:
i ma cały szereg repozytoriów:
z czego najważniejsze jest thg:
Jest tam też niedawno powstałe repo thg-build zawierające subrepozytoria z, jak się wydaje, rzeczami potrzebnymi do zbudowania thg (oczywiście nie wszystkimi):
Warto zwrócić uwagę, że thg to nie to samo co TortoiseHg, w każdym razie nie w każdym kontekście... To drugie to aplikacje i shell extensions dla Windows. Natomiat thg [...] allows you to launch the TortoiseHg dialogs on any platform that supports Mercurial and PyQt. This is the easiest way to start using TortoiseHg on Linux and Mac OS X.
[edytuj] Budujemy
OK, postanowiłem spróbować to jednak zbudować na Debianie 5.0.8.
[edytuj] Zależności
Na początku ustawmy zmienne środowiskowe:
export thg=/usr/local/opt/thg export PATH=$thg/bin:$PATH export QTDIR=$thg export PYTHONPATH=$thg/lib/python2.5/site-packages
Najpierw ściągnąłem sobie bibliotekę Qt w wersji 4.7.3 [1]. Teraz próbuję ją zbudować.
tar xzvf qt-everywhere-opensource-src-4.7.3.tar.gz cd qt-everywhere-opensource-src-4.7.3 ./configure --prefix=$thg make # I po niecałych trzech godzinach: make install cd ..
W międzyczasie ściągnąłem sip-4.12.3 [2] i pyqt-4.8.4 [3].
tar xzvf sip-4.12.3.tar.gz cd sip-4.12.3 python ./configure.py -b $thg/bin -d $thg/lib/python2.5/site-packages \ -e $thg/include/python2.5 -v $thg/share/sip make make install cd ..
PyQt wymaga zarówno sipa, jak i Qt.
tar xzvf ../download/PyQt-x11-gpl-4.8.4.tar.gz cd PyQt-x11-gpl-4.8.4/ python configure.py -b $thg/bin -d $thg/lib/python2.5/site-packages make make install
I tu pojawił się błąd, bo Makefile z podkatalogu dbus usiłował mi zainstalować coś w /var/lib/python-support/python2.5/dbus/mainloop, gdzie oczywiście nie miałem dostępu. Zmodyfikowałem Makefile dopisując w nim:
DESTDIR=$(thg)
Ponowne make install zakończyło się sukcesem, chociaż pewnie to nie zadziała w ten sposób. Mam nadzieję, że dbus nie będzie mi niezbędny.
Kolejnym niezbędnym komponentem jest QScintilla [4].
tar xzvf QScintilla-gpl-2.5.1.tar.gz cd QScintilla-gpl-2.5.1 cd Qt4 qmake qscintilla.pro make make install cd ../Python python configure.py make make install
[edytuj] THG
Pora na samo thg. Autorzy zalecają pobranie poprzez sklonowanie repozytorium. Tutaj nie trzeba niczego instalować.
hg clone https://bitbucket.org/tortoisehg/thg cd thg hg update stable # skoro mają branch stable to czemu go nie wykorzystać? ./thg
Za pierwszym razem nie powiodło się, gdyż nie zainstalowałem pakietu QScintilla (dokumentacja nie wspominała o nim). Usupełniłem i... tada! sukces! Pojawił się długo wyczekiwany TortoiseHG Workbench :)
[edytuj] Skrypt startowy
Ok. Pora na skrypt startowy z ustawieniami środowiska, bo instalowałem to wszystko w niestandardowych lokalizacjach.
#! /bin/sh
thg_base=/usr/local/opt/thg
thg_repo=$thg_base/thg
thg_main=$thg_repo/thg
QTDIR=$thg_base
PATH=$thg_base/bin:$PATH
LD_LIBRARY_PATH=$thg_base/lib${LD_LIBRARY_PATH+:}$LD_LIBRARY_PATH
PYTHONPATH=$thg_base/lib/python2.5/site-packages${PYTHONPATH+:}$PYTHONPATH
export QTDIR PATH LD_LIBRARY_PATH PYTHONPATH
exec $thg_main "$@"
Skrypt zapisałem jako /usr/local/bin/thg.
[edytuj] GUI do diffów i merge'y
Aplikacja używa zewnętrznych programów, przede wszystkim kdiff3 (załączone do windowsowej paczce instalacyjnej). Na Linuksie zalecają dopisać w pliku ~/.hgrc:
%include /usr/local/opt/thg/thg/contrib/mergetools.rc
Rzeczywiście, wizualne diffowanie zaczęło mi działać, gdy to zrobiłem.
[edytuj] Uzupełnienia
Uzupełniam o brakujące elementy, bez których z grubsza niby działa, ale jednak nie do końca ;) Wszystko oczywiście z poprzednimi ustawieniami środowiska (PATH, LD_LIBRARY_PATH, QTDIR, PYTHONPATH).
[edytuj] iniparse
Iniparse jest potrzebny, żeby można było zmieniać preferencje w oknie dialogowym thg. Można sklonować następująco:
hg clone https://bitbucket.org/sborho/iniparse/
Bądź pobrać thg-build, gdzie będzie referowane jako podrepozytorium:
hg clone https://bitbucket.org/tortoisehg/thg-build
(Muszę wspomnieć, że miałem pewne trudności z pobieraniem tego: raz się wysypał mercurial, potem się zwiesiło do timeoutu na połączeniu i za trzecim razem poszło).
cd iniparse/ python setup.py build make python setup.py install --prefix=$thg
[edytuj] Wady
Bardzo powolny, im większe repozytorium, tym gorzej. Na przykład przy netbeans (zob. obrazek wyżej) z niecałymi 200 tys. changesetów, czas reakcji na kliknięcie listę przekracza na moim sprzęcie 2 sekundy - masakra. Ale nawet przy małych repozytoriach czuć, że program jest taki ociężały.
Algorytm rysowania grafów nie jest najlepszy [5] i gdy szerokość rośnie staje się coraz mniej czytelny. Dodatkowo jest niestabilny w tym sensie, że nawet niewielka zmiana (commit, update itp) powoduje jego narysowanie od nowa, często w inny sposób niż dotychczas i z innymi kolorami przypisanymi do węzłów i łuków. Moim zdaniem znacznie lepiej wygląda graf w interfejsie webowym (hg serve).