$bSlots = $b->getRevisionRecord()->getSlots();
$changedRoles = $aSlots->getRolesWithDifferentContent( $bSlots );
- return ( $changedRoles !== [ 'main' ] );
+ return ( $changedRoles !== [ 'main' ] && $changedRoles !== [] );
}
/**
* to perform updates, if the edit was already saved.
* @param RevisionSlotsUpdate|null $forUpdate The new content to be saved by the edit (pre PST),
* if the edit was not yet saved.
+ * @param bool $forEdit Only re-use if the cached DerivedPageDataUpdater has the current
+ * revision as the edit's parent revision. This ensures that the same
+ * DerivedPageDataUpdater cannot be re-used for two consecutive edits.
*
* @return DerivedPageDataUpdater
*/
private function getDerivedDataUpdater(
User $forUser = null,
RevisionRecord $forRevision = null,
- RevisionSlotsUpdate $forUpdate = null
+ RevisionSlotsUpdate $forUpdate = null,
+ $forEdit = false
) {
if ( !$forRevision && !$forUpdate ) {
// NOTE: can't re-use an existing derivedDataUpdater if we don't know what the caller is
&& !$this->derivedDataUpdater->isReusableFor(
$forUser,
$forRevision,
- $forUpdate
+ $forUpdate,
+ $forEdit ? $this->getLatest() : null
)
) {
$this->derivedDataUpdater = null;
* @since 1.32
*
* @param User $user
+ * @param RevisionSlotsUpdate|null $forUpdate If given, allows any cached ParserOutput
+ * that may already have been returned via getDerivedDataUpdater to be re-used.
*
* @return PageUpdater
*/
- public function newPageUpdater( User $user ) {
+ public function newPageUpdater( User $user, RevisionSlotsUpdate $forUpdate = null ) {
global $wgAjaxEditStash, $wgUseAutomaticEditSummaries, $wgPageCreationLog;
$pageUpdater = new PageUpdater(
$user,
$this, // NOTE: eventually, PageUpdater should not know about WikiPage
- $this->getDerivedDataUpdater( $user ),
+ $this->getDerivedDataUpdater( $user, null, $forUpdate, true ),
$this->getDBLoadBalancer(),
$this->getRevisionStore()
);
$flags = ( $flags & ~EDIT_MINOR );
}
+ $slotsUpdate = new RevisionSlotsUpdate();
+ $slotsUpdate->modifyContent( 'main', $content );
+
// NOTE: while doEditContent() executes, callbacks to getDerivedDataUpdater and
// prepareContentForEdit will generally use the DerivedPageDataUpdater that is also
// used by this PageUpdater. However, there is no guarantee for this.
- $updater = $this->newPageUpdater( $user );
+ $updater = $this->newPageUpdater( $user, $slotsUpdate );
$updater->setContent( 'main', $content );
$updater->setOriginalRevisionId( $originalRevId );
$updater->setUndidRevisionId( $undidRevId );
/**
* Get parser options suitable for rendering the primary article wikitext
*
- * @see ContentHandler::makeParserOptions
+ * @see ParserOptions::newCanonical
*
* @param IContextSource|User|string $context One of the following:
* - IContextSource: Use the User and the Language of the provided
* @return ParserOptions
*/
public function makeParserOptions( $context ) {
- $options = $this->getContentHandler()->makeParserOptions( $context );
+ $options = ParserOptions::newCanonical( $context );
if ( $this->getTitle()->isConversionTable() ) {
// @todo ConversionTable should become a separate content model, so
// Note array_intersect() preserves keys from the first arg, and we're
// assuming $revQuery has `revision` primary and isn't using subtables
// for anything we care about.
- $res = $dbw->select(
+ $dbw->lockForUpdate(
array_intersect(
$revQuery['tables'],
[ 'revision', 'revision_comment_temp', 'revision_actor_temp' ]
),
- '1',
[ 'rev_page' => $id ],
__METHOD__,
- 'FOR UPDATE',
+ [],
$revQuery['joins']
);
- foreach ( $res as $row ) {
- // Fetch all rows in case the DB needs that to properly lock them.
- }
// If SCHEMA_COMPAT_WRITE_OLD is set, also select all extra fields we still write,
// so we can copy it to the archive table.
foreach ( $deleted as $catName ) {
$cat = Category::newFromName( $catName );
Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
- }
-
- // Refresh counts on categories that should be empty now
- if ( count( $deleted ) ) {
- $rows = $dbw->select(
- 'category',
- [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
- [ 'cat_title' => $deleted, 'cat_pages <= 100' ],
- __METHOD__
- );
- foreach ( $rows as $row ) {
- $cat = Category::newFromRow( $row );
- // T166757: do the update after this DB commit
- DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
- $cat->refreshCounts();
- } );
- }
+ // Refresh counts on categories that should be empty now (after commit, T166757)
+ DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
+ $cat->refreshCountsIfEmpty();
+ } );
}
}