Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 57 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 1 |
NukeNS | |
0.00% |
0 / 54 |
|
0.00% |
0 / 2 |
72 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
execute | |
0.00% |
0 / 49 |
|
0.00% |
0 / 1 |
56 |
1 | <?php |
2 | /** |
3 | * Remove pages with only 1 revision from the MediaWiki namespace, without |
4 | * flooding recent changes, delete logs, etc. |
5 | * Irreversible (can't use standard undelete) and does not update link tables |
6 | * |
7 | * This is mainly useful to run before maintenance/update.php when upgrading |
8 | * to 1.9, to prevent flooding recent changes/deletion logs. It's intended |
9 | * to be conservative, so it's possible that a few entries will be left for |
10 | * deletion by the upgrade script. It's also possible that it hasn't been |
11 | * tested thouroughly enough, and will delete something it shouldn't; so |
12 | * back up your DB if there's anything in the MediaWiki that is important to |
13 | * you. |
14 | * |
15 | * This program is free software; you can redistribute it and/or modify |
16 | * it under the terms of the GNU General Public License as published by |
17 | * the Free Software Foundation; either version 2 of the License, or |
18 | * (at your option) any later version. |
19 | * |
20 | * This program is distributed in the hope that it will be useful, |
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | * GNU General Public License for more details. |
24 | * |
25 | * You should have received a copy of the GNU General Public License along |
26 | * with this program; if not, write to the Free Software Foundation, Inc., |
27 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
28 | * http://www.gnu.org/copyleft/gpl.html |
29 | * |
30 | * @file |
31 | * @ingroup Maintenance |
32 | * @author Steve Sanbeg |
33 | * based on nukePage by Rob Church |
34 | */ |
35 | |
36 | require_once __DIR__ . '/Maintenance.php'; |
37 | |
38 | use MediaWiki\Title\Title; |
39 | |
40 | /** |
41 | * Maintenance script that removes pages with only one revision from the |
42 | * MediaWiki namespace. |
43 | * |
44 | * @ingroup Maintenance |
45 | */ |
46 | class NukeNS extends Maintenance { |
47 | public function __construct() { |
48 | parent::__construct(); |
49 | $this->addDescription( 'Remove pages with only 1 revision from any namespace' ); |
50 | $this->addOption( 'delete', "Actually delete the page" ); |
51 | $this->addOption( 'ns', 'Namespace to delete from, default NS_MEDIAWIKI', false, true ); |
52 | $this->addOption( 'all', 'Delete everything regardless of revision count' ); |
53 | } |
54 | |
55 | public function execute() { |
56 | $ns = $this->getOption( 'ns', NS_MEDIAWIKI ); |
57 | $delete = $this->hasOption( 'delete' ); |
58 | $all = $this->hasOption( 'all' ); |
59 | $dbw = $this->getPrimaryDB(); |
60 | $this->beginTransaction( $dbw, __METHOD__ ); |
61 | |
62 | $res = $dbw->newSelectQueryBuilder() |
63 | ->select( 'page_title' ) |
64 | ->from( 'page' ) |
65 | ->where( [ 'page_namespace' => $ns ] ) |
66 | ->caller( __METHOD__ )->fetchResultSet(); |
67 | |
68 | $n_deleted = 0; |
69 | |
70 | foreach ( $res as $row ) { |
71 | // echo "$ns_name:".$row->page_title, "\n"; |
72 | $title = Title::makeTitle( $ns, $row->page_title ); |
73 | $id = $title->getArticleID(); |
74 | |
75 | // Get corresponding revisions |
76 | $revs = $dbw->newSelectQueryBuilder() |
77 | ->select( 'rev_id' ) |
78 | ->from( 'revision' ) |
79 | ->where( [ 'rev_page' => $id ] ) |
80 | ->caller( __METHOD__ )->fetchFieldValues(); |
81 | $count = count( $revs ); |
82 | |
83 | // skip anything that looks modified (i.e. multiple revs) |
84 | if ( $all || $count == 1 ) { |
85 | # echo $title->getPrefixedText(), "\t", $count, "\n"; |
86 | $this->output( "delete: " . $title->getPrefixedText() . "\n" ); |
87 | |
88 | // as much as I hate to cut & paste this, it's a little different, and |
89 | // I already have the id & revs |
90 | if ( $delete ) { |
91 | $dbw->newDeleteQueryBuilder() |
92 | ->deleteFrom( 'page' ) |
93 | ->where( [ 'page_id' => $id ] ) |
94 | ->caller( __METHOD__ )->execute(); |
95 | $this->commitTransaction( $dbw, __METHOD__ ); |
96 | // Delete revisions as appropriate |
97 | /** @var NukePage $child */ |
98 | $child = $this->runChild( NukePage::class, 'nukePage.php' ); |
99 | '@phan-var NukePage $child'; |
100 | $child->deleteRevisions( $revs ); |
101 | $n_deleted++; |
102 | } |
103 | } else { |
104 | $this->output( "skip: " . $title->getPrefixedText() . "\n" ); |
105 | } |
106 | } |
107 | $this->commitTransaction( $dbw, __METHOD__ ); |
108 | |
109 | if ( $n_deleted > 0 ) { |
110 | $this->purgeRedundantText( true ); |
111 | |
112 | # update statistics - better to decrement existing count, or just count |
113 | # the page table? |
114 | $pages = $dbw->newSelectQueryBuilder() |
115 | ->select( 'ss_total_pages' ) |
116 | ->from( 'site_stats' ) |
117 | ->caller( __METHOD__ )->fetchField(); |
118 | $pages -= $n_deleted; |
119 | $dbw->newUpdateQueryBuilder() |
120 | ->update( 'site_stats' ) |
121 | ->set( [ 'ss_total_pages' => $pages ] ) |
122 | ->where( [ 'ss_row_id' => 1 ] ) |
123 | ->caller( __METHOD__ ) |
124 | ->execute(); |
125 | } |
126 | |
127 | if ( !$delete ) { |
128 | $this->output( "To update the database, run the script with the --delete option.\n" ); |
129 | } |
130 | } |
131 | } |
132 | |
133 | $maintClass = NukeNS::class; |
134 | require_once RUN_MAINTENANCE_IF_MAIN; |