Fix variable name in doc comment added in r78192
[lhc/web/wiklou.git] / includes / Title.php
index cec0067..9adc9a8 100644 (file)
@@ -329,8 +329,8 @@ class Title {
         * This will only return the very next target, useful for
         * the redirect table and other checks that don't need full recursion
         *
-        * @param $text \type{\string} Text with possible redirect
-        * @return \type{Title} The corresponding Title
+        * @param $text String: Text with possible redirect
+        * @return Title: The corresponding Title
         */
        public static function newFromRedirect( $text ) {
                return self::newFromRedirectInternal( $text );
@@ -595,21 +595,21 @@ class Title {
        /**
         * Get the main part with underscores
         *
-        * @return \type{\string} Main part of the title, with underscores
+        * @return String: Main part of the title, with underscores
         */
        public function getDBkey() { return $this->mDbkeyform; }
 
        /**
         * Get the namespace index, i.e.\ one of the NS_xxxx constants.
         *
-        * @return \type{\int} Namespace index
+        * @return Integer: Namespace index
         */
        public function getNamespace() { return $this->mNamespace; }
 
        /**
         * Get the namespace text
         *
-        * @return \type{\string} Namespace text
+        * @return String: Namespace text
         */
        public function getNsText() {
                global $wgContLang;
@@ -1304,7 +1304,14 @@ class Title {
 
        /**
         * Check various permission hooks
-        * @see checkQuickPermissions for parameter information
+        *
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkPermissionHooks( $action, $user, $errors, $doExpensiveQueries, $short ) {
                // Use getUserPermissionsErrors instead
@@ -1327,7 +1334,14 @@ class Title {
 
        /**
         * Check permissions on special pages & namespaces
-        * @see checkQuickPermissions for parameter information
+        *
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                # Only 'createaccount' and 'execute' can be performed on
@@ -1350,7 +1364,14 @@ class Title {
 
        /**
         * Check CSS/JS sub-page permissions
-        * @see checkQuickPermissions for parameter information
+        *
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkCSSandJSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                # Protect css/js subpages of user pages
@@ -1374,7 +1395,14 @@ class Title {
         * Check against page_restrictions table requirements on this
         * page. The user must possess all required rights for this
         * action.
-        * @see checkQuickPermissions for parameter information
+        *
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkPageRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                foreach ( $this->getRestrictions( $action ) as $right ) {
@@ -1401,7 +1429,14 @@ class Title {
 
        /**
         * Check restrictions on cascading pages.
-        * @see checkQuickPermissions for parameter information
+        * 
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkCascadingSourcesRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                if ( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
@@ -1433,7 +1468,14 @@ class Title {
 
        /**
         * Check action permissions not already checked in checkQuickPermissions
-        * @see checkQuickPermissions for parameter information
+        *
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkActionPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                if ( $action == 'protect' ) {
@@ -1472,10 +1514,17 @@ class Title {
 
        /**
         * Check that the user isn't blocked from editting.
-        * @see checkQuickPermissions for parameter information
+        *
+        * @param $action String the action to check
+        * @param $user User user to check
+        * @param $errors Array list of current errors
+        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+        * @param $short Boolean short circuit on first error
+        *
+        * @return Array list of errors
         */
        private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
-               if( $short ) {
+               if( $short && count( $errors ) > 0 ) {
                        return $errors;
                }
 
@@ -1602,6 +1651,10 @@ class Title {
                return $this->mTitleProtection;
        }
 
+       private function invalidateTitleProtectionCache() {
+               unset( $this->mTitleProtection );
+       }
+
        /**
         * Update the title protection status
         *
@@ -1650,6 +1703,8 @@ class Title {
                        $dbw->delete( 'protected_titles', array( 'pt_namespace' => $namespace,
                                'pt_title' => $title ), __METHOD__ );
                }
+               $this->invalidateTitleProtectionCache();
+
                # Update the protection log
                if ( $dbw->affectedRows() ) {
                        $log = new LogPage( 'protect' );
@@ -1676,6 +1731,7 @@ class Title {
                        array( 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ),
                        __METHOD__
                );
+               $this->invalidateTitleProtectionCache();
        }
 
        /**
@@ -1891,21 +1947,12 @@ class Title {
 
        /**
         * Is this a *valid* .css or .js subpage of a user page?
-        * Check that the corresponding skin exists
         *
         * @return \type{\bool}
+        * @deprecated
         */
        public function isValidCssJsSubpage() {
-               if ( $this->isCssJsSubpage() ) {
-                       $name = $this->getSkinFromCssJsSubpage();
-                       if ( $name == 'common' ) {
-                               return true;
-                       }
-                       $skinNames = Skin::getSkinNames();
-                       return array_key_exists( $name, $skinNames );
-               } else {
-                       return false;
-               }
+               return $this->isCssJsSubpage();
        }
 
        /**
@@ -2058,6 +2105,7 @@ class Title {
                }
                if ( $purgeExpired ) {
                        Title::purgeExpiredRestrictions();
+                       $this->invalidateTitleProtectionCache();
                }
 
                wfProfileOut( __METHOD__ );
@@ -2177,6 +2225,7 @@ class Title {
 
                        if ( $purgeExpired ) {
                                Title::purgeExpiredRestrictions();
+                               $this->invalidateTitleProtectionCache();
                        }
                }
 
@@ -2211,6 +2260,7 @@ class Title {
                                                $this->mRestrictions['create'] = explode( ',', trim( $title_protection['pt_create_perm'] ) );
                                        } else { // Get rid of the old restrictions
                                                Title::purgeExpiredRestrictions();
+                                               $this->invalidateTitleProtectionCache();
                                        }
                                } else {
                                        $this->mRestrictionsExpiry['create'] = Block::decodeExpiry( '' );
@@ -2595,7 +2645,9 @@ class Title {
                                        $this->mInterwiki = $wgContLang->lc( $p );
 
                                        # Redundant interwiki prefix to the local wiki
-                                       if ( 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki ) ) {
+                                       if ( $wgLocalInterwiki !== false
+                                               && 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki ) ) 
+                                       {
                                                if ( $dbkey == '' ) {
                                                        # Can't have an empty self-link
                                                        return false;
@@ -2794,7 +2846,8 @@ class Title {
                $retVal = array();
                if ( $db->numRows( $res ) ) {
                        foreach ( $res as $row ) {
-                               if ( $titleObj = Title::makeTitle( $row->page_namespace, $row->page_title ) ) {
+                               $titleObj = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               if ( $titleObj ) {
                                        $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect, $row->page_latest );
                                        $retVal[] = $titleObj;
                                }
@@ -3291,7 +3344,6 @@ class Title {
                # Truncate for whole multibyte characters. +5 bytes for ellipsis
                $comment = $wgContLang->truncate( $comment, 250 );
 
-               $newid = $nt->getArticleID();
                $oldid = $this->getArticleID();
                $latest = $this->getLatestRevId();
 
@@ -3696,12 +3748,35 @@ class Title {
         */
        public function countRevisionsBetween( $old, $new ) {
                $dbr = wfGetDB( DB_SLAVE );
-               return (int)$dbr->selectField( 'revision', 'count(*)',
-                       'rev_page = ' . intval( $this->getArticleId() ) .
-                       ' AND rev_id > ' . intval( $old ) .
-                       ' AND rev_id < ' . intval( $new ),
-                       __METHOD__
+               return (int)$dbr->selectField( 'revision', 'count(*)', array(
+                               'rev_page' => intval( $this->getArticleId() ),
+                               'rev_id > ' . intval( $old ),
+                               'rev_id < ' . intval( $new )
+                       ), __METHOD__
+               );
+       }
+
+       /**
+        * Get the number of authors between the given revision IDs.
+        * Used for diffs and other things that really need it.
+        *
+        * @param $fromRevId \type{\int} Revision ID (first before range)
+        * @param $toRevId \type{\int} Revision ID (first after range)
+        * @param $limit \type{\int} Maximum number of authors
+        * @param $flags \type{\int} Title::GAID_FOR_UPDATE
+        * @return \type{\int}
+        */
+       public function countAuthorsBetween( $fromRevId, $toRevId, $limit, $flags = 0 ) {
+               $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
+               $res = $db->select( 'revision', 'DISTINCT rev_user_text',
+                       array(
+                               'rev_page' => $this->getArticleID(),
+                               'rev_id > ' . (int)$fromRevId,
+                               'rev_id < ' . (int)$toRevId
+                       ), __METHOD__,
+                       array( 'LIMIT' => $limit )
                );
+               return (int)$db->numRows( $res );
        }
 
        /**
@@ -4019,7 +4094,7 @@ class Title {
         * In other words, is this a content page, for the purposes of calculating
         * statistics, etc?
         *
-        * @return \type{\bool}
+        * @return Boolean
         */
        public function isContentPage() {
                return MWNamespace::isContent( $this->getNamespace() );