diff options
Diffstat (limited to 'maintenance/findhooks.php')
-rw-r--r-- | maintenance/findhooks.php | 98 |
1 files changed, 72 insertions, 26 deletions
diff --git a/maintenance/findhooks.php b/maintenance/findhooks.php index 284e7906..8433571d 100644 --- a/maintenance/findhooks.php +++ b/maintenance/findhooks.php @@ -7,25 +7,26 @@ * - hooks names in hooks.txt are at the beginning of a line and single quoted. * - hooks names in code are the first parameter of wfRunHooks. * + * Any instance of wfRunHooks that doesn't meet these parameters will be noted. + * * @addtogroup Maintenance * * @author Ashar Voultoiz <hashar@altern.org> * @copyright Copyright © Ashar voultoiz * @license http://www.gnu.org/copyleft/gpl.html GNU General Public Licence 2.0 or later */ - + /** This is a command line script*/ include('commandLine.inc'); - - + + # GLOBALS - + $doc = $IP . '/docs/hooks.txt'; -$pathinc = $IP . '/includes/'; - - +$pathinc = array( $IP.'/includes/', $IP.'/includes/api/', $IP.'/includes/filerepo/', $IP.'/languages/', $IP.'/maintenance/', $IP.'/skins/' ); + # FUNCTIONS - + /** * @return array of documented hooks */ @@ -36,19 +37,19 @@ function getHooksFromDoc() { preg_match_all( "/\n'(.*?)'/", $content, $m); return $m[1]; } - + /** - * Get hooks from a php file + * Get hooks from a PHP file * @param $file Full filename to the PHP file. * @return array of hooks found. */ function getHooksFromFile( $file ) { $content = file_get_contents( $file ); $m = array(); - preg_match_all( "/wfRunHooks\(\s*\'(.*?)\'/", $content, $m); - return $m[1]; + preg_match_all( '/wfRunHooks\(\s*([\'"])(.*?)\1/', $content, $m); + return $m[2]; } - + /** * Get hooks from the source code. * @param $path Directory where the include files can be found @@ -66,7 +67,43 @@ function getHooksFromPath( $path ) { } return $hooks; } - + +/** + * Get bad hooks (where the hook name could not be determined) from a PHP file + * @param $file Full filename to the PHP file. + * @return array of bad wfRunHooks() lines + */ +function getBadHooksFromFile( $file ) { + $content = file_get_contents( $file ); + $m = array(); + # We want to skip the "function wfRunHooks()" one. :) + preg_match_all( '/(?<!function )wfRunHooks\(\s*[^\s\'"].*/', $content, $m); + $list = array(); + foreach( $m[0] as $match ){ + $list[] = $match . "(" . $file . ")"; + } + return $list; +} + +/** + * Get bad hooks from the source code. + * @param $path Directory where the include files can be found + * @return array of bad wfRunHooks() lines + */ +function getBadHooksFromPath( $path ) { + $hooks = array(); + if( $dh = opendir($path) ) { + while(($file = readdir($dh)) !== false) { + # We don't want to read this file as it contains bad calls to wfRunHooks() + if( filetype( $path.$file ) == 'file' && !$path.$file == __FILE__ ) { + $hooks = array_merge( $hooks, getBadHooksFromFile($path.$file) ); + } + } + closedir($dh); + } + return $hooks; +} + /** * Nicely output the array * @param $msg A message to show before the value @@ -75,20 +112,29 @@ function getHooksFromPath( $path ) { */ function printArray( $msg, $arr, $sort = true ) { if($sort) asort($arr); - foreach($arr as $v) print "$msg: $v\n"; + foreach($arr as $v) echo "$msg: $v\n"; } - - -# MAIN - + + +# MAIN + $documented = getHooksFromDoc($doc); -$potential = getHooksFromPath($pathinc); - -$todo = array_diff($potential, $documented); -$deprecated = array_diff($documented, $potential); - +$potential = array(); +$bad = array(); +foreach( $pathinc as $dir ) { + $potential = array_merge( $potential, getHooksFromPath( $dir ) ); + $bad = array_merge( $bad, getBadHooksFromPath( $dir ) ); +} + +$potential = array_unique( $potential ); +$bad = array_unique( $bad ); +$todo = array_diff( $potential, $documented ); +$deprecated = array_diff( $documented, $potential ); + // let's show the results: printArray('undocumented', $todo ); printArray('not found', $deprecated ); - - +printArray('unclear hook calls', $bad ); + +if ( count( $todo ) == 0 && count( $deprecated ) == 0 && count( $bad ) == 0 ) + echo "Looks good!\n";
\ No newline at end of file |