Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReviewAllPages
0.00% covered (danger)
0.00%
0 / 77
0.00% covered (danger)
0.00%
0 / 3
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 autoReviewCurrent
0.00% covered (danger)
0.00%
0 / 68
0.00% covered (danger)
0.00%
0 / 1
90
1<?php
2/**
3 * @ingroup Maintenance
4 */
5
6use MediaWiki\Title\Title;
7use MediaWiki\User\User;
8
9if ( getenv( 'MW_INSTALL_PATH' ) ) {
10    $IP = getenv( 'MW_INSTALL_PATH' );
11} else {
12    $IP = __DIR__ . '/../../..';
13}
14
15require_once "$IP/maintenance/Maintenance.php";
16
17class ReviewAllPages extends Maintenance {
18
19    public function __construct() {
20        parent::__construct();
21        $this->addDescription( "Review all pages in reviewable namespaces. " .
22            "A user ID must be given to specifiy the \"reviewer\" who accepted the pages." );
23        $this->addOption( 'username',
24            'The user name of the existing user to use as the "reviewer"', true, true );
25        $this->setBatchSize( 100 );
26        $this->requireExtension( 'FlaggedRevs' );
27    }
28
29    /**
30     * @inheritDoc
31     */
32    public function execute() {
33        $user = User::newFromName( $this->getOption( 'username' ) );
34        $this->autoReviewCurrent( $user );
35    }
36
37    /**
38     * @param User $user
39     */
40    private function autoReviewCurrent( User $user ) {
41        $services = $this->getServiceContainer();
42        $this->output( "Auto-reviewing all current page versions...\n" );
43        if ( !$user->isRegistered() ) {
44            $this->output( "Invalid user specified.\n" );
45            return;
46        } elseif ( !$services->getPermissionManager()->userHasRight( $user, 'review' ) ) {
47            $this->output( "User specified (id: {$user->getId()}) does not have \"review\" rights.\n" );
48            return;
49        }
50
51        $db = $this->getPrimaryDB();
52
53        $this->output( "Reviewer username: " . $user->getName() . "\n" );
54
55        $start = $db->newSelectQueryBuilder()
56            ->select( 'MIN(page_id)' )
57            ->from( 'page' )
58            ->where( __METHOD__ )
59            ->fetchField();
60        $end = $db->newSelectQueryBuilder()
61            ->select( 'MAX(page_id)' )
62            ->from( 'page' )
63            ->caller( __METHOD__ )
64            ->fetchField();
65        if ( $start === null || $end === null ) {
66            $this->output( "...page table seems to be empty.\n" );
67            return;
68        }
69        # Do remaining chunk
70        $end += $this->mBatchSize - 1;
71        $blockStart = (int)$start;
72        $blockEnd = (int)( $start + $this->mBatchSize - 1 );
73        $count = 0;
74        $changed = 0;
75        $flags = FlaggedRevs::quickTags(); // Assume basic level
76
77        $wikiPageFactory = $services->getWikiPageFactory();
78        $revisionStore = $services->getRevisionStore();
79
80        while ( $blockEnd <= $end ) {
81            $this->output( "...doing page_id from $blockStart to $blockEnd\n" );
82            $res = $db->newSelectQueryBuilder()
83                ->select( '*' )
84                ->from( 'page' )
85                ->join( 'revision', null, 'rev_id = page_latest' )
86                ->where( [
87                    $db->expr( 'page_id', '>=', $blockStart ),
88                    $db->expr( 'page_id', '<=', $blockEnd ),
89                    'page_namespace' => FlaggedRevs::getReviewNamespaces(),
90                ] )
91                ->caller( __METHOD__ )
92                ->fetchResultSet();
93            # Go through and autoreview the current version of every page...
94            foreach ( $res as $row ) {
95                $title = Title::newFromRow( $row );
96                $rev = $revisionStore->newRevisionFromRow( $row, IDBAccessObject::READ_LATEST );
97                # Is it already reviewed?
98                $frev = FlaggedRevision::newFromTitle( $title, $row->page_latest, IDBAccessObject::READ_LATEST );
99                # Rev should exist, but to be safe...
100                if ( !$frev && $rev ) {
101                    $wikiPage = $wikiPageFactory->newFromTitle( $title );
102                    $db->startAtomic( __METHOD__ );
103                    FlaggedRevs::autoReviewEdit(
104                        $wikiPage,
105                        $user,
106                        $rev,
107                        $flags,
108                        true,
109                        true // approve the reverted tag update
110                    );
111                    FlaggedRevs::updateHtmlCaches( $wikiPage->getTitle() );
112                    $db->endAtomic( __METHOD__ );
113                    $changed++;
114                }
115                $count++;
116            }
117            $blockStart += $this->mBatchSize - 1;
118            $blockEnd += $this->mBatchSize - 1;
119
120            $this->waitForReplication();
121        }
122
123        $this->output( "Auto-reviewing of all pages complete ..." .
124            "{$count} rows [{$changed} changed]\n" );
125    }
126}
127
128$maintClass = ReviewAllPages::class;
129require_once RUN_MAINTENANCE_IF_MAIN;