---
title: Kapitel 10. Einen existierenden Port aktualisieren
prev: books/porters-handbook/testing
next: books/porters-handbook/security
showBookMenu: true
weight: 10
params:
  path: "/books/porters-handbook/port-upgrading/"
---

[[port-upgrading]]
= Einen existierenden Port aktualisieren
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 10
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

Wenn Sie feststellen, dass ein Port verglichen mit der neuesten Version des Originalautors nicht mehr auf dem aktuellen Stand ist, sollten Sie als Erstes sicherstellen, dass Sie die aktuellste Version des Ports haben. Diese finden Sie im Verzeichnis [.filename]#ports/ports-current# der FreeBSD FTP-Spiegelseiten. Wenn Sie allerdings mit mehr als ein paar Ports arbeiten, werden Sie es wahrscheinlich einfacher finden CVSup zu benutzen, um Ihre gesamte Ports-Sammlung aktuell zu halten, wie es im extref:{handbook}[Handbuch, CVSUP-CONFIG] beschrieben wird. Das hat zusätzlich den Vorteil, dass Sie so auch alle Abhängigkeiten des Ports aktuell halten.

Der nächste Schritt besteht darin festzustellen, ob bereits eine Aktualisierung des Ports darauf wartet committet zu werden. Um das sicherzustellen haben Sie folgende Möglichkeiten. Es gibt eine durchsuchbare Schnittstelle zur http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[FreeBSD Problembericht Datenbank (PR - Problem Report)] (auch bekannt als `GNATS`). Wählen Sie dazu `Ports` im Drop-Down-Menü und geben Sie den Namen des Ports ein.

Allerdings wird manchmal vergessen den Namen des Ports eindeutig im Feld für die Zusammenfassung anzugeben. In diesem Fall können Sie das <<portsmon,FreeBSD Ports Monitoring System>> (auch bekannt als `portsmon`) nutzen. Dieses versucht PRs von Ports nach Portname zu sortieren. Um PRs nach einem bestimmten Port zu durchsuchen können Sie die http://portsmon.FreeBSD.org/portoverview.py[Übersicht eines Ports] verwenden.

Wenn es keine wartenden PRs gibt, ist der nächste Schritt eine E-Mail an den Maintainer des Ports zu schicken, wie von `make maintainer` gezeigt wird. Diese Person arbeitet vielleicht schon an einer Aktualisierung, oder hat einen guten Grund den Port im Moment nicht zu aktualisieren (z.B. wegen Stabilitätsproblemen der neuen Version). Sie wollen sicher nicht die Arbeit des Maintainers doppelt machen. Beachten Sie bitte, dass für Ports ohne Maintainer `ports@FreeBSD.org` eingetragen ist. Das ist nur die allgemeine {freebsd-ports}-Mailingliste, deshalb wird es in diesem Fall wahrscheinlich nicht helfen eine E-Mail dorthin zu schicken.

Wenn Sie der Maintainer bittet die Aktualisierung zu erledigen, oder falls es keinen Maintainer gibt, haben Sie Gelegenheit, FreeBSD zu helfen, indem Sie die Aktualisierung selbst bereitstellen. Dazu verwenden Sie man:diff[1], das bereits im Basissystem enthalten ist.

Um einen brauchbaren `diff` für einen einzelne Datei zu erstellen, kopieren Sie die zu patchende Datei nach _dateiname.orig_ und speichern Ihre Änderungen in die Datei _dateiname_. Danach erzeugen Sie den Patch:

[source,shell]
....
% /usr/bin/diff dateiname.orig dateiname > dateiname.diff
....

Soll mehr als eine Datei gepatcht werden, können Sie entweder `cvs diff` verwenden (siehe dazu <<cvs-diff>>) oder Sie kopieren den kompletten Port in ein neues Verzeichnis und speichern die Ausgabe des rekursiven man:diff[1] auf das neue und alte Portverzeichniss (wenn Ihr verändertes Portverzeichnis z.B. [.filename]#superedit# und das Original [.filename]#superedit.bak# heißt, dann speichern Sie bitte die Ergebnisse von `diff -ruN superedit.bak superedit`). Sowohl vereinheitlichendes als auch kontextabhängiges diff (Auflistung der Unterschiede zweier Dateien) sind akzeptabel, aber im Allgemeinen bevorzugen Port-Committer vereinheitlichende ``diff``s. Bitte beachten Sie die Verwendung der ``-N``-Option. Dies ist der gebräuchliche Weg `diff` dazu zu bewegen korrekt damit umzugehen, neue Dateien anzulegen und alte zu löschen. Bevor Sie das diff einsenden überprüfen Sie bitte die Ausgabe, um sicherzugehen, dass die Änderungen sinnvoll sind. Stellen Sie insbesondere sicher, dass Sie das Arbeitsverzeichnis mit `make clean` aufgerät haben).

Um gängige Operationen mit Korrekturdateien zu vereinfachen, können Sie [.filename]#/usr/ports/Tools/scripts/patchtool.py# benutzen. Aber lesen Sie bitte vorher [.filename]#/usr/ports/Tools/scripts/README.patchtool#.

Falls der Port keinen Maintainer hat und Sie ihn selbst aktiv benutzen, ziehen Sie bitte in Erwägung sich als Maintainer zu melden. FreeBSD hat mehr als 4000 Ports ohne Maintainer und in diesem Bereich werden immer zusätzliche Freiwillige benötigt (Für eine ausführliche Beschreibung der Verantwortlichkeiten eines Maintainers lesen Sie bitte im extref:{developers-handbook}[Developer's Handbook, POLICIES-MAINTAINER] nach).

Der beste Weg uns das diff zu schicken ist mittels man:send-pr[1] (Kategorie Ports). Wenn Sie der Maintainer des Ports sind, fügen Sie bitte `[maintainer update]` an den Anfang Ihrer Zusammenfassung und setzen Sie die "Klasse" des PR auf `maintainer-update`. Ansonsten sollte die "Klasse" des PR `change-request` sein. Bitte erwähnen Sie alle hinzugefügten oder gelöschten Dateien in der Nachricht, da diese beim Commit ausdrücklich an man:cvs[1] übergeben werden müssen. Wenn das diff größer ist als 20 Kilobyte komprimieren und uuencoden Sie es bitte. Ansonsten können Sie es in den PR einfügen wie es ist.

Bevor Sie den PR mit man:send-pr[1] abschicken, sollten Sie den Abschnitt extref:{problem-reports}[Den Problembericht schreiben, pr-writing] im Artikel über Problemberichte lesen. Dieser enthält sehr viel mehr Informationen darüber, wie man nützliche Problemberichte verfasst.

[IMPORTANT]
====
Wenn Sie Ihre Aktualisierung aufgrund von Sicherheitsbedenken oder eines schwerwiegenden Fehlers bereitstellen wollen, informieren Sie bitte das {portmgr}, um einen sofortigen Rebuild und eine Neuverteilung des Pakets Ihres Ports durchzuführen. Sonst werden ahnungslose Nutzer von man:pkg_add[1] über mehrere Wochen die alte Version durch `pkg_add -r` installieren.
====

[NOTE]
====
Noch einmal: Bitte verwenden Sie man:diff[1] und nicht man:shar[1], um Aktualisierungen existierender Ports zu senden. Sie erleichtern es damit den Ports-Committern, Ihre Änderungen nachzuvollziehen.
====

Nun, da Sie all das geschafft haben, können Sie in crossref:keeping-up[keeping-up, Auf dem Laufenden bleiben] nachlesen, wie Sie den Port aktuell halten.

[[cvs-diff]]
== Patches mit CVS erstellen

Wenn möglich, sollten Sie stets eine man:cvs[1]-Differenz einreichen. Diese sind leichter zu bearbeiten als Differenzen zwischen "neuen und alten" Verzeichnissen. Außerdem könenn Sie so einfacher feststellen, welche Änderungen Sie vorgenommen haben oder Ihren Patch modifizieren, falls dies durch Änderungen in einem anderen Bereich der Ports-Sammlung notwendig wird oder Sie vom Committer um eine Korrektur Ihres Patches gebeten werden.

[source,shell]
....
% cd ~/my_wrkdir <.>
% cvs -d R_CVSROOT co pdnsd <.> <.>
% cd ~/my_wrkdir/pdnsd
....

<.> Das Verzeichnis, in dem Sie den Port bauen wollen. Dieses Arbeitsverzeichnis kann sich auch außerhalb von [.filename]#/usr/ports/# befinden.

<.> R_CVSROOT steht für einen öffentlichen CVS-Server. Eine Liste aller verfügbaren Server finden Sie im extref:{handbook}[FreeBSD Handbuch, cvsup].

<.> Ersetzen Sie "pdnsd" durch den Modulnamen des Ports. Dieser entspricht in der Regel dem Namen des Ports. Allerdings gibt es einige Ausnahmen von dieser Regel, insbesondere bei sprachspezifischen Ports (beispielsweise lautet der Modulname für den Port package:german/selfhtml[] de-selfhtml). Um den Namen des Moduls herauszufinden, können Sie entweder die link:https://www.FreeBSD.org/cgi/cvsweb.cgi/ports[cvsweb-Schnittstelle] verwenden oder den kompletten Pfad des Ports angeben (in unserem Beispiel wäre der komplette Pfad also [.filename]#ports/dns/pdnsd#).

Danach modifizieren Sie den Port in gewohnter Weise. Falls Sie Dateien hinzufügen oder entfernen, sollten Sie dies mit `cvs` protokollieren:

[source,shell]
....
% cvs add new_file
% cvs remove deleted_file
....

Überprüfen Sie die Funktion Ihres Ports anhand der Checklisten in crossref:quick-porting[porting-testing, Den Port testen] und crossref:quick-porting[porting-portlint,Ihren Port mit `portlint` überprüfen].

[source,shell]
....
% cvs status
% cvs update <.>
....

<.> Dadurch wird versucht, die Differenz zwischen Ihrer geänderten Version und dem aktuellen Stand im CVS zu kombinieren. Achten Sie dabei unbedingt auf die Ausgabe dieses Befehls. Vor jeder Datei wird ein Buchstabe angezeigt, der Ihnen mitteilt, was mit dieser Datei passiert ist. Eine vollständige Liste dieser Präfixe finden Sie in <<table-cvs-up>>.

[[table-cvs-up]]
.Von cvs update verwendete Präfixe
[cols="1,1", frame="none"]
|===
|U
|Die Datei wurde aktualisiert. Es traten dabei keine Probleme auf.

|P
|Die Datei wurde ohne Probleme aktualisiert (dieses Präfix wird nur verwendet, wenn Sie mit einem entfernten Repository arbeiten).

|M
|Die Datei wurde modifiziert. Es traten keine Konflikte auf.

|C
|Die Datei wurde modifiziert, allerdings kam es dabei zu Konflikten zwischen Ihrer geänderten Version und der aktuellen Version im CVS.
|===

Wird das Präfix `C` nach einem `cvs update` angezeigt, bedeutet dies, dass im CVS etwas geändert wurde und man:cvs[1] daher nicht in der Lage war, Ihre Änderungen und die Änderungen im CVS zu kombinieren. Es ist immer sinnvoll, sich die Änderungen anzusehen, da `cvs` keine Informationen darüber hat, wie ein Port aufgebaut sein soll. Es kann (und wird wahrscheinlich) daher vorkommen, dass sich manchmal Änderungen ergeben, die keinen Sinn machen.

Im letzten Schritt erzeugen Sie einen "unified man:diff[1]" gegen die derzeit im CVS vorhandenen Dateien:

[source,shell]
....
% cvs diff -uN > ../`basename ${PWD}`.diff
....

[NOTE]
====
Verwenden Sie unbedingt die Option `-N`, um sicherzustellen, dass von hinzugefügte oder gelöschte Dateien im Patch erfasst sind. Der Patch enthät auch von Ihnen gelöschte Dateien (allerdings ohne Inhalt). Dies ist wichtig, da nur so der Committer wissen kann, welche Dateien er entfernen muss.
====

Zuletzt reichen Sie Ihren Patch ein, indem Sie der Anleitung in <<port-upgrading>> folgen.

[[moved-and-updating-files]]
== Die Dateien UPDATING und MOVED

Wenn die Aktualisierung des Ports spezielle Schritte wie die Anpassung von Konfigurationsdateien oder die Ausführung eines speziellen Programms erfordert, sollten Sie diesen Umstand in der Datei [.filename]#/usr/ports/UPDATING# dokumentieren. Einträge in dieser Datei haben das folgende Format:

[.programlisting]
....
YYYYMMDD:
  AFFECTS: users of portcategory/portname
  AUTHOR: Your name <Your email address>

  Special instructions
....

Wenn Sie exakte Portmaster oder Portupgrade-Meldungen einfügen wollen, stellen Sie bitte sicher, dass alle Sonderzeichen korrekt dargestellt werden.

Wurde der Port gelöscht oder umbenannt, sollten Sie dies in der Datei [.filename]#/usr/ports/MOVED# vermerken. Einträge in dieser Datei haben das folgende Format:

[.programlisting]
....
old name|new name (blank for deleted)|date of move|reason
....
