Kontrola souboru před SVN commit

Školení, která pořádám

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

Nastavení 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.

Jakub Vrána, Řešení problému, 2.9.2009, diskuse: 3 (nové: 0)

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

ikona Jakub Vrána OpenID:

Ale jistě. Nicméně je dobré mít nějakou pojistku, jak se ochránit před commitem bez tohoto odladění.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.