Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
RepopulateCodePaths
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 2
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3use MediaWiki\Extension\CodeReview\Backend\CodeRepository;
4use MediaWiki\Extension\CodeReview\Backend\CodeRevision;
5
6$IP = getenv( 'MW_INSTALL_PATH' );
7if ( $IP === false ) {
8    $IP = __DIR__ . '/../../..';
9}
10require_once "$IP/maintenance/Maintenance.php";
11
12class RepopulateCodePaths extends Maintenance {
13    public function __construct() {
14        parent::__construct();
15        $this->addDescription( 'Rebuilds all code paths to support more efficient searching' );
16        $this->addArg( 'repo', 'The name of the repo. Cannot be all.' );
17        $this->addArg( 'revisions', 'The revisions to set status for. Format: start:end' );
18
19        $this->requireExtension( 'CodeReview' );
20    }
21
22    public function execute() {
23        $repoName = $this->getArg( 0 );
24
25        if ( $repoName == 'all' ) {
26            $this->fatalError( "Cannot use the 'all' repo" );
27        }
28
29        $repo = CodeRepository::newFromName( $repoName );
30        if ( !$repo ) {
31            $this->fatalError( "Repo '{$repoName}' is not a valid Repository" );
32        }
33
34        $revisions = $this->getArg( 1 );
35        if ( strpos( $revisions, ':' ) !== false ) {
36            $revisionVals = explode( ':', $revisions, 2 );
37        } else {
38            $this->fatalError( "Invalid revision range" );
39        }
40
41        $start = intval( $revisionVals[0] );
42        $end = intval( $revisionVals[1] );
43
44        $revisions = range( $start, $end );
45
46        $dbr = wfGetDB( DB_REPLICA );
47
48        $res = $dbr->select(
49            'code_paths',
50            '*',
51            [ 'cp_rev_id' => $revisions, 'cp_repo_id' => $repo->getId() ],
52            __METHOD__
53        );
54
55        $dbw = wfGetDB( DB_PRIMARY );
56        $this->beginTransaction( $dbw, __METHOD__ );
57
58        foreach ( $res as $row ) {
59            $fragments = CodeRevision::getPathFragments(
60                [ [ 'path' => $row->cp_path, 'action' => $row->cp_action ] ]
61            );
62
63            CodeRevision::insertPaths( $dbw, $fragments, $repo->getId(), $row->cp_rev_id );
64
65            $this->output( "r{$row->cp_rev_id}, path: " . $row->cp_path . " Fragments: " .
66                count( $fragments ) . "\n" );
67        }
68
69        $this->commitTransaction( $dbw, __METHOD__ );
70
71        $this->output( "Done!\n" );
72    }
73}
74
75$maintClass = RepopulateCodePaths::class;
76require_once RUN_MAINTENANCE_IF_MAIN;