Merge "Display MediaWiki:Loginprompt on the login page"
[lhc/web/wiklou.git] / maintenance / findHooks.php
index 74eb971..9929cf9 100644 (file)
@@ -42,6 +42,11 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class FindHooks extends Maintenance {
+       /*
+        * Hooks that are ignored
+        */
+       protected static $ignore = array( 'testRunLegacyHooks' );
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = 'Find hooks that are undocumented, missing, or just plain wrong';
@@ -58,6 +63,8 @@ class FindHooks extends Maintenance {
                $documented = $this->getHooksFromDoc( $IP . '/docs/hooks.txt' );
                $potential = array();
                $bad = array();
+
+               // TODO: Don't hardcode the list of directories
                $pathinc = array(
                        $IP . '/',
                        $IP . '/includes/',
@@ -81,10 +88,11 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/htmlform/',
                        $IP . '/includes/installer/',
                        $IP . '/includes/interwiki/',
-                       $IP . '/includes/job/',
+                       $IP . '/includes/jobqueue/',
                        $IP . '/includes/json/',
                        $IP . '/includes/logging/',
                        $IP . '/includes/media/',
+                       $IP . '/includes/page/',
                        $IP . '/includes/parser/',
                        $IP . '/includes/rcfeed/',
                        $IP . '/includes/resourceloader/',
@@ -94,6 +102,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/specialpage/',
                        $IP . '/includes/specials/',
                        $IP . '/includes/upload/',
+                       $IP . '/includes/utils/',
                        $IP . '/languages/',
                        $IP . '/maintenance/',
                        $IP . '/maintenance/language/',
@@ -101,6 +110,8 @@ class FindHooks extends Maintenance {
                        $IP . '/tests/parser/',
                        $IP . '/tests/phpunit/suites/',
                        $IP . '/skins/',
+                       $IP . '/skins/MonoBook/',
+                       $IP . '/skins/Vector/',
                );
 
                foreach ( $pathinc as $dir ) {
@@ -137,14 +148,15 @@ class FindHooks extends Maintenance {
 
        /**
         * Get hooks from a local file (for example docs/hooks.txt)
-        * @param $doc string: filename to look in
-        * @return array of documented hooks
+        * @param string $doc filename to look in
+        * @return array Array of documented hooks
         */
        private function getHooksFromLocalDoc( $doc ) {
-                       $m = array();
-                       $content = file_get_contents( $doc );
-                       preg_match_all( "/\n'(.*?)'/", $content, $m );
-                       return array_unique( $m[1] );
+               $m = array();
+               $content = file_get_contents( $doc );
+               preg_match_all( "/\n'(.*?)':/", $content, $m );
+
+               return array_unique( $m[1] );
        }
 
        /**
@@ -152,47 +164,59 @@ class FindHooks extends Maintenance {
         * @return array of documented hooks
         */
        private function getHooksFromOnlineDoc() {
-                       // All hooks
-                       $allhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php' );
-                       $allhookdata = unserialize( $allhookdata );
-                       $allhooks = array();
-                       foreach ( $allhookdata['query']['categorymembers'] as $page ) {
-                               $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
-                               if ( $found ) {
-                                       $hook = str_replace( ' ', '_', $matches[1] );
-                                       $allhooks[] = $hook;
-                               }
+               // All hooks
+               $allhookdata = Http::get(
+                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
+                       . 'cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php'
+               );
+               $allhookdata = unserialize( $allhookdata );
+               $allhooks = array();
+               foreach ( $allhookdata['query']['categorymembers'] as $page ) {
+                       $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
+                       if ( $found ) {
+                               $hook = str_replace( ' ', '_', $matches[1] );
+                               $allhooks[] = $hook;
                        }
-                       // Removed hooks
-                       $oldhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Removed_hooks&cmlimit=500&format=php' );
-                       $oldhookdata = unserialize( $oldhookdata );
-                       $removed = array();
-                       foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
-                               $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
-                               if ( $found ) {
-                                       $hook = str_replace( ' ', '_', $matches[1] );
-                                       $removed[] = $hook;
-                               }
+               }
+               // Removed hooks
+               $oldhookdata = Http::get(
+                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
+                       . 'cmtitle=Category:Removed_hooks&cmlimit=500&format=php'
+               );
+               $oldhookdata = unserialize( $oldhookdata );
+               $removed = array();
+               foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
+                       $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
+                       if ( $found ) {
+                               $hook = str_replace( ' ', '_', $matches[1] );
+                               $removed[] = $hook;
                        }
-                       return array_diff( $allhooks, $removed );
+               }
+
+               return array_diff( $allhooks, $removed );
        }
 
        /**
         * Get hooks from a PHP file
-        * @param $file string Full filename to the PHP file.
+        * @param string $file Full filename to the PHP file.
         * @return array of hooks found.
         */
        private function getHooksFromFile( $file ) {
                $content = file_get_contents( $file );
                $m = array();
-               preg_match_all( '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/', $content, $m );
+               preg_match_all(
+                       '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/',
+                       $content,
+                       $m
+               );
+
                return $m[2];
        }
 
        /**
         * Get hooks from the source code.
-        * @param $path Directory where the include files can be found
-        * @return array of hooks found.
+        * @param string $path Directory where the include files can be found
+        * @return array Array of hooks found.
         */
        private function getHooksFromPath( $path ) {
                $hooks = array();
@@ -205,13 +229,14 @@ class FindHooks extends Maintenance {
                        }
                        closedir( $dh );
                }
+
                return $hooks;
        }
 
        /**
         * Get bad hooks (where the hook name could not be determined) from a PHP file
-        * @param $file string Full filename to the PHP file.
-        * @return array of bad wfRunHooks() lines
+        * @param string $file Full filename to the PHP file.
+        * @return array Array of bad wfRunHooks() lines
         */
        private function getBadHooksFromFile( $file ) {
                $content = file_get_contents( $file );
@@ -222,13 +247,14 @@ class FindHooks extends Maintenance {
                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
+        * @param string $path Directory where the include files can be found
+        * @return array Array of bad wfRunHooks() lines
         */
        private function getBadHooksFromPath( $path ) {
                $hooks = array();
@@ -242,21 +268,25 @@ class FindHooks extends Maintenance {
                        }
                        closedir( $dh );
                }
+
                return $hooks;
        }
 
        /**
         * Nicely output the array
-        * @param $msg String: a message to show before the value
-        * @param $arr Array: an array
-        * @param $sort Boolean: whether to sort the array (Default: true)
+        * @param string $msg A message to show before the value
+        * @param array $arr
+        * @param bool $sort Whether to sort the array (Default: true)
         */
        private function printArray( $msg, $arr, $sort = true ) {
                if ( $sort ) {
                        asort( $arr );
                }
+
                foreach ( $arr as $v ) {
-                       $this->output( "$msg: $v\n" );
+                       if ( !in_array( $v, self::$ignore ) ) {
+                               $this->output( "$msg: $v\n" );
+                       }
                }
        }
 }