2013-01-31 8 views
5

コミットできるようになる前にSVNプリコミットフックを使用して自分のコードスタンダード(PSR2)を検証しています。これは1つの例外を除いて完全に機能します。私の単体テスト(PHPUnit)ファイルは、すべての静的ユニットテスト関数の中に存在する私のブートストラップクラスの中に存在しますが、ブートストラップクラス定義の上にエラーメッセージも表示されます。既存のPreCommitフック警告でSVNコミットを許可

PSR2標準では、クラス定義を含むファイルにクラスまたは関数に含まれていないコードを持つことができないため、これをコミットしようとすると警告が表示されます。

私のコードニファイアでこのエラーを除外する方法、またはコードを有効にする方法(ブートストラップクラスの各静的機能でエラーメッセージを有効にするコードを入れないでください)はありますか?

ここでは、ファイルの:

<?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(); 

答えて

0

はどのようにあなたのプリコミットフックが見えますか? Codesnifferに送る前に最初の数行を動的に削除するだけでいいですか? もう1つの解決策は、ブートストラップのinitでerror_reportingを設定することです。

+0

私のプリコミットフックは、コミット時に自分のコードでPSR-2ルールをチェックするだけです。行を削除するのは奇妙なことですが、この考え方を詳しく説明してください... 私のinitでエラー報告をすることは、その関数ではうまくいくはずですが、他のすべての関数にも同様にコピーする必要があります。それは私が探している解決策ではありません。 – Sander

+0

コードスニッファーはどのようにデータを取得しますか? stdinから読み込むことは可能ですか?そのため、一時ファイルを生成せずに、最初のファイルを削除することは即座に実行できますか? –

関連する問題