From: Aaron Schulz Date: Fri, 27 May 2016 21:58:10 +0000 (-0700) Subject: revisiondelete: Fix $oldBits/$newBits usage in setVisibility() X-Git-Tag: 1.31.0-rc.0~6715 X-Git-Url: http://git.cyclocoop.org/%22.%24info%5B?a=commitdiff_plain;h=f8f60f39264ae9206ece03258225628d7d16e6ec;p=lhc%2Fweb%2Fwiklou.git revisiondelete: Fix $oldBits/$newBits usage in setVisibility() This addresses the FIXME comment around updateLog() Change-Id: Iedb9df0b4cf65308a6b58bd9d9295d1850bc2c28 --- diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php index f9b7875d86..c205626305 100644 --- a/includes/logging/DeleteLogFormatter.php +++ b/includes/logging/DeleteLogFormatter.php @@ -61,6 +61,7 @@ class DeleteLogFormatter extends LogFormatter { && in_array( $params[3], [ 'revision', 'archive', 'oldimage', 'filearchive' ] ) ) ) { + // See RevDelList::getLogParams()/RevDelLogList::getLogParams() $paramStart = $subtype === 'revision' ? 4 : 3; $old = $this->parseBitField( $params[$paramStart + 1] ); diff --git a/includes/revisiondelete/RevDelList.php b/includes/revisiondelete/RevDelList.php index 79d66a9d8a..87e641db54 100644 --- a/includes/revisiondelete/RevDelList.php +++ b/includes/revisiondelete/RevDelList.php @@ -125,7 +125,13 @@ abstract class RevDelList extends RevisionListBase { $status->itemStatuses = []; } + // For multi-item deletions, set the old/new bitfields in log_params such that "hid X" + // shows in logs if field X was hidden from ANY item and likewise for "unhid Y". Note the + // form does not let the same field get hidden and unhidden in different items at once. + $virtualOldBits = 0; + $virtualNewBits = 0; $logType = 'delete'; + // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed for ( $this->reset(); $this->current(); $this->next() ) { // @codingStandardsIgnoreEnd @@ -187,6 +193,11 @@ abstract class RevDelList extends RevisionListBase { if ( ( $oldBits | $newBits ) & $this->getSuppressBit() ) { $logType = 'suppress'; } + // Track which fields where (un)hidden for each item + $addedBits = ( $oldBits ^ $newBits ) & $newBits; + $removedBits = ( $oldBits ^ $newBits ) & $oldBits; + $virtualNewBits |= $addedBits; + $virtualOldBits |= $removedBits; $status->successCount++; if ( $item->getAuthorId() > 0 ) { @@ -228,14 +239,13 @@ abstract class RevDelList extends RevisionListBase { } // Log it - // @FIXME: $newBits/$oldBits set in for loop, makes IDE warnings too $this->updateLog( $logType, [ 'title' => $this->title, 'count' => $successCount, - 'newBits' => $newBits, - 'oldBits' => $oldBits, + 'newBits' => $virtualNewBits, + 'oldBits' => $virtualOldBits, 'comment' => $comment, 'ids' => $idsForLog, 'authorIds' => $authorIds,