Aktualizacja - łatanie i porównywanie plików
Artykuł został zaktualizowany 5 stycznia 2007 roku. Dodano opis skryptu ułatwiającego łatanie katalogów.
Nawet złowrogi Sith, przebywający na co dzień po ciemnej stronie mocy, musi sobie coś czasem załatać. Inaczej mówiąc: i użytkownik Windows musi (bądź chce) mieć czasem do czynienia z łatami (*.patch).
Omówione sytuacje
- Co pewien czas pojawiają się nowe wersje Drupala, których wydanie podyktowane zostało wykryciem luk bezpieczeństwa. Czy nie znudziło się już Wam wysyłanie od nowa całej paczki z Drupalem?
- Denerwuje Was jakiś mniej znany błąd lub chcecie skorzystać z łatki dodającej niestandardowe funkcje? Mozolnie ślęczycie nad edytorem, kopiując i wklejając odpowiednie linijki?
- A może chcecie stworzyć własną łatkę, by móc później automatycznie dodawać poczynione przez siebie modyfikacje do oryginalnych plików?
1. Porównywanie katalogów przed aktualizacją Drupala
Korzystając z jednego z poniższych sposobów można wytypować pliki, które wymagają wysłania na serwer, a te, które nie uległy zmianie od ostatniej aktualizacji, pozostawić w spokoju.
WinMerge – tylko pod Windows

- Porównywanie dwu archiwów z Drupalem w WinMerge
Dobrym darmowym windowsowym narzędziem do porównywania katalogów jest WinMerge.
Katalogi (lub nawet dwa archiwa .tar.gz) wybiera się za pomocą przycisku Porównaj. Na czerwono oznaczone zostaną pliki różniące się między sobą zawartością lub nieistniejące w jednym z katalogów.
By nie musieć wchodzić do każdego z podkatalogów po kolei, warto zaznaczyć opcję Domyślnie uwzględnij podkatalogi
.
Vim – pod Unix/Linux i Windows
Za pomocą wszechstronnego edytora Vim, ze wsparciem DiffUtils w wersji dla Unix/Linux lub dla Windows, a także wtyczki DirDiff, możemy porównać zawartość dwu katalogów.
Ładne pokolorowanie różnic zapewni natomiast zestaw kolorów Twist.
Do porównania katalogów, po uprzednim zainstalowaniu wszystkich potrzebnych rzeczy, używamy poniższej komendy (którą wydajemy w gVimie):
:DirDiff <katalog A> <katalog B>
Okno gVima zostanie podzielone na 3 części – dwie pierwsze będą zajmować podglądy różnic w plikach, a w trzeciej znajdować się będzie lista plików, które okażą się nie być identycznymi. Umieszczając kursor nad linijką odnoszącą się do dwu takich plików i wciskając klawisz o, można otworzyć je na podglądzie.
2. Łatanie plików
Łaty zamieszczane na drupal.org tworzone są programem diff i zapisywane w tzw. „zunifikowanym formacie”. Podobne łaty możemy także uzyskać, tworząc je w programie WinMerge
, korzystając z opisu znajdującego się pod koniec artykułu.
Patch Wizard
Patch Wizard
to skrypt PHP, ułatwiający łatanie plików. Umieściwszy go na serwerze, w miejscu dostępnym z przeglądarki internetowej, możemy załatać cały wybrany katalog wprowadzoną w odpowiednim polu łatą (należy wkleić zawartość pliku z łatą – *.patch).

- Fragment
Patch Wizard
Strategia jest prosta. Gdy pojawia się nowa wersja Drupala, porównuję jej archiwum z zainstalowaną na serwerze, za pomocą WinMerge (widok z opcją Uwzględnij podkatalogi
). WinMerge odfiltrowuje pliki, które wymagają szczególnego potraktowania (zmienione przeze mnie), a całą resztę zaznaczam i korzystam z Narzędzia
→ Generuj patch
, gdzie wybieram opcję otwarcia w zewnętrznym edytorze. Kopiuję łatę i wklejam do przeznaczonego dla niej pola udostępnianego przez skrypt Patch Wizard. Odpalam i Drupal załatany.
Podobnie postąpić można z gotowymi łatami, dostępnymi na drupal.org.
Skrypt umożliwia przekazywanie wartości ustawień poprzez URL (np. ?dir=/home/example w adresie), dzięki czemu mogę skorzystać z zakładek, które „pamiętają” za mnie większość ustawień, a moja rola sprowadza się do wciśnięcia przycisku. Jest to pomocne zwłaszcza, jeśli konieczne jest załatanie kilku witryn.
Dostępne argumenty URL to:
dir– katalog do załataniap–P level
unified– jeśli równa się0, tzw.zunifikowany
format nie jest wykorzystywany
Cały URL wyglądać więc będzie mniej więcej tak:
http://example.com/patch-wizard.php?dir=/home/example/example.com&p=0
Vim
By coś z pomocą Vima załatać, potrzebujemy programu Patch w wersji dla Windows lub dla Unix/Linux.
Przechodzimy do gVima i otwieramy w nim plik, który zamierzamy załatać. Następnie korzystamy z funkcji Podziel łatane przez (nie, nie mam pojęcia, kto ją tak przetłumaczył) i wskazujemy pobrany z drupal.org (albo innej strony) plik z roszerzeniem patch. Wyplute zostanie okienko linii poleceń z komunikatami programu Patch, które zamykamy wciskając Enter. O przebiegu łatania powiadomi nas też Vim – ponownie wciskamy Enter.

- Okno gVim-a z zestawem kolorów Twist, podzielone między załatany, a oryginalny plik
Po lewej stronie okna gVima widoczny będzie nowy, jeszcze nie zapisany, plik będący wynikiem łatania pliku znajdującego się po stronie prawej. Sprawdzamy czy wszystko wygląda w porządku i – upewniwszy się, że kursor znajduje się w lewej części okna – zapisujemy plik, usuwając końcówkę .new. Można go teraz wysłać na serwer.
3. Tworzenie łat
Tworzenie łat ma sens z kilku powodów. Jeśli chcemy udostępnić nasze modyfikacje, oszczędzamy miejsce na serwerze i czas ewentualnych zainteresowanych. Poza tym przydają się w przypadku modyfikacji często aktualizowanych plików, bo nie musimy sami od nowa grzebać w plikach, które zmieniła centrala.
za pomocą WinMerge
Otwieramy do porównania oryginalny plik i jego kopię zmodyfikowaną przez nas oraz wchodzimy do menu Narzędzia → Generuj patch. W nowootwartm okienku Plikiem 1 będzie ten otwarty w lewej części okna, a Plikiem 2 – otwarty w prawej. Jeśli nie odpowiada nam ta kolejność, możemy kliknąć przycisk Zamień.
W polu Wynik wpisujemy ścieżkę i nazwę pliku oczekiwanej łatki (lub klikamy sąsiedni przycisk Przeglądaj). Z grupy opcji o nazwie Format, przy Styl wybieramy Zunifikowany. Przy Kontekst wybrać możemy ile linii sąsiadujących z linią zawierającą zmianę będzie umieszczanych w łacie – im więcej, tym mniejsze ryzyko późniejszego wprowadzenia zmiany w złym miejscu, ale i większe prawdopodobieństwo niedopasowania łaty do pliku, który bardzo się zmienił od czasu jej utworzenia.
za pomocą Patch
Wydajemy polecenie
diff -u plik1 plik2
Kapitanie, nie mam go na radarze!
W wypadku korzystania z Patch bądź DiffUtils pod Windows, konieczne jest dopisanie ścieżek do tych programów do listy zmiennych środowiskowych. Czynimy to poprzez Mój komputer → Właściwości → karta Zaawansowane → Zmienne środowiskowe → Zmienne systemowe. Tam, na liście odszukujemy zmienną Path i na końcu zawartości pola Wartość dodajemy:
- dla Patch:
;C:\Program Files\GNU\Patch\bin - dla DiffUtils:
;C:\Program Files\GNU\DiffUtils\bin
Powyższe ścieżki są domyślnymi – jeśli programy zainstalowane są w niestandardowych katalogach, trzeba je oczywiście wskazać.

Małe pytanko
palik, pt., 2006-11-10 15:30 moderatorCzy jeśli plik .patch będziemy próbowali zaaplikować do pliku w którym wcześniej dodaliśmy jakiś swój kod, i patchowany fragment jest kilka(naście) linijek wyżej/niżej niż w oryginalnym pliku (bo zwyczajnie się przesunął), to operacja ma szanse się powieść?
Krócej – czy patchując jakiś plik możemy liczyć na jakąś ‚pseudointeligencję’ programu, czy w wypadku opisanym wyżej pozostaje nam wyszukanie samemu linii od której ma się zacząć patch i podmienienie jej numerka w pliku .patch ?
Może też warto by było opisać jak samemu wykonać plik patch?
ale zamotałem :)… jak zwykle.
Czy jeśli plik .patch
archetwist, pt., 2006-11-10 19:56 moderatorTak, przed chwilą załatałem plik
node.nodule, w którym interesująca mnie linijka przesunęła się o pięć wierszy od czasu stworzenia łaty na niego. Jak widać jest jakieś „autowykrywanie”.OK, wyedytuję później powyższy artykuł :) .
wiem że marudzę
palik, pon., 2006-11-20 21:18 moderatorale kurde jak jeden plik .patch jest do kilkunastu plików? aktualizacja do 4.7.4 tak właśnie wygląda (3 pliki łatające kilkadziesiąt plików drupala)…
nie wspomnę, że sam gvim jest niedzrowy dla psychiki (i nie przekonają mnie głosy hardkorowych userów vi, że to najlepszy edytor)
ja się zastrzelę z tym całym linuxowym ‚dobrodziejstwem’ :)
-- drupal w akcji? http://palikowski.vel.pl http://basoofka.net
patch
archetwist, wt., 2006-11-21 01:43 moderatorToteż ja nigdzie w powyższym tekście nie pisałem, żeby używać Vima do łatania wielu plików na raz. Do wybiórczej aktualizacji poleciłem WinMerge, albo gVim, ale w trybie porównywania katalogów. Można też oczywiście skorzystać z samego Patcha, z linii poleceń (szczegóły znajdziesz w dokumentacji).
Nie wiem czy najlepszy, ale chyba najwszechstronniejszy (setki dodatków). A że Drupal rozwiązaniami uniksowatymi stoi (diff, patch, po), prędzej czy później aktywny użytkownik i tak będzie się musiał z nimi zmierzyć.
Na marginesie, jest taki dowcip: Jak najprościej wygenerować losowy ciąg znaków? Posadzić użytkownika przed Vimem i kazać mu wyjść z programu.
Patch dla całego katalogu
Erewhon, wt., 2007-02-27 22:06 moderatorSiedzę przeglądam artykuły i wstrzelę swoje trzy grosze dotyczące porównywania katalogów – mimo, że ta dyskusja już ma kilka miesięcy – może się komuś przyda.
Wszystko na Linux-ie.
Instrukcja
Mam dwie kartoteki które muszę porównać: drupal_new oraz drupal_old. Wchodzę do katalogu drupal_new (bo to jest świeża zmieniona wersja):
następnie porównuje katalogi i wynik zapisuje do zbioru drupal.patch.
Parametry polecenia diff pozwolą mi wykonać patch wewnątrz katalogu który będzie musiał być uaktualniony, oraz spowoduje porównanie podkatalogów.
Pozdrawiam … korzystający z Linuxowego ‚dobrodziejstwa’ :-) Jak uaktualnić teraz takiego drupala? To już jest proste. Wchodzę do katalogu z wersją Drupala, która odpowiada wersji drupal_old, a następnie wykonuję polecenie patch:
Zaleta takiego tworzenia patch-a to taka, że:
Pozdrawiam, korzystający z Linux-owego „dobrodziejstwa” :-)
[ Erewhon ] [ http://www.judoinfo.pl ]