API: Fix list=deletedrevs paging bug pointed out by Splarka on IRC
[lhc/web/wiklou.git] / includes / Categoryfinder.php
index 7a9d427..7c1c285 100644 (file)
@@ -7,8 +7,8 @@
  * articles are in one or all of a given subset of categories.
  *
  * Example use :
- *
- *     # Determines wether the article with the page_id 12345 is in both
+ * <code>
+ *     # Determines whether the article with the page_id 12345 is in both
  *     # "Category 1" and "Category 2" or their subcategories, respectively
  *
  *     $cf = new Categoryfinder ;
@@ -19,7 +19,7 @@
  *     ) ;
  *     $a = $cf->run() ;
  *     print implode ( "," , $a ) ;
- *
+ * </code>
  *
  */
 class Categoryfinder {
@@ -35,7 +35,7 @@ class Categoryfinder {
 
        /**
         * Constructor (currently empty).
-       */
+        */
        function __construct() {
        }
 
@@ -53,17 +53,19 @@ class Categoryfinder {
                # Set the list of target categories; convert them to DBKEY form first
                $this->targets = array () ;
                foreach ( $categories AS $c ) {
-                       $ct = Title::newFromText ( $c , NS_CATEGORY ) ;
-                       $c = $ct->getDBkey () ;
-                       $this->targets[$c] = $c ;
+                       $ct = Title::makeTitleSafe( NS_CATEGORY, $c );
+                       if( $ct ) {
+                               $c = $ct->getDBkey();
+                               $this->targets[$c] = $c;
+                       }
                }
        }
 
        /**
         * Iterates through the parent tree starting with the seed values,
         * then checks the articles if they match the conditions
-        @return array of page_ids (those given to seed() that match the conditions)
-       */
+        @return array of page_ids (those given to seed() that match the conditions)
+        */
        function run () {
                $this->dbr = wfGetDB( DB_SLAVE );
                while ( count ( $this->next ) > 0 ) {
@@ -84,11 +86,17 @@ class Categoryfinder {
 
        /**
         * This functions recurses through the parent representation, trying to match the conditions
-        @param $id The article/category to check
-        @param $conds The array of categories to match
-        @return bool Does this match the conditions?
-       */
-       function check ( $id , &$conds ) {
+        * @param $id The article/category to check
+        * @param $conds The array of categories to match
+        * @param $path used to check for recursion loops
+        * @return bool Does this match the conditions?
+        */
+       function check ( $id , &$conds, $path=array() ) {
+               // Check for loops and stop!
+               if( in_array( $id, $path ) )
+                       return false;
+               $path[] = $id;
+
                # Shortcut (runtime paranoia): No contitions=all matched
                if ( count ( $conds ) == 0 ) return true ;
 
@@ -120,7 +128,7 @@ class Categoryfinder {
                                # No sub-parent
                                continue ;
                        }
-                       $done = $this->check ( $this->name2id[$pname] , $conds ) ;
+                       $done = $this->check ( $this->name2id[$pname] , $conds, $path );
                        if ( $done OR count ( $conds ) == 0 ) {
                                # Subparents have done it!
                                return true ;
@@ -131,7 +139,7 @@ class Categoryfinder {
 
        /**
         * Scans a "parent layer" of the articles/categories in $this->next
-       */
+        */
        function scan_next_layer () {
                $fname = "Categoryfinder::scan_next_layer" ;
 
@@ -188,5 +196,3 @@ class Categoryfinder {
        }
 
 } # END OF CLASS "Categoryfinder"
-
-?>