Při posílání souborů do SVN repozitáře chci provést nějakou jejich základní kontrolu, u PHP skriptů konkrétně kontrolu syntaktické správnosti. Ideálně se k tomu hodí hooky na straně serveru, hostuji ale na SourceForge, kde je jejich podpora omezená. Musím se tedy spokojit s hooky na straně klienta, což má ale zase tu výhodu, že se kvůli nim nemusí komunikovat se serverem.
Z příkazové řádky jsem podporu vyřešil tak, že místo svn commit
spouštím skript, který soubory ověří a pokud jsou v pořádku, tak svn commit
zavolá sám.
<?php function svn_check($filename) { if (pathinfo($filename, PATHINFO_EXTENSION) == "php") { exec("php -l $filename", $output, $return); if ($return) { echo implode("\n", $output) . "\n"; exit($return); } } } $filename = $_SERVER["argv"][$_SERVER["argc"] - 1]; if (is_dir($filename)) { exec("svn status $filename", $output, $return); foreach ($output as $line) { if (preg_match('~^[AMR]......(.+)~', $line, $match)) { svn_check($match[1]); } } } else { svn_check($filename); } unset($_SERVER["argv"][0]); passthru('svn commit "' . implode('" "', $_SERVER["argv"]) . '"'); ?>
Pokud skript dostane adresář, tak na něj zavolá svn status
, čímž zjistí změněné soubory, takže se nemusí kontrolovat všechny. Škoda, že přímo v PHP není funkce pro kontrolu syntaxe souboru.
V TortoiseSVN, které na některé úlohy používám, je nastavení klientského skriptu jednodušší. Stačí zadat skript, který se před commitem spustí. Ten dostane název souboru se všemi změněnými soubory. Tyto soubory pak už jen stačí zkontrolovat:
<?php foreach (file($_SERVER["argv"][1]) as $line) { svn_check(trim($line)); } ?>
Výpis chybové hlášky mi bohužel nefunguje, takže i když dojde k chybě, tak ji TortoiseSVN nevypíše.
Diskuse je zrušena z důvodu spamu.