Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
CheckComposerLockUpToDate
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 3
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 canExecuteWithoutLocalSettings
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3require_once __DIR__ . '/Maintenance.php';
4
5use MediaWiki\Composer\LockFileChecker;
6use Wikimedia\Composer\ComposerJson;
7use Wikimedia\Composer\ComposerLock;
8
9/**
10 * Checks whether your composer-installed dependencies are up to date
11 *
12 * Composer creates a "composer.lock" file which specifies which versions are installed
13 * (via `composer install`). It has a hash, which can be compared to the value of
14 * the composer.json file to see if dependencies are up to date.
15 */
16class CheckComposerLockUpToDate extends Maintenance {
17    public function __construct() {
18        parent::__construct();
19        $this->addDescription(
20            'Checks whether your composer.lock file is up to date with the current composer.json' );
21    }
22
23    public function canExecuteWithoutLocalSettings(): bool {
24        return true;
25    }
26
27    public function execute() {
28        global $IP;
29        $lockLocation = "$IP/composer.lock";
30        $jsonLocation = "$IP/composer.json";
31        if ( !file_exists( $lockLocation ) ) {
32            // Maybe they're using mediawiki/vendor?
33            $lockLocation = "$IP/vendor/composer.lock";
34            if ( !file_exists( $lockLocation ) ) {
35                $this->fatalError(
36                    'Could not find composer.lock file. Have you run "composer install --no-dev"?'
37                );
38            }
39        }
40
41        $lock = new ComposerLock( $lockLocation );
42        $json = new ComposerJson( $jsonLocation );
43
44        // Check all the dependencies to see if any are old
45        $checker = new LockFileChecker( $json, $lock );
46        $errors = $checker->check();
47
48        // NOTE: This is used by TestSetup before MediaWikiServices is initialized and thus
49        //       may not rely on global singletons.
50        // NOTE: This is used by maintenance/update.php and thus may not rely on
51        //       database connections, including e.g. interface messages without useDatabase=false,
52        //       which would call MessageCache.
53        if ( $errors ) {
54            foreach ( $errors as $error ) {
55                $this->error( $error . "\n" );
56            }
57            $this->fatalError(
58                'Error: your composer.lock file is not up to date. ' .
59                'Run "composer update --no-dev" to install newer dependencies'
60            );
61        } else {
62            // We couldn't find any out-of-date dependencies, so assume everything is ok!
63            $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
64        }
65    }
66}
67
68$maintClass = CheckComposerLockUpToDate::class;
69require_once RUN_MAINTENANCE_IF_MAIN;