Fixed a bug with module loading. Fixed a bug that prevented a file's local function definitions not to be picked up. Added the base path and quiet options. Mantis: 2691

git-svn-id: file:///srv/svn/scanner/trunk@4 a0501263-5b7a-4423-a8ba-1edf086583e7
This commit is contained in:
Correl Roush 2008-02-14 22:45:04 +00:00
parent 5531fb7a24
commit d0714c149b
2 changed files with 29 additions and 8 deletions

View file

@ -16,7 +16,7 @@ function FunctionsModule_callback_local( $object ) {
if( !isset( $FunctionsModule_local_functions[$file] ) ) { if( !isset( $FunctionsModule_local_functions[$file] ) ) {
$FunctionsModule_local_functions[$file] = array(); $FunctionsModule_local_functions[$file] = array();
} }
$FunctionsModule_local_functions[$file][] = array( $FunctionsModule_local_functions[$file][strtolower( $object['name'] )] = array(
'used' => 0, 'used' => 0,
'file' => $object['file'] 'file' => $object['file']
); );
@ -39,7 +39,7 @@ class FunctionsModule extends ScannerModule {
global $base_path; global $base_path;
$parser = new PHPParser( PHPPARSER_FETCH_FUNCTIONS ); $parser = new PHPParser( PHPPARSER_FETCH_FUNCTIONS );
$parser->registerCallback( 'FunctionsModule_callback_global' ); $parser->registerCallback( 'FunctionsModule_callback_global' );
$parser->registerCallback( 'FunctionsModule_callback_local' ); //$parser->registerCallback( 'FunctionsModule_callback_local' );
$this->include_paths = array(); $this->include_paths = array();
$paths = array(); $paths = array();
$path = realpath( $base_path ); $path = realpath( $base_path );
@ -99,7 +99,7 @@ class FunctionsModule extends ScannerModule {
if( !in_array( $object['name'], array_keys( $FunctionsModule_functions ) ) ) { if( !in_array( $object['name'], array_keys( $FunctionsModule_functions ) ) ) {
if( if(
!in_array( $object['name'], $this->internal_functions ) !in_array( $object['name'], $this->internal_functions )
&& !in_array( $object['name'], $FunctionsModule_local_functions[filename( $object['file'] )] ) && !in_array( $object['name'], array_keys( $FunctionsModule_local_functions[filename( $object['file'] )] ) )
) { ) {
$this->fault( $object, FAULT_MAJOR, "Undefined function '{$object['name']}'" ); $this->fault( $object, FAULT_MAJOR, "Undefined function '{$object['name']}'" );
} }
@ -138,7 +138,7 @@ class FunctionsModule extends ScannerModule {
$FunctionsModule_local_functions[filename( $filename)] = array(); $FunctionsModule_local_functions[filename( $filename)] = array();
$parser = new PHPParser( PHPPARSER_FETCH_FUNCTIONS ); $parser = new PHPParser( PHPPARSER_FETCH_FUNCTIONS );
$parser->registerCallback( 'FunctionsModule_callback_local' ); $parser->registerCallback( 'FunctionsModule_callback_local' );
$parser->parse( $filename ); $parser->parseFile( $filename );
$this->included_files = array(); $this->included_files = array();
} }
} }

View file

@ -10,9 +10,14 @@ $stderr = fopen( 'php://stderr', 'w' );
$config = array( $config = array(
'svn' => false, 'svn' => false,
'modules' => array(), 'modules' => array(),
'quiet' => false,
); );
$help = "Usage: {$argv[0]} [options] file|path [file|path ...] $help = "Usage: {$argv[0]} [options] file|path [file|path ...]
Options: Options:
-b Set the base path for the scan. Useful if you want
--base-path to scan individual files in a code base that don't
live in the project's base directory.
-h Display this usage information -h Display this usage information
--help --help
@ -20,6 +25,9 @@ Options:
--module modulename parameter is not specified, all available modules --module modulename parameter is not specified, all available modules
will be loaded. will be loaded.
-q Suppresses all progress output
--quiet
--svn Enables SVN integration --svn Enables SVN integration
"; ";
@ -81,8 +89,10 @@ function filename( $filename ) {
return $filename; return $filename;
} }
function err( $string ) { function err( $string ) {
global $stderr; global $stderr, $config;
fputs( $stderr, $string ); if( $config['quiet'] === false ) {
fputs( $stderr, $string );
}
} }
@ -91,6 +101,13 @@ $files = array();
$base_path = false; $base_path = false;
for( $i = 1; $i < $argc; $i++ ) { for( $i = 1; $i < $argc; $i++ ) {
switch( $argv[$i] ) { switch( $argv[$i] ) {
case '-b':
case '--base-path':
$new_base = $argv[++$i];
if( is_dir( $new_base ) ) {
$base_path = realpath( $new_base ) . '/';
}
break;
case '-h': case '-h':
case '--help': case '--help':
die( $help ); die( $help );
@ -99,6 +116,10 @@ for( $i = 1; $i < $argc; $i++ ) {
case '--module': case '--module':
$config['modules'][] = $argv[++$i]; $config['modules'][] = $argv[++$i];
break; break;
case '-q':
case '--quiet':
$config['quiet'] = true;
break;
case '--svn': case '--svn':
$config['svn'] = true; $config['svn'] = true;
break; break;
@ -108,7 +129,7 @@ for( $i = 1; $i < $argc; $i++ ) {
$files[] = $argv[$i]; $files[] = $argv[$i];
} else if( is_dir( $argv[$i] ) ) { } else if( is_dir( $argv[$i] ) ) {
$base_path = ( $base_path === false ) ? realpath( $argv[$i] ) . '/' : $base_path; $base_path = ( $base_path === false ) ? realpath( $argv[$i] ) . '/' : $base_path;
exec( "find $base_path -iname '*.php' 2>/dev/null", $output, $result ); exec( "find {$argv[$i]} -iname '*.php' 2>/dev/null", $output, $result );
$files = array_merge( $files, $output ); $files = array_merge( $files, $output );
} }
} }
@ -124,7 +145,7 @@ foreach( $module_files as $module_file ) {
if( strtolower( substr( $module_file, -4 ) ) == '.php' ) { if( strtolower( substr( $module_file, -4 ) ) == '.php' ) {
$module = substr( $module_file, 0, strlen( $module_file ) - 4 ); $module = substr( $module_file, 0, strlen( $module_file ) - 4 );
if( if(
count( $modules ) == 0 count( $config['modules'] ) == 0
|| ( in_array( $module, $config['modules'] ) ) || ( in_array( $module, $config['modules'] ) )
) { ) {
require_once( "modules/{$module_file}" ); require_once( "modules/{$module_file}" );