diff --git a/CHANGELOG.md b/CHANGELOG.md index 818823a86..98608df6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,13 @@ * Fixed suggest output being very spammy, it now is only one line long and shows more rarely * Fixed conflict rules like e.g. >=5 from matching dev-master, as it is not normalized to 9999999-dev internally anymore +### [1.10.14] 2020-10-13 + + * Fixed version guesser to look at remote branches as well as local ones + * Fixed path repositories version guessing to handle edge cases where version is different from the VCS-guessed version + * Fixed COMPOSER env var causing issues when combined with the `global ` command + * Fixed a few issues dealing with PHP without openssl extension (not recommended at all but sometimes needed for testing) + ### [1.10.13] 2020-09-09 * Fixed regressions with old version validation @@ -969,6 +976,7 @@ [2.0.0-alpha3]: https://github.com/composer/composer/compare/2.0.0-alpha2...2.0.0-alpha3 [2.0.0-alpha2]: https://github.com/composer/composer/compare/2.0.0-alpha1...2.0.0-alpha2 [2.0.0-alpha1]: https://github.com/composer/composer/compare/1.10.7...2.0.0-alpha1 +[1.10.14]: https://github.com/composer/composer/compare/1.10.13...1.10.14 [1.10.13]: https://github.com/composer/composer/compare/1.10.12...1.10.13 [1.10.12]: https://github.com/composer/composer/compare/1.10.11...1.10.12 [1.10.11]: https://github.com/composer/composer/compare/1.10.10...1.10.11 diff --git a/doc/05-repositories.md b/doc/05-repositories.md index c7129a6c6..64ec0325b 100644 --- a/doc/05-repositories.md +++ b/doc/05-repositories.md @@ -589,6 +589,17 @@ the branch or tag that is currently checked out. Otherwise, the version should be explicitly defined in the package's `composer.json` file. If the version cannot be resolved by these means, it is assumed to be `dev-master`. +When the version cannot be inferred from the local VCS repository, you should use +the special `branch-version` entry under `extra` instead of `version`: + +```json +{ + "extra": { + "branch-version": "4.2-dev" + } +} +``` + The local package will be symlinked if possible, in which case the output in the console will read `Symlinking from ../../packages/my-package`. If symlinking is _not_ possible the package will be copied. In that case, the console will diff --git a/src/Composer/Package/Loader/RootPackageLoader.php b/src/Composer/Package/Loader/RootPackageLoader.php index f6b310454..dbd199e3d 100644 --- a/src/Composer/Package/Loader/RootPackageLoader.php +++ b/src/Composer/Package/Loader/RootPackageLoader.php @@ -73,8 +73,10 @@ class RootPackageLoader extends ArrayLoader if (!isset($config['version'])) { $commit = null; - // override with env var if available - if (getenv('COMPOSER_ROOT_VERSION')) { + if (isset($config['extra']['branch-version'])) { + $config['version'] = preg_replace('{(\.x)?(-dev)?$}', '.x-dev', $config['extra']['branch-version']); + } elseif (getenv('COMPOSER_ROOT_VERSION')) { + // override with env var if available $config['version'] = getenv('COMPOSER_ROOT_VERSION'); } else { $versionData = $this->versionGuesser->guessVersion($config, $cwd ?: getcwd()); diff --git a/src/Composer/Repository/PathRepository.php b/src/Composer/Repository/PathRepository.php index dc9659e5f..060773071 100644 --- a/src/Composer/Repository/PathRepository.php +++ b/src/Composer/Repository/PathRepository.php @@ -171,6 +171,11 @@ class PathRepository extends ArrayRepository implements ConfigurableRepositoryIn ); $package['transport-options'] = $this->options; + // use the branch-version as the package version if available + if (!isset($package['version']) && isset($package['extra']['branch-version'])) { + $package['version'] = preg_replace('{(\.x)?(-dev)?$}', '.x-dev', $package['extra']['branch-version']); + } + // carry over the root package version if this path repo is in the same git repository as root package if (!isset($package['version']) && ($rootVersion = getenv('COMPOSER_ROOT_VERSION'))) { if ( diff --git a/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php b/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php index f2bdc04f9..a3c22112c 100644 --- a/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php @@ -201,4 +201,15 @@ class RootPackageLoaderTest extends TestCase $this->assertEquals("dev-latest-production", $package->getPrettyVersion()); } + + public function testLoadExtraBranchVersion() + { + $package = $this->loadPackage(array( + 'extra' => array( + 'branch-version' => '1.2', + ), + )); + + $this->assertEquals('1.2.x-dev', $package->getPrettyVersion()); + } } diff --git a/tests/Composer/Test/Repository/Fixtures/path/with-branch-version/composer.json b/tests/Composer/Test/Repository/Fixtures/path/with-branch-version/composer.json new file mode 100644 index 000000000..75545d5f9 --- /dev/null +++ b/tests/Composer/Test/Repository/Fixtures/path/with-branch-version/composer.json @@ -0,0 +1,6 @@ +{ + "name": "test/path-branch-versioned", + "extra": { + "branch-version": "1.2" + } +} diff --git a/tests/Composer/Test/Repository/PathRepositoryTest.php b/tests/Composer/Test/Repository/PathRepositoryTest.php index 30fa983f7..33235e11a 100644 --- a/tests/Composer/Test/Repository/PathRepositoryTest.php +++ b/tests/Composer/Test/Repository/PathRepositoryTest.php @@ -69,6 +69,23 @@ class PathRepositoryTest extends TestCase $this->assertNotEmpty($packageVersion); } + public function testLoadPackageFromFileSystemWithExtraBranchVersion() + { + $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') + ->getMock(); + + $config = new \Composer\Config(); + $versionGuesser = null; + + $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'with-branch-version')); + $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config); + $packages = $repository->getPackages(); + + $this->assertEquals(1, $repository->count()); + + $this->assertTrue($repository->hasPackage($this->getPackage('test/path-branch-versioned', '1.2.x-dev'))); + } + public function testLoadPackageFromFileSystemWithWildcard() { $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') @@ -82,7 +99,7 @@ class PathRepositoryTest extends TestCase $packages = $repository->getPackages(); $names = array(); - $this->assertGreaterThanOrEqual(2, $repository->count()); + $this->assertGreaterThanOrEqual(3, $repository->count()); $package = $packages[0]; $names[] = $package->getName(); @@ -90,8 +107,11 @@ class PathRepositoryTest extends TestCase $package = $packages[count($packages) - 1]; $names[] = $package->getName(); + $package = $packages[2]; + $names[] = $package->getName(); + sort($names); - $this->assertSame(array('test/path-unversioned', 'test/path-versioned'), $names); + $this->assertSame(array('test/path-branch-versioned', 'test/path-unversioned', 'test/path-versioned'), $names); } /**