Start · Sprachen · PHP · Referenz · svn_diff

svn_diff

Funktion

Vergleicht zwei Pfade oder Revisionen eines SVN-Repositorys rekursiv und gibt die Differenz (Diff) als Streams zurück.

seit PHP 0.1.0 Kategorie: misc

Signatur

svn_diff(string $path1, int $rev1, string $path2, int $rev2): array|false

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

Typ
array|false
Beschreibung
Bei Erfolg ein indiziertes Array mit zwei Ressourcen: [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>';
    }
}
Index: src/MyClass.php =================================================================== --- src/MyClass.php (revision 100) +++ src/MyClass.php (revision 200) @@ -10,7 +10,7 @@ - private $name; + private string $name;

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.