From a9c243b7b5289dad204278dbe7ed571fd914e395 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Niklas=20Laxstr=C3=B6m?= Date: Wed, 14 Sep 2011 10:36:24 +0000 Subject: [PATCH] RevisionDeleter: * Fixed comment of getChanges and made it public * Removed getLogMessage and expandMessageArray, now unused LogFormatter: * Cache parsed parameters locally, since this function is going to be called few times for every log entry DefaultSettings: * Could not find any use of suppress/file log LogPage: * Removed old formatting code, now unused WikiPage: * Converted (suppress|delete)/delete logs to new format Added DeleteLogFormatter, handles part of suppression log as well. Updated messages. This also addresses bug 18578. --- RELEASE-NOTES-1.19 | 2 + includes/AutoLoader.php | 1 + includes/DefaultSettings.php | 15 ++--- includes/LogPage.php | 17 ----- includes/WikiPage.php | 9 ++- includes/logging/LogFormatter.php | 74 ++++++++++++++++++++- includes/revisiondelete/RevisionDeleter.php | 48 ++----------- languages/messages/MessagesEn.php | 33 +++++---- languages/messages/MessagesFi.php | 30 +++++---- maintenance/language/messages.inc | 35 +++++----- 10 files changed, 145 insertions(+), 119 deletions(-) diff --git a/RELEASE-NOTES-1.19 b/RELEASE-NOTES-1.19 index 8f38d35e83..144e87984b 100644 --- a/RELEASE-NOTES-1.19 +++ b/RELEASE-NOTES-1.19 @@ -61,6 +61,8 @@ production. to stop it from replace an already existing default sort, and suppress error. * (bug 30364) LanguageConverter now depends on the page content language instead of the wiki content language +* (bug 18578) Rewrote revision delete related messages to allow better + localisation === Bug fixes in 1.19 === * $wgUploadNavigationUrl should be used for file redlinks if diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 065a487207..73ab7e0c32 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -542,6 +542,7 @@ $wgAutoloadLocalClasses = array( 'ManualLogEntry' => 'includes/logging/LogEntry.php', 'LogFormatter' => 'includes/logging/LogFormatter.php', 'LegacyLogFormatter' => 'includes/logging/LogFormatter.php', + 'DeleteLogFormatter' => 'includes/logging/LogFormatter.php', 'MoveLogFormatter' => 'includes/logging/LogFormatter.php', # includes/media diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index a7a3a186cd..4b69e7188e 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -5028,20 +5028,12 @@ $wgLogActions = array( 'protect/move_prot' => 'movedarticleprotection', 'rights/rights' => 'rightslogentry', 'rights/autopromote' => 'rightslogentry-autopromote', - 'delete/delete' => 'deletedarticle', - 'delete/restore' => 'undeletedarticle', - 'delete/revision' => 'revdelete-logentry', - 'delete/event' => 'logdelete-logentry', 'upload/upload' => 'uploadedimage', 'upload/overwrite' => 'overwroteimage', 'upload/revert' => 'uploadedimage', 'import/upload' => 'import-logentry-upload', 'import/interwiki' => 'import-logentry-interwiki', 'merge/merge' => 'pagemerge-logentry', - 'suppress/revision' => 'revdelete-logentry', - 'suppress/file' => 'revdelete-logentry', - 'suppress/event' => 'logdelete-logentry', - 'suppress/delete' => 'suppressedarticle', 'suppress/block' => 'blocklogentry', 'suppress/reblock' => 'reblock-logentry', 'patrol/patrol' => 'patrol-log-line', @@ -5055,7 +5047,12 @@ $wgLogActions = array( */ $wgLogActionsHandlers = array( // move, move_redir - 'move/*' => 'MoveLogFormatter', + 'move/*' => 'MoveLogFormatter', + // delete, restore, revision, event + 'delete/*' => 'DeleteLogFormatter', + 'suppress/revision' => 'DeleteLogFormatter', + 'suppress/event' => 'DeleteLogFormatter', + 'suppress/delete' => 'DeleteLogFormatter', ); /** diff --git a/includes/LogPage.php b/includes/LogPage.php index aa579290a1..64f9540726 100644 --- a/includes/LogPage.php +++ b/includes/LogPage.php @@ -286,23 +286,6 @@ class LogPage { if( $params[2] ) { $details .= ' [' . wfMsgExt( 'protect-summary-cascade', array( 'parsemag', 'language' => $langObj ) ) . ']'; } - // Page moves - } elseif ( $type == 'move' && count( $params ) == 3 ) { - if( $params[2] ) { - $details .= ' [' . wfMsgExt( 'move-redirect-suppressed', array( 'parsemag', 'language' => $langObj ) ) . ']'; - } - // Revision deletion - } elseif ( preg_match( '/^(delete|suppress)\/revision$/', $key ) && count( $params ) == 5 ) { - $count = substr_count( $params[2], ',' ) + 1; // revisions - $ofield = intval( substr( $params[3], 7 ) ); // - $nfield = intval( substr( $params[4], 7 ) ); // - $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, $langObj, false ); - // Log deletion - } elseif ( preg_match( '/^(delete|suppress)\/event$/', $key ) && count( $params ) == 4 ) { - $count = substr_count( $params[1], ',' ) + 1; // log items - $ofield = intval( substr( $params[2], 7 ) ); // - $nfield = intval( substr( $params[3], 7 ) ); // - $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, $langObj, true ); } $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $params ) . $details; diff --git a/includes/WikiPage.php b/includes/WikiPage.php index d13c60aa93..a99058da31 100644 --- a/includes/WikiPage.php +++ b/includes/WikiPage.php @@ -1741,10 +1741,13 @@ class WikiPage extends Page { # Log the deletion, if the page was suppressed, log it at Oversight instead $logtype = $suppress ? 'suppress' : 'delete'; - $log = new LogPage( $logtype ); - # Make sure logging got through - $log->addEntry( 'delete', $this->mTitle, $reason, array() ); + $logEntry = new ManualLogEntry( $logtype, 'delete' ); + $logEntry->setPerformer( $user ); + $logEntry->setTarget( $this->mTitle ); + $logEntry->setComment( $reason ); + $logid = $logEntry->insert(); + $logEntry->publish( $logid ); if ( $commit ) { $dbw->commit(); diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php index 4a73ec677c..0cbcc69632 100644 --- a/includes/logging/LogFormatter.php +++ b/includes/logging/LogFormatter.php @@ -133,7 +133,7 @@ class LogFormatter { * @return Message|pre-escaped html */ protected function getActionMessage() { - $message = $this->msg( $this->getMessageKey() ); + $message = $this->msg( $this->getMessageKey() ); $message->params( $this->getMessageParameters() ); return $message; } @@ -162,6 +162,10 @@ class LogFormatter { * @return array */ protected function getMessageParameters() { + if ( isset( $this->parsedParameters ) ) { + return $this->parsedParameters; + } + $entry = $this->entry; $params = array(); @@ -193,7 +197,7 @@ class LogFormatter { } } - return $params; + return $this->parsedParameters = $params; } /** @@ -341,3 +345,69 @@ class MoveLogFormatter extends LogFormatter { return $params; } } + +/** + * This class formats delete log entries. + * @since 1.19 + */ +class DeleteLogFormatter extends LogFormatter { + protected function getMessageKey() { + $key = parent::getMessageKey(); + if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) { + if ( count( $this->getMessageParameters() ) < 5 ) { + return "$key-legacy"; + } + } + return $key; + } + + protected function getMessageParameters() { + if ( isset( $this->parsedParametersDeleteLog ) ) { + return $this->parsedParametersDeleteLog; + } + + $params = parent::getMessageParameters(); + $subtype = $this->entry->getSubtype(); + if ( in_array( $subtype, array( 'event', 'revision' ) ) ) { + if ( count( $params ) > 5 ) { + $paramStart = $subtype === 'revision' ? 4 : 3; + + $old = $this->parseBitField( $params[$paramStart+1] ); + $new = $this->parseBitField( $params[$paramStart+2] ); + list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old ); + $changes = array(); + foreach ( $hid as $v ) { + $changes[] = $this->msg( "$v-hid" )->plain(); + } + foreach ( $unhid as $v ) { + $changes[] = $this->msg( "$v-unhid" )->plain(); + } + foreach ( $extra as $v ) { + $changes[] = $this->msg( $v )->plain(); + } + $changeText = $this->context->getLang()->listToText( $changes ); + + + $newParams = array_slice( $params, 0, 3 ); + $newParams[3] = $changeText; + $count = count( explode( ',', $params[$paramStart] ) ); + $newParams[4] = $this->context->getLang()->formatNum( $count ); + return $this->parsedParametersDeleteLog = $newParams; + } else { + return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 ); + } + } + + return $this->parsedParametersDeleteLog = $params; + } + + protected function parseBitField( $string ) { + // Input is like ofield=2134 or just the number + if ( strpos( $string, 'field=' ) === 1 ) { + list( , $field ) = explode( '=', $string ); + return (int) $field; + } else { + return (int) $string; + } + } +} diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php index bde586c595..0d67774fe6 100644 --- a/includes/revisiondelete/RevisionDeleter.php +++ b/includes/revisiondelete/RevisionDeleter.php @@ -30,16 +30,17 @@ class RevisionDeleter { /** * Gets an array of message keys describing the changes made to the visibility * of the revision. If the resulting array is $arr, then $arr[0] will contain an - * array of strings describing the items that were hidden, $arr[2] will contain - * an array of strings describing the items that were unhidden, and $arr[3] will + * array of strings describing the items that were hidden, $arr[1] will contain + * an array of strings describing the items that were unhidden, and $arr[2] will * contain an array with a single string, which can be one of "applied * restrictions to sysops", "removed restrictions from sysops", or null. * * @param $n Integer: the new bitfield. * @param $o Integer: the old bitfield. * @return An array as described above. + * @since 1.19 public */ - protected static function getChanges( $n, $o ) { + public static function getChanges( $n, $o ) { $diff = $n ^ $o; $ret = array( 0 => array(), 1 => array(), 2 => array() ); // Build bitfield changes in language @@ -59,47 +60,6 @@ class RevisionDeleter { return $ret; } - /** - * Gets a log message to describe the given revision visibility change. This - * message will be of the form "[hid {content, edit summary, username}]; - * [unhid {...}][applied restrictions to sysops] for $count revisions: $comment". - * - * @param $count Integer: The number of effected revisions. - * @param $nbitfield Integer: The new bitfield for the revision. - * @param $obitfield Integer: The old bitfield for the revision. - * @param $language Language object to use - * @param $isForLog Boolean - */ - public static function getLogMessage( $count, $nbitfield, $obitfield, $language, $isForLog = false ) { - $changes = self::getChanges( $nbitfield, $obitfield ); - array_walk( $changes, array( __CLASS__, 'expandMessageArray' ), $language ); - - $changesText = array(); - - if( count( $changes[0] ) ) { - $changesText[] = wfMsgExt( 'revdelete-hid', array( 'parsemag', 'language' => $language ), $language->commaList( $changes[0] ) ); - } - if( count( $changes[1] ) ) { - $changesText[] = wfMsgExt( 'revdelete-unhid', array( 'parsemag', 'language' => $language ), $language->commaList( $changes[1] ) ); - } - - $s = $language->semicolonList( $changesText ); - if( count( $changes[2] ) ) { - $s .= $s ? ' (' . $changes[2][0] . ')' : ' ' . $changes[2][0]; - } - - $msg = $isForLog ? 'logdelete-log-message' : 'revdelete-log-message'; - return wfMsgExt( $msg, array( 'parsemag', 'language' => $language ), $s, $language->formatNum($count) ); - } - - private static function expandMessageArray( &$msg, $key, $language ) { - if ( is_array ( $msg ) ) { - array_walk( $msg, array( __CLASS__, 'expandMessageArray' ), $language ); - } else { - $msg = wfMsgExt( $msg, array( 'parsemag', 'language' => $language ) ); - } - } - // Get DB field name for URL param... // Future code for other things may also track // other types of revision-specific changes. diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 553c5a4522..fef8150e91 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -1572,8 +1572,6 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con 'revdelete-unsuppress' => 'Remove restrictions on restored revisions', 'revdelete-log' => 'Reason:', 'revdelete-submit' => 'Apply to selected {{PLURAL:$1|revision|revisions}}', -'revdelete-logentry' => 'changed revision visibility of "[[$1]]"', -'logdelete-logentry' => 'changed event visibility of "[[$1]]"', 'revdelete-success' => "'''Revision visibility successfully updated.'''", 'revdelete-failure' => "'''Revision visibility could not be updated:''' $1", @@ -1585,15 +1583,6 @@ $1", 'revdel-restore-visible' => 'visible revisions', 'pagehist' => 'Page history', 'deletedhist' => 'Deleted history', -'revdelete-content' => 'content', -'revdelete-summary' => 'edit summary', -'revdelete-uname' => 'username', -'revdelete-restricted' => 'applied restrictions to administrators', -'revdelete-unrestricted' => 'removed restrictions for administrators', -'revdelete-hid' => 'hid $1', -'revdelete-unhid' => 'unhid $1', -'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|revision|revisions}}', -'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|event|events}}', 'revdelete-hide-current' => 'Error hiding the item dated $2, $1: this is the current revision. It cannot be hidden.', 'revdelete-show-no-access' => 'Error showing the item dated $2, $1: this item has been marked "restricted". @@ -2810,8 +2799,6 @@ Please confirm that you intend to do this, that you understand the consequences, 'actionfailed' => 'Action failed', 'deletedtext' => '"$1" has been deleted. See $2 for a record of recent deletions.', -'deletedarticle' => 'deleted "[[$1]]"', -'suppressedarticle' => 'suppressed "[[$1]]"', 'dellogpage' => 'Deletion log', 'dellogpagetext' => 'Below is a list of the most recent deletions.', 'deletionlog' => 'deletion log', @@ -2946,7 +2933,6 @@ You may have a bad link, or the revision may have been restored or removed from 'undeletereset' => 'Reset', 'undeleteinvert' => 'Invert selection', 'undeletecomment' => 'Reason:', -'undeletedarticle' => 'restored "[[$1]]"', 'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisions}} restored', 'undeletedrevisions-files' => '{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored', 'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} restored', @@ -4647,6 +4633,25 @@ This site is experiencing technical difficulties.', 'sqlite-no-fts' => '$1 without full-text search support', # New logging system +'logentry-delete-delete' => '$1 {{GENDER:$2|deleted}} page $3', +'logentry-delete-restore' => '$1 {{GENDER:$2|restored}} page $3', +'logentry-delete-event' => '$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4', +'logentry-delete-revision' => '$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4', +'logentry-delete-event-legacy' => '$1 {{GENDER:$2|changed}} visibility of log events on $3', +'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|changed}} visibility of revisions on page $3', +'logentry-suppress-delete' => '$1 {{GENDER:$2|supressed}} page $3', +'logentry-suppress-event' => '$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4', +'logentry-suppress-revision' => '$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4', +'logentry-suppress-event-legacy' => '$1 secretly {{GENDER:$2|changed}} visibility of log events on $3', +'logentry-suppress-revision-legacy' => '$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3', +'revdelete-content-hid' => 'content hidden', +'revdelete-summary-hid' => 'edit summary hidden', +'revdelete-uname-hid' => 'username hidden', +'revdelete-content-unhid' => 'content unhidden', +'revdelete-summary-unhid' => 'edit summary unhidden', +'revdelete-uname-unhid' => 'username unhidden', +'revdelete-restricted' => 'applied restrictions to administrators', +'revdelete-unrestricted' => 'removed restrictions for administrators', 'logentry-move-move' => '$1 {{GENDER:$2|moved}} page $3 to $4', 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect', 'logentry-move-move_redir' => '$1 {{GENDER:$2|moved}} page $3 to $4 over redirect', diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php index 4e3b0d6cc2..c738b0679b 100644 --- a/languages/messages/MessagesFi.php +++ b/languages/messages/MessagesFi.php @@ -1136,8 +1136,6 @@ Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti lukea piilote 'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versiolta', 'revdelete-log' => 'Syy', 'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}', -'revdelete-logentry' => 'muutti sivun [[$1]] version näkyvyyttä', -'logdelete-logentry' => 'muutti sivun [[$1]] näkyvyyttä', 'revdelete-success' => "'''Version näkyvyys päivitetty.'''", 'revdelete-failure' => "'''Version näkyvyyttä ei voitu päivittää:''' $1", @@ -1149,15 +1147,6 @@ $1", 'revdel-restore-visible' => 'näkyvät muutokset', 'pagehist' => 'Sivun muutoshistoria', 'deletedhist' => 'Poistettujen versioiden historia', -'revdelete-content' => 'sisällön', -'revdelete-summary' => 'yhteenvedon', -'revdelete-uname' => 'käyttäjänimen', -'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille', -'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä', -'revdelete-hid' => 'piilotti $1', -'revdelete-unhid' => 'palautti näkyviin $1', -'revdelete-log-message' => '$1 koskien $2 {{PLURAL:$2|versiota}}', -'logdelete-log-message' => '$1 koskien $2 {{PLURAL:$2|tapahtumaa}}', 'revdelete-hide-current' => 'Virhe tapahtui $2, $1 päivätyn kohteen piilottamisessa: tämä on nykyinen versio. Sitä ei voi piilottaa.', 'revdelete-show-no-access' => 'Virhe näyttäessä kohtaa $2 kello $1: kohta on merkitty ”rajoitetuksi”. Sinulla ei ole oikeutta siihen.', @@ -2226,8 +2215,6 @@ Palaute ja lisäapu osoitteessa: 'actionfailed' => 'Toiminto epäonnistui', 'deletedtext' => '”$1” on poistettu. Sivulla $2 on lista viimeaikaisista poistoista.', -'deletedarticle' => 'poisti sivun [[$1]]', -'suppressedarticle' => 'häivytti sivun [[$1]]', 'dellogpage' => 'Poistoloki', 'dellogpagetext' => 'Alla on loki viimeisimmistä poistoista.', 'deletionlog' => 'poistoloki', @@ -2342,7 +2329,6 @@ Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valinta 'undeletereset' => 'Tyhjennä', 'undeleteinvert' => 'Käänteinen valinta', 'undeletecomment' => 'Syy', -'undeletedarticle' => 'palautti sivun [[$1]]', 'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin', 'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin', 'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin', @@ -3671,4 +3657,20 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P 'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle', 'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle', +# New logging system +'logentry-delete-delete' => '$1 poisti sivun $3', +'logentry-delete-restore' => '$1 palautti sivun $3', +'logentry-delete-event' => '$1 muutti {{PLURAL:$5||$5}} lokitapahtuman näkyvyyttä $3: $4', +'logentry-delete-revision' => '$1 muutti {{PLURAL:$5||$5}} muutoksen näkyvyyttä sivulla $3: $4', +'logentry-delete-event-legacy' => '$1 muutti lokitapahtumien näkyvyyttä $3', +'logentry-delete-revision-legacy' => '$1 muutti sivun $3 muutosten näkyvyyttä', +'revdelete-content-hid' => 'sisältö piilotettu', +'revdelete-summary-hid' => 'muokkausyhteenveto piilotettu', +'revdelete-uname-hid' => 'käyttäjätunnus piilotettu', +'revdelete-content-unhid' => 'sisältö palautettu näkyviin', +'revdelete-summary-unhid' => 'muokkausyhteenveto palautettu näkyviin', +'revdelete-uname-unhid' => 'käyttäjätunnus palautettu näkyviin', +'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille', +'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä', + ); diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index ac45fc6b14..427ab44629 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -768,10 +768,6 @@ $wgMessageStructure = array( 'revdelete-unsuppress', 'revdelete-log', 'revdelete-submit', - 'revdelete-logentry', - 'logdelete-logentry', - 'revdelete-logaction', - 'logdelete-logaction', 'revdelete-success', 'revdelete-failure', 'logdelete-success', @@ -781,15 +777,6 @@ $wgMessageStructure = array( 'revdel-restore-visible', 'pagehist', 'deletedhist', - 'revdelete-content', - 'revdelete-summary', - 'revdelete-uname', - 'revdelete-restricted', - 'revdelete-unrestricted', - 'revdelete-hid', - 'revdelete-unhid', - 'revdelete-log-message', - 'logdelete-log-message', 'revdelete-hide-current', 'revdelete-show-no-access', 'revdelete-modify-no-access', @@ -1870,8 +1857,6 @@ $wgMessageStructure = array( 'actioncomplete', 'actionfailed', 'deletedtext', - 'deletedarticle', - 'suppressedarticle', 'dellogpage', 'dellogpagetext', 'deletionlog', @@ -1977,7 +1962,6 @@ $wgMessageStructure = array( 'undeletereset', 'undeleteinvert', 'undeletecomment', - 'undeletedarticle', 'undeletedrevisions', 'undeletedrevisions-files', 'undeletedfiles', @@ -3513,6 +3497,25 @@ $wgMessageStructure = array( 'confirm-unwatch-button', ), 'logging' => array( + 'logentry-delete-delete', + 'logentry-delete-restore', + 'logentry-delete-event', + 'logentry-delete-revision', + 'logentry-delete-event-legacy', + 'logentry-delete-revision-legacy', + 'logentry-suppress-delete', + 'logentry-suppress-event', + 'logentry-suppress-revision', + 'logentry-suppress-event-legacy', + 'logentry-suppress-revision-legacy', + 'revdelete-content-hid', + 'revdelete-summary-hid', + 'revdelete-uname-hid', + 'revdelete-content-unhid', + 'revdelete-summary-unhid', + 'revdelete-uname-unhid', + 'revdelete-restricted', + 'revdelete-unrestricted', 'logentry-move-move', 'logentry-move-move-noredirect', 'logentry-move-move_redir', -- 2.20.1