+ *
*/
+
class UserMerge extends SpecialPage {
function __construct() {
parent::__construct( 'UserMerge', 'usermerge' );
}
=
function execute( $par ) {
- global $wgRequest, $wgOut, $wgUser;
-
- wfLoadExtensionMessages( 'UserMerge' );
-
$this->setHeaders();
=
- if ( !$wgUser->isAllowed( 'usermerge' ) ) {
- $wgOut->permissionRequired( 'usermerge' );
- return;
+ $user =3D $this->getUser();
+
+ if ( !$user->isAllowed( 'usermerge' ) ) {
+ throw new PermissionsError( 'usermerge' );
}
=
+ $out =3D $this->getOutput();
+ $request =3D $this->getRequest();
+
// init variables
$olduser_text =3D '';
$newuser_text =3D '';
$deleteUserCheck =3D false;
+ $validOldUser =3D false;
$validNewUser =3D false;
=
- if ( strlen( $wgRequest->getText( 'olduser' ).$wgRequest->getText( 'newu=
ser' ) ) > 0 || $wgRequest->getText( 'deleteuser' ) ) {
- //POST data found
- $olduser =3D Title::newFromText( $wgRequest->getText( 'olduser' ) );
+ if ( strlen( $request->getText( 'olduser' ) . $request->getText( 'newuse=
r' ) ) > 0 || $request->getText( 'deleteuser' ) ) {
+ // POST data found
+ $olduser =3D Title::newFromText( $request->getText( 'olduser' ) );
$olduser_text =3D is_object( $olduser ) ? $olduser->getText() : '';
=
- $newuser =3D Title::newFromText( $wgRequest->getText( 'newuser' ) );
+ $newuser =3D Title::newFromText( $request->getText( 'newuser' ) );
$newuser_text =3D is_object( $newuser ) ? $newuser->getText() : '';
=
- if ( $wgRequest->getText( 'deleteuser' ) ) {
+ if ( $request->getText( 'deleteuser' ) ) {
$deleteUserCheck =3D true;
}
=
@@ -51,14 +55,12 @@ class UserMerge extends SpecialPage {
$objOldUser =3D User::newFromName( $olduser_text );
$olduserID =3D $objOldUser->idForName();
=
- global $wgUser;
-
- if ( !is_object( $objOldUser ) ) {
+ if ( !is_object( $objOldUser ) || $objOldUser->getID() =3D=3D 0 ) {
$validOldUser =3D false;
- $wgOut->wrapWikiMsg( "\n$1
", 'usermerge-ba=
dolduser' );
- } elseif ( $olduserID =3D=3D $wgUser->getID() ) {
+ $out->wrapWikiMsg( "\n$1
", 'usermerge-bado=
lduser' );
+ } elseif ( $olduserID =3D=3D $user->getID() ) {
$validOldUser =3D false;
- $wgOut->wrapWikiMsg( "\n$1
", 'usermerge-no=
selfdelete' );
+ $out->wrapWikiMsg( "\n$1
", 'usermerge-nose=
lfdelete' );
} else {
global $wgUserMergeProtectedGroups;
=
@@ -71,182 +73,609 @@ class UserMerge extends SpecialPage {
=
if ( $boolProtected ) {
$validOldUser =3D false;
- $wgOut->wrapWikiMsg( "\n$1
", 'usermerge-p=
rotectedgroup' );
+ $out->wrapWikiMsg( "\n$1
", 'usermerge-pro=
tectedgroup' );
} else {
$validOldUser =3D true;
=
- if (strlen( $newuser_text ) > 0 ) {
-
+ if ( strlen( $newuser_text ) > 0 ) {
$objNewUser =3D User::newFromName( $newuser_text );
$newuserID =3D $objNewUser->idForName();
=
- if ( !is_object( $objNewUser ) || $newuserID =3D=3D 0 ) {
- if ( $newuser_text =3D=3D 'Anonymous' ) {
+ if ( !is_object( $objNewUser ) || $newuserID =3D=3D=3D 0 ) {
+ if ( $newuser_text =3D=3D=3D 'Anonymous' ) {
// Merge to anonymous
$validNewUser =3D true;
$newuserID =3D 0;
} else {
- //invalid newuser entered
+ // invalid newuser entered
$validNewUser =3D false;
- $wgOut->wrapWikiMsg( "$1
", 'usermerge-=
badnewuser' );
+ $out->wrapWikiMsg( "$1
", 'usermerge-ba=
dnewuser' );
}
+ } elseif( $olduserID =3D=3D $newuserID ) {
+ $validNewUser =3D false;
+ $out->wrapWikiMsg( "$1
", array( 'userme=
rge-same-old-and-new-user' ) );
} else {
- //newuser looks good
+ // newuser looks good
$validNewUser =3D true;
}
} else {
- //empty newuser string
+ // empty newuser string
$validNewUser =3D false;
$newuser_text =3D "Anonymous";
- $wgOut->wrapWikiMsg( "$1
", array( 'userm=
erge-nonewuser', $newuser_text ) );
+ $out->wrapWikiMsg( "$1
", array( 'usermer=
ge-nonewuser', $newuser_text ) );
}
}
}
} else {
$validOldUser =3D false;
- $wgOut->addHTML( "" . wfMsg('usermerge-n=
oolduser') . "
\n" );
+ $out->addHTML(
+ Html::rawElement( 'span',
+ array( 'class' =3D> 'warning' ),
+ $this->msg( 'usermerge-noolduser' )->escaped()
+ ) .
+ Html::element( 'br' ) .
+ "\n"
+ );
}
- } else {
- //NO POST data found
}
=
- $wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' =3D> 'post', 'action' =3D> $t=
his->getTitle()->getLocalUrl(), 'id' =3D> 'usermergeform' ) ) .
- Xml::fieldset( wfMsg( 'usermerge-fieldset' ) ) .
- Xml::openElement( 'table', array( 'id' =3D> 'mw-usermerge-table' ) ) .
- "
- " .
- Xml::label( wfMsg( 'usermerge-olduser' ), 'olduser' ) .
- " |
- " .
- Xml::input( 'olduser', 20, $olduser_text, array( 'type' =3D> 'text', =
'tabindex' =3D> '1', 'onFocus' =3D> "document.getElementById('olduser').sel=
ect;" ) ) . ' ' .
- " |
-
-
- " .
- Xml::label( wfMsg( 'usermerge-newuser' ), 'newuser' ) .
- " |
- " .
- Xml::input( 'newuser', 20, $newuser_text, array( 'type' =3D> 'text', =
'tabindex' =3D> '2', 'onFocus' =3D> "document.getElementById('newuser').sel=
ect;" ) ) .
- " |
-
-
- " .
- " |
- " .
- Xml::checkLabel( wfMsg( 'usermerge-deleteolduser' ), 'deleteuser', 'd=
eleteuser', $deleteUserCheck, array( 'tabindex' =3D> '3' ) ) .
- " |
-
-
-
- |
- " .
- Xml::submitButton( wfMsg( 'usermerge-submit' ), array( 'tabindex' =3D=
> '4' ) ) .
- " |
-
" .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' ) .
- Html::hidden( 'token', $wgUser->editToken() ) .
- Xml::closeElement( 'form' ) . "\n"
+ $out->addHtml(
+
+ Html::rawElement( 'form',
+
+ array(
+ 'method' =3D> 'post',
+ 'action' =3D> $this->getTitle()->getLocalUrl(),
+ 'id' =3D> 'usermergeform'
+ ),
+
+ Html::rawElement( 'fieldset',
+
+ array(),
+ Html::element( 'legend',
+ array(),
+ $this->msg( 'usermerge-fieldset' )->text()
+ ) .
+
+ Html::rawElement( 'table',
+
+ array( 'id' =3D> 'mw-usermerge-table' ),
+ Html::rawElement( 'tr',
+
+ array(),
+ Html::rawElement( 'td',
+ array( 'class' =3D> 'mw-label' ),
+ Html::element( 'label',
+ array( 'for' =3D> 'olduser' ),
+ $this->msg( 'usermerge-olduser' )->text()
+ )
+ ) .
+
+ Html::rawElement( 'td',
+ array( 'class' =3D> 'mw-input' ),
+ Html::input(
+ 'olduser',
+ $olduser_text,
+ 'text',
+ array(
+ 'tabindex' =3D> '1',
+ 'size' =3D> '20',
+ 'onFocus' =3D> "document.getElementById( 'olduser' ).select;"
+ )
+ ),
+ ' '
+ )
+ ) .
+
+ Html::rawElement( 'tr',
+
+ array(),
+ Html::rawElement( 'td',
+ array( 'class' =3D> 'mw-label' ),
+ Html::element( 'label',
+ array( 'for' =3D> 'newuser' ),
+ $this->msg( 'usermerge-newuser' )->text()
+ )
+ ) .
+
+ Html::rawElement( 'td',
+ array( 'class' =3D> 'mw-input' ),
+ Html::input(
+ 'newuser',
+ $newuser_text,
+ 'text',
+ array(
+ 'tabindex' =3D> '2',
+ 'size' =3D> '20',
+ 'onFocus' =3D> "document.getElementById( 'newuser' ).select;"
+ )
+ )
+ )
+
+ ) .
+
+ Html::rawElement( 'tr',
+
+ array(),
+ Html::rawElement( 'td',
+ array(),
+ " "
+ ) .
+
+ Html::rawElement( 'td',
+ array( 'class' =3D> 'mw-input' ),
+ Xml::checkLabel(
+ $this->msg( 'usermerge-deleteolduser' )->text(),
+ 'deleteuser',
+ 'deleteuser',
+ $deleteUserCheck,
+ array( 'tabindex' =3D> '3' )
+ )
+ )
+
+ ) .
+
+ Html::rawElement( 'tr',
+
+ array(),
+ Html::rawElement( 'td',
+ array(),
+ " "
+ ) .
+
+ Html::rawElement( 'td',
+ array( 'class' =3D> 'mw-submit' ),
+ Xml::submitButton(
+ $this->msg( 'usermerge-submit' )->text(),
+ array( 'tabindex' =3D> '4' )
+ )
+ )
+
+ )
+
+ )
+
+ ) .
+
+ Html::Hidden( 'token', $user->getEditToken() )
+
+ ) . "\n"
+
);
=
if ( $validNewUser && $validOldUser ) {
- //go time, baby
- if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'token' ) ) ) {
- //bad editToken
- $wgOut->addHTML( "" . wfMsg( 'usermerge-=
badtoken' ) . "
\n" );
+ // go time, baby
+ if ( !$user->matchEditToken( $request->getVal( 'token' ) ) ) {
+ // bad editToken
+ $out->addHTML(
+ Html::rawElement( 'span',
+ array( 'class' =3D> 'warning' ),
+ $this->msg( 'usermerge-badtoken' )->escaped()
+ ) .
+ Html::element( 'br' ) . "\n"
+ );
} else {
- //good editToken
- $this->mergeUser( $newuser_text, $newuserID, $olduser_text, $olduserID=
);
- if ( $wgRequest->getText( 'deleteuser' ) ) {
- $this->deleteUser($olduserID, $olduser_text);
+ // good editToken
+ $this->mergeEditcount( $newuserID, $olduserID );
+ $this->mergeUser( $objNewUser, $newuser_text, $newuserID, $objOldUser,=
$olduser_text, $olduserID );
+ if ( $request->getText( 'deleteuser' ) ) {
+ $this->movePages( $newuser_text, $olduser_text );
+ $this->deleteUser( $objOldUser, $olduserID, $olduser_text );
}
}
}
}
=
- ///Function to delete users following a successful mergeUser call
/**
+ * 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 Always returns true - throws exceptions on failure.
+ * @return bool Always returns true - throws exceptions on failure.
*/
- private function deleteUser( $olduserID, $olduser_text ) {
- global $wgOut,$wgUser;
-
+ private function deleteUser( $objOldUser, $olduserID, $olduser_text ) {
$dbw =3D wfGetDB( DB_MASTER );
- $dbw->delete( 'user_groups', array( 'ug_user' =3D> $olduserID ) );
- $dbw->delete( 'user', array( 'user_id' =3D> $olduserID ) );
- $wgOut->addHTML( wfMsg( 'usermerge-userdeleted', $olduser_text, $olduser=
ID ) );
+ $dbw->delete(
+ 'user_groups',
+ array( 'ug_user' =3D> $olduserID )
+ );
+ $dbw->delete(
+ 'user',
+ array( 'user_id' =3D> $olduserID )
+ );
+ $this->getOutput()->addHTML(
+ $this->msg( 'usermerge-userdeleted', $olduser_text, $olduserID )->escap=
ed() .
+ Html::element( 'br' ) . "\n"
+ );
=
$log =3D new LogPage( 'usermerge' );
- $log->addEntry( 'deleteuser', $wgUser->getUserPage(),'',array($olduser_t=
ext,$olduserID) );
+ $log->addEntry( 'deleteuser', $this->getUser()->getUserPage(), '', array=
( $olduser_text, $olduserID ) );
+
+ wfRunHooks( 'DeleteAccount', array( &$objOldUser ) );
=
- $users =3D $dbw->selectField( 'user', 'COUNT(*)', array() );
- $admins =3D $dbw->selectField( 'user_groups', 'COUNT(*)', array( 'ug_gro=
up' =3D> 'sysop' ) );
+ $users =3D $dbw->selectField(
+ 'user',
+ 'COUNT(*)',
+ array()
+ );
$dbw->update( 'site_stats',
- array( 'ss_users' =3D> $users, 'ss_admins' =3D> $admins ),
- array( 'ss_row_id' =3D> 1 ) );
+ array( 'ss_users' =3D> $users ),
+ array( 'ss_row_id' =3D> 1 )
+ );
return true;
}
=
- ///Function to merge database referances from one user to another user
/**
+ * 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 =3D wfGetDB( DB_MASTER );
+ $dbw->begin( __METHOD__ );
+
+ $res =3D $dbw->select(
+ array(
+ 'w1' =3D> 'watchlist',
+ 'w2' =3D> 'watchlist'
+ ),
+ array(
+ 'w2.wl_namespace',
+ 'w2.wl_title'
+ ),
+ array(
+ 'w1.wl_user' =3D> $newUser->getID(),
+ 'w2.wl_user' =3D> $oldUser->getID()
+ ),
+ __METHOD__,
+ array( 'FOR UPDATE' ),
+ array(
+ 'w2' =3D> array(
+ 'INNER JOIN',
+ array(
+ 'w1.wl_namespace =3D w2.wl_namespace',
+ 'w1.wl_title =3D w2.wl_title'
+ ),
+ )
+ )
+ );
+
+ # Construct an array to delete all watched pages of the old user
+ # which the new user already watches
+ $conds =3D array();
+
+ foreach ( $res as $result ) {
+ $conds[] =3D $dbw->makeList(
+ array(
+ 'wl_user' =3D> $oldUser->getID(),
+ 'wl_namespace' =3D> $result->wl_namespace,
+ 'wl_title' =3D> $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 (20=
130625)
+ $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 use=
r ID or username
* to preserve referential integrity.
*
- * @param $newuser_text string Username to merge referances TO
- * @param $newuserID int ID of user to merge referances TO
- * @param $olduser_text string Username of user to remove referances FROM
- * @param $olduserID int ID of user to remove referances FROM
+ * @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 Always returns true - throws exceptions on failure.
+ * @return bool Always returns true - throws exceptions on failure.
*/
- private function mergeUser( $newuser_text, $newuserID, $olduser_text, $ol=
duserID ) {
- global $wgOut, $wgUser;
-
- $textUpdateFields =3D array(
- array('archive','ar_user_text'),
- array('revision','rev_user_text'),
- array('filearchive','fa_user_text'),
- array('image','img_user_text'),
- array('oldimage','oi_user_text'),
- array('recentchanges','rc_user_text'),
- array('ipblocks','ipb_address')
+ private function mergeUser( $objNewUser, $newuser_text, $newuserID, $objO=
ldUser, $olduser_text, $olduserID ) {
+ // Fields to update with the format:
+ // array( tableName, idField, textField )
+ $updateFields =3D 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' ),
+ );
+
+ $dbw =3D wfGetDB( DB_MASTER );
+ $out =3D $this->getOutput();
+
+ $this->deduplicateWatchlistEntries( $objOldUser, $objNewUser );
+
+ foreach ( $updateFields as $fieldInfo ) {
+ $tableName =3D array_shift( $fieldInfo );
+ $idField =3D array_shift( $fieldInfo );
+
+ $dbw->update(
+ $tableName,
+ array( $idField =3D> $newuserID ) + array_fill_keys( $fieldInfo, $newu=
ser_text ),
+ array( $idField =3D> $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' =3D> $olduserID ) );
+
+ $out->addHTML(
+ Html::element( 'hr' ) . "\n" .
+ $this->msg( 'usermerge-success', $olduser_text, $olduserID, $newuser_te=
xt, $newuserID )->escaped() .
+ Html::element( 'br' ) . "\n"
);
=
- $idUpdateFields =3D array(
- array('archive','ar_user'),
- array('revision','rev_user'),
- array('filearchive','fa_user'),
- array('image','img_user'),
- array('oldimage','oi_user'),
- array('recentchanges','rc_user'),
- array('logging','log_user')
+ $log =3D new LogPage( 'usermerge' );
+ $log->addEntry(
+ 'mergeuser',
+ $this->getUser()->getUserPage(),
+ '',
+ array( $olduser_text, $olduserID, $newuser_text, $newuserID )
);
=
+ wfRunHooks( 'MergeAccountFromTo', array( &$objOldUser, &$objNewUser ) );
+
+ return true;
+ }
+
+
+ /**
+ * Function to add edit count
+ *
+ * Adds edit count of both users
+ *
+ * @param $newuserID int ID of user to merge references TO
+ * @param $olduserID int ID of user to remove references FROM
+ *
+ * @return bool Always returns true - throws exceptions on failure.
+ *
+ * @author Matthew April
+ */
+ private function mergeEditcount( $newuserID, $olduserID ) {
$dbw =3D wfGetDB( DB_MASTER );
=
- foreach ( $idUpdateFields as $idUpdateField ) {
- $dbw->update( $idUpdateField[0], array( $idUpdateField[1] =3D> $newuser=
ID ), array( $idUpdateField[1] =3D> $olduserID ) );
- $wgOut->addHTML( wfMsg('usermerge-updating', $idUpdateField[0], $olduse=
rID, $newuserID ) . "
\n" );
+ $olduserEdits =3D $dbw->selectField(
+ 'user',
+ 'user_editcount',
+ array( 'user_id' =3D> $olduserID ),
+ __METHOD__
+ );
+ if ( $olduserEdits =3D=3D=3D false ) {
+ $olduserEdits =3D 0;
}
=
- foreach ( $textUpdateFields as $textUpdateField ) {
- $dbw->update( $textUpdateField[0], array( $textUpdateField[1] =3D> $new=
user_text ), array( $textUpdateField[1] =3D> $olduser_text ) );
- $wgOut->addHTML( wfMsg( 'usermerge-updating', $textUpdateField[0], $old=
user_text, $newuser_text ) . "
\n" );
+ $newuserEdits =3D $dbw->selectField(
+ 'user',
+ 'user_editcount',
+ array( 'user_id' =3D> $newuserID ),
+ __METHOD__
+ );
+ if ( $newuserEdits =3D=3D=3D false ) {
+ $newuserEdits =3D 0;
}
=
- $dbw->delete( 'user_newtalk', array( 'user_id' =3D> $olduserID ));
+ $totalEdits =3D $olduserEdits + $newuserEdits;
+
+ # don't run querys if neither user has any edits
+ if ( $totalEdits > 0 ) {
+ # update new user with total edits
+ $dbw->update( 'user',
+ array( 'user_editcount' =3D> $totalEdits ),
+ array( 'user_id' =3D> $newuserID ),
+ __METHOD__
+ );
+
+ # clear old users edits
+ $dbw->update( 'user',
+ array( 'user_editcount' =3D> 0 ),
+ array( 'user_id' =3D> $olduserID ),
+ __METHOD__
+ );
+ }
=
- $wgOut->addHTML("
\n" . wfMsg('usermerge-success',$olduser_text,$ol=
duserID,$newuser_text,$newuserID) . "\n
");
+ $this->getOutput()->addHTML(
+ $this->msg(
+ 'usermerge-editcount-merge-success',
+ $olduserEdits, $olduserID, $newuserEdits, $newuserID, $totalEdits
+ )->escaped() .
+ Html::element( 'br' ) . "\n"
+ );
=
- $log =3D new LogPage( 'usermerge' );
- $log->addEntry( 'mergeuser', $wgUser->getUserPage(),'',array($olduser_te=
xt,$olduserID,$newuser_text,$newuserID) );
+ 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
+ */
+ private function movePages( $newuser_text, $olduser_text ) {
+ global $wgContLang;
+
+ $oldusername =3D trim( str_replace( '_', ' ', $olduser_text ) );
+ $oldusername =3D Title::makeTitle( NS_USER, $oldusername );
+ $newusername =3D Title::makeTitleSafe( NS_USER, $wgContLang->ucfirst( $n=
ewuser_text ) );
+
+ # select all user pages and sub-pages
+ $dbr =3D wfGetDB( DB_SLAVE );
+ $pages =3D $dbr->select( 'page',
+ array( 'page_namespace', 'page_title' ),
+ array(
+ 'page_namespace' =3D> array( NS_USER, NS_USER_TALK ),
+ $dbr->makeList( array(
+ 'page_title' =3D> $dbr->buildLike( $oldusername->getDBkey() . '/', $d=
br->anyString() ),
+ 'page_title' =3D> $oldusername->getDBkey()
+ ),
+ LIST_OR
+ )
+ )
+ );
+
+ $output =3D '';
+
+ foreach ( $pages as $row ) {
+
+ $oldPage =3D Title::makeTitleSafe( $row->page_namespace, $row->page_tit=
le );
+ $newPage =3D Title::makeTitleSafe( $row->page_namespace,
+ preg_replace( '!^[^/]+!', $newusername->getDBkey(), $row->page_title )=
);
+
+ if ( $newuser_text =3D=3D=3D "Anonymous" ) { # delete ALL old pages
+ if ( $oldPage->exists() ) {
+ $oldPageArticle =3D new Article( $oldPage, 0 );
+ $oldPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedele=
te' )->inContentLanguage()->text() );
+
+ $oldLink =3D Linker::linkKnown( $oldPage );
+ $output .=3D Html::rawElement( 'li',
+ array( 'class' =3D> 'mw-renameuser-pe' ),
+ $this->msg( 'usermerge-page-deleted' )->rawParams( $oldLink )->escap=
ed()
+ );
+
+ }
+ } elseif ( $newPage->exists()
+ && !$oldPage->isValidMoveTarget( $newPage )
+ && $newPage->getLength() > 0 ) { # delete old pages that can't be moved
+
+ $oldPageArticle =3D new Article( $oldPage, 0 );
+ $oldPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedelet=
e' )->text() );
+
+ $link =3D Linker::linkKnown( $oldPage );
+ $output .=3D Html::rawElement( 'li',
+ array( 'class' =3D> '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 =3D new Article( $newPage, 0 );
+ $newPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedele=
te' )->inContentLanguage()->text() );
+ }
+
+ # move to target location
+ $success =3D $oldPage->moveTo(
+ $newPage,
+ false,
+ $this->msg(
+ 'usermerge-move-log',
+ $oldusername->getText(),
+ $newusername->getText() )->inContentLanguage()->text()
+ );
+
+ if ( $success =3D=3D=3D true ) {
+ $oldLink =3D Linker::linkKnown(
+ $oldPage,
+ null,
+ array(),
+ array( 'redirect' =3D> 'no' )
+ );
+ $newLink =3D Linker::linkKnown( $newPage );
+ $output .=3D Html::rawElement( 'li',
+ array( 'class' =3D> 'mw-renameuser-pm' ),
+ $this->msg( 'usermerge-page-moved' )->rawParams( $oldLink, $newLink =
)->escaped()
+ );
+ } else {
+ $oldLink =3D Linker::linkKnown( $oldPage );
+ $newLink =3D Linker::linkKnown( $newPage );
+ $output .=3D Html::rawElement( 'li',
+ array( 'class' =3D> 'mw-renameuser-pu' ),
+ $this->msg( 'usermerge-page-unmoved' )->rawParams( $oldLink, $newLin=
k )->escaped()
+ );
+ }
+
+ # check if any pages link here
+ $res =3D $dbr->selectField( 'pagelinks',
+ 'pl_title',
+ array( 'pl_title' =3D> $olduser_text ),
+ __METHOD__
+ );
+ if ( !$dbr->numRows( $res ) ) {
+ # nothing links here, so delete unmoved page/redirect
+ $oldPageArticle =3D new Article( $oldPage, 0 );
+ $oldPageArticle->doDeleteArticle( $this->msg( 'usermerge-autopagedele=
te' )->inContentLanguage()->text() );
+ }
+ }
+
+ }
+
+ if ( $output ) {
+ $this->getOutput()->addHTML(
+ Html::rawElement( 'ul',
+ array(),
+ $output
+ )
+ );
+ }
=
return true;
}
+
}
diff --git a/extensions/UserMerge/install.settings b/extensions/UserMerge/i=
nstall.settings
old mode 100755
new mode 100644