2013-01-31 8 views
5

Sto utilizzando i ganci di precommit SVN per convalidare il mio codice standard (PSR2) prima di poter eseguire il commit. Funziona perfettamente con una sola eccezione. I miei file test unitari (PHPUnit) esistono della mia classe bootstrap esistente di tutte le funzioni di test delle unità statiche, ma abilitano anche i messaggi di errore sopra la definizione della classe bootstrap.Consenti il ​​commit SVN con gli avvisi del gancio preCommit esistenti

Lo standard PSR2 fornirà un avviso quando si tenta di eseguire il commit, poiché non è possibile avere codice che non si trova in una classe o funzione in un file che contiene una definizione di classe.

Qualcuno ha un modo per escludere questo errore nel mio codesniffer o un modo per rendere valido il mio codice (senza inserire il codice per abilitare i miei messaggi di errore in ogni funzione statica della classe bootstrap)?

Ecco il file:

<?php 
namespace AlbumTest; 

use Zend\Loader\AutoloaderFactory; 
use Zend\Mvc\Service\ServiceManagerConfig; 
use Zend\ServiceManager\ServiceManager; 
use Zend\Stdlib\ArrayUtils; 
use RuntimeException; 

error_reporting(E_ALL | E_STRICT); 
chdir(__DIR__); 

class Bootstrap 
{ 
    protected static $serviceManager; 
    protected static $config; 
    protected static $bootstrap; 

    public static function init() 
    { 
     // Load the user-defined test configuration file, if it exists; otherwise, load 
     if (is_readable(__DIR__ . '/TestConfig.php')) { 
      $testConfig = include __DIR__ . '/TestConfig.php'; 
     } else { 
      $testConfig = include __DIR__ . '/TestConfig.php.dist'; 
     } 

     $zf2ModulePaths = array(); 

     if (isset($testConfig['module_listener_options']['module_paths'])) { 
      $modulePaths = $testConfig['module_listener_options']['module_paths']; 
      foreach ($modulePaths as $modulePath) { 
       if (($path = static::findParentPath($modulePath))) { 
        $zf2ModulePaths[] = $path; 
       } 
      } 
     } 

     $zf2ModulePaths = implode(PATH_SEPARATOR, $zf2ModulePaths) . PATH_SEPARATOR; 
     $zf2ModulePaths .= getenv('ZF2_MODULES_TEST_PATHS') ?: (defined('ZF2_MODULES_TEST_PATHS') 
                  ? ZF2_MODULES_TEST_PATHS : ''); 

     static::initAutoloader(); 

     // use ModuleManager to load this module and it's dependencies 
     $baseConfig = array(
      'module_listener_options' => array(
       'module_paths' => explode(PATH_SEPARATOR, $zf2ModulePaths), 
      ), 
     ); 

     $config = ArrayUtils::merge($baseConfig, $testConfig); 

     $serviceManager = new ServiceManager(new ServiceManagerConfig()); 
     $serviceManager->setService('ApplicationConfig', $config); 
     $serviceManager->get('ModuleManager')->loadModules(); 

     static::$serviceManager = $serviceManager; 
     static::$config = $config; 
    } 

    public static function getServiceManager() 
    { 
     return static::$serviceManager; 
    } 

    public static function getConfig() 
    { 
     return static::$config; 
    } 

    protected static function initAutoloader() 
    { 
     $vendorPath = static::findParentPath('vendor'); 

     if (is_readable($vendorPath . '/autoload.php')) { 
      $loader = include $vendorPath . '/autoload.php'; 
     } else { 
      $zf2Path = getenv('ZF2_PATH') ?: (defined('ZF2_PATH') 
              ? ZF2_PATH : (is_dir($vendorPath . '/ZF2/library') 
              ? $vendorPath . '/ZF2/library' : false)); 

      if (!$zf2Path) { 
       throw new RuntimeException(
        'Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.' 
       ); 
      } 

      include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; 

     } 

     AutoloaderFactory::factory(
      array(
       'Zend\Loader\StandardAutoloader' => array(
        'autoregister_zf' => true, 
        'namespaces' => array(
         __NAMESPACE__ => __DIR__ . '/' . __NAMESPACE__, 
        ), 
       ), 
      ) 
     ); 
    } 

    protected static function findParentPath($path) 
    { 
     $dir = __DIR__; 
     $previousDir = '.'; 
     while (!is_dir($dir . '/' . $path)) { 
      $dir = dirname($dir); 
      if ($previousDir === $dir) { 
       return false; 
      } 
      $previousDir = $dir; 
     } 
     return $dir . '/' . $path; 
    } 
} 

Bootstrap::init(); 

risposta

0

Come funziona il vostro precommit-gancio simile? Potresti rimuovere le prime poche righe dinamicamente prima di inviare il Codesniffer? Un'altra soluzione potrebbe essere quella di impostare l'error_reporting nella init del bootstrap

+0

My-commit pre gancio controlla semplicemente il mio codice per PSR-2 regole quando commettere. Rimozione delle linee sarebbe strano, ma per favore approfondisci questa idea ... Inserire la segnalazione degli errori nel mio init funzionerebbe per quella funzione, ma dovrei copiarlo anche su tutte le altre funzioni. E questa non è la soluzione che sto cercando. – Sander

+0

Come vengono acquisiti i dati dal tuo Code Sniffer? È possibile leggere da stdin, quindi la rimozione dei primi file potrebbe essere eseguita al volo, senza generare file temporanei? –

Problemi correlati