Signatur
Beschreibung
svn_diff() ist Teil der PECL-Erweiterung svn und ermöglicht es, zwei Pfade – entweder lokale Arbeitskopien oder Repository-URLs – in bestimmten Revisionen miteinander zu vergleichen. Das Ergebnis entspricht der Ausgabe des Kommandozeilenbefehls svn diff und zeigt hinzugefügte, geänderte und entfernte Zeilen im Unified-Diff-Format.
Die Funktion gibt ein Array mit zwei Elementen zurück: einem Stream für die eigentliche Diff-Ausgabe und einem Stream für Fehlermeldungen. Beide Streams müssen mit fread() oder ähnlichen Funktionen ausgelesen und anschließend mit fclose() geschlossen werden.
Typische Einsatzgebiete sind Code-Review-Tools, automatisierte Change-Log-Generierung oder Web-basierte SVN-Browser, die Änderungen zwischen Revisionen darstellen sollen. Die Funktion ist besonders nützlich, wenn man den Diff programmatisch verarbeiten möchte, anstatt ihn nur auf der Konsole auszugeben.
Voraussetzung ist die Installation der PECL-Erweiterung svn sowie eine erreichbare SVN-Arbeitskopie oder ein zugängliches Repository. Ohne diese Erweiterung steht die Funktion nicht zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path1 Pflicht | string | Pfad zur ersten Datei oder zum ersten Verzeichnis – entweder ein lokaler Dateisystempfad einer SVN-Arbeitskopie oder eine Repository-URL (z. B. http://example.com/svn/trunk). |
|
| $rev1 Pflicht | int | Revisionsnummer für path1. Verwende SVN_REVISION_HEAD für die neueste Revision oder SVN_REVISION_BASE für die Basisrevision der Arbeitskopie. |
|
| $path2 Pflicht | string | Pfad zur zweiten Datei oder zum zweiten Verzeichnis – entweder ein lokaler Dateisystempfad einer SVN-Arbeitskopie oder eine Repository-URL. | |
| $rev2 Pflicht | int | Revisionsnummer für path2. Verwende SVN_REVISION_HEAD für die neueste Revision oder eine konkrete Versionsnummer für eine historische Revision. |
Rückgabewert
[0] enthält einen Stream mit der Diff-Ausgabe im Unified-Diff-Format, [1] enthält einen Stream mit etwaigen Fehlermeldungen. Beide Streams müssen mit fread() ausgelesen und mit fclose() geschlossen werden. Bei einem Fehler wird false zurückgegeben.Beispiele
Diff zwischen zwei Revisionen einer Arbeitskopie ausgeben
<?php
// Vergleicht Revision 100 mit Revision 200 des Trunk
$result = svn_diff(
'http://example.com/svn/project/trunk',
100,
'http://example.com/svn/project/trunk',
200
);
if ($result === false) {
echo 'Fehler beim Ausführen des Diffs.';
} else {
[$diffStream, $errorStream] = $result;
$diff = stream_get_contents($diffStream);
$errors = stream_get_contents($errorStream);
fclose($diffStream);
fclose($errorStream);
if (!empty($errors)) {
echo 'Fehler: ' . htmlspecialchars($errors);
} else {
echo '<pre>' . htmlspecialchars($diff) . '</pre>';
}
}
Lokale Arbeitskopie mit HEAD-Revision vergleichen
<?php
// Vergleicht die lokale Arbeitskopie (BASE) mit der aktuellen HEAD-Revision
$localPath = '/var/www/project';
$result = svn_diff(
$localPath,
SVN_REVISION_BASE,
$localPath,
SVN_REVISION_HEAD
);
if ($result !== false) {
[$diffStream, $errorStream] = $result;
$diff = stream_get_contents($diffStream);
fclose($diffStream);
fclose($errorStream);
if (empty(trim($diff))) {
echo 'Keine Änderungen zwischen BASE und HEAD gefunden.';
} else {
// Diff zeilenweise verarbeiten
$lines = explode("\n", $diff);
foreach ($lines as $line) {
if (str_starts_with($line, '+')) {
echo '<span style="color:green">' . htmlspecialchars($line) . '</span><br>';
} elseif (str_starts_with($line, '-')) {
echo '<span style="color:red">' . htmlspecialchars($line) . '</span><br>';
} else {
echo htmlspecialchars($line) . '<br>';
}
}
}
}
// Wichtig · Fallstricke
Voraussetzung: Die Funktion ist nur verfügbar, wenn die PECL-Erweiterung svn installiert und geladen ist. Sie ist nicht Teil der PHP-Standardinstallation.
Stream-Management: Die zurückgegebenen Streams müssen nach der Verwendung unbedingt mit fclose() geschlossen werden, um Ressourcenlecks zu vermeiden.
Authentifizierung: Für passwortgeschützte Repositories können SVN-Konfigurationsdateien oder Umgebungsvariablen genutzt werden. Passwörter sollten niemals im Quellcode hartcodiert werden.
Performance: Bei großen Repositories oder vielen Änderungen kann die Funktion eine erhebliche Menge an Speicher und Zeit beanspruchen. Für sehr große Diffs ist eine asynchrone Verarbeitung oder ein Timeout-Mechanismus empfehlenswert.