Mercurial Queues

Z funus.net

Mercurial Queues (MQ) to dostępne z Mercurialem, rozproszonym systemem kontroli wersji, narzędzie do zarządzania kolejkami patchy, bazowane na samodzielnym toolu o nazwie quilt. Integracja polega na tym, że zaaplikowane patche widziane są jako changesety w repozytorium, dlatego można do nich stosować większość normalnych operacji na historii, a przy tym łatwo je "zdjąć" i, na przykład, przenieść w inne miejsce.

Tutoriale i kupa informacji o MQ jest oczywiście dostępna w internecie. Tu chcę odnotować jedynie parę swoich uwag i spostrzeżen.

  • MQ dostęne jest jako rozszerzenie dostarczane razem z Mercurialem, ale nieaktywne; należy włączyć je w pliku konfiguracyjnym
  • Do interaktywnego "nagrywania" patchy przyda się także rozszerzenie record, dzięki któremu można będzie użyć komend qrecord i qnew --interactive.
  • Ostrożnie z komendą qrefresh, potrafi ona działać dość nieintuicyjnie (jak na mój gust), gdy chcę zapisać w patchu zmiany tylko z niektórych plików. W szczególności:
    • wskanie pliku (plików) spowoduje, że zapisane uprzednio zmiany z innych plików wylecą z patcha a pojawią się ponownie jako modyfikacja kopii roboczej
    • opcja -e czy -l nie służy wyłącznie do modyfikacji "log message", przy okazji wykonuje też odświeżenie patcha; jeśli chcesz zmienić komunikat, po prostu przeedytuj patch ręcznie
  • Zdejmowanie patchy i ponowne ich nakładanie w innym miejscu (na przykład po dociągnięciu zmian z innego repozytorium) działa świetnie, dopóki nie pojawi się konflikt; wtedy tworzy pliki *.rej zawierające odrzucone zmiany i każe nam ręcznie rozwiązywać ten problem (czyli dokładnie tak, jak to się robiło przed wiekami przy użyciu prostych poleceń diff i patch). Na szczęście jest alternatywa: polecenie rebase obsługuje także zaaplikowane patche, więc gdy prosta aplikacja patchy się nie powiedzie można je zdjąć, zrobić update do porzedniej rewizji (tzn. tej, gdzie patche były poprzednio aplikowane), tam nałożyć patche i przy pomocy rebase nanieść je na docelowy commit, rozwiązując w zwykły sposób konflikty (zależnie od konfiguracji może to być interaktywne narzędzie typu kdiff3).

[edytuj] Zobacz też