[code] Versionspflege mit GNU Diffutils
17. November 2008 von Jürgen
Ich bin häufig mit der Situation konfrontiert zum Beispiel für einen Bugfix eine Code-Änderung in einem oder mehreren Files auf verschiedene Versionen (stable / unstable / testing) zu verteilen. Wenn dies ein umfangreicherer Fix war, kann diese mechanische Arbeit durchaus einige Zeit in Anspruch nehmen.
Genau für diese Arbeit nutze ich inzwischen schon seit längeren die “GNU Diffutils” für die Versionspflege in meiner täglichen Arbeit. Diffutils liefert das Programm “diff” welches einen sogenannten “patch” aus zwei Versionen einer Datei, oder eines ganzen Verzeichnisses erstellt. Dieser “patch” kann dann unter zuhilfenahme des Tools “patch” in einer anderen Umgebung (unstable o. testing) eingespielt werden. Dabei ist “patch” in den meisten Fällen in der Lage diverse Unstimmigkeiten im Quellfile intelligent zu erkennen und den patch dennoch richtig einzubauen. Für den Fall das eine solche Erkennung nötig war, gibt “patch” den Zeilenoffset aus den es angenommen hat um den patch einzuarbeiten.
Im folgenden die Command – Schnipsel die ich für diese Tätigkeit verwende:
diff -Naurp example.cpp.1 example.cpp.2
produziert folgende (für meinen Geschmack sehr verständliche) Ausgabe:
--- example.cpp.1 2008-11-17 09:02:25.181464000 +0100
+++ example.cpp.1 2008-11-17 09:02:18.271528000 +0100
@@ -4692,7 +4692,7 @@ void MyClass::Move
HQUERY_T hQuery;
MERGERESULT_SOURCE_Row_t MRS;
- pS_MERGERESULT_SOURCE_ResultJobQSCreate(MRS, 4711);
+ pS_MERGERESULT_SOURCE_ResultJobQSCreate(MRS, 4712);
if (rows > 0 && messageNo == DAL_OK)
{
das “-” markiert die “alte” Zeile, das “+” die “neue”. Im Kopf stehen noch die Datei bzw. Ordnernamen und die Modification Dates der Files. Im weiteren noch ein Rowoffset und durch die Option “-p” im Aufruf wird auch noch der C++ Function/Method Name ausgegeben innerhalb dessen Definition die Änderung stattgefunden hat.
Diese Ausgabe lässt sich in ein File “pipen” um den patch zu speichern und zu einem späteren Zeitpunkt wieder anwenden zu können. Auf Windows mit dem “>” operator.
Das Tool “patch” dient nun dem Zusammenführen eines (noch nicht auf dem aktuellen Stand) Quellfiles und dem patch. Der Aufruf um einen patch auf ein einzelnes File anzuwenden könnte wie folgt aussehen:
patch example.cpp.1 -i example.patch
Dafür habe ich den obigen diff in die Datei “example.patch” geschrieben um es hier wieder anwenden zu können um die Version 1 des Files ebenfalls auf Version 2 zu bringen. “patch” liefert folgende Ausgabe:
patching file example.cpp.1
für den Fall das die intelligente Suche angewandt wurde um die entsprechende Stelle im Code zu indentifizieren, gibt patch folgenden Output aus:
patching file example.cpp.1
Hunk #1 succeeded at 4670 (offset -22 lines).
hi, ich bin Jürgen aká zero und auf meinem blog findest du Infos zu Themen die mich interessieren (allein das kann schon ziemlich umfangreich sein) und Sachen die ich mir hier notiere damit ich sie nicht vergesse.