141 $status = Status::newGood();
143 $bitPars = $params[
'value'];
144 $comment = $params[
'comment'];
145 $perItemStatus = $params[
'perItemStatus'] ??
false;
148 if ( $perItemStatus ) {
149 $status->value[
'itemStatuses'] = [];
154 $dbw = $this->lbFactory->getPrimaryDatabase();
155 $this->res = $this->
doQuery( $dbw );
158 if ( !$status->isGood() ) {
162 $dbw->startAtomic( __METHOD__, $dbw::ATOMIC_CANCELABLE );
163 $dbw->onTransactionResolution(
171 $missing = array_fill_keys( $this->ids,
true );
182 $useSuppressLog =
false;
186 $visibilityChangeMap = [];
189 foreach ( $this as $item ) {
190 unset( $missing[$item->getId()] );
192 if ( $perItemStatus ) {
193 $itemStatus = Status::newGood();
194 $status->value[
'itemStatuses'][$item->getId()] = $itemStatus;
196 $itemStatus = $status;
199 $oldBits = $item->getBits();
201 $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
203 if ( $oldBits == $newBits ) {
204 $itemStatus->warning(
205 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
206 $status->failCount++;
208 } elseif ( $oldBits == 0 && $newBits != 0 ) {
210 } elseif ( $oldBits != 0 && $newBits == 0 ) {
216 if ( $item->isHideCurrentOp( $newBits ) ) {
219 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
220 $status->failCount++;
222 } elseif ( !$item->canView() ) {
224 $msg = ( $opType ==
'show' ) ?
225 'revdelete-show-no-access' :
'revdelete-modify-no-access';
226 $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
227 $status->failCount++;
230 } elseif ( $newBits == self::SUPPRESS_BIT ) {
231 $itemStatus->warning(
232 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
233 $status->failCount++;
238 $ok = $item->setBits( $newBits );
241 $idsForLog[] = $item->getId();
243 if ( ( $oldBits | $newBits ) & self::SUPPRESS_BIT ) {
244 $logType =
'suppress';
245 $useSuppressLog =
true;
248 $addedBits = ( $oldBits ^ $newBits ) & $newBits;
249 $removedBits = ( $oldBits ^ $newBits ) & $oldBits;
250 $virtualNewBits |= $addedBits;
251 $virtualOldBits |= $removedBits;
253 $status->successCount++;
254 $authorActors[] = $item->getAuthorActor();
258 $visibilityChangeMap[$item->getId()] = [
259 'oldBits' => $oldBits,
260 'newBits' => $newBits,
264 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
265 $status->failCount++;
270 foreach ( $missing as $id => $unused ) {
271 if ( $perItemStatus ) {
272 $status->value[
'itemStatuses'][$id] = Status::newFatal(
'revdelete-modify-missing', $id );
274 $status->error(
'revdelete-modify-missing', $id );
276 $status->failCount++;
279 if ( $status->successCount == 0 ) {
280 $dbw->endAtomic( __METHOD__ );
285 $successCount = $status->successCount;
289 if ( !$status->isOK() ) {
291 $dbw->cancelAtomic( __METHOD__ );
297 $authorFields[
'authorActors'] = $authorActors;
299 $tags = $params[
'tags'] ?? [];
301 $logEntry = $this->updateLog(
304 'page' => $this->page,
305 'count' => $successCount,
306 'newBits' => $virtualNewBits,
307 'oldBits' => $virtualOldBits,
308 'comment' => $comment,
314 $this->
emitEvents( $bitPars, $visibilityChangeMap, $tags, $logEntry, $useSuppressLog );
317 DeferredUpdates::addCallableUpdate(
318 function () use ( $visibilityChangeMap ) {
321 DeferredUpdates::PRESEND,
325 $dbw->endAtomic( __METHOD__ );