111 foreach ( $this as $item ) {
112 if ( $item->getBits() & $bit ) {
135 $bitPars = $params[
'value'];
136 $comment = $params[
'comment'];
137 $perItemStatus = $params[
'perItemStatus'] ??
false;
141 $dbw = $this->lbFactory->getMainLB()->getConnectionRef(
DB_MASTER );
142 $this->res = $this->
doQuery( $dbw );
145 if ( !$status->isGood() ) {
149 $dbw->startAtomic( __METHOD__ );
150 $dbw->onTransactionResolution(
158 $missing = array_flip( $this->ids );
163 if ( $perItemStatus ) {
164 $status->itemStatuses = [];
176 $visibilityChangeMap = [];
179 foreach ( $this as $item ) {
180 unset( $missing[$item->getId()] );
182 if ( $perItemStatus ) {
184 $status->itemStatuses[$item->getId()] = $itemStatus;
186 $itemStatus = $status;
189 $oldBits = $item->getBits();
193 if ( $oldBits == $newBits ) {
194 $itemStatus->warning(
195 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
196 $status->failCount++;
198 } elseif ( $oldBits == 0 && $newBits != 0 ) {
200 } elseif ( $oldBits != 0 && $newBits == 0 ) {
206 if ( $item->isHideCurrentOp( $newBits ) ) {
209 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
210 $status->failCount++;
212 } elseif ( !$item->canView() ) {
214 $msg = ( $opType ==
'show' ) ?
215 'revdelete-show-no-access' :
'revdelete-modify-no-access';
216 $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
217 $status->failCount++;
220 } elseif ( $newBits == RevisionRecord::DELETED_RESTRICTED ) {
221 $itemStatus->warning(
222 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
223 $status->failCount++;
228 $ok = $item->setBits( $newBits );
231 $idsForLog[] = $item->getId();
234 $logType =
'suppress';
237 $addedBits = ( $oldBits ^ $newBits ) & $newBits;
238 $removedBits = ( $oldBits ^ $newBits ) & $oldBits;
239 $virtualNewBits |= $addedBits;
240 $virtualOldBits |= $removedBits;
242 $status->successCount++;
243 $authorActors[] = $item->getAuthorActor();
247 $visibilityChangeMap[$item->getId()] = [
248 'oldBits' => $oldBits,
249 'newBits' => $newBits,
253 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
254 $status->failCount++;
259 foreach ( $missing as $id => $unused ) {
260 if ( $perItemStatus ) {
261 $status->itemStatuses[$id] =
Status::newFatal(
'revdelete-modify-missing', $id );
263 $status->error(
'revdelete-modify-missing', $id );
265 $status->failCount++;
268 if ( $status->successCount == 0 ) {
269 $dbw->endAtomic( __METHOD__ );
274 $successCount = $status->successCount;
278 if ( !$status->isOK() ) {
280 $this->lbFactory->rollbackMasterChanges( __METHOD__ );
286 $authorFields[
'authorActors'] = $authorActors;
290 'title' => $this->title,
291 'count' => $successCount,
292 'newBits' => $virtualNewBits,
293 'oldBits' => $virtualOldBits,
294 'comment' => $comment,
296 'tags' => $params[
'tags'] ?? [],
302 function () use ( $visibilityChangeMap ) {
305 DeferredUpdates::PRESEND,
309 $dbw->endAtomic( __METHOD__ );
317 foreach ( $this as $item ) {
318 $status->merge( $item->lock() );
327 foreach ( $this as $item ) {
328 $status->merge( $item->unlock() );
339 $dbw = $this->lbFactory->getMainLB()->getConnectionRef(
DB_MASTER );
340 $this->res = $this->
doQuery( $dbw );
360 throw new MWException(
"Bad log URL param type!" );
366 $logEntry->setTarget( $params[
'title'] );
367 $logEntry->setComment( $params[
'comment'] );
368 $logEntry->setParameters( $logParams );
369 $logEntry->setPerformer( $this->
getUser() );
372 $field => $params[
'ids'],
374 if ( isset( $params[
'authorActors'] ) ) {
376 'target_author_actor' => $params[
'authorActors'],
379 $logEntry->setRelations( $relations );
381 $logEntry->addTags( $params[
'tags'] );
382 $logId = $logEntry->insert();
383 $logEntry->publish( $logId );
402 '5::ids' => $params[
'ids'],
403 '6::ofield' => $params[
'oldBits'],
404 '7::nfield' => $params[
'newBits'],