Signatur
Beschreibung
svn_repos_fs_begin_txn_for_commit() öffnet eine neue Transaktion im Subversion-Repository-Dateisystem, die als Grundlage für einen programmatischen Commit dient. Die Transaktion wird auf Basis einer bestimmten Revision erstellt und mit Metadaten wie Autor und Log-Nachricht vorbelegt, sodass nachfolgende Änderungen am Repository-Dateisystem anschließend als atomarer Commit eingereicht werden können.
Diese Funktion gehört zur PECL-Erweiterung svn und ist besonders dann nützlich, wenn man serverseitig direkt mit einem Subversion-Repository interagieren möchte — etwa um Dateien hinzuzufügen, zu ändern oder zu löschen, ohne einen lokalen Working-Copy-Checkout zu benötigen. Das zurückgegebene Transaktions-Handle wird an weitere Funktionen wie svn_fs_txn_root() übergeben, um einen Verzeichnisbaum zu manipulieren.
Der typische Workflow besteht darin, zuerst das Repository mit svn_repos_open() zu öffnen, die aktuellste Revision mit svn_repos_fs_youngest_rev() zu ermitteln, dann mit svn_repos_fs_begin_txn_for_commit() eine Transaktion zu beginnen, Änderungen durchzuführen und diese abschließend mit svn_repos_fs_commit_txn() oder einer äquivalenten Funktion zu committen.
Hinweis: Diese Funktion ist Teil der experimentellen PECL-SVN-Erweiterung und steht nur zur Verfügung, wenn php_svn installiert und aktiviert ist. Die API kann sich zwischen Versionen ändern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $repos Pflicht | resource | Ein Repository-Handle, das zuvor mit svn_repos_open() geöffnet wurde. |
|
| $rev Pflicht | int | Die Revisionsnummer, auf der die neue Transaktion basieren soll. Üblicherweise die jüngste Revision, die mit svn_repos_fs_youngest_rev() ermittelt wird. |
|
| $author Pflicht | string | Der Benutzername des Autors, der dem Commit zugeordnet werden soll. Wird als Metadatum (svn:author) in der Transaktion gespeichert. |
|
| $log_msg Pflicht | string | Die Commit-Nachricht (Log-Message), die der Transaktion zugeordnet wird. Wird als Metadatum (svn:log) gespeichert. |
Rückgabewert
resource zurück, das für weitere Dateisystem-Operationen (z. B. svn_fs_txn_root()) verwendet werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
Neue Commit-Transaktion in einem lokalen SVN-Repository erstellen
<?php
// Repository öffnen
$reposPath = '/var/svn/myrepo';
$repos = svn_repos_open($reposPath);
if (!$repos) {
die('Repository konnte nicht geöffnet werden.');
}
// Aktuellste Revision ermitteln
$fs = svn_repos_fs($repos);
$latestRev = svn_fs_youngest_rev($fs);
// Neue Transaktion für den Commit beginnen
$txn = svn_repos_fs_begin_txn_for_commit(
$repos,
$latestRev,
'deploy-user',
'Automatischer Commit via PHP-Skript'
);
if (!$txn) {
die('Transaktion konnte nicht gestartet werden.');
}
echo "Transaktion erfolgreich gestartet auf Revision $latestRev.\n";
// Transaktions-Root für Dateisystem-Operationen holen
$txnRoot = svn_fs_txn_root($txn);
// Hier können nun Dateisystem-Operationen durchgeführt werden,
// z. B. svn_fs_make_file(), svn_fs_apply_text() usw.
// Transaktion committen
$newRev = svn_repos_fs_commit_txn($txn);
if ($newRev !== false) {
echo "Commit erfolgreich: Neue Revision $newRev erstellt.\n";
} else {
echo "Commit fehlgeschlagen.\n";
}
?>
Workflow mit Fehlerbehandlung und Datei-Anlage
<?php
$reposPath = '/var/svn/projektrepo';
$repos = svn_repos_open($reposPath);
if (!$repos) {
throw new RuntimeException('SVN-Repository konnte nicht geöffnet werden: ' . $reposPath);
}
$fs = svn_repos_fs($repos);
$latestRev = svn_fs_youngest_rev($fs);
$txn = svn_repos_fs_begin_txn_for_commit(
$repos,
$latestRev,
'ci-system',
'CI: Automatisch generierte Konfig hinzugefügt'
);
if (!$txn) {
throw new RuntimeException('Transaktion konnte nicht erstellt werden.');
}
$txnRoot = svn_fs_txn_root($txn);
// Neue Datei im Repository anlegen
svn_fs_make_file($txnRoot, 'config/auto-generated.conf');
$stream = svn_fs_apply_text($txnRoot, 'config/auto-generated.conf', null);
fwrite($stream, "# Automatisch erzeugt\nkey=value\n");
fclose($stream);
$newRev = svn_repos_fs_commit_txn($txn);
echo $newRev !== false
? "Revision $newRev erfolgreich erstellt.\n"
: "Commit-Fehler.\n";
?>
// Wichtig · Fallstricke
Experimentelle Erweiterung: Die svn-PECL-Erweiterung gilt als experimentell. Sowohl API als auch Verhalten können sich ohne Vorankündigung ändern. Sie sollte nicht in produktionskritischen Umgebungen ohne ausführliche Tests eingesetzt werden.
Berechtigungen: Das PHP-Prozess-Benutzerkonto muss Schreibzugriff auf das Subversion-Repository-Verzeichnis besitzen, da direkt auf das Dateisystem des Repositories zugegriffen wird — ohne Netzwerkprotokoll.
Transaktions-Abbruch: Wird die Transaktion nicht committet (z. B. wegen eines Fehlers), verbleibt sie als offene Transaktion im Repository. Diese sollte manuell mit svnadmin rmtxns bereinigt werden, um das Repository sauber zu halten.
Nur lokale Repositories: Diese Funktion arbeitet ausschließlich mit lokal zugänglichen Repositories über den file://-Pfad. Für Remote-Repositories via svn:// oder http:// sind andere Mechanismen notwendig.