Kontrola souboru před SVN commit
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.
Příkazová řádka
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.
TortoiseSVN
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
Spock lone wolf:
V tomhle mi jako elegantnější řešení přijde mít na localhostu nainstalované prostředí s debuggerem a odladit script rovnou jak syntakticky, tak sémanticky. Sice to dá víc práce ze začátku, ale často se to vyplatí.
Jakub:
Přesně tak, mě ani jiné řešení nenapadlo. Resp. mě ani nenapadlo, že tohle může někdo řešit podobným způsobem
Jakub Vrána
:
Ale jistě. Nicméně je dobré mít nějakou pojistku, jak se ochránit před commitem bez tohoto odladění.


Diskuse je zrušena z důvodu spamu.

