jenkins-bot has submitted this change and it was merged. Change subject: Refactor backend logic out of special page ......................................................................
Refactor backend logic out of special page Creates a MergeUser class which handles all the database updates and page moves. The output for the special page was also trimmed down, it no longer spams a bunch of useless output. Change-Id: I2bfcecad9994abaf8c58ec1ba0e02bc33309cf72 --- A IUserMergeLogger.php A MergeUser.php M SpecialUserMerge.php M UserMerge.php A UserMergeLogger.php M i18n/en.json 6 files changed, 411 insertions(+), 403 deletions(-) Approvals: CSteipp: Looks good to me, approved Siebrand: Looks good to me, but someone else must approve jenkins-bot: Verified diff --git a/IUserMergeLogger.php b/IUserMergeLogger.php new file mode 100644 index 0000000..f468b3e --- /dev/null +++ b/IUserMergeLogger.php @@ -0,0 +1,21 @@ +<?php + +interface IUserMergeLogger { + + /** + * Adds a merge log entry + * + * @param User $performer + * @param User $oldUser + * @param User $newUser + */ + public function addMergeEntry( User $performer, User $oldUser, User $newUser ); + + /** + * Adds a user deletion log entry + * + * @param User $perfomer + * @param User $oldUser + */ + public function addDeleteEntry( User $perfomer, User $oldUser ); +} \ No newline at end of file diff --git a/MergeUser.php b/MergeUser.php new file mode 100644 index 0000000..a0a7c99 --- /dev/null +++ b/MergeUser.php @@ -0,0 +1,313 @@ +<?php + +/** + * Contains the actual database backend logic for merging users + * + */ +class MergeUser { + + /** + * @var User + */ + private $oldUser, $newUser; + + /** + * @var IUserMergeLogger + */ + private $logger; + + public function __construct( + User $oldUser, + User $newUser, + IUserMergeLogger $logger + ) { + $this->newUser = $newUser; + $this->oldUser = $oldUser; + $this->logger = $logger; + } + + public function merge( User $performer ) { + $this->mergeEditcount(); + $this->mergeDatabaseTables(); + $this->logger->addMergeEntry( $performer, $this->oldUser, $this->newUser ); + } + + /** + * @param User $performer + * @param callable $msg something that returns a Message object + * + * @return array Array of failed page moves, see MergeUser::movePages + */ + public function delete( User $performer, /* callable */ $msg ) { + $failed = $this->movePages( $performer, $msg ); + $this->deleteUser(); + $this->logger->addDeleteEntry( $performer, $this->oldUser ); + + return $failed; + } + + /** + * Adds edit count of both users + */ + private function mergeEditcount() { + $dbw = wfGetDB( DB_MASTER ); + + $totalEdits = $dbw->selectField( + 'user', + 'SUM(user_editcount)', + array( 'user_id' => array( $this->newUser->getId(), $this->oldUser->getId() ) ), + __METHOD__ + ); + + $totalEdits = intval( $totalEdits ); + + # don't run queries if neither user has any edits + if ( $totalEdits > 0 ) { + # update new user with total edits + $dbw->update( 'user', + array( 'user_editcount' => $totalEdits ), + array( 'user_id' => $this->newUser->getId() ), + __METHOD__ + ); + + # clear old user's edits + $dbw->update( 'user', + array( 'user_editcount' => 0 ), + array( 'user_id' => $this->oldUser->getId() ), + __METHOD__ + ); + } + } + + /** + * Function to merge database references from one user to another user + * + * Merges database references from one user ID or username to another user ID or username + * to preserve referential integrity. + */ + private function mergeDatabaseTables() { + // Fields to update with the format: + // array( tableName, idField, textField ) + $updateFields = array( + array( 'archive', 'ar_user', 'ar_user_text' ), + array( 'revision', 'rev_user', 'rev_user_text' ), + array( 'filearchive', 'fa_user', 'fa_user_text' ), + array( 'image', 'img_user', 'img_user_text' ), + array( 'oldimage', 'oi_user', 'oi_user_text' ), + array( 'recentchanges', 'rc_user', 'rc_user_text' ), + array( 'logging', 'log_user' ), + array( 'ipblocks', 'ipb_user', 'ipb_address' ), + array( 'ipblocks', 'ipb_by', 'ipb_by_text' ), + array( 'watchlist', 'wl_user' ), + ); + + wfRunHooks( 'UserMergeAccountFields', array( &$updateFields ) ); + + $dbw = wfGetDB( DB_MASTER ); + + $this->deduplicateWatchlistEntries(); + + foreach ( $updateFields as $fieldInfo ) { + $tableName = array_shift( $fieldInfo ); + $idField = array_shift( $fieldInfo ); + + $dbw->update( + $tableName, + array( $idField => $this->newUser->getId() ) + array_fill_keys( $fieldInfo, $this->newUser->getName() ), + array( $idField => $this->oldUser->getId() ), + __METHOD__ + ); + } + + $dbw->delete( 'user_newtalk', array( 'user_id' => $this->oldUser->getId() ) ); + + wfRunHooks( 'MergeAccountFromTo', array( &$this->oldUser, &$this->newUser ) ); + } + + /** + * Deduplicate watchlist entries + * which old (merge-from) and new (merge-to) users are watching + */ + private function deduplicateWatchlistEntries() { + + $dbw = wfGetDB( DB_MASTER ); + $dbw->begin( __METHOD__ ); + + $res = $dbw->select( + array( + 'w1' => 'watchlist', + 'w2' => 'watchlist' + ), + array( + 'w2.wl_namespace', + 'w2.wl_title' + ), + array( + 'w1.wl_user' => $this->newUser->getID(), + 'w2.wl_user' => $this->oldUser->getID() + ), + __METHOD__, + array( 'FOR UPDATE' ), + array( + 'w2' => array( + 'INNER JOIN', + array( + 'w1.wl_namespace = w2.wl_namespace', + 'w1.wl_title = w2.wl_title' + ), + ) + ) + ); + + # Construct an array to delete all watched pages of the old user + # which the new user already watches + $conds = array(); + + foreach ( $res as $result ) { + $conds[] = $dbw->makeList( + array( + 'wl_user' => $this->oldUser->getID(), + 'wl_namespace' => $result->wl_namespace, + 'wl_title' => $result->wl_title + ), + LIST_AND + ); + } + + if ( empty( $conds ) ) { + $dbw->commit( __METHOD__ ); + return; + } + + # Perform a multi-row delete + $dbw->delete( + 'watchlist', + $dbw->makeList( $conds, LIST_OR ), + __METHOD__ + ); + + $dbw->commit( __METHOD__ ); + } + + /** + * Function to merge user pages + * + * Deletes all pages when merging to Anon + * Moves user page when the target user page does not exist or is empty + * Deletes redirect if nothing links to old page + * Deletes the old user page when the target user page exists + * + * @todo This code is a duplicate of Renameuser and GlobalRename + * + * @param User $performer + * @param callable $msg Function that returns a Message object + * @return array Array of old name (string) => new name (Title) where the move failed + */ + private function movePages( User $performer, /* callable */ $msg ) { + global $wgContLang, $wgUser; + + $oldusername = trim( str_replace( '_', ' ', $this->oldUser->getName() ) ); + $oldusername = Title::makeTitle( NS_USER, $oldusername ); + $newusername = Title::makeTitleSafe( NS_USER, $wgContLang->ucfirst( $this->newUser->getName() ) ); + + # select all user pages and sub-pages + $dbr = wfGetDB( DB_SLAVE ); + $pages = $dbr->select( 'page', + array( 'page_namespace', 'page_title' ), + array( + 'page_namespace' => array( NS_USER, NS_USER_TALK ), + $dbr->makeList( array( + 'page_title' => $dbr->buildLike( $oldusername->getDBkey() . '/', $dbr->anyString() ), + 'page_title' => $oldusername->getDBkey() + ), + LIST_OR + ) + ) + ); + + // Need to set $wgUser to attribute log properly. + $oldUser = $wgUser; + $wgUser = $performer; + + $failedMoves = array(); + foreach ( $pages as $row ) { + + $oldPage = Title::makeTitleSafe( $row->page_namespace, $row->page_title ); + $newPage = Title::makeTitleSafe( $row->page_namespace, + preg_replace( '!^[^/]+!', $newusername->getDBkey(), $row->page_title ) ); + + if ( $this->newUser->getName() === "Anonymous" ) { # delete ALL old pages + if ( $oldPage->exists() ) { + $oldPageArticle = new Article( $oldPage, 0 ); + $oldPageArticle->doDeleteArticle( $msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); + } + } elseif ( $newPage->exists() + && !$oldPage->isValidMoveTarget( $newPage ) + && $newPage->getLength() > 0 ) { # delete old pages that can't be moved + + $oldPageArticle = new Article( $oldPage, 0 ); + $oldPageArticle->doDeleteArticle( $msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); + + } else { # move content to new page + # delete target page if it exists and is blank + if ( $newPage->exists() ) { + $newPageArticle = new Article( $newPage, 0 ); + $newPageArticle->doDeleteArticle( $msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); + } + + # move to target location + $errors = $oldPage->moveTo( + $newPage, + false, + $msg( + 'usermerge-move-log', + $oldusername->getText(), + $newusername->getText() )->inContentLanguage()->text() + ); + if ( $errors !== true ) { + $failedMoves[$oldPage->getPrefixedText()] = $newPage; + } + + # check if any pages link here + $res = $dbr->selectField( 'pagelinks', + 'pl_title', + array( 'pl_title' => $this->oldUser->getName() ), + __METHOD__ + ); + if ( !$dbr->numRows( $res ) ) { + # nothing links here, so delete unmoved page/redirect + $oldPageArticle = new Article( $oldPage, 0 ); + $oldPageArticle->doDeleteArticle( $msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); + } + } + } + + $wgUser = $oldUser; + + return $failedMoves; + } + + + /** + * Function to delete users following a successful mergeUser call + * + * Removes user entries from the user table and the user_groups table + */ + private function deleteUser() { + $dbw = wfGetDB( DB_MASTER ); + $dbw->delete( + 'user_groups', + array( 'ug_user' => $this->oldUser->getId() ) + ); + $dbw->delete( + 'user', + array( 'user_id' => $this->oldUser->getId() ) + ); + + wfRunHooks( 'DeleteAccount', array( &$this->oldUser ) ); + + DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'users' => -1 ) ) ); + } + + +} \ No newline at end of file diff --git a/SpecialUserMerge.php b/SpecialUserMerge.php index e0ea500..d601382 100644 --- a/SpecialUserMerge.php +++ b/SpecialUserMerge.php @@ -121,410 +121,44 @@ return Status::newFatal( 'usermerge-same-old-and-new-user' ); } - $this->mergeEditcount( $newUser->getId(), $oldUser->getId() ); - $this->mergeUser( - $newUser, $newUser->getName(), $newUser->getId(), - $oldUser, $oldUser->getName(), $oldUser->getId() + // Validation passed, let's merge the user now. + $um = new MergeUser( $oldUser, $newUser, new UserMergeLogger() ); + $um->merge( $this->getUser() ); + + $out = $this->getOutput(); + + $out->addWikiMsg( + 'usermerge-success', + $oldUser->getName(), $oldUser->getId(), + $newUser->getName(), $newUser->getId() ); if ( $data['delete'] ) { - $this->movePages( $newUser->getName(), $oldUser->getName() ); - $this->deleteUser( $oldUser, $oldUser->getId(), $oldUser->getName() ); + $failed = $um->delete( $this->getUser(), array( $this, 'msg' ) ); + $out->addWikiMsg( + 'usermerge-userdeleted', $oldUser->getName(), $oldUser->getId() + ); + + if ( $failed ) { + // Output an error message for failed moves + $out->addHTML( Html::openElement( 'ul' ) ); + foreach ( $failed as $oldTitleText => $newTitle ) { + $oldTitle = Title::newFromText( $oldTitleText ); + $out->addHTML( + Html::rawElement( 'li', array(), + $this->msg( 'usermerge-page-unmoved' )->rawParams( + Linker::link( $oldTitle ), + Linker::link( $newTitle ) + )->escaped() + ) + ); + } + $out->addHTML( Html::closeElement( 'ul' ) ); + } } return Status::newGood(); } - - /** - * Function to delete users following a successful mergeUser call - * - * Removes user entries from the user table and the user_groups table - * - * @param $objOldUser User - * @param $olduserID int ID of user to delete - * @param $olduser_text string Username of user to delete - * - * @return bool Always returns true - throws exceptions on failure. - */ - private function deleteUser( $objOldUser, $olduserID, $olduser_text ) { - $dbw = wfGetDB( DB_MASTER ); - $dbw->delete( - 'user_groups', - array( 'ug_user' => $olduserID ) - ); - $dbw->delete( - 'user', - array( 'user_id' => $olduserID ) - ); - $this->getOutput()->addHTML( - $this->msg( 'usermerge-userdeleted', $olduser_text, $olduserID )->escaped() . - Html::element( 'br' ) . "\n" - ); - - $log = new LogPage( 'usermerge' ); - $log->addEntry( 'deleteuser', $this->getUser()->getUserPage(), '', array( $olduser_text, $olduserID ) ); - - wfRunHooks( 'DeleteAccount', array( &$objOldUser ) ); - - DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'users' => -1 ) ) ); - - return true; - } - - /** - * Deduplicate watchlist entries - * which old (merge-from) and new (merge-to) users are watching - * - * @param $oldUser User - * @param $newUser User - * - * @return bool - */ - private function deduplicateWatchlistEntries( $oldUser, $newUser ) { - - $dbw = wfGetDB( DB_MASTER ); - $dbw->begin( __METHOD__ ); - - $res = $dbw->select( - array( - 'w1' => 'watchlist', - 'w2' => 'watchlist' - ), - array( - 'w2.wl_namespace', - 'w2.wl_title' - ), - array( - 'w1.wl_user' => $newUser->getID(), - 'w2.wl_user' => $oldUser->getID() - ), - __METHOD__, - array( 'FOR UPDATE' ), - array( - 'w2' => array( - 'INNER JOIN', - array( - 'w1.wl_namespace = w2.wl_namespace', - 'w1.wl_title = w2.wl_title' - ), - ) - ) - ); - - # Construct an array to delete all watched pages of the old user - # which the new user already watches - $conds = array(); - - foreach ( $res as $result ) { - $conds[] = $dbw->makeList( - array( - 'wl_user' => $oldUser->getID(), - 'wl_namespace' => $result->wl_namespace, - 'wl_title' => $result->wl_title - ), - LIST_AND - ); - } - - if ( empty( $conds ) ) { - $dbw->commit( __METHOD__ ); - return true; - } - - # Perform a multi-row delete - - # requires - # MediaWiki database function with fixed https://bugzilla.wikimedia.org/50078 - # i.e. MediaWiki core after 505dbb331e16a03d87cb4511ee86df12ea295c40 (20130625) - $dbw->delete( - 'watchlist', - $dbw->makeList( $conds, LIST_OR ), - __METHOD__ - ); - - $dbw->commit( __METHOD__ ); - - return true; - } - - - /** - * Function to merge database references from one user to another user - * - * Merges database references from one user ID or username to another user ID or username - * to preserve referential integrity. - * - * @param $objNewUser User - * @param $newuser_text string Username to merge references TO - * @param $newuserID int ID of user to merge references TO - * @param $objOldUser User - * @param $olduser_text string Username of user to remove references FROM - * @param $olduserID int ID of user to remove references FROM - * - * @return bool Always returns true - throws exceptions on failure. - */ - private function mergeUser( $objNewUser, $newuser_text, $newuserID, $objOldUser, $olduser_text, $olduserID ) { - // Fields to update with the format: - // array( tableName, idField, textField ) - $updateFields = array( - array( 'archive', 'ar_user', 'ar_user_text' ), - array( 'revision', 'rev_user', 'rev_user_text' ), - array( 'filearchive', 'fa_user', 'fa_user_text' ), - array( 'image', 'img_user', 'img_user_text' ), - array( 'oldimage', 'oi_user', 'oi_user_text' ), - array( 'recentchanges', 'rc_user', 'rc_user_text' ), - array( 'logging', 'log_user' ), - array( 'ipblocks', 'ipb_user', 'ipb_address' ), - array( 'ipblocks', 'ipb_by', 'ipb_by_text' ), - array( 'watchlist', 'wl_user' ), - ); - - wfRunHooks( 'UserMergeAccountFields', array( &$updateFields ) ); - - $dbw = wfGetDB( DB_MASTER ); - $out = $this->getOutput(); - - $this->deduplicateWatchlistEntries( $objOldUser, $objNewUser ); - - foreach ( $updateFields as $fieldInfo ) { - $tableName = array_shift( $fieldInfo ); - $idField = array_shift( $fieldInfo ); - - $dbw->update( - $tableName, - array( $idField => $newuserID ) + array_fill_keys( $fieldInfo, $newuser_text ), - array( $idField => $olduserID ), - __METHOD__ - ); - - $out->addHTML( - $this->msg( - 'usermerge-updating', - $tableName, - $olduserID, - $newuserID - )->escaped() . - Html::element( 'br' ) . "\n" - ); - - foreach ( $fieldInfo as $textField ) { - $out->addHTML( - $this->msg( - 'usermerge-updating', - $tableName, - $olduser_text, - $newuser_text - )->escaped() . - Html::element( 'br' ) . "\n" - ); - } - } - - $dbw->delete( 'user_newtalk', array( 'user_id' => $olduserID ) ); - - $out->addHTML( - Html::element( 'hr' ) . "\n" . - $this->msg( 'usermerge-success', $olduser_text, $olduserID, $newuser_text, $newuserID )->escaped() . - Html::element( 'br' ) . "\n" - ); - - $log = new LogPage( 'usermerge' ); - $log->addEntry( - 'mergeuser', - $this->getUser()->getUserPage(), - '', - array( $olduser_text, $olduserID, $newuser_text, $newuserID ) - ); - - wfRunHooks( 'MergeAccountFromTo', array( &$objOldUser, &$objNewUser ) ); - - return true; - } - - - /** - * Adds edit count of both users - * - * @param $newuserID int ID of user we're merging into - * @param $olduserID int ID of user we're merging from - * - * @return bool - */ - private function mergeEditcount( $newuserID, $olduserID ) { - $dbw = wfGetDB( DB_MASTER ); - - $totalEdits = $dbw->selectField( - 'user', - 'SUM(user_editcount)', - array( 'user_id' => array( $newuserID, $olduserID ) ), - __METHOD__ - ); - - $totalEdits = intval( $totalEdits ); - - # don't run queries if neither user has any edits - if ( $totalEdits > 0 ) { - # update new user with total edits - $dbw->update( 'user', - array( 'user_editcount' => $totalEdits ), - array( 'user_id' => $newuserID ), - __METHOD__ - ); - - # clear old user's edits - $dbw->update( 'user', - array( 'user_editcount' => 0 ), - array( 'user_id' => $olduserID ), - __METHOD__ - ); - } - - $this->getOutput()->addHTML( - $this->msg( - 'usermerge-editcount-merge-success2', - $olduserID, $newuserID, Message::numParam( $totalEdits ) - )->escaped() . - Html::element( 'br' ) . "\n" - ); - - return true; - } - - /** - * Function to merge user pages - * - * Deletes all pages when merging to Anon - * Moves user page when the target user page does not exist or is empty - * Deletes redirect if nothing links to old page - * Deletes the old user page when the target user page exists - * - * @param $newuser_text string Username to merge pages TO - * @param $olduser_text string Username of user to remove pages FROM - * - * @return bool True on completion - * - * @author Matthew April <matthew.ap...@tbs-sct.gc.ca> - */ - private function movePages( $newuser_text, $olduser_text ) { - global $wgContLang; - - $oldusername = trim( str_replace( '_', ' ', $olduser_text ) ); - $oldusername = Title::makeTitle( NS_USER, $oldusername ); - $newusername = Title::makeTitleSafe( NS_USER, $wgContLang->ucfirst( $newuser_text ) ); - - # select all user pages and sub-pages - $dbr = wfGetDB( DB_SLAVE ); - $pages = $dbr->select( 'page', - array( 'page_namespace', 'page_title' ), - array( - 'page_namespace' => array( NS_USER, NS_USER_TALK ), - $dbr->makeList( array( - 'page_title' => $dbr->buildLike( $oldusername->getDBkey() . '/', $dbr->anyString() ), - 'page_title' => $oldusername->getDBkey() - ), - LIST_OR - ) - ) - ); - - $output = ''; - - foreach ( $pages as $row ) { - - $oldPage = Title::makeTitleSafe( $row->page_namespace, $row->page_title ); - $newPage = Title::makeTitleSafe( $row->page_namespace, - preg_replace( '!^[^/]+!', $newusername->getDBkey(), $row->page_title ) ); - - if ( $newuser_text === "Anonymous" ) { # delete ALL old pages - if ( $oldPage->exists() ) { - $oldPageArticle = new Article( $oldPage, 0 ); - $oldPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); - - $oldLink = Linker::linkKnown( $oldPage ); - $output .= Html::rawElement( 'li', - array( 'class' => 'mw-renameuser-pe' ), - $this->msg( 'usermerge-page-deleted' )->rawParams( $oldLink )->escaped() - ); - - } - } elseif ( $newPage->exists() - && !$oldPage->isValidMoveTarget( $newPage ) - && $newPage->getLength() > 0 ) { # delete old pages that can't be moved - - $oldPageArticle = new Article( $oldPage, 0 ); - $oldPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedelete' )->text() ); - - $link = Linker::linkKnown( $oldPage ); - $output .= Html::rawElement( 'li', - array( 'class' => 'mw-renameuser-pe' ), - $this->msg( 'usermerge-page-deleted' )->rawParams( $link )->escaped() - ); - - } else { # move content to new page - # delete target page if it exists and is blank - if ( $newPage->exists() ) { - $newPageArticle = new Article( $newPage, 0 ); - $newPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); - } - - # move to target location - $success = $oldPage->moveTo( - $newPage, - false, - $this->msg( - 'usermerge-move-log', - $oldusername->getText(), - $newusername->getText() )->inContentLanguage()->text() - ); - - if ( $success === true ) { - $oldLink = Linker::linkKnown( - $oldPage, - null, - array(), - array( 'redirect' => 'no' ) - ); - $newLink = Linker::linkKnown( $newPage ); - $output .= Html::rawElement( 'li', - array( 'class' => 'mw-renameuser-pm' ), - $this->msg( 'usermerge-page-moved' )->rawParams( $oldLink, $newLink )->escaped() - ); - } else { - $oldLink = Linker::linkKnown( $oldPage ); - $newLink = Linker::linkKnown( $newPage ); - $output .= Html::rawElement( 'li', - array( 'class' => 'mw-renameuser-pu' ), - $this->msg( 'usermerge-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped() - ); - } - - # check if any pages link here - $res = $dbr->selectField( 'pagelinks', - 'pl_title', - array( 'pl_title' => $olduser_text ), - __METHOD__ - ); - if ( !$dbr->numRows( $res ) ) { - # nothing links here, so delete unmoved page/redirect - $oldPageArticle = new Article( $oldPage, 0 ); - $oldPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedelete' )->inContentLanguage()->text() ); - } - } - - } - - if ( $output ) { - $this->getOutput()->addHTML( - Html::rawElement( 'ul', - array(), - $output - ) - ); - } - - return true; - } - } /** diff --git a/UserMerge.php b/UserMerge.php index 8b76dd4..b8596e4 100644 --- a/UserMerge.php +++ b/UserMerge.php @@ -58,6 +58,9 @@ $dir = __DIR__ . '/'; $wgAutoloadClasses['SpecialUserMerge'] = $dir . 'SpecialUserMerge.php'; $wgAutoloadClasses['UserMerge'] = $dir . 'SpecialUserMerge.php'; // back-compat +$wgAutoloadClasses['MergeUser'] = $dir . 'MergeUser.php'; +$wgAutoloadClasses['IUserMergeLogger'] = $dir . 'IUserMergeLogger.php'; +$wgAutoloadClasses['UserMergeLogger'] = $dir . 'UserMergeLogger.php'; $wgMessagesDirs['UserMerge'] = __DIR__ . '/i18n'; diff --git a/UserMergeLogger.php b/UserMergeLogger.php new file mode 100644 index 0000000..6e050bf --- /dev/null +++ b/UserMergeLogger.php @@ -0,0 +1,42 @@ +<?php + +class UserMergeLogger implements IUserMergeLogger { + + /** + * Adds a merge log entry + * + * @todo Stop using this deprecated format + * @param User $performer + * @param User $oldUser + * @param User $newUser + */ + public function addMergeEntry( User $performer, User $oldUser, User $newUser ) { + $log = new LogPage( 'usermerge' ); + $log->addEntry( + 'mergeuser', + $performer->getUserPage(), + '', + array( + $oldUser->getName(), $oldUser->getId(), + $newUser->getName(), $newUser->getId() + ) + ); + } + + /** + * Adds a user deletion log entry + * + * @todo Stop using this deprecated format + * @param User $perfomer + * @param User $oldUser + */ + public function addDeleteEntry( User $perfomer, User $oldUser ) { + $log = new LogPage( 'usermerge' ); + $log->addEntry( + 'deleteuser', + $perfomer->getUserPage(), + '', + array( $oldUser->getName(), $oldUser->getId() ) + ); + } +} diff --git a/i18n/en.json b/i18n/en.json index 2222e45..4e6eb70 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -17,20 +17,15 @@ "usermerge-badtoken": "Invalid edit token.", "usermerge-userdeleted": "$1 ($2) has been deleted.", "usermerge-userdeleted-log": "Deleted user: $2 ($3)", - "usermerge-updating": "Updating $1 table ($2 to $3)", "usermerge-success": "Merge from $1 ($2) to {{GENDER:$3|$3}} ($4) is complete.", "usermerge-success-log": "User $2 ($3) merged to {{GENDER:$4|$4}} ($5)", "usermerge-logpage": "User merge log", "usermerge-logpagetext": "This is a log of user merge actions.", "usermerge-noselfdelete": "You cannot delete or merge from yourself!", - "usermerge-unmergable": "Unable to merge from user: ID or name has been defined as unmergable.", "usermerge-protectedgroup": "Unable to merge from user: User is in a protected group.", "right-usermerge": "Merge users", "action-usermerge": "merge users", - "usermerge-editcount-merge-success2": "Merged edit counts of $1 and $2 for a new total of $3 {{PLURAL:$3|edit|edits}}", "usermerge-autopagedelete": "Automatically deleted when merging users", "usermerge-page-unmoved": "The page $1 could not be moved to $2.", - "usermerge-page-moved": "The page $1 has been moved to $2.", - "usermerge-move-log": "Automatically moved page while merging the user \"[[User:$1|$1]]\" to \"[[User:$2|{{GENDER:$2|$2}}]]\"", - "usermerge-page-deleted": "Deleted page $1" + "usermerge-move-log": "Automatically moved page while merging the user \"[[User:$1|$1]]\" to \"[[User:$2|{{GENDER:$2|$2}}]]\"" } -- To view, visit https://gerrit.wikimedia.org/r/150128 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I2bfcecad9994abaf8c58ec1ba0e02bc33309cf72 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/UserMerge Gerrit-Branch: master Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com> Gerrit-Reviewer: BryanDavis <bda...@wikimedia.org> Gerrit-Reviewer: CSteipp <cste...@wikimedia.org> Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com> Gerrit-Reviewer: Reedy <re...@wikimedia.org> Gerrit-Reviewer: Siebrand <siebr...@kitano.nl> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits