139 $status = Status::newGood();
143 $perItemStatus =
$params[
'perItemStatus'] ??
false;
147 $dbw = $this->lbFactory->getPrimaryDatabase();
148 $this->res = $this->
doQuery( $dbw );
151 if ( !$status->isGood() ) {
155 $dbw->startAtomic( __METHOD__, $dbw::ATOMIC_CANCELABLE );
156 $dbw->onTransactionResolution(
164 $missing = array_fill_keys( $this->ids,
true );
169 if ( $perItemStatus ) {
170 $status->value[
'itemStatuses'] = [];
182 $visibilityChangeMap = [];
185 foreach ( $this as $item ) {
186 unset( $missing[$item->getId()] );
188 if ( $perItemStatus ) {
189 $itemStatus = Status::newGood();
190 $status->value[
'itemStatuses'][$item->getId()] = $itemStatus;
192 $itemStatus = $status;
195 $oldBits = $item->getBits();
197 $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
199 if ( $oldBits == $newBits ) {
200 $itemStatus->warning(
201 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
202 $status->failCount++;
204 } elseif ( $oldBits == 0 && $newBits != 0 ) {
206 } elseif ( $oldBits != 0 && $newBits == 0 ) {
212 if ( $item->isHideCurrentOp( $newBits ) ) {
215 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
216 $status->failCount++;
218 } elseif ( !$item->canView() ) {
220 $msg = ( $opType ==
'show' ) ?
221 'revdelete-show-no-access' :
'revdelete-modify-no-access';
222 $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
223 $status->failCount++;
226 } elseif ( $newBits == self::SUPPRESS_BIT ) {
227 $itemStatus->warning(
228 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
229 $status->failCount++;
234 $ok = $item->setBits( $newBits );
237 $idsForLog[] = $item->getId();
239 if ( ( $oldBits | $newBits ) & self::SUPPRESS_BIT ) {
240 $logType =
'suppress';
243 $addedBits = ( $oldBits ^ $newBits ) & $newBits;
244 $removedBits = ( $oldBits ^ $newBits ) & $oldBits;
245 $virtualNewBits |= $addedBits;
246 $virtualOldBits |= $removedBits;
248 $status->successCount++;
249 $authorActors[] = $item->getAuthorActor();
253 $visibilityChangeMap[$item->getId()] = [
254 'oldBits' => $oldBits,
255 'newBits' => $newBits,
259 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
260 $status->failCount++;
265 foreach ( $missing as $id => $unused ) {
266 if ( $perItemStatus ) {
267 $status->value[
'itemStatuses'][$id] = Status::newFatal(
'revdelete-modify-missing', $id );
269 $status->error(
'revdelete-modify-missing', $id );
271 $status->failCount++;
274 if ( $status->successCount == 0 ) {
275 $dbw->endAtomic( __METHOD__ );
280 $successCount = $status->successCount;
284 if ( !$status->isOK() ) {
286 $dbw->cancelAtomic( __METHOD__ );
292 $authorFields[
'authorActors'] = $authorActors;
296 'page' => $this->page,
297 'count' => $successCount,
298 'newBits' => $virtualNewBits,
299 'oldBits' => $virtualOldBits,
300 'comment' => $comment,
302 'tags' =>
$params[
'tags'] ?? [],
307 DeferredUpdates::addCallableUpdate(
308 function () use ( $visibilityChangeMap ) {
311 DeferredUpdates::PRESEND,
315 $dbw->endAtomic( __METHOD__ );