Program diff pozwala na wyświetlenie różnic między plikami tekstowymi . Format wyświetlanych danych jest (w miarę) czytelny dla człowieka, jak i możliwy do przetwarzania przez komputer. Program patch pozwala na naniesienie różnic znalezionych przez program diff na plik tekstowy. diff i patch operują na liniach plików.
Częstym zastosowaniem programów diff i patch są operacje na zmianach w plikach źródłowych programów, np. w języku C.
Do wykonania powyższych ćwiczeń został dostarczony przykładowy program w języku C i jego modyfikacje
diff – różne rodzaje wyjścia. Użyć diff do porównywania parami plików main.c, main2.c main3.c. Użyć róœnych formatów wyjścia:
Przypomnienie: echo $? wyświetla kod wyjścia ostatnio wykonanego polecenia. Jaki jest status wyjścia gdy pliki są różne, a jaki gdy są takie same?
Pliki patch. Wyjście programu diff przekierowane do pliku zwyczajowo nazywane jest plikiem patch (łaty). Typowe wywołanie pozwalające utworzyć plik patch, to:
$ diff -u plik.stary plik.nowy > zmiany.patch
Diff pozwala również utworzyć patch dla całego katalogu (co nie jest przedmiotem tego ćwiczenia), typowo używany wtedy zestaw opcji, to:
$ diff -Naur katalog.stary katalog.nowy > zmiany.patch
Teoretycznie opcję -u przy tworzeniu pliku patch można pominąć, spowoduje to jednak pewne problemy:
Utworzyć dwa pliki patch zawierający zmiany z pliku main.c do pliku main3.c. Jeden patch ma być wynikiem wywołania diff z opcją -u, drugi bez (jeden zawiera informacje o numerze linii, gdzie następuje różnica i kontekst. Drugi tylko informacje o linii).
Utworzyć kopię pliku main2.c i zaaplikować jej patch:
$ cp main2.c main2.1.c
$ patch main2.1.c pierwszy.patch
Zrobić drugą kopię i zaaplikować jej drugą łatę. Jakie są różnice w działaniu? Który wynik jest bardziej sensowny? Które wywołanie wyświetliło ostrzeżenie? Wyciągnąć wniosek, że patch zawierający kontekst jest znacznie lepszy.
Utworzyć dwa pliki patch. Jeden z różnicami pomiędzy main.c i main2.c, drugi z różnicami main.c i main3.c.
Utworzyć kopię main.c i zaaplikować jej najpierw pierwszy, a potem drugi patch. Utworzyć drugą kopię i zaaplikować patche w odwrotnej kolejności. Czy są różnice w wyniku?
Program patch ma opcję -R pozwalającą odwrócić działanie – wycofać zmiany opisane w pliku patch. Przetestować ją na pliku z zaaplikowanymi zmianami.
Nie wszystkie zmiany są od siebie niezależne, a co za tym idzie nie zawsze można zaaplikować dwie łaty na raz. Przygotować dwie modyfikacje pliku main.c zawierające zmiany w konflikcie (na przykład w jednej modyfikacji zamienić return 0 na return 1, a w drugiej na return 2.
Podobnie jak w poprzednim ćwiczeniu utworzyć pliki patch i spróbować zaaplikować oba na kopii main.c