43 public const MAX_DR_JOBS_COUNTER = 10000;
54 private $revisionLookup;
57 private $magicWordFactory;
60 private $wikiPageFactory;
81 parent::__construct(
'fixDoubleRedirect', $page,
$params );
82 $this->redirTitle = Title::newFromText(
$params[
'redirTitle'] );
83 $this->revisionLookup = $revisionLookup;
84 $this->magicWordFactory = $magicWordFactory;
85 $this->wikiPageFactory = $wikiPageFactory;
96 # Need to use the primary DB to get the redirect table updated in the same transaction
97 $services = MediaWikiServices::getInstance();
98 $dbw = $services->getDBLoadBalancerFactory()->getPrimaryDatabase();
99 $res = $dbw->newSelectQueryBuilder()
100 ->select( [
'page_namespace',
'page_title' ] )
102 ->join(
'page',
null,
'page_id = rd_from' )
103 ->where( [
'rd_namespace' => $redirTitle->
getNamespace(),
'rd_title' => $redirTitle->
getDBkey() ] )
104 ->andWhere( [
'rd_interwiki' => [
'',
null ] ] )
105 ->caller( __METHOD__ )->fetchResultSet();
106 if ( !$res->numRows() ) {
110 $jobQueueGroup = $services->getJobQueueGroup();
111 foreach ( $res as $row ) {
112 $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
121 'redirTitle' => $services->getTitleFormatter()
122 ->getPrefixedDBkey( $redirTitle )
124 $services->getRevisionLookup(),
125 $services->getMagicWordFactory(),
126 $services->getWikiPageFactory()
128 # Avoid excessive memory usage
129 if ( count( $jobs ) > self::MAX_DR_JOBS_COUNTER ) {
130 $jobQueueGroup->push( $jobs );
134 $jobQueueGroup->push( $jobs );
141 if ( !$this->redirTitle ) {
147 if ( !$this->title->canExist() ) {
154 $targetRev = $this->revisionLookup
155 ->getRevisionByTitle( $this->title, 0, RevisionLookup::READ_LATEST );
157 wfDebug( __METHOD__ .
": target redirect already deleted, ignoring" );
161 $content = $targetRev->getContent( SlotRecord::MAIN );
163 if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
164 wfDebug( __METHOD__ .
": Redirect has changed since the job was queued" );
170 $mw = $this->magicWordFactory->get(
'staticredirect' );
171 if (
$content->matchMagicWord( $mw ) ) {
172 wfDebug( __METHOD__ .
": skipping: suppressed with __STATICREDIRECT__" );
181 ": skipping: single redirect, circular redirect or invalid redirect destination" );
185 if ( $newTitle->equals( $this->redirTitle ) ) {
188 wfDebug( __METHOD__ .
" : skipping, already good" );
192 $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
193 $currentDest->getFragment(), $newTitle->getInterwiki() );
196 $newContent =
$content->updateRedirect( $newTitle );
198 if ( $newContent->equals(
$content ) ) {
204 $user = $this->getUser();
216 $article = $this->wikiPageFactory->newFromTitle( $this->title );
219 $reason =
wfMessage(
'double-redirect-fixed-' . $this->params[
'reason'],
220 $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
221 )->inContentLanguage()->text();
224 $article->doUserEditContent( $newContent, $user, $reason, $flags );
239 $dbw = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->getPrimaryDatabase();
246 $titleText = CacheKeyHelper::getKeyForPage(
$title );
247 if ( isset( $seenTitles[$titleText] ) ) {
248 wfDebug( __METHOD__,
"Circular redirect detected, aborting" );
252 $seenTitles[$titleText] =
true;
261 $row = $dbw->newSelectQueryBuilder()
262 ->select( [
'rd_namespace',
'rd_title',
'rd_interwiki' ] )
264 ->join(
'page',
null,
'page_id = rd_from' )
267 ->caller( __METHOD__ )->fetchRow();
269 # No redirect from here, chain terminates
272 $dest =
$title = Title::makeTitle(
276 $row->rd_interwiki ??
''
291 private function getUser() {
292 if ( !self::$user ) {
293 $username =
wfMessage(
'double-redirect-fixer' )->inContentLanguage()->text();
294 self::$user = User::newFromName( $username );
295 # User::newFromName() can return false on a badly configured wiki.
296 if ( self::$user && !self::$user->isRegistered() ) {
297 self::$user->addToDatabase();
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
Fix any double redirects after moving a page.
static getFinalDestination( $title)
Get the final destination of a redirect.
__construct(PageReference $page, array $params, RevisionLookup $revisionLookup, MagicWordFactory $magicWordFactory, WikiPageFactory $wikiPageFactory)
static fixRedirects( $reason, $redirTitle)
Insert jobs into the job queue to fix redirects to the given title.
Class to both describe a background job and handle jobs.
array $params
Array of job parameters.
Service for creating WikiPage objects.