128 $this->availableExtensions = $this->listUtility->getAvailableExtensions();
146 $this->dependencyErrors = [];
148 foreach ($dependencies as $dependency) {
150 $identifier = strtolower($dependency->getIdentifier());
153 if (!$this->skipDependencyCheck) {
154 $methodName =
'check' . ucfirst($identifier) .
'Dependency';
155 $this->{$methodName}($dependency);
158 if ($dependency->getType() ===
'depends') {
162 }
catch (Exception\UnresolvedDependencyException $e) {
166 $extensionKey = $identifier;
168 if (!isset($this->dependencyErrors[$extensionKey])) {
169 $this->dependencyErrors[$extensionKey] = [];
171 $this->dependencyErrors[$extensionKey][] = [
172 'code' => $e->getCode(),
173 'message' => $e->getMessage()
186 return !empty($this->dependencyErrors);
209 if ($lowerCaseIdentifier ===
'typo3') {
211 throw new Exception\UnresolvedTypo3DependencyException(
217 throw new Exception\UnresolvedTypo3DependencyException(
223 throw new Exception\UnresolvedTypo3DependencyException(
224 'checkTypo3Dependency can only check TYPO3 dependencies. Found dependency with identifier "' . $dependency->
getIdentifier() .
'"',
241 if ($lowerCaseIdentifier ===
'php') {
243 throw new Exception\UnresolvedPhpDependencyException(
244 'Your PHP version is lower than necessary. You need at least PHP version ' . $dependency->
getLowestVersion(),
249 throw new Exception\UnresolvedPhpDependencyException(
255 throw new Exception\UnresolvedPhpDependencyException(
256 'checkPhpDependency can only check PHP dependencies. Found dependency with identifier "' . $dependency->
getIdentifier() .
'"',
277 $extensionKey = $dependency->getIdentifier();
279 if ($extensionIsLoaded ===
true) {
281 if ($isLoadedVersionCompatible ===
true || $this->skipDependencyCheck) {
284 $extension = $this->listUtility->getExtension($extensionKey);
285 $loadedVersion = $extension->getPackageMetaData()->
getVersion();
286 if (version_compare($loadedVersion, $dependency->getHighestVersion()) === -1) {
289 }
catch (Exception\UnresolvedDependencyException $e) {
290 throw new Exception\MissingVersionDependencyException(
291 'The extension ' . $extensionKey .
' is installed in version ' . $loadedVersion
292 .
' but needed in version ' . $dependency->getLowestVersion() .
' - ' . $dependency->getHighestVersion() .
' and could not be fetched from TER',
297 throw new Exception\MissingVersionDependencyException(
298 'The extension ' . $extensionKey .
' is installed in version ' . $loadedVersion .
299 ' but needed in version ' . $dependency->getLowestVersion() .
' - ' . $dependency->getHighestVersion(),
305 if ($extensionIsAvailable ===
true) {
307 if ($isAvailableVersionCompatible) {
309 $this->managementService->markExtensionForInstallation($extensionKey);
310 $this->dependencyErrors = array_merge($unresolvedDependencyErrors, $this->dependencyErrors);
312 $extension = $this->listUtility->getExtension($extensionKey);
313 $availableVersion = $extension->getPackageMetaData()->
getVersion();
314 if (version_compare($availableVersion, $dependency->getHighestVersion()) === -1) {
317 }
catch (Exception\MissingExtensionDependencyException $e) {
318 if (!$this->skipDependencyCheck) {
319 throw new Exception\MissingVersionDependencyException(
320 'The extension ' . $extensionKey .
' is available in version ' . $availableVersion
321 .
' but is needed in version ' . $dependency->getLowestVersion() .
' - ' . $dependency->getHighestVersion() .
' and could not be fetched from TER',
327 if (!$this->skipDependencyCheck) {
328 throw new Exception\MissingVersionDependencyException(
329 'The extension ' . $extensionKey .
' is available in version ' . $availableVersion
330 .
' but is needed in version ' . $dependency->getLowestVersion() .
' - ' . $dependency->getHighestVersion(),
335 $this->managementService->markExtensionForInstallation($extensionKey);
341 $this->dependencyErrors = array_merge($unresolvedDependencyErrors, $this->dependencyErrors);
372 if ($this->localExtensionStorage !==
'' && is_dir($this->localExtensionStorage)) {
373 $extList = \TYPO3\CMS\Core\Utility\GeneralUtility::get_dirs($this->localExtensionStorage);
374 if (in_array($extensionKey, $extList)) {
375 $this->managementService->markExtensionForCopy($extensionKey, $this->localExtensionStorage);
393 if (!$isExtensionDownloadableFromTer) {
394 if (!$this->skipDependencyCheck) {
395 if ($this->extensionRepository->countAll() > 0) {
396 throw new Exception\MissingExtensionDependencyException(
397 'The extension ' . $extensionKey .
' is not available from TER.',
401 throw new Exception\MissingExtensionDependencyException(
402 'The extension ' . $extensionKey .
' could not be checked. Please update your Extension-List from TYPO3 Extension Repository (TER).',
410 if (!$isDownloadableVersionCompatible) {
411 if (!$this->skipDependencyCheck) {
412 throw new Exception\MissingVersionDependencyException(
413 'No compatible version found for extension ' . $extensionKey,
421 if (!$latestCompatibleExtensionByIntegerVersionDependency instanceof
Extension) {
422 if (!$this->skipDependencyCheck) {
423 throw new Exception\MissingExtensionDependencyException(
424 'Could not resolve dependency for "' . $dependency->
getIdentifier() .
'"',
432 $this->managementService->markExtensionForUpdate($latestCompatibleExtensionByIntegerVersionDependency);
434 $this->managementService->markExtensionForDownload($latestCompatibleExtensionByIntegerVersionDependency);
483 return array_key_exists($extensionKey, $this->availableExtensions);
495 $extensionData = $this->emConfUtility->includeEmConf($this->availableExtensions[$dependency->
getIdentifier()]);
507 return $this->extensionRepository->countByExtensionKey($extensionKey) > 0;
519 $count = $this->extensionRepository->countByVersionRangeAndExtensionKey(
521 $versions[
'lowestIntegerVersion'],
522 $versions[
'highestIntegerVersion']
524 return !empty($count);
536 foreach ($extensions as $extension) {
539 $extensionKey = $extension->getExtensionKey();
541 if (isset($this->dependencyErrors[$extensionKey])) {
543 unset($this->dependencyErrors[$extensionKey]);
563 $compatibleDataSets = $this->extensionRepository->findByVersionRangeAndExtensionKeyOrderedByVersion(
565 $versions[
'lowestIntegerVersion'],
566 $versions[
'highestIntegerVersion']
584 'lowestIntegerVersion' => $lowestVersionInteger,
585 'highestIntegerVersion' => $highestVersionInteger
595 $availableAndInstalledExtensions = $this->listUtility->getAvailableAndInstalledExtensionsWithAdditionalInformation();
596 $dependentExtensions = [];
597 foreach ($availableAndInstalledExtensions as $availableAndInstalledExtensionKey => $availableAndInstalledExtension) {
598 if (isset($availableAndInstalledExtension[
'installed']) && $availableAndInstalledExtension[
'installed'] ===
true) {
599 if (is_array($availableAndInstalledExtension[
'constraints']) && is_array($availableAndInstalledExtension[
'constraints'][
'depends']) && array_key_exists($extensionKey, $availableAndInstalledExtension[
'constraints'][
'depends'])) {
600 $dependentExtensions[] = $availableAndInstalledExtensionKey;
604 return $dependentExtensions;
615 $suitableExtensions = [];
617 foreach ($extensions as $extension) {
619 foreach ($extension->getDependencies() as $dependency) {
620 if ($dependency->getIdentifier() ===
'typo3') {
623 $suitableExtensions[] = $extension;
631 return $suitableExtensions;
646 if (!$showUnsuitable) {
649 $filteredExtensions = [];
650 foreach ($extensions as $extension) {
651 $extensionKey = $extension->getExtensionKey();
652 if (!array_key_exists($extensionKey, $filteredExtensions)) {
653 $filteredExtensions[$extensionKey] = $extension;
656 $currentVersion = $filteredExtensions[$extensionKey]->getVersion();
657 $newVersion = $extension->getVersion();
658 if (version_compare($newVersion, $currentVersion,
'>')) {
659 $filteredExtensions[$extensionKey] = $extension;
662 return $filteredExtensions;