From 7f5f5687dba53c42c9bb7eaed3060f5fa7aa8419 Mon Sep 17 00:00:00 2001 From: SychO9 Date: Tue, 9 Nov 2021 20:06:03 +0100 Subject: [PATCH] Auto append `:*` when installing an extension if not specifying a version --- .../src/Command/RequireExtensionHandler.php | 11 ++++- .../ComposerCommandFailedExceptionHandler.php | 6 ++- .../api/extensions/RequireExtensionTest.php | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/extensions/package-manager/src/Command/RequireExtensionHandler.php b/extensions/package-manager/src/Command/RequireExtensionHandler.php index f900f3235..d0ed401b4 100755 --- a/extensions/package-manager/src/Command/RequireExtensionHandler.php +++ b/extensions/package-manager/src/Command/RequireExtensionHandler.php @@ -66,12 +66,19 @@ class RequireExtensionHandler throw new ExtensionAlreadyInstalledException($extension); } + $packageName = $command->package; + + // Auto append :* if not requiring a specific version. + if (strpos($packageName, ':') === false) { + $packageName .= ":*"; + } + $output = $this->composer->run( - new StringInput("require $command->package") + new StringInput("require $packageName") ); if ($output->getExitCode() !== 0) { - throw new ComposerRequireFailedException($command->package, $output->getContents()); + throw new ComposerRequireFailedException($packageName, $output->getContents()); } $this->events->dispatch( diff --git a/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php b/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php index 75e7d040e..01e5ec558 100755 --- a/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php +++ b/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php @@ -13,7 +13,7 @@ use Flarum\Foundation\ErrorHandling\HandledError; class ComposerCommandFailedExceptionHandler { - protected const INCOMPATIBLE_REGEX = '/(?:(?: +- {PACKAGE_NAME} v[0-9A-z.-]+ requires flarum\/core)|(?:Could not find a version of package {PACKAGE_NAME} matching your minim))/m'; + protected const INCOMPATIBLE_REGEX = '/(?:(?: +- {PACKAGE_NAME}(?: v[0-9A-z.-]+ requires|\[[^\[\]]+\] require) flarum\/core)|(?:Could not find a version of package {PACKAGE_NAME} matching your minim)|(?: +- Root composer.json requires {PACKAGE_NAME} [^,]+, found {PACKAGE_NAME}\[[^\[\]]+\]+ but it does not match your minimum-stability))/m'; public function handle(ComposerCommandFailedException $e): HandledError { @@ -39,8 +39,10 @@ class ComposerCommandFailedExceptionHandler protected function guessCause(ComposerCommandFailedException $e): ?string { + $rawPackageName = preg_replace('/^([A-z0-9-_\/]+)(?::.*|)$/i', '$1', $e->packageName); + if ($e instanceof ComposerRequireFailedException) { - $hasMatches = preg_match(str_replace('{PACKAGE_NAME}', preg_quote($e->packageName, '/'), self::INCOMPATIBLE_REGEX), $e->getMessage(), $matches); + $hasMatches = preg_match(str_replace('{PACKAGE_NAME}', preg_quote($rawPackageName, '/'), self::INCOMPATIBLE_REGEX), $e->getMessage(), $matches); if ($hasMatches) { return 'extension_incompatible_with_instance'; diff --git a/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php b/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php index 3a41af0e1..001e8a6eb 100644 --- a/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php +++ b/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php @@ -63,6 +63,26 @@ class RequireExtensionTest extends TestCase $this->assertExtensionExists('v17development-blog'); } + /** + * @test + */ + public function requiring_a_compatible_extension_with_specific_version_works() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'v17development/flarum-blog:0.4.0' + ] + ] + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertExtensionExists('v17development-blog'); + } + /** * @test */ @@ -82,4 +102,24 @@ class RequireExtensionTest extends TestCase $this->assertEquals(409, $response->getStatusCode()); $this->assertEquals('extension_incompatible_with_instance', $this->guessedCause($response)); } + + /** + * @test + */ + public function requiring_an_uncompatible_extension_with_specific_version_fails() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'flarum/auth-github:0.1.0-beta.9' + ] + ] + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + $this->assertEquals('extension_incompatible_with_instance', $this->guessedCause($response)); + } }