Start · Sprachen · PHP · Referenz · svn_fs_apply_text

svn_fs_apply_text

Funktion

Erstellt einen beschreibbaren Stream, über den der Inhalt einer Datei im Subversion-Dateisystem ersetzt werden kann.

Kategorie: misc

Signatur

svn_fs_apply_text(resource $root, string $path, string $result_pool): resource|false

Beschreibung

svn_fs_apply_text() öffnet einen beschreibbaren Stream auf eine Datei innerhalb eines Subversion-Dateisystem-Transaktions-Roots. Der zurückgegebene Stream kann verwendet werden, um den vollständigen Inhalt der angegebenen Datei zu überschreiben. Dies ist der übliche Weg, um Dateiinhalte programmatisch in einer SVN-Transaktion zu ersetzen.

Die Funktion gehört zu den Low-Level-Funktionen der SVN-Dateisystem-API (svn_fs_*) und wird typischerweise im Zusammenspiel mit svn_repos_fs_begin_txn_for_commit() und svn_fs_txn_root() eingesetzt, um Änderungen an einem Repository vorzunehmen, bevor diese mit svn_repos_fs_commit_txn() übernommen werden.

Der zurückgegebene Stream ist ein normales PHP-Stream-Resource, auf das mit Standard-Stream-Funktionen wie fwrite() oder stream_copy_to_stream() geschrieben werden kann. Nach dem Schreiben sollte der Stream mit fclose() geschlossen werden, um sicherzustellen, dass alle Daten korrekt übertragen wurden.

Diese Funktion ist nur verfügbar, wenn die PECL-Erweiterung svn installiert ist und setzt ein beschreibbares Transaktions-Root voraus – ein Read-only-Root (z. B. aus svn_fs_revision_root()) ist nicht geeignet.

Parameter

Name Typ Default Beschreibung
$root Pflicht resource Ein Transaktions-Root-Resource, das mit svn_fs_txn_root() erzeugt wurde. Muss beschreibbar sein.
$path Pflicht string Der absolute Pfad der Datei innerhalb des Repositories, deren Inhalt ersetzt werden soll, z. B. /trunk/src/index.php.
$result_pool Pflicht string Der APR-Speicherpool, der für die Operation verwendet wird. In den meisten PHP-Bindungen wird hier ein leerer String '' übergeben.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt eine Stream-Resource zurück, in die der neue Dateiinhalt geschrieben werden kann. Bei einem Fehler (z. B. ungültiger Pfad oder Read-only-Root) wird false zurückgegeben.

Beispiele

Dateiinhalt in einer SVN-Transaktion ersetzen

<?php
// Repository öffnen
$repos = svn_repos_open('/var/svn/myrepo');
$fs    = svn_repos_fs($repos);

// Aktuelle Revision ermitteln
$latestRev = svn_fs_youngest_rev($fs);

// Neue Transaktion starten
$txn  = svn_repos_fs_begin_txn_for_commit($repos, $latestRev, 'autor', 'Dateiinhalt aktualisiert');
$root = svn_fs_txn_root($txn);

// Stream auf die zu ersetzende Datei öffnen
$stream = svn_fs_apply_text($root, '/trunk/README.txt', '');

if ($stream === false) {
    die('Fehler: Stream konnte nicht geöffnet werden.');
}

// Neuen Inhalt schreiben
fwrite($stream, "Neuer Inhalt der README-Datei.\nStand: " . date('Y-m-d') . "\n");
fclose($stream);

// Transaktion committen
$newRev = svn_repos_fs_commit_txn($txn);
echo "Committed als Revision: $newRev\n";
?>
Committed als Revision: 42

Lokale Datei in das Repository hochladen

<?php
$repos = svn_repos_open('/var/svn/myrepo');
$fs    = svn_repos_fs($repos);
$txn   = svn_repos_fs_begin_txn_for_commit(
    $repos,
    svn_fs_youngest_rev($fs),
    'deploy-script',
    'Automatisches Deployment'
);
$root = svn_fs_txn_root($txn);

// Lokale Quelldatei öffnen
$localFile = fopen('/tmp/build/app.js', 'rb');

// SVN-Stream für Zieldatei öffnen
$svnStream = svn_fs_apply_text($root, '/trunk/public/app.js', '');

if ($localFile && $svnStream) {
    stream_copy_to_stream($localFile, $svnStream);
    fclose($localFile);
    fclose($svnStream);
    $rev = svn_repos_fs_commit_txn($txn);
    echo "Datei als Revision $rev eingecheckt.\n";
} else {
    echo "Fehler beim Öffnen der Streams.\n";
}
?>
Datei als Revision 43 eingecheckt.

// Wichtig · Fallstricke

Voraussetzungen: Die PECL-Erweiterung svn muss installiert und geladen sein. Die Funktion steht nur zur Verfügung, wenn PHP mit SVN-Unterstützung kompiliert wurde.

Nur für Transaktions-Roots: svn_fs_apply_text() funktioniert ausschließlich mit einem beschreibbaren Transaktions-Root. Der Versuch, ein Revisions-Root (aus svn_fs_revision_root()) zu verwenden, schlägt fehl.

Datei muss existieren: Die Datei am angegebenen Pfad muss bereits im Repository vorhanden sein. Um eine neue Datei anzulegen, muss vorher svn_fs_make_file() aufgerufen werden.

Vollständiger Ersatz: Der Stream überschreibt den gesamten bisherigen Dateiinhalt. Ein teilweises Schreiben (Append) ist nicht möglich – es muss immer der vollständige neue Inhalt geschrieben werden.