summaryrefslogtreecommitdiff
path: root/maintenance/refreshLinks.php
diff options
context:
space:
mode:
Diffstat (limited to 'maintenance/refreshLinks.php')
-rw-r--r--maintenance/refreshLinks.php45
1 files changed, 30 insertions, 15 deletions
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 3d9270b8..7b255664 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -105,7 +105,7 @@ class RefreshLinks extends Maintenance {
array(),
array( 'redirect' => array( "LEFT JOIN", "page_id=rd_from" ) )
);
- $num = $dbr->numRows( $res );
+ $num = $res->numRows();
$this->output( "Refreshing $num old redirects from $start...\n" );
$i = 0;
@@ -126,7 +126,7 @@ class RefreshLinks extends Maintenance {
"page_id >= $start" ),
__METHOD__
);
- $num = $dbr->numRows( $res );
+ $num = $res->numRows();
$this->output( "$num new articles...\n" );
$i = 0;
@@ -176,8 +176,16 @@ class RefreshLinks extends Maintenance {
}
/**
- * Update the redirect entry for a given page
- * @param $id int The page_id of the redirect
+ * Update the redirect entry for a given page.
+ *
+ * This methods bypasses the "redirect" table to get the redirect target,
+ * and parses the page's content to fetch it. This allows to be sure that
+ * the redirect target is up to date and valid.
+ * This is particularly useful when modifying namespaces to be sure the
+ * entry in the "redirect" table points to the correct page and not to an
+ * invalid one.
+ *
+ * @param $id int The page ID to check
*/
private function fixRedirect( $id ) {
$page = WikiPage::newFromID( $id );
@@ -191,14 +199,25 @@ class RefreshLinks extends Maintenance {
return;
}
- $rt = $page->getRedirectTarget();
+ $rt = null;
+ $content = $page->getContent( Revision::RAW );
+ if ( $content !== null ) {
+ $rt = $content->getUltimateRedirectTarget();
+ }
if ( $rt === null ) {
// The page is not a redirect
// Delete any redirect table entry for it
- $dbw->delete( 'redirect', array( 'rd_from' => $id ),
- __METHOD__ );
+ $dbw->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+ $fieldValue = 0;
+ } else {
+ $page->insertRedirectEntry( $rt );
+ $fieldValue = 1;
}
+
+ // Update the page table to be sure it is an a consistent state
+ $dbw->update( 'page', array( 'page_is_redirect' => $fieldValue ),
+ array( 'page_id' => $id ), __METHOD__ );
}
/**
@@ -206,8 +225,6 @@ class RefreshLinks extends Maintenance {
* @param $id int The page_id
*/
public static function fixLinksFromArticle( $id ) {
- global $wgParser, $wgContLang;
-
$page = WikiPage::newFromID( $id );
LinkCache::singleton()->clear();
@@ -216,18 +233,16 @@ class RefreshLinks extends Maintenance {
return;
}
- $text = $page->getRawText();
- if ( $text === false ) {
+ $content = $page->getContent( Revision::RAW );
+ if ( $content === null ) {
return;
}
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
- $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
- $parserOutput = $wgParser->parse( $text, $page->getTitle(), $options, true, true, $page->getLatest() );
- $update = new LinksUpdate( $page->getTitle(), $parserOutput, false );
- $update->doUpdate();
+ $updates = $content->getSecondaryDataUpdates( $page->getTitle() );
+ DataUpdate::runUpdates( $updates );
$dbw->commit( __METHOD__ );
}