Home Ein guter Weg um einen Patch zu erstellen (und zu verwenden)
Post
Cancel

Ein guter Weg um einen Patch zu erstellen (und zu verwenden)

Wer kennt das nicht, man benötigt ein Stück Software, welches - zum Glück - Open Source ist, aber an dem seit Jahren nichts mehr geändert wurde!?

Okay .. sie funktioniert ja.
Vielleicht ist das Ding mittlerweile auch so ausgehangen, das es brutalst stabil ist und niemals irgendwelche Sicherheitslücken bekommen könnte. hust

Mein heutiges Paradebeispiel dafür ist scanbd.

Um meinen Scanner betreiben zu können, benötigte ich scanbd.
Während Debian wenigstens noch die letzte offizielle Version mitbrachte, lag mein Raspberry brach.
Und daher machte ich mich daran, die Sourcen zu nehmen, den gcc anzuheizen und den Code selber zu compilieren.

Old School Style eben. Der Weg der Profis. :)

Nur dreht sich die Welt weiter und der alte Code aus den 2017igern bekommt man nicht mit dem gcc 8 gebaut.

Und schon habe ich ein neues Thema, über das man mal wieder etwas schreiben kann:

Wie erstellt man einen Patch?

Prinzipiell geht es mir darum, Code den ich einmal gefixed habe, reproduzierbar wieder bauen zu können.
(Ggf. haben die Upstream Distributionen ja bereits eigene Patches am Start und liefern wieder binaries mit.)

Um einen Patch für eine einzelne Datei zu erstellen, könnte man es wie folgt machen:

1
diff -Naru file_original file_updated > file.patch

Ein kleiner Auszug aus der Hilfe von patch:

  • -N: treat absent files as empty
  • -a: treat all files as text
  • -r: recursively compare any subdirectories found
  • -u: output NUM (default 3) lines of unified context

Ich bevorzuge die Langform. Das macht es mir einfacher Parameter auch noch nach Monaten schneller erfassen zu können:

1
diff --new-file --text --recursive --unified file_original file_updated > file.patch

Wenn man mehrere Dateien ändert, lohnt es sich, einen einzigen Patch eines ganzes Verzeichnisses zu erstellen:

1
diff -crB dir_original dir_updated > directory.patch

Und die Erklärungen aus der patch Hilfe:

  • -c: output NUM (default 3) lines of copied context
  • -r: recursively compare any subdirectories
  • -B: ignore changes whose lines are all blank

Auch hier wieder die Langform:

1
diff --context --recursive --ignore-blank-lines dir_original dir_updated > directory.patch

Und wie wendet man den Patch an?

Gute Frage!

Bringt mich jedesmal auch wieder dazu, die Suchmaschine der Wahl zu bemühen. ;)

Aber so schwer ist das ja gar nicht:

1
patch -p1 --dry-run < ${PATCHFILE}

Die lange Fassung:

1
patch --dry-run --strip 1 --input directory.patch

Beim Parameter -p bzw. --strip kommt es darauf an, wo euer patch liegt. Hier kann man auch mal eine 0 einsetzen.

--dry-run führt logischerweise den Patch nicht aus, sondern gibt euch nur aus, ob er funktionieren würde!

Wenn man auf eine Interaktion verzichten mag und sich sicher ist, dass der eigene Patch funktioniert, dann gibt man dem ganzen noch ein --batch mit.

Und da Leerzeichen auch einen Patch durcheinanderbringen können, kann man mittels --ignore-whitespace hier den großen Ignoranten mimen.

Fazit

Patchen ist nicht schwer.

Man muß nur wissen, wo man suchen muß, wenn man es mal braucht. ;)

This post is licensed under CC BY 4.0 by the author.