TortoiseHg

Z funus.net

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:

http://tortoisehg.bitbucket.org/

hostowany na bitbuckecie:

https://bitbucket.org/tortoisehg/

i ma cały szereg repozytoriów:

https://bitbucket.org/tortoisehg/thg/wiki/developers/repositories

z czego najważniejsze jest thg:

https://bitbucket.org/tortoisehg/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):

https://bitbucket.org/tortoisehg/thg-build

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 :)

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).

[edytuj] Zobacz też