From 02564b0ff0cb6bd250dfaed97d1f9d1b4fa1244a Mon Sep 17 00:00:00 2001 From: Nicole Cordes <typo3@cordes.co> Date: Tue, 30 Jun 2015 19:44:58 +0200 Subject: [PATCH] [BUGFIX] Skip dependency check for extensions If an incompatible extension is trying to be installed, a popup opens with the possibility to skip dependency checks and retry the installation. Currently the skipping is only implemented for system checks (TYPO3 and PHP versions). This patch adds the missing skip method during extension dependency resolving. Resolves: #67863 Releases: master Change-Id: Idbd4bc649a83a8e8a98652ffb8bd8081a7c65192 Reviewed-on: http://review.typo3.org/40775 Reviewed-by: Markus Klein <markus.klein@typo3.org> Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl> Reviewed-by: Florian Weiss <typo3org@leblanc.at> Tested-by: Florian Weiss <typo3org@leblanc.at> Tested-by: Markus Klein <markus.klein@typo3.org> --- .../Classes/Controller/ActionController.php | 2 +- .../Classes/Controller/DownloadController.php | 2 +- .../Service/ExtensionManagementService.php | 12 +++--- .../Classes/Utility/DependencyUtility.php | 37 +++++++++++-------- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/typo3/sysext/extensionmanager/Classes/Controller/ActionController.php b/typo3/sysext/extensionmanager/Classes/Controller/ActionController.php index ccfdf5fc9ee9..3977432c53fa 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/ActionController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/ActionController.php @@ -81,7 +81,7 @@ class ActionController extends AbstractController { * @return void */ public function installExtensionWithoutSystemDependencyCheckAction($extensionKey) { - $this->managementService->setSkipSystemDependencyCheck(TRUE); + $this->managementService->setSkipDependencyCheck(TRUE); $this->forward('toggleExtensionInstallationState', NULL, NULL, array('extensionKey' => $extensionKey)); } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php b/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php index 8fcd0f40393d..26d1aad52121 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php @@ -128,7 +128,7 @@ class DownloadController extends AbstractController { * @throws \Exception */ public function installExtensionWithoutSystemDependencyCheckAction(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension) { - $this->managementService->setSkipSystemDependencyCheck(TRUE); + $this->managementService->setSkipDependencyCheck(TRUE); $this->forward('installFromTer', NULL, NULL, array('extension' => $extension, 'downloadPath' => 'Local')); } diff --git a/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php b/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php index 7a4235ef3cf5..d5fadd144d04 100644 --- a/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php +++ b/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php @@ -70,7 +70,7 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface { /** * @var bool */ - protected $skipSystemDependencyCheck = FALSE; + protected $skipDependencyCheck = FALSE; /** * @param string $extensionKey @@ -124,10 +124,10 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface { /** * Enables or disables the dependency check for system environment (PHP, TYPO3) before extension installation * - * @param bool $skipSystemDependencyCheck + * @param bool $skipDependencyCheck */ - public function setSkipSystemDependencyCheck($skipSystemDependencyCheck) { - $this->skipSystemDependencyCheck = $skipSystemDependencyCheck; + public function setSkipDependencyCheck($skipDependencyCheck) { + $this->skipDependencyCheck = $skipDependencyCheck; } /** @@ -223,7 +223,7 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface { * @return bool Returns TRUE if all dependencies can be resolved, otherwise FALSE */ protected function checkDependencies(Extension $extension) { - $this->dependencyUtility->setSkipSystemDependencyCheck($this->skipSystemDependencyCheck); + $this->dependencyUtility->setSkipDependencyCheck($this->skipDependencyCheck); $this->dependencyUtility->checkDependencies($extension); return !$this->dependencyUtility->hasDependencyErrors(); @@ -323,7 +323,7 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface { * @return array */ public function getAndResolveDependencies(Extension $extension) { - $this->dependencyUtility->setSkipSystemDependencyCheck($this->skipSystemDependencyCheck); + $this->dependencyUtility->setSkipDependencyCheck($this->skipDependencyCheck); $this->dependencyUtility->checkDependencies($extension); $installQueue = $this->downloadQueue->getExtensionInstallStorage(); if (is_array($installQueue) && !empty($installQueue)) { diff --git a/typo3/sysext/extensionmanager/Classes/Utility/DependencyUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/DependencyUtility.php index fbf23136432a..81562f8c57fe 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/DependencyUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/DependencyUtility.php @@ -75,7 +75,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { /** * @var bool */ - protected $skipSystemDependencyCheck = FALSE; + protected $skipDependencyCheck = FALSE; /** * @param string $localExtensionStorage @@ -99,8 +99,8 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { * @param bool $skipSpecialDependencyCheck * @return void */ - public function setSkipSystemDependencyCheck($skipSpecialDependencyCheck) { - $this->skipSystemDependencyCheck = $skipSpecialDependencyCheck; + public function setSkipDependencyCheck($skipDependencyCheck) { + $this->skipDependencyCheck = $skipDependencyCheck; } /** @@ -117,7 +117,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { $identifier = strtolower($dependency->getIdentifier()); try { if (in_array($identifier, Dependency::$specialDependencies)) { - if (!$this->skipSystemDependencyCheck) { + if (!$this->skipDependencyCheck) { $methodName = 'check' . ucfirst($identifier) . 'Dependency'; $this->{$methodName}($dependency); } @@ -240,7 +240,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { $extensionIsLoaded = $this->isDependentExtensionLoaded($extensionKey); if ($extensionIsLoaded === TRUE) { $isLoadedVersionCompatible = $this->isLoadedVersionCompatible($dependency); - if ($isLoadedVersionCompatible === TRUE) { + if ($isLoadedVersionCompatible === TRUE || $this->skipDependencyCheck) { return TRUE; } $extension = $this->listUtility->getExtension($extensionKey); @@ -277,18 +277,22 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { try { $this->getExtensionFromRepository($extensionKey, $dependency); } catch (Exception\MissingExtensionDependencyException $e) { - throw new Exception\MissingVersionDependencyException( - 'The extension ' . $extensionKey . ' is available in version ' . $availableVersion + if (!$this->skipDependencyCheck) { + throw new Exception\MissingVersionDependencyException( + 'The extension ' . $extensionKey . ' is available in version ' . $availableVersion . ' but is needed in version ' . $dependency->getLowestVersion() . ' - ' . $dependency->getHighestVersion() . ' and could not be fetched from TER', - 1430560390 - ); + 1430560390 + ); + } } } else { - throw new Exception\MissingVersionDependencyException( - 'The extension ' . $extensionKey . ' is available in version ' . $availableVersion + if (!$this->skipDependencyCheck) { + throw new Exception\MissingVersionDependencyException( + 'The extension ' . $extensionKey . ' is available in version ' . $availableVersion . ' but is needed in version ' . $dependency->getLowestVersion() . ' - ' . $dependency->getHighestVersion(), - 1430562374 - ); + 1430562374 + ); + } } } } else { @@ -297,6 +301,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { $this->dependencyErrors = array_merge($unresolvedDependencyErrors, $this->dependencyErrors); } } + return FALSE; } @@ -345,7 +350,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { protected function getExtensionFromTer($extensionKey, Dependency $dependency) { $isExtensionDownloadableFromTer = $this->isExtensionDownloadableFromTer($extensionKey); if (!$isExtensionDownloadableFromTer) { - if (!$this->skipSystemDependencyCheck) { + if (!$this->skipDependencyCheck) { if ($this->extensionRepository->countAll() > 0) { throw new Exception\MissingExtensionDependencyException( 'The extension ' . $extensionKey . ' is not available from TER.', @@ -363,7 +368,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { $isDownloadableVersionCompatible = $this->isDownloadableVersionCompatible($dependency); if (!$isDownloadableVersionCompatible) { - if (!$this->skipSystemDependencyCheck) { + if (!$this->skipDependencyCheck) { throw new Exception\MissingVersionDependencyException( 'No compatible version found for extension ' . $extensionKey, 1399161284 @@ -374,7 +379,7 @@ class DependencyUtility implements \TYPO3\CMS\Core\SingletonInterface { $latestCompatibleExtensionByIntegerVersionDependency = $this->getLatestCompatibleExtensionByIntegerVersionDependency($dependency); if (!$latestCompatibleExtensionByIntegerVersionDependency instanceof Extension) { - if (!$this->skipSystemDependencyCheck) { + if (!$this->skipDependencyCheck) { throw new Exception\MissingExtensionDependencyException( 'Could not resolve dependency for "' . $dependency->getIdentifier() . '"', 1399161302 -- GitLab