Page MenuHomePhabricator

cores composer.json doesn't like ~version for non dev dependencies
Closed, DeclinedPublic

Description

For https://gerrit.wikimedia.org/r/#/c/300755/

"justinrainbow/json-schema": "~1.6",

And 1.6.1 is in the committed vendor repo, we get a rather stupid error message

15:52:38 justinrainbow/json-schema: 1.6.1 installed, ~1.6 required.
15:52:38 Error: your composer.lock file is not up to date. Run "composer update" to install newer dependencies

Or is this intentional? I know various extensions use ~ syntax...

Event Timeline

Reedy renamed this task from cores extension.json doesn't like ~version for non dev dependencies to cores composer.json doesn't like ~version for non dev dependencies.Jul 24 2016, 4:00 PM
		$installed = $lock->getInstalledDependencies();
		foreach ( $json->getRequiredDependencies() as $name => $version ) {
			if ( isset( $installed[$name] ) ) {
				if ( $installed[$name]['version'] !== $version ) {
					$this->output(
						"$name: {$installed[$name]['version']} installed, $version required.\n"
					);
					$found = true;
				}

I guess it's because !== is too literal. It should be using composer/semver in some way or another. By that point, we've checked that some version of composer exists, so the semvers stuff *should* be useable... No?

And MediaWiki itself doesn't complain with normal usage...

Annoying, I'd have hoped the semver stuff was smarter, and this would've been an adequate fix, as the semver stuff should know that 1.6.1 == ~1.6

I feel like I'm missing something obvious here

diff --git a/maintenance/checkComposerLockUpToDate.php b/maintenance/checkComposerLockUpToDate.php
index 9ec61dc..6d1ad44 100644
--- a/maintenance/checkComposerLockUpToDate.php
+++ b/maintenance/checkComposerLockUpToDate.php
@@ -2,6 +2,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Composer\Semver\Comparator;
+
 /**
  * Checks whether your composer-installed dependencies are up to date
  *
@@ -43,7 +45,7 @@ class CheckComposerLockUpToDate extends Maintenance {
                $installed = $lock->getInstalledDependencies();
                foreach ( $json->getRequiredDependencies() as $name => $version ) {
                        if ( isset( $installed[$name] ) ) {
-                               if ( $installed[$name]['version'] !== $version ) {
+                               if ( !Comparator::equalTo( $installed[$name]['version'], $version ) ) {
                                        $this->output(
                                                "$name: {$installed[$name]['version']} installed, $version required.\n"
                                        );
Composer\Semver\Semver::satisfies( '1.6.1', '~1.6' )

Change 300891 had a related patch set uploaded (by Reedy):
Respect version modifiers in checkComposerLockUpToDate.php

https://gerrit.wikimedia.org/r/300891

Change 300891 abandoned by Reedy:
Respect version modifiers in checkComposerLockUpToDate.php

https://gerrit.wikimedia.org/r/300891