# Wie schreibt man einen Patch?

## ChrisJumper

Guten Tag,

ich hab gestern verzweifelt feststellen müssen das es gar nicht so leicht ist einen Patch für ein Gentoo ebuild anzulegen. Darum wollte ich nun mit euch über meine Fehler sprechen. Es wäre sehr nett wenn ihr mir sagen könntet was ich falsch gemacht habe beziehungsweise beachten muss, damit es Zukunft klappt.

Es soll in diesem Thread nicht unbedingt um das Problem gehen sondern darum wie man einen Patch erstellt der im besten Fall auch weitergegeben werden kann.

Folgende Situation:

1. Ich probiere Gnome 3.0 aus dem Layman Overlay: gnome  git : // git.overlays.gentoo.org/proj/gnome.git

2. Hier bin ich auf ein Problem gestoßen wonach sich app-text/poppler-1.16.7 nicht mehr compilieren ließ.

3. Wie in dem Thread angemerkt scheint das Problem von der pango-1.28.4 Version zu kommen. Via Google bin ich auch schon auf einen Patch gestoßen, der das Problem aber erst in späteren Versionen behebt.

4.  Eine einfache Kopie von x11-libs/pango-1.28.4 und umbenennen in x11-libs/pango-1.29.3 und dieses durch ein lokales Overlay zur Verfügung zu stellen Compilierte zwar, warf aber unsaubere Programmierung vor und nach der Installation einige Fehler auf.

Also machte ich mir die sinnfreie Arbeit die Stellen mit genauer Zeilen-Angabe relativ zur 1.28.4-Version aufzuschreiben, welche geändert werden müssen und sie von Hand in eine Datei einzutragen.

```
--- pango/fonts.c

+++ pango/fonts.c

@@ -168,1 +168,1 @@

-G_CONST_RETURN char *

+const char *

@@ -1930,1 +1930,1 @@

-G_CONST_RETURN char *

+const char *

@@ -2063,1 +2063,1 @@

-G_CONST_RETURN cahr *

+const char *
```

Natürlich funktioniert das so nicht da Portage eine maschinell erstellte Diff-Datei wünscht. Danach probierte ich eine Kopie von /var/tmp/portage/x11-libs/pango-1.28.4/work zu erstellen und dort ein rekursives Diff-Datei von den Verzeichnissen work und ein mit den vorgenommenen Änderungen work1. Das schlug aber ebenfalls fehl.

Besser wäre wohl wenn ich ein git-clone des pango-1.28.4 Repositories gemacht hätte, anschließend eine Kopie des aktuellen Verzeichnisses und in diesem dann die Änderungen vorgenommen hätte. Zuletzt dann das Patchfile mit git-diff erstelle?

Ziel soll es sein ein Patch-File zu erstellen, das Portage beim emerge-Vorgang annimmt. Wenn ich ein Modifiziertes Ebuild verwende und lediglich um eine Zeile erweitere:

```
epatch "${FILESDIR}/${PN}-1.28.4-mypango.patch"
```

Die Frage ist: Wenn ich ein ebuild mit kleinen lokalen Änderungen patchen möchte, was muss ich dabei beachten bzw. wie würdet ihr das machen?

----------

## Yamakuzure

Du kopierst die fehlerhafte Datei und korrigierts diese. Wenn du eine Datei korrigiert hast, erstellst du hiermit eine "patch"-fähige Textdatei:

```
diff -aur alte_Datei neue_Datei > patchdatei.patch
```

In der ersten Zeile korrigierst du dann noch den Pfad der Zieldatei, so das zweimal die gleiche Datei (einmal --- einmal +++) drinsteht, und schon hat epatch keine Schmerzen mehr. Wichtig ist nur, das die Pfade stimmen und relativ sind.

----------

## ChrisJumper

Danke Yamakuzure!

Jetzt hat es geklappt. Eigentlich auch logisch ich sollte so spät nicht mehr am Computer sitzen besonders wenn man mir Koffein-freien-Kaffee unter geschoben hat.

Diesmal hat es funktioniert und ich muss mich vorher wohl bei der Pfandangabe verstrickt haben.

Patch und Pango funktionieren und schon habe ich eine neue Aufgabe:

 *Quote:*   

> 
> 
> * QA Notice: Package has poor programming practices which may compile
> 
>  *            fine but exhibit random runtime failures.
> ...

 

Zu lernen wie man bessere Ebuilds schreibt.

----------

## Yamakuzure

Diese QA Notice kommt von Compiler-Warnungen, nicht vom Ebuild. Der Hinweis heißt soviel wie: "Es gibt wirklich ernstzunehmende Warnungen, aber die Entwickler haben sie bislang ignoriert!"

Ein gutes Beispiel für eine solche Warnung ist der Hinweis, dass ein Vergleich immer "wahr" oder immer "falsch" ist. Als Programmierer kann ich sagen, dass das ein sehr wichtiger Hinweis darauf ist, dass mein Code nicht das tun (dürfte), was ich beabsichtige.  :Wink: 

----------

