Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F2751971
fixStuckGlobalRename.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
fixStuckGlobalRename.php
View Options
<?php
namespace
MediaWiki\Extension\CentralAuth\Maintenance
;
use
DatabaseLogEntry
;
use
MediaWiki\Extension\CentralAuth\CentralAuthServices
;
use
MediaWiki\Extension\CentralAuth\GlobalRename\LocalRenameJob\LocalRenameUserJob
;
use
MediaWiki\Extension\CentralAuth\User\CentralAuthUser
;
use
MediaWiki\Maintenance\Maintenance
;
use
MediaWiki\Title\Title
;
use
MediaWiki\User\User
;
use
MediaWiki\WikiMap\WikiMap
;
use
Wikimedia\Rdbms\SelectQueryBuilder
;
$IP
=
getenv
(
'MW_INSTALL_PATH'
);
if
(
$IP
===
false
)
{
$IP
=
__DIR__
.
'/../../..'
;
}
require_once
"$IP/maintenance/Maintenance.php"
;
/**
* Script to run global renames that are stuck in the status table with "queued" or "in progress"
* but failed for whatever reason
*/
class
FixStuckGlobalRename
extends
Maintenance
{
public
function
__construct
()
{
parent
::
__construct
();
$this
->
requireExtension
(
'CentralAuth'
);
$this
->
addArg
(
'oldname'
,
'Old name'
);
$this
->
addArg
(
'newname'
,
'New name'
);
$this
->
addOption
(
'logwiki'
,
'Wiki where the log entry exists'
,
true
,
true
);
$this
->
addOption
(
'ignorestatus'
,
'Ignore rename status. Don
\'
t do this when the rename '
.
'jobs might still be running.'
);
$this
->
addDescription
(
'Unstuck global rename on a single wiki'
);
}
public
function
execute
()
{
global
$wgLocalDatabases
;
$userNameUtils
=
$this
->
getServiceContainer
()->
getUserNameUtils
();
$databaseManager
=
CentralAuthServices
::
getDatabaseManager
();
$oldName
=
$userNameUtils
->
getCanonical
(
$this
->
getArg
(
0
)
);
$newName
=
$userNameUtils
->
getCanonical
(
$this
->
getArg
(
1
)
);
if
(
$oldName
===
false
||
$newName
===
false
)
{
$this
->
fatalError
(
'Invalid name'
);
}
$logTitle
=
Title
::
newFromText
(
'Special:CentralAuth'
)->
getSubpage
(
$newName
);
$ca
=
new
CentralAuthUser
(
$newName
);
if
(
!
$ca
->
renameInProgressOn
(
WikiMap
::
getCurrentWikiId
()
)
)
{
$this
->
fatalError
(
"{$ca->getName()} does not have a rename in progress on this wiki."
);
}
$dbr
=
$databaseManager
->
getLocalDB
(
DB_REPLICA
,
$this
->
getOption
(
'logwiki'
)
);
$queryData
=
DatabaseLogEntry
::
getSelectQueryData
();
$row
=
$dbr
->
newSelectQueryBuilder
()
->
tables
(
$queryData
[
'tables'
]
)
->
select
(
$queryData
[
'fields'
]
)
->
where
(
$queryData
[
'conds'
]
)
->
andWhere
(
[
'log_type'
=>
'gblrename'
,
'log_action'
=>
'rename'
,
'log_namespace'
=>
NS_SPECIAL
,
'log_title'
=>
$logTitle
->
getDBkey
(),
]
)
->
options
(
$queryData
[
'options'
]
)
->
orderBy
(
'log_timestamp'
,
SelectQueryBuilder
::
SORT_DESC
)
->
joinConds
(
$queryData
[
'join_conds'
]
)
->
caller
(
__METHOD__
)
->
fetchRow
();
// try to guess the options if the log record does not contain them
$movepages
=
true
;
$suppressredirects
=
false
;
if
(
$row
)
{
$logEntry
=
DatabaseLogEntry
::
newFromRow
(
$row
);
$renamer
=
$logEntry
->
getPerformerIdentity
()->
getName
();
$comment
=
$logEntry
->
getComment
();
$logParams
=
$logEntry
->
getParameters
();
if
(
isset
(
$logParams
[
'movepages'
]
)
)
{
$movepages
=
$logParams
[
'movepages'
];
}
if
(
isset
(
$logParams
[
'suppressredirects'
]
)
)
{
$suppressredirects
=
$logParams
[
'suppressredirects'
];
}
$this
->
output
(
"Using $renamer as the renamer.
\n
"
);
}
else
{
$this
->
output
(
"Could not find log entry, falling back to system account
\n
"
);
// Go through User::newSystemUser() to ensure the user exists (T344632).
// The username is reserved in onUserGetReservedNames() hook.
$renamer
=
User
::
newSystemUser
(
'Global rename script'
,
[
'steal'
=>
true
]
)->
getName
();
$comment
=
''
;
}
$params
=
[
'from'
=>
$oldName
,
'to'
=>
$newName
,
'renamer'
=>
$renamer
,
'movepages'
=>
$movepages
,
'suppressredirects'
=>
$suppressredirects
,
'reason'
=>
$comment
,
'ignorestatus'
=>
$this
->
getOption
(
'ignorestatus'
,
false
),
// No way to recover localuser attachment details, faking it.
// $wgLocalDatabases will contain wikis where the user does not have an account.
// That's fine, LocalRenameUserJob will only use the one that matches WikiMap::getCurrentWikiId().
// FIXME the real attachment info should be saved & restored instead, see T215107
'reattach'
=>
array_fill_keys
(
$wgLocalDatabases
,
[
'attachedMethod'
=>
'admin'
,
'attachedTimestamp'
=>
wfTimestamp
(
TS_MW
),
]
),
];
foreach
(
$params
as
$key
=>
$value
)
{
if
(
$key
===
'reattach'
)
{
continue
;
}
$this
->
output
(
"$key: $value
\n
"
);
}
$title
=
Title
::
newFromText
(
'Global rename job'
);
$job
=
new
LocalRenameUserJob
(
$title
,
$params
);
$this
->
output
(
"
\n
Starting to run job...
\n
"
);
$status
=
$job
->
run
();
$job
->
teardown
(
$status
);
$this
->
output
(
$status
?
"Done!
\n
"
:
"Failed!
\n
"
);
}
}
$maintClass
=
FixStuckGlobalRename
::
class
;
require_once
RUN_MAINTENANCE_IF_MAIN
;
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Fri, Jul 3, 19:22 (1 d, 11 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
81/61/19d8a32e08003cdefecf45893327
Default Alt Text
fixStuckGlobalRename.php (4 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment