MediaWiki
REL1_34
cleanupTitles.php
Go to the documentation of this file.
1
<?php
28
use
MediaWiki\MediaWikiServices
;
29
30
require_once __DIR__ .
'/cleanupTable.inc'
;
31
37
class
TitleCleanup
extends
TableCleanup
{
38
public
function
__construct
() {
39
parent::__construct();
40
$this->
addDescription
(
'Script to clean up broken, unparseable titles'
);
41
$this->
batchSize
= 1000;
42
}
43
47
protected
function
processRow
( $row ) {
48
$display
= Title::makeName( $row->page_namespace, $row->page_title );
49
$verified = MediaWikiServices::getInstance()->getContentLanguage()->normalize(
$display
);
50
$title
= Title::newFromText( $verified );
51
52
if
( !
is_null
(
$title
)
53
&&
$title
->canExist()
54
&&
$title
->getNamespace() == $row->page_namespace
55
&&
$title
->getDBkey() === $row->page_title
56
) {
57
$this->
progress
( 0 );
// all is fine
58
59
return
;
60
}
61
62
if
( $row->page_namespace ==
NS_FILE
&&
$this
->fileExists( $row->page_title ) ) {
63
$this->
output
(
"file $row->page_title needs cleanup, please run cleanupImages.php.\n"
);
64
$this->
progress
( 0 );
65
}
elseif
(
is_null
(
$title
) ) {
66
$this->
output
(
"page $row->page_id ($display) is illegal.\n"
);
67
$this->
moveIllegalPage
( $row );
68
$this->
progress
( 1 );
69
}
else
{
70
$this->
output
(
"page $row->page_id ($display) doesn't match self.\n"
);
71
$this->
moveInconsistentPage
( $row,
$title
);
72
$this->
progress
( 1 );
73
}
74
}
75
80
protected
function
fileExists
( $name ) {
81
// XXX: Doesn't actually check for file existence, just presence of image record.
82
// This is reasonable, since cleanupImages.php only iterates over the image table.
83
$dbr
= $this->
getDB
(
DB_REPLICA
);
84
$row =
$dbr
->selectRow(
'image'
, [
'img_name'
], [
'img_name'
=> $name ],
__METHOD__
);
85
86
return
$row !==
false
;
87
}
88
92
protected
function
moveIllegalPage
( $row ) {
93
$legal
=
'A-Za-z0-9_/\\\\-'
;
94
$legalized
=
preg_replace_callback
(
"!([^$legal])!"
,
95
[
$this
,
'hexChar'
],
96
$row->page_title );
97
if
(
$legalized
==
'.'
) {
98
$legalized
=
'(dot)'
;
99
}
100
if
(
$legalized
==
'_'
) {
101
$legalized
=
'(space)'
;
102
}
103
$legalized
=
'Broken/'
.
$legalized
;
104
105
$title
= Title::newFromText(
$legalized
);
106
if
(
is_null
(
$title
) ) {
107
$clean
=
'Broken/id:'
. $row->page_id;
108
$this->
output
(
"Couldn't legalize; form '$legalized' still invalid; using '$clean'\n"
);
109
$title
= Title::newFromText(
$clean
);
110
}
elseif
(
$title
->exists() ) {
111
$clean
=
'Broken/id:'
. $row->page_id;
112
$this->
output
(
"Legalized for '$legalized' exists; using '$clean'\n"
);
113
$title
= Title::newFromText(
$clean
);
114
}
115
116
$dest =
$title
->getDBkey();
117
if
( $this->
dryrun
) {
118
$this->
output
(
"DRY RUN: would rename $row->page_id ($row->page_namespace,"
.
119
"'$row->page_title') to ($row->page_namespace,'$dest')\n"
);
120
}
else
{
121
$this->
output
(
"renaming $row->page_id ($row->page_namespace,"
.
122
"'$row->page_title') to ($row->page_namespace,'$dest')\n"
);
123
$dbw = $this->
getDB
(
DB_MASTER
);
124
$dbw->update(
'page'
,
125
[
'page_title'
=> $dest ],
126
[
'page_id'
=> $row->page_id ],
127
__METHOD__
);
128
}
129
}
130
135
protected
function
moveInconsistentPage
( $row,
Title
$title
) {
136
if
(
$title
->exists( Title::READ_LATEST )
137
||
$title
->getInterwiki()
138
|| !
$title
->canExist()
139
) {
140
$titleImpossible
=
$title
->getInterwiki() || !
$title
->canExist();
141
if
(
$titleImpossible
) {
142
$prior
=
$title
->getPrefixedDBkey();
143
}
else
{
144
$prior
=
$title
->getDBkey();
145
}
146
147
# Old cleanupTitles could move articles there. See T25147.
148
$ns = $row->page_namespace;
149
if
( $ns < 0 ) {
150
$ns = 0;
151
}
152
153
# Namespace which no longer exists. Put the page in the main namespace
154
# since we don't have any idea of the old namespace name. See T70501.
155
if
( !MediaWikiServices::getInstance()->getNamespaceInfo()->exists( $ns ) ) {
156
$ns = 0;
157
}
158
159
if
( !
$titleImpossible
&& !
$title
->exists() ) {
160
// Looks like the current title, after cleaning it up, is valid and available
161
$clean
=
$prior
;
162
}
else
{
163
$clean
=
'Broken/'
.
$prior
;
164
}
165
$verified = Title::makeTitleSafe( $ns,
$clean
);
166
if
( !$verified || $verified->exists() ) {
167
$blah
=
"Broken/id:"
. $row->page_id;
168
$this->
output
(
"Couldn't legalize; form '$clean' exists; using '$blah'\n"
);
169
$verified = Title::makeTitleSafe( $ns,
$blah
);
170
}
171
$title
= $verified;
172
}
173
if
(
is_null
(
$title
) ) {
174
$this->
fatalError
(
"Something awry; empty title."
);
175
}
176
$ns =
$title
->getNamespace();
177
$dest =
$title
->getDBkey();
178
179
if
( $this->
dryrun
) {
180
$this->
output
(
"DRY RUN: would rename $row->page_id ($row->page_namespace,"
.
181
"'$row->page_title') to ($ns,'$dest')\n"
);
182
}
else
{
183
$this->
output
(
"renaming $row->page_id ($row->page_namespace,"
.
184
"'$row->page_title') to ($ns,'$dest')\n"
);
185
$dbw = $this->
getDB
(
DB_MASTER
);
186
$dbw->update(
'page'
,
187
[
188
'page_namespace'
=> $ns,
189
'page_title'
=> $dest
190
],
191
[
'page_id'
=> $row->page_id ],
192
__METHOD__
);
193
MediaWikiServices::getInstance()->getLinkCache()->clear();
194
}
195
}
196
}
197
198
$maintClass
=
TitleCleanup::class
;
199
require_once
RUN_MAINTENANCE_IF_MAIN
;
getDB
getDB()
RUN_MAINTENANCE_IF_MAIN
const RUN_MAINTENANCE_IF_MAIN
Definition
Maintenance.php:39
Maintenance\output
output( $out, $channel=null)
Throw some output to the user.
Definition
Maintenance.php:453
Maintenance\addDescription
addDescription( $text)
Set the description text.
Definition
Maintenance.php:348
Maintenance\fatalError
fatalError( $msg, $exitCode=1)
Output a message and terminate the current script.
Definition
Maintenance.php:504
MediaWiki\MediaWikiServices
MediaWikiServices is the service locator for the application scope of MediaWiki.
Definition
MediaWikiServices.php:117
TableCleanup
Generic class to cleanup a database table.
Definition
cleanupTable.inc:31
TableCleanup\$count
$count
Definition
cleanupTable.inc:43
TableCleanup\progress
progress( $updated)
Definition
cleanupTable.inc:74
TitleCleanup
Maintenance script to clean up broken, unparseable titles.
Definition
cleanupTitles.php:37
TitleCleanup\moveIllegalPage
moveIllegalPage( $row)
Definition
cleanupTitles.php:92
TitleCleanup\processRow
processRow( $row)
Definition
cleanupTitles.php:47
TitleCleanup\moveInconsistentPage
moveInconsistentPage( $row, Title $title)
Definition
cleanupTitles.php:135
TitleCleanup\__construct
__construct()
Default constructor.
Definition
cleanupTitles.php:38
TitleCleanup\fileExists
fileExists( $name)
Definition
cleanupTitles.php:80
Title
Represents a title within MediaWiki.
Definition
Title.php:42
$maintClass
$maintClass
Definition
cleanupTitles.php:198
NS_FILE
const NS_FILE
Definition
Defines.php:75
DB_REPLICA
const DB_REPLICA
Definition
defines.php:25
DB_MASTER
const DB_MASTER
Definition
defines.php:26
$dbr
$dbr
Definition
testCompression.php:50
$title
$title
Definition
testCompression.php:34
maintenance
cleanupTitles.php
Generated on Fri Apr 5 2024 23:11:06 for MediaWiki by
1.9.8