Merge "Remove unused 'XMPGetInfo' and 'XMPGetResults' hooks"
[lhc/web/wiklou.git] / includes / page / WikiPage.php
index 752565d..5e4438a 100644 (file)
@@ -1141,6 +1141,7 @@ class WikiPage implements Page, IDBAccessObject {
                        return;
                }
 
+               Hooks::run( 'PageViewUpdates', array( $this, $user ) );
                // Update newtalk / watchlist notification status
                try {
                        $user->clearNotification( $this->mTitle, $oldid );
@@ -1691,6 +1692,7 @@ class WikiPage implements Page, IDBAccessObject {
         *     revision: The revision object for the inserted revision, or null.
         *
         * @since 1.21
+        * @throws MWException
         */
        public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
                User $user = null, $serialFormat = null
@@ -1802,56 +1804,48 @@ class WikiPage implements Page, IDBAccessObject {
 
                        if ( $changed ) {
                                $dbw->begin( __METHOD__ );
-                               try {
 
-                                       $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
-                                       $status->merge( $prepStatus );
+                               $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
+                               $status->merge( $prepStatus );
 
-                                       if ( !$status->isOK() ) {
-                                               $dbw->rollback( __METHOD__ );
+                               if ( !$status->isOK() ) {
+                                       $dbw->rollback( __METHOD__ );
 
-                                               return $status;
-                                       }
-                                       $revisionId = $revision->insertOn( $dbw );
+                                       return $status;
+                               }
+                               $revisionId = $revision->insertOn( $dbw );
 
-                                       // Update page
-                                       //
-                                       // We check for conflicts by comparing $oldid with the current latest revision ID.
-                                       $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+                               // Update page
+                               //
+                               // We check for conflicts by comparing $oldid with the current latest revision ID.
+                               $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
 
-                                       if ( !$ok ) {
-                                               // Belated edit conflict! Run away!!
-                                               $status->fatal( 'edit-conflict' );
+                               if ( !$ok ) {
+                                       // Belated edit conflict! Run away!!
+                                       $status->fatal( 'edit-conflict' );
 
-                                               $dbw->rollback( __METHOD__ );
+                                       $dbw->rollback( __METHOD__ );
 
-                                               return $status;
-                                       }
+                                       return $status;
+                               }
 
-                                       Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
-                                       // Update recentchanges
-                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                               // Mark as patrolled if the user can do so
-                                               $patrolled = $wgUseRCPatrol && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                               // Add RC row to the DB
-                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
-                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
-                                                       $revisionId, $patrolled
-                                               );
+                               Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
 
-                                               // Log auto-patrolled edits
-                                               if ( $patrolled ) {
-                                                       PatrolLog::record( $rc, true, $user );
-                                               }
-                                       }
-                                       $user->incEditCount();
-                               } catch ( Exception $e ) {
-                                       $dbw->rollback( __METHOD__ );
-                                       // Question: Would it perhaps be better if this method turned all
-                                       // exceptions into $status's?
-                                       throw $e;
+                               // Update recentchanges
+                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                       // Mark as patrolled if the user can do so
+                                       $patrolled = $wgUseRCPatrol && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                       // Add RC row to the DB
+                                       RecentChange::notifyEdit(
+                                               $now, $this->mTitle, $isminor, $user, $summary,
+                                               $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+                                               $revisionId, $patrolled
+                                       );
                                }
+
+                               $user->incEditCount();
+
                                $dbw->commit( __METHOD__ );
                        } else {
                                // Bug 32948: revision ID must be set to page {{REVISIONID}} and
@@ -1881,78 +1875,71 @@ class WikiPage implements Page, IDBAccessObject {
                        $status->value['new'] = true;
 
                        $dbw->begin( __METHOD__ );
-                       try {
 
-                               $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
-                               $status->merge( $prepStatus );
+                       $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
+                       $status->merge( $prepStatus );
 
-                               if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
+                       if ( !$status->isOK() ) {
+                               $dbw->rollback( __METHOD__ );
 
-                                       return $status;
-                               }
+                               return $status;
+                       }
 
-                               $status->merge( $prepStatus );
+                       $status->merge( $prepStatus );
 
-                               // Add the page record; stake our claim on this title!
-                               // This will return false if the article already exists
-                               $newid = $this->insertOn( $dbw );
+                       // Add the page record; stake our claim on this title!
+                       // This will return false if the article already exists
+                       $newid = $this->insertOn( $dbw );
 
-                               if ( $newid === false ) {
-                                       $dbw->rollback( __METHOD__ );
-                                       $status->fatal( 'edit-already-exists' );
+                       if ( $newid === false ) {
+                               $dbw->rollback( __METHOD__ );
+                               $status->fatal( 'edit-already-exists' );
 
-                                       return $status;
-                               }
+                               return $status;
+                       }
 
-                               // Save the revision text...
-                               $revision = new Revision( array(
-                                       'page'       => $newid,
-                                       'title'      => $this->getTitle(), // for determining the default content model
-                                       'comment'    => $summary,
-                                       'minor_edit' => $isminor,
-                                       'text'       => $serialized,
-                                       'len'        => $newsize,
-                                       'user'       => $user->getId(),
-                                       'user_text'  => $user->getName(),
-                                       'timestamp'  => $now,
-                                       'content_model' => $content->getModel(),
-                                       'content_format' => $serialFormat,
-                               ) );
-                               $revisionId = $revision->insertOn( $dbw );
+                       // Save the revision text...
+                       $revision = new Revision( array(
+                               'page'       => $newid,
+                               'title'      => $this->getTitle(), // for determining the default content model
+                               'comment'    => $summary,
+                               'minor_edit' => $isminor,
+                               'text'       => $serialized,
+                               'len'        => $newsize,
+                               'user'       => $user->getId(),
+                               'user_text'  => $user->getName(),
+                               'timestamp'  => $now,
+                               'content_model' => $content->getModel(),
+                               'content_format' => $serialFormat,
+                       ) );
+                       $revisionId = $revision->insertOn( $dbw );
 
-                               // Bug 37225: use accessor to get the text as Revision may trim it
-                               $content = $revision->getContent(); // sanity; get normalized version
+                       // Bug 37225: use accessor to get the text as Revision may trim it
+                       $content = $revision->getContent(); // sanity; get normalized version
 
-                               if ( $content ) {
-                                       $newsize = $content->getSize();
-                               }
+                       if ( $content ) {
+                               $newsize = $content->getSize();
+                       }
 
-                               // Update the page record with revision data
-                               $this->updateRevisionOn( $dbw, $revision, 0 );
+                       // Update the page record with revision data
+                       $this->updateRevisionOn( $dbw, $revision, 0 );
 
-                               Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+                       Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 
-                               // Update recentchanges
-                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                       // Mark as patrolled if the user can do so
-                                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                       // Add RC row to the DB
-                                       $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
-                                               '', $newsize, $revisionId, $patrolled );
+                       // Update recentchanges
+                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                               // Mark as patrolled if the user can do so
+                               $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
+                                       $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                               // Add RC row to the DB
+                               RecentChange::notifyNew(
+                                       $now, $this->mTitle, $isminor, $user, $summary, $bot,
+                                       '', $newsize, $revisionId, $patrolled
+                               );
+                       }
 
-                                       // Log auto-patrolled edits
-                                       if ( $patrolled ) {
-                                               PatrolLog::record( $rc, true, $user );
-                                       }
-                               }
-                               $user->incEditCount();
+                       $user->incEditCount();
 
-                       } catch ( Exception $e ) {
-                               $dbw->rollback( __METHOD__ );
-                               throw $e;
-                       }
                        $dbw->commit( __METHOD__ );
 
                        // Update links, etc.
@@ -2199,18 +2186,18 @@ class WikiPage implements Page, IDBAccessObject {
                        $recursive = $options['changed']; // bug 50785
                        $updates = $content->getSecondaryDataUpdates(
                                $this->getTitle(), null, $recursive, $editInfo->output );
-                       DataUpdate::runUpdates( $updates );
+                       foreach ( $updates as $update ) {
+                               DeferredUpdates::addUpdate( $update );
+                       }
                }
 
                Hooks::run( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
 
                if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
-                       JobQueueGroup::singleton()->push( array(
-                               // Flush old entries from the `recentchanges` table
-                               RecentChangesUpdateJob::newPurgeJob(),
-                               // Update the cached list of active users
-                               RecentChangesUpdateJob::newCacheUpdateJob()
-                       ) );
+                       // Flush old entries from the `recentchanges` table
+                       if ( mt_rand( 0, 9 ) == 0 ) {
+                               JobQueueGroup::singleton()->lazyPush( RecentChangesUpdateJob::newPurgeJob() );
+                       }
                }
 
                if ( !$this->exists() ) {
@@ -2279,7 +2266,6 @@ class WikiPage implements Page, IDBAccessObject {
                } elseif ( $options['changed'] ) { // bug 50785
                        self::onArticleEdit( $this->mTitle );
                }
-
        }
 
        /**
@@ -3410,13 +3396,14 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Check if the last link refresh was before page_touched
                if ( $this->getLinksTimestamp() < $this->getTouched() ) {
-                       JobQueueGroup::singleton()->push( EnqueueJob::newFromLocalJobs(
-                               new JobSpecification( 'refreshLinks', $params, array(), $this->mTitle )
+                       $params['isOpportunistic'] = true;
+                       $params['rootJobTimestamp'] = $parserOutput->getCacheTime();
+
+                       JobQueueGroup::singleton()->lazyPush( EnqueueJob::newFromLocalJobs(
+                               new JobSpecification( 'refreshLinks', $params,
+                                       array( 'removeDuplicates' => true ), $this->mTitle )
                        ) );
-                       return;
                }
-
-               return;
        }
 
        /**