29

Jui

2011

gForge pre commit hook pour fichier php PDF Imprimer Envoyer

Faire une vérification des fichiers PHP via le Commit Hook dans gForge

Voici un petit tutorial pour faire un filtre qui va tester les fichiers commit et les refuser si ce ne sont pas des php valide.

Fait avec la version de gForge AS 5.5

 

Avec le compte administrateur de gForge, aller dans "Admin/Plugins/SCM commit Filters"
gforge_svn_hook1

Cliquez sur "add new"
gforge_svn_hook2

Bien coché le "filter for" pour SVN :

gforge_svn_hook3


La description est celle que vous voulez donner au filtre.
Pour la commande on va avoir besoin de $PATH qui donne le chemin du dépôt et de $FILE qui dans le cas du pré commit renvois l’id de la transaction.

Dans le cas présent j’ai chargé le fichier au même emplacement que ceux d’origine, à savoir :

/opt/gforge5/plugins/scmsvn/bin/

L'url complète de la commande est donc :
/opt/gforge5/plugins/scmsvn/bin/svn_php_precommit_gforge.php $PATH $FILE

 

Cliquez sur "add" vous devriez avoir plus ou moins ceci :
gforge_svn_hook4


Maintenant il faut aller dans tous les projets concernés cocher la case pour activer le filtre :
C’est un peu caché, il faut aller dans "SVN / Admin / Edit commit filter" :
gforge_svn_hook5

 

* l'application se fait en cron, les changements ne sont donc pas immédiats.

 

Voici mon fichier "svn_php_precommit_gforge.php":


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#!/usr/bin/php
<?php
/**
 * Test les fichiers PHP qui vont etre commit
 *
 * Command: "/opt/gforge5/plugins/scmsvn/bin/svn_php_precommit_gforge.php $PATH $FILE"
 *
 * @version   $Id$
 * @author Vlyan (www.vlyan.com)
 */
 
// + + + FUNCTIONS + + +
/**
 * Everything must be written to stderr
 * @param  String $sError
 * @return Bool
 */
function log_error($sError) {
    return file_put_contents("php://stderr", $sError);
}
 
/**
 * Shell cmd
 * @param  String $sCmd
 * @param  Array  $aOutput
 * @return Int
 */
function execute($sCmd, &$aOutput) {
    $iRetval = 0;
    exec($sCmd, $aOutput, $iRetval);
    return $iRetval;
}
// + + + End Functions + + +
 
 
// arg count
if (!isset($argv[1]) || !isset($argv[2])) {
    log_error('Usage: '.basename(__FILE__).' <repository path> <transaction id> : argv='.var_export($argv, true));
    exit(1);
}
 
// Path to binaries
$sSvnPath = dirname(`which svn`);
$sSvnLook = $sSvnPath.'/svnlook';
$sPhp     = trim(`which php`);
 
if (empty($sSvnPath) || empty($sPhp)) {
    log_error("Error while fetching paths: SvnPath='$sSvnPath', Php='$sPhp'");
    exit(1);
}
 
$sRepoPath = $argv[1];
$sTransId  = $argv[2];
 
// modified files
$aFiles = array();
$iExec  = execute($sSvnLook.' changed -t "'.$sTransId.'" "'.$sRepoPath.'" | cut -b 5-', $aFiles);
 
if (empty($aFiles)) {
    log_error('Files not found : aFiles='.var_export($aFiles, true));
    exit(1);
}
 
// for each file
foreach($aFiles as $sFile) {
    // check only php file
    if (substr($sFile, -4) == '.php') {
        $aOut  = array();
        $iExec = execute($sSvnLook.' cat -t "'.$sTransId.'" "'.$sRepoPath.'" "'.$sFile.'" | '.$sPhp.' -l', $aOut);
        if ($iExec != 0) {
            // exit if code is not zero, cancel commit
            log_error("Transaction cancelled: Errors found in file '$sFile'.\n".var_export($aOut, true));
            exit(1);
        }
    }
}
 
// ok
exit(0);
 

 


 
French (Fr)English (United Kingdom)
oct.11

Interface personnalisée

Left4Run 1.0.1
avr.09

Lanceur graphique pour Left4Dead

nov.08

Lanceur graphique pour les serveurs DoL.

nov.08

Programme alternatif au ComponentChooser pour les personnes ayant le .net et ne voulant pas insta...