From a5028bfe5f638e53ab002114435e8e480ef4bbc9 Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Sun, 13 Jan 2013 02:06:15 +0100 Subject: [PATCH] (bug 43915) Implement deleteEqualMessages.php Change-Id: I97529b775d4db4f996c40395c891a0049d2e43c5 --- RELEASE-NOTES-1.21 | 3 +- maintenance/deleteEqualMessages.php | 143 ++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 maintenance/deleteEqualMessages.php diff --git a/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21 index a831310aba..9852162c93 100644 --- a/RELEASE-NOTES-1.21 +++ b/RELEASE-NOTES-1.21 @@ -85,9 +85,10 @@ production. a security fix (bug 42202). * Added the ability to limit the wall clock time used by shell processes, as well as the CPU time. Configurable with $wgMaxShellWallClockTime. -* Added $wgWhitelistReadRegexp for regex whitelisting +* Added $wgWhitelistReadRegexp for regex whitelisting. * (bug 5346) Categories that are redirects will be displayed italic in the category links section at the bottom of a page. +* (bug 43915) New maintenance script deleteEqualMessages.php. === Bug fixes in 1.21 === * (bug 40353) SpecialDoubleRedirect should support interwiki redirects. diff --git a/maintenance/deleteEqualMessages.php b/maintenance/deleteEqualMessages.php new file mode 100644 index 0000000000..38e6956e9b --- /dev/null +++ b/maintenance/deleteEqualMessages.php @@ -0,0 +1,143 @@ +mDescription = "Deletes all pages in the MediaWiki namespace that are equal to the default message"; + $this->addOption( 'delete', 'Actually delete the pages' ); + $this->addOption( 'delete-talk', 'Don\'t leave orphaned talk pages behind' ); + $this->addOption( 'lang-code', 'Check for subpages of this lang-code (default: root page against content language)', false, true ); + } + + public function execute() { + global $wgUser, $wgContLang; + + $doDelete = $this->hasOption( 'delete' ); + $doDeleteTalk = $this->hasOption( 'delete-talk' ); + $forLangCode = $this->getOption( 'lang-code' ); + + if ( $forLangCode ) { + $langObj = Language::factory( $forLangCode ); + $langCode = $langObj->getCode(); + $nonContLang = true; + } else { + $langObj = $wgContLang; + $langCode = $wgContLang->getCode(); + $nonContLang = false; + } + + $this->output( "Checking for pages with default message..." ); + + /* Based on SpecialAllmessages::reallyDoQuery #filter=modified */ + + $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' ); + // Normalise message names for NS_MEDIAWIKI page_title + $messageNames = array_map( array( $langObj, 'ucfirst' ), $messageNames ); + // TODO: Do the below for each language code (e.g. delete /xxx subpage if equal to MessagesXxx) + // Right now it only takes care of the root override, which is enough since most wikis aren't multi-lang wikis. + $statuses = AllmessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang ); + + $relevantPages = 0; + $equalPages = 0; + $equalPagesTalks = 0; + $results = array(); + foreach ( $messageNames as $key ) { + $customised = isset( $statuses['pages'][$key] ); + if ( $customised ) { + $actual = wfMessage( $key )->inLanguage( $langCode )->plain(); + $default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain(); + + $relevantPages++; + if ( $actual === $default ) { + $hasTalk = isset( $statuses['talks'][$key] ); + $results[] = array( + 'title' => $key, + 'hasTalk' => $hasTalk, + ); + $equalPages++; + if ( $hasTalk ) { + $equalPagesTalks++; + } + } + } + } + + if ( $equalPages === 0 ) { + // No more equal messages left + $this->output( "done.\n" ); + return; + } + + $this->output( "\n{$relevantPages} pages in the MediaWiki namespace override messages." ); + $this->output( "\n{$equalPages} pages are equal to the default message ({$equalPagesTalks} talk pages).\n" ); + + if ( !$doDelete ) { + $this->output( "\nRun the script again with --delete to delete these pages" ); + if ( $equalPagesTalks !== 0 ) { + $this->output( " (include --delete-talk to also delete the talk pages)" ); + } + $this->output( "\n" ); + return; + } + + $user = User::newFromName( 'MediaWiki default' ); + if ( !$user ) { + $this->error( "Invalid username", true ); + } + $wgUser = $user; + + // Hide deletions from RecentChanges + $user->addGroup( 'bot' ); + + // Handle deletion + $this->output( "\n...deleting equal messages (this may take a long time!)...", 'msg' ); + $dbw = wfGetDB( DB_MASTER ); + foreach ( $results as $result ) { + wfWaitForSlaves(); + $dbw->ping(); + $dbw->begin( __METHOD__ ); + $title = Title::makeTitle( NS_MEDIAWIKI, $result['title'] ); + $page = WikiPage::factory( $title ); + $error = ''; // Passed by ref + $page->doDeleteArticle( 'No longer required', false, 0, false, $error, $user ); + if ( $result['hasTalk'] && $doDeleteTalk ) { + $title = Title::makeTitle( NS_MEDIAWIKI_TALK, $result['title'] ); + $page = WikiPage::factory( $title ); + $error = ''; // Passed by ref + $page->doDeleteArticle( 'Orphaned talk page of no longer required message', false, 0, false, $error, $user ); + } + $dbw->commit( __METHOD__ ); + } + $this->output( "done!\n", 'msg' ); + } +} + +$maintClass = "DeleteEqualMessages"; +require_once( RUN_MAINTENANCE_IF_MAIN ); -- 2.20.1