BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

patch-Dateien bearbeiten

Mit Hilfe von diff(1) können Änderungen zwischen zwei Versionen einer Textdatei angezeigt werden:

# diff -u datei.orig datei
--- datei.orig 2008-07-05 10:26:27.000000000 +0200
+++ datei 2008-07-05 10:26:18.000000000 +0200
@@ -1 +1 @@
-Inhalt original
+Inhalt neu

Leitet man die Ausgabe von diff in eine Datei um, kann die Änderung danach mit Hilfe von patch(1) zum Beispiel auf eine identische Datei auf einem anderen Rechner angewendet werden:

# diff -u datei.orig datei > datei.patch
# patch < datei.patch
Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- datei.orig 2008-07-05 10:26:27.000000000 +0200
|+++ datei 2008-07-05 10:26:18.000000000 +0200
--------------------------
Patching file datei using Plan A...
Hunk #1 succeeded at 1.
done

In den FreeBSD Ports unter misc/patchutils findet man patchutils, welches mehrere Programme enthält, mit denen man patch-Dateien bearbeiten kann.

# cd /usr/ports/misc/patchutils && make install clean

Besitzt man zum Beispiel zwei Versionen eines Patches, so können mit Hilfe von interdiff(1) die Änderungen zwischen den beiden Versionen angezeigt werden. Die Ausgabe von interdiff kann ebenfalls wieder in eine Datei umgeleitet werden, welche danach wieder mit patch(1) angewendet werden kann:

# interdiff pkg_updating_main_c-1.patch pkg_updating_main_c-2.patch > pkg_updating_main_c-diff_1-2.patch

Eine Patch-Datei kann auch die Änderungen von mehreren Datein beinhalten. Möchte man nur Änderungen von bestimmten Dateien aus einem Patch auslesen, kann filterdiff(1) verwendet werden. Mit der -i Option werden nur Änderungen von Dateien angezeigt, welche auf das Filterkriterium passen. Mit der -x Option werden alle Änderungen von Datein angezeigt, welche nicht auf das Filterkriterium passen. Im folgenden Beispiel werden nur die Änderungen an Header-Dateien aus dem Patch angezeigt:

# filterdiff -i '*.h' pkg_updating.patch

Modifizert man einen Patch von Hand, kann es sein, dass Zeilennummern und der Offset im Patch nicht mehr stimmen. Nun kann dazu rediff(1) aufgerufen werden, welches diese an die neuen Änderungen anpasst:

# rediff <Originale Datei> <Modifizierter Patch>

Alternativ dazu kann der Patch direkt mit editdiff(1) bearbeitet werden. Dazu wird ein Editor geöffnet, in welchem der Patch bearbeitet werden kann. Speichert man die Änderungen und schliesst den Editor, werden die Änderungen am Patch direkt umgesetzt:

# editdiff <Patch>

Hat man zwei Patches auf die gleiche Datei erstellt, welche nacheinander angewendet werden sollen, können diese mit combinediff(1) zu einem Patch verbunden werden

# combinediff <Patch1> <Patch2>

Mit lsdiff(1) können alle Dateien angezeigt werden, welche durch den Patch modifiziert werden:

#  lsdiff pkg_updating.patch
src/usr.sbin/pkg_install/lib/lib.h
src/usr.sbin/pkg_install/updating/Makefile
src/usr.sbin/pkg_install/updating/main.c
src/usr.sbin/pkg_install/updating/pathnames.h
src/usr.sbin/pkg_install/version/version.h

Möchte man überprüfen, ob eine gewisse Datei mit dem Patch modifiziert wird, kann grepdiff(1) verwendet werden:

# grepdiff main pkg_updating.patch
src/usr.sbin/pkg_install/updating/main.c

Befindet sich ein Patch auf einer HTML Seite, kann der Quellcode der Seite heruntergeladen werden und danach der Patch aus dem HTML-Code mit Hilfe von dehtmldiff(1) extrahiert werden:

# dehtmldiff <HTML-Datei>
 Permalink

Comments

No new comments allowed (anymore) on this post.