diff and patch – Zarządzanie zmianami w plikach tekstowych

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

  1. 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:

    • bez dodatkowych opcji – bez kontekstu
    • z opcją -u – wyświetlenie linii otaczających zmiany (kontekstu)
    • z opcją -y – wyświetlenie dwukolumnowego porównania

    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?

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

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

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