# 4. Einen Bug in Ubuntu beheben

## 4.1. Einleitung

Wenn Du die Anweisungen in Sich für Ubuntu-Entwicklung einrichten befolgt hast, solltest Du bereit sein loszulegen.

Wie man in der obigen Abbildung sehen kann, gibt es wenig Überraschungen im Prozess der Fehlerbehebung: man findet ein Problem, lädt den Quellcode herunter, arbeitet an einer Lösung, lädt die notwendigen Änderungen nach Launchpad und bittet um einen Merge. In diesem Handbuch werden wir alle nötigen Schritte nacheinander behandeln.

## 4.2. Das Problem finden

Es gibt viele verschiedene Wege Dinge zu finden an denen man arbeiten kann. Es kann ein Fehlerbericht sein, der einen selbst betrifft (was das Testen vereinfacht), oder ein Problem, das man woanders beobachtet hat, vielleicht auch in einem Fehlerbericht.

In Harvest <http://harvest.ubuntu.com/>`_ haben wir eine Übersicht über vielfältige “TODO-Listen” die mit Ubuntu-Entwicklung zusammenhängen. Harvest listet Fehler, die in Debian oder Upstream-Projekten behoben wurden, es listet kleine Bugs (wir nennen sie ‘bitesize’) und so weiter. Schau es Dir an und finde Deinen ersten Fehler an dem Du arbeitest.

## 4.3. Herausfinden, was repariert werden muss

Wenn Du das Quellpaket, das den Fehler beinhaltet nicht kennst, aber Dir der Pfad zu dem betroffenen Programm auf Deinem System bekannt ist, dann kannst Du das Quellpaket selbst ermitteln, an dem Du arbeiten musst.

Sagen wird, du hast einen Fehler in Tomboy gefunden, einer Merkzettel-Anwendung für den Desktop. Tomboy kann mit dem Befehl `/usr/bin/tomboy` aus der Kommandozeile gestartet werden. Um das Binärpaket zu finden, welches die Anwendung enthält, verwende folgenden Befehl:

    $ apt-file find /usr/bin/tomboy

Dies gibt aus:

    tomboy: /usr/bin/tomboy

Beachte dass der Teil vor dem Doppelpunkt der Binärpaketname ist. Es ist häufig der Fall, dass das Quellpaket und Binärpaket unterschiedliche Bezeichnungen besietzen. Das tritt am häufigsten auf, wenn ein einzelnes Quellpaket dazu verwendet wird mehrere verschiedene Binärpakete zu erstellen. Um das Quellpaket eines bestimmten Binärpaketes zu finden, tippe:

    $ apt-cache showsrc tomboy | grep ^Package:
    Package: tomboy
    $ apt-cache showsrc python-vigra | grep ^Package:
    Package: libvigraimpex

`apt-cache` ist Teil der Standardinstallation von Ubuntu.

## 4.4. Den Quellcode herunterladen

Wenn Du einmal das Quellpaket kennst mit dem Du arbeitest, wirst Du eine Kopie des Codes auf deinem System brauchen, um es von Fehlern zu befreien. In der Ubuntu Entwicklungsverteilung wird dazu das Quellpaket abgezweigt. Launchpad verwaltet alle Zweige der Quellpakete in Ubuntu.

Wenn du erst einmal eine lokale Kopie des Quellpakets hast, kannst du den Fehler untersuchen, ihn beheben und die Lösung wieder zu Launchpad in Form eines Bazaar-Zweiges hochladen. Wenn du mit deiner Lösung zufrieden bist, kannst du einen Vereinigungsvorschlag einreichen, der andere Ubuntu-Entwicker auffordert deine Änderung zu überprüfen und anzunehmen. Wenn sie mit deinen Änderungen einverstanden sind, wird ein Ubuntu-Entwickler die neue Version des Pakets zu Ubuntu hochladen, sodass jeder von deiner exzellenten Lösung profitieren kann - und du ein bisschen Ansehen einheimst. Du bist jetzt schon auf dem Weg ein Ubuntu-Entwicker zu werden!

Wir werden in den folgenden Abschnitten genauer beschreiben, wie der Code abgezweigt werden kann, deine Fehlerbehebung vorangebracht wird und eine Anfrage für eine Durchsicht gestellt wird.

## 4.5. Arbeiten an einer Fehlerbehebung

Es wurden ganze Bücher darüber verfasst wie man Fehler findet, sie behebt, testet, usw. Wenn du ein Anfänger im Programmieren bist, versuche zuerst einfache Fehler wie beispielsweise in der Rechtschreibung zu beheben. Versuche die Änderungen so minimal wie möglich zu halten und dokumentiere deine Änderungen und Annahmen übersichtlich.

Bevor du dich daran machst, einen Fehler selbst du behen, solltest du sicherstellen, dass nicht schon ein anderer diesen Fehler behoben hat oder gerade daran arbeitet. Anlaufstellen dafür sind:

- Upstream (und Debian) Fehlererfassung (offene and geschlossene Fehler),

- Die Upstream-Revisionseinträge (oder eine neue Veröffentlichung) haben möglicherweise das Problem behoben,

- Fehler oder Paket-Uploads von Debian oder einer anderen Distribution

Du willst nun einen Patch entwickeln, der die Fehlerbehebung enthält. Der Befehl `edit-patch` ist eine einfache Möglichkeit um einen Patch zu einem Paket hinzuzufügen. Führe aus:

    $ edit-patch 99-new-patch

Das wird die Paketierung in temporäres Verzeichnis kopieren. Du kannst nun die Dateien mit einem Texteditor bearbeiten oder die Patches vom Upstream anwenden, zum Beispiel:

    $ patch -p1 < ../bugfix.patch

Nachdem du die Datei bearbeitet hast, schreibe `exit` oder drücke `Strg+D` um die zeitweilige Umgebung zu verlassen. Der neue Patch wird dann unter `debian/patches` eingefügt.

## 4.6. Die Lösung testen

Um ein Testpaket mit Deinen Änderungen zu bauen, durchlaufe diese Kommandos:

    $ bzr builddeb -- -S -us -uc
    $ pbuilder-dist <release> build ../<package>_<version>.dsc

Dies wird ein Quellpaket aus dem Inhalt des Zweiges (`-us -uc` bewirkt, dass die Signierung des Pakets übersprungen wird) und `pbuilder-dist` wird die Pakete aus dem Quellcode bauen, für den `release`, den Du ausgewählt hast..

Ist die Erstellung einmal gelungen, installieren Sie das Paket von `~/pbuilder/<Veröffentlichung>_result/` (mithilfe von `sudo dpkg -i <Paket>_<Version>.deb`). Dann führen Sie einen Test durch, ob der Fehler behoben wurde.

### 4.6.1. Die Lösung dokumentieren

Es ist sehr wichtig Deine Änderung ausreichend zu dokumentieren, so dass Entwickler, die sich den Code zukünftig ansehen, nicht raten müssen, was Deine Gründe und Annahmen gewesen sind. Jedes Debian- und Ubuntu-Quellpaket beinhaltet die Datei `debian/changelog`, wo die Änderungen jedes hochgeladenen Paketes dokumentiert werden.

Die einfachste Möglichkeit um zu updaten ist den Befehl auszuführen:

    $ dch -i

Dies wird eine Vorlage für einen Changelog-Eintrag für Dich erstellen, wo Du die Lücken ausfüllen kannst. Ein Beispiel dafür wäre etwa:

    specialpackage (1.2-3ubuntu4) trusty; urgency=low

      * debian/control: updated description to include frobnicator (LP: #123456)

     -- Emma Adams <emma.adams@isp.com>  Sat, 17 Jul 2010 02:53:39 +0200

`dch` sollte die erste und letzte Zeile von solch einem Änderungsprotokolleintrag bereits für dich ausgefüllt haben. Zeile 1 enthält den Quellpaketnamen, die Versionsnummer, die Ubuntu-Zielversion und die Dringlichkeit (welche meistens »low« ist). Die letzte Zeile enthält immer den Namen des Autors, E-Mail Adresse und Zeitstempel (im Format RFC 5322) der Änderung.

Wenn dieses Hindernis beseitigt ist, können wir uns auf den eigentlichen Eintrag des Änderungsprotokolles selbst konzentrieren: Es ist sehr wichtig festzuhalten:

> 1. wo die Änderungen durchgeführt wurden

> 2. was geändert wurde

> 3. wo die Diskussion zu dieser Änderung zu finden ist

In unserem (sehr dürftigen) Beispiel ist der letzte Punkt mit `(LP: #123456)` abgedeckt, was sich auf den Launchpad-Fehler 123456 bezieht. Fehlerberichte, Beiträge zu Mailing-Listen oder Spezifikationen sind allgemein gute Informationen, die als Rationale für eine Änderung angegeben werden können. Zusätzlich wird im Falle der Verwendung von `LP: #<Nummer>` der angegebene Fehler automatisch geschlossen, wenn das Paket zu Ubuntu hochgeladen wird.

### 4.6.2. Den Fix hochladen

Wenn der Eintrag im changelog geschrieben und gespeichert ist, kannst Du einfach folgendes starten:

    debcommit

und die Änderung wird mit deinem Changelog-Eintrag als Commit-Nachricht lokal committet.

Um das ganze als Zweignamen zu Launchpad hoch zu laden (push), musst Du Dich an die folgende Struktur halten.

    lp:~<yourlpid>/ubuntu/<release>/<package>/<branchname>

Dies könnte zum Beispiel sein:

    lp:~emmaadams/ubuntu/trusty/specialpackage/fix-for-123456

Also wenn Du einfach folgendes startest:

    bzr push lp:~emmaadams/ubuntu/trusty/specialpackage/fix-for-123456
    bzr lp-propose

sollte alles erledigt sein. Der Befehl push befördert es auf Launchpad und das nächste Kommando öffnet die Launchpad-Webseite mit dem Remotezweig in deinem Browser. Nach dem Klick auf den Link “(+) Propose for merging” wird die Änderung überprüft und in Ubuntu eingefügt.

Unser Artikel ueber seeking sponsorship geht mehr ins Detail darüber, wie man Feedback zu den eingestellten Änderungen erhält.

Wenn deine Arbeit an einem Entwicklungszweig Fehler in einer stabilen Version oder eine Sicherheitslücke behebt, ist es wert einen Blick auf den Artikel doc:Sicherheits- und Stabilitäts-Updates<./security-and-stable-release-updates> zu werfen.