Start · Sprachen · PHP · Referenz · svn_log

svn_log

Funktion

Gibt die Commit-Log-Nachrichten einer Subversion-Repository-URL als Array zurück.

Kategorie: misc

Signatur

svn_log(string $repos_url, int $start_revision = SVN_REVISION_HEAD, int $end_revision = SVN_REVISION_INITIAL, int $limit = 0, int $flags = SVN_DISCOVER_CHANGED_PATHS | SVN_STOP_ON_COPY): array|false

Beschreibung

svn_log() liest die Commit-Historik (Revisions-Logs) eines Subversion-Repositories oder eines bestimmten Pfades darin und gibt sie als strukturiertes PHP-Array zurück. Jeder Eintrag enthält die Revisionsnummer, den Autor, den Zeitstempel, die Log-Nachricht sowie optional die Liste der geänderten Pfade.

Die Funktion ist Teil der PECL-Erweiterung svn und eignet sich besonders, wenn Deployment-Systeme, CI-Pipelines oder Verwaltungsoberflächen Informationen zur Versionshistorie direkt aus einem SVN-Repository beziehen sollen, ohne externe Prozesse starten zu müssen.

Mit den Parametern start_revision und end_revision kann ein Revisionsbereich eingegrenzt werden. Die Konstanten SVN_REVISION_HEAD (neueste Revision) und SVN_REVISION_INITIAL (erste Revision) erleichtern die Angabe typischer Bereiche. Über limit lässt sich die maximale Anzahl zurückgegebener Einträge begrenzen.

Das Flag SVN_DISCOVER_CHANGED_PATHS sorgt dafür, dass jeder Log-Eintrag auch die betroffenen Dateipfade enthält; SVN_STOP_ON_COPY unterbricht die Suche, sobald ein Kopier-Ursprung gefunden wird, was in vielen Szenarien (z. B. Branch-Logs) das gewünschte Verhalten ist.

Parameter

Name Typ Default Beschreibung
$repos_url Pflicht string Die vollständige URL des Subversion-Repositories oder eines Pfades darin, z. B. svn+ssh://svn.example.com/repo/trunk oder file:///var/svn/myrepo.
$start_revision int SVN_REVISION_HEAD Die Revision, bei der die Log-Abfrage beginnt. Standardmäßig SVN_REVISION_HEAD (aktuellste Revision). Kann auch eine konkrete Revisionsnummer sein.
$end_revision int SVN_REVISION_INITIAL Die Revision, bei der die Log-Abfrage endet. Standardmäßig SVN_REVISION_INITIAL (erste Revision des Repositories). Damit wird standardmäßig die gesamte Historie abgerufen.
$limit int 0 Maximale Anzahl der zurückgegebenen Log-Einträge. Der Wert 0 bedeutet kein Limit.
$flags int SVN_DISCOVER_CHANGED_PATHS | SVN_STOP_ON_COPY Bitmaske aus Konstanten wie SVN_DISCOVER_CHANGED_PATHS (geänderte Pfade einschließen) und SVN_STOP_ON_COPY (bei Kopieroperationen anhalten). Beide sind standardmäßig aktiv.

Rückgabewert

Typ
array|false
Beschreibung

Bei Erfolg ein numerisch indiziertes Array von Log-Einträgen. Jeder Eintrag ist ein assoziatives Array mit folgenden Schlüsseln:

  • rev (int) – Revisionsnummer
  • author (string) – Benutzername des Committers
  • msg (string) – Commit-Nachricht
  • date (string) – Datum/Uhrzeit des Commits im ISO-8601-Format
  • paths (array, optional) – Liste der geänderten Pfade mit den Schlüsseln action, path, copyfrom und copyrev (wenn SVN_DISCOVER_CHANGED_PATHS gesetzt ist)

Bei einem Fehler wird false zurückgegeben.

Beispiele

Letzte 5 Commit-Log-Einträge eines Repositories abrufen

<?php
// Letzte 5 Commits aus dem Trunk eines SVN-Repositories laden
$logs = svn_log('svn+ssh://svn.example.com/repo/trunk', SVN_REVISION_HEAD, SVN_REVISION_INITIAL, 5);

if ($logs === false) {
    echo 'Fehler beim Abrufen der Logs.';
} else {
    foreach ($logs as $entry) {
        printf(
            "Rev %d | %s | %s\nNachricht: %s\n\n",
            $entry['rev'],
            $entry['author'],
            $entry['date'],
            $entry['msg']
        );
    }
}
Rev 42 | jdoe | 2024-03-15T10:23:00.000000Z Nachricht: Bugfix im Login-Formular Rev 41 | asmith | 2024-03-14T08:11:00.000000Z Nachricht: Feature: Passwort-Reset implementiert ...

Geänderte Dateipfade eines bestimmten Revisionsbereichs anzeigen

<?php
// Logs für Revisionen 100 bis 110 inklusive geänderter Pfade abrufen
$logs = svn_log(
    'file:///var/svn/myrepo/trunk',
    110,
    100,
    0,
    SVN_DISCOVER_CHANGED_PATHS
);

if ($logs === false) {
    echo 'Fehler.';
} else {
    foreach ($logs as $entry) {
        echo "Rev {$entry['rev']} von {$entry['author']}: {$entry['msg']}\n";
        if (!empty($entry['paths'])) {
            foreach ($entry['paths'] as $path) {
                echo "  [{$path['action']}] {$path['path']}\n";
            }
        }
        echo "\n";
    }
}
Rev 110 von jdoe: Refactoring Controller [M] /trunk/src/Controller/UserController.php [A] /trunk/src/Controller/AuthController.php Rev 109 von asmith: Konfiguration angepasst [M] /trunk/config/settings.php ...

// Wichtig · Fallstricke

Voraussetzung: Die PECL-Erweiterung svn muss installiert und in der php.ini aktiviert sein (extension=svn). Sie ist nicht Teil der Standard-PHP-Distribution.

Authentifizierung: Für passwortgeschützte Repositories kann svn_auth_set_parameter() verwendet werden, um Benutzernamen und Passwort vorab zu setzen. Zugangsdaten sollten niemals fest im Quellcode hinterlegt werden.

Performance: Bei großen Repositories ohne limit-Begrenzung kann der Abruf der gesamten Historie sehr lange dauern und viel Speicher verbrauchen. Es empfiehlt sich, limit stets auf einen sinnvollen Wert zu setzen.

Fehlerbehandlung: Bei ungültiger URL, Netzwerkproblemen oder fehlenden Berechtigungen gibt die Funktion false zurück. Eine Fehlerursache lässt sich über svn_last_error() ermitteln.