diff --git a/src/Classes/Config.php b/src/Classes/Config.php index 433fac9f..effb1575 100644 --- a/src/Classes/Config.php +++ b/src/Classes/Config.php @@ -12,6 +12,7 @@ namespace RobinTheHood\ModifiedModuleLoaderClient; use RobinTheHood\ModifiedModuleLoaderClient\App; +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; class Config { @@ -428,4 +429,36 @@ public static function getLogging(): bool return $logging === 'true'; } + + + /** + * Set exceptionMonitorMail in config. + * + * @param string $newExceptionMonitorMail. + */ + public static function setDependencyMode(string $dependencyMode): void + { + self::writeConfiguration(['dependencyMode' => $dependencyMode]); + } + + /** + * Get dependencyMode from config. + * + * @return int Returns logging from config or null. + */ + public static function getDependenyMode(): int + { + /** + * Expect a string or null + * depending if the user specified an email address. + * You will not receive an empty string. + */ + $dependencyMode = self::getOption('dependencyMode'); + + if ($dependencyMode === 'strict') { + return Comparator::CARET_MODE_STRICT; + } + + return Comparator::CARET_MODE_LAX; + } } diff --git a/src/Classes/DependencyManager/CombinationSatisfyer.php b/src/Classes/DependencyManager/CombinationSatisfyer.php index b3a417f7..e7fb471f 100644 --- a/src/Classes/DependencyManager/CombinationSatisfyer.php +++ b/src/Classes/DependencyManager/CombinationSatisfyer.php @@ -14,7 +14,7 @@ namespace RobinTheHood\ModifiedModuleLoaderClient\DependencyManager; use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; -use RobinTheHood\ModifiedModuleLoaderClient\Semver\Parser; +use RobinTheHood\ModifiedModuleLoaderClient\SemverComparatorFactory; class CombinationSatisfyer { @@ -23,7 +23,7 @@ class CombinationSatisfyer public function __construct() { - $this->comparator = new Comparator(new Parser()); + $this->comparator = SemverComparatorFactory::createComparator(); } /** @@ -117,9 +117,8 @@ public function satisfiesCominationsFromModuleWithIterator( ModuleTree $moduleTree, CombinationIterator $combinationIterator ): CombinationSatisfyerResult { - $foundCombination = new Combination(); - while (true) { + $foundCombination = new Combination(); $failLog = new FailLog(); $testCombination = $combinationIterator->current(); $result = $this->satisfiesCominationFromModuleTree( diff --git a/src/Classes/DependencyManager/DependencyManager.php b/src/Classes/DependencyManager/DependencyManager.php index 283d2bb5..91e13c50 100644 --- a/src/Classes/DependencyManager/DependencyManager.php +++ b/src/Classes/DependencyManager/DependencyManager.php @@ -22,15 +22,16 @@ use RobinTheHood\ModifiedModuleLoaderClient\Logger\LogLevel; use RobinTheHood\ModifiedModuleLoaderClient\Logger\StaticLogger; use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; -use RobinTheHood\ModifiedModuleLoaderClient\Semver\Parser; +use RobinTheHood\ModifiedModuleLoaderClient\SemverComparatorFactory; class DependencyManager { + /** @var Comparator */ protected $comparator; public function __construct() { - $this->comparator = new Comparator(new Parser()); + $this->comparator = SemverComparatorFactory::createComparator(); } /** diff --git a/src/Classes/IndexController.php b/src/Classes/IndexController.php index 4c99f36e..c9c33acc 100644 --- a/src/Classes/IndexController.php +++ b/src/Classes/IndexController.php @@ -632,6 +632,10 @@ public function invokeSettings() Config::setInstallMode($parsedBody['installMode']); } + if (isset($parsedBody['dependencyMode'])) { + Config::setDependencyMode($parsedBody['dependencyMode']); + } + Notification::pushFlashMessage([ 'text' => 'Einstellungen erfolgreich gespeichert.', 'type' => 'success' diff --git a/src/Classes/MmlcVersionInfoLoader.php b/src/Classes/MmlcVersionInfoLoader.php index 0a7ce597..e3bf4a51 100644 --- a/src/Classes/MmlcVersionInfoLoader.php +++ b/src/Classes/MmlcVersionInfoLoader.php @@ -34,7 +34,7 @@ class MmlcVersionInfoLoader public static function createLoader(): MmlcVersionInfoLoader { $parser = new Parser(); - $comparator = new Comparator($parser); + $comparator = new Comparator($parser, Comparator::CARET_MODE_STRICT); $sorter = new Sorter($comparator); $filter = new Filter($parser, $comparator, $sorter); diff --git a/src/Classes/Module.php b/src/Classes/Module.php index bf9a9a02..a9f4fda1 100644 --- a/src/Classes/Module.php +++ b/src/Classes/Module.php @@ -515,7 +515,7 @@ public function isCompatibleWithPhp(): bool } $phpVersionInstalled = phpversion(); - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); return $comparator->satisfies($phpVersionInstalled, $phpVersionContraint); } @@ -532,7 +532,7 @@ public function isCompatibleWithMmlc(): bool return true; } - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); return $comparator->satisfies($mmlcVersionInstalled, $mmlcVersionContraint); } diff --git a/src/Classes/ModuleFilter.php b/src/Classes/ModuleFilter.php index 2d898e54..5359e910 100644 --- a/src/Classes/ModuleFilter.php +++ b/src/Classes/ModuleFilter.php @@ -124,7 +124,7 @@ public static function filterNewestVersion(array $modules): array continue; } - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); if ($comparator->lessThan($module->getVersion(), $filteredModule->getVersion())) { $insertOrReplace = false; break; @@ -162,7 +162,7 @@ public static function filterNewestOrInstalledVersion($modules): array break; } - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); if ($comparator->lessThan($module->getVersion(), $filteredModule->getVersion())) { $insertOrReplace = false; break; @@ -215,7 +215,7 @@ public static function filterByVersionConstrain(array $modules, string $constrai { $filteredModules = []; foreach ($modules as $module) { - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); if ($comparator->satisfies($module->getVersion(), $constrain)) { $filteredModules[] = $module; } @@ -230,7 +230,7 @@ public static function getLatestVersion(array $modules): ?Module { $selectedModule = null; foreach ($modules as $module) { - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); if (!$selectedModule || $comparator->greaterThan($module->getVersion(), $selectedModule->getVersion())) { $selectedModule = $module; } diff --git a/src/Classes/ModuleSorter.php b/src/Classes/ModuleSorter.php index af42e793..df3f1e11 100644 --- a/src/Classes/ModuleSorter.php +++ b/src/Classes/ModuleSorter.php @@ -73,7 +73,7 @@ public static function sortByCategory($modules): array public static function sortByVersion(array $modules): array { usort($modules, function (Module $moduleA, Module $moduleB): int { - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); if ($comparator->lessThan($moduleA->getVersion(), $moduleB->getVersion())) { return 1; } else { diff --git a/src/Classes/ModuleStatus.php b/src/Classes/ModuleStatus.php index 3c1f81ba..b73f955c 100644 --- a/src/Classes/ModuleStatus.php +++ b/src/Classes/ModuleStatus.php @@ -136,7 +136,7 @@ public static function isUpdatable(Module $module): bool return false; } - $comparator = new Comparator(new Parser()); + $comparator = SemverComparatorFactory::createComparator(); if (!$comparator->greaterThan($newestVersion->getVersion(), $installedVersion->getVersion())) { return false; } diff --git a/src/Classes/SelfUpdater.php b/src/Classes/SelfUpdater.php index 9115e9be..c7be36e0 100644 --- a/src/Classes/SelfUpdater.php +++ b/src/Classes/SelfUpdater.php @@ -55,7 +55,7 @@ public function __construct(MmlcVersionInfoLoader $mmlcVersionInfoLoader) $this->appRoot = App::getRoot(); $this->mmlcVersionInfoLoader = $mmlcVersionInfoLoader; $this->remoteUpdateServer = $this->getRomteUpdateServer(); - $this->comparator = new Comparator(new Parser()); + $this->comparator = new Comparator(new Parser(), Comparator::CARET_MODE_STRICT); $this->parser = new Parser(); $this->filter = new Filter($this->parser, $this->comparator, new Sorter($this->comparator)); } diff --git a/src/Classes/Semver/Comparator.php b/src/Classes/Semver/Comparator.php index 4d4d5920..85b42c29 100644 --- a/src/Classes/Semver/Comparator.php +++ b/src/Classes/Semver/Comparator.php @@ -17,9 +17,16 @@ class Comparator { + public const CARET_MODE_LAX = 0; + public const CARET_MODE_STRICT = 1; + + /** @var Parser */ protected $parser; - public function __construct(Parser $parser) + /** @var int */ + private $mode = self::CARET_MODE_STRICT; + + public function __construct(Parser $parser, int $mode = self::CARET_MODE_STRICT) { $this->parser = $parser; } @@ -156,8 +163,24 @@ public function isCompatible(string $versionString1, string $versionString2): bo $version1 = $this->parser->parse($versionString1); $version2 = $this->parser->parse($versionString2); - if ($version1->getMajor() != $version2->getMajor()) { - return false; + $majorCheck = $version1->getMajor() == $version2->getMajor(); + $minorCheck = $version1->getMinor() == $version2->getMinor(); + $patchCheck = $version1->getPatch() == $version2->getPatch(); + + $strict = $this->mode === self::CARET_MODE_STRICT; + + if ($version1->getMajor() >= 1) { // ^1.0.0 + if (!$majorCheck) { + return false; + } + } elseif ($strict && $version1->getMajor() == 0 && $version1->getMinor() >= 1) { // ^0.1.0 + if (!$majorCheck || !$minorCheck) { + return false; + } + } elseif ($strict && $version1->getMajor() == 0 && $version1->getMinor() == 0) { // ^0.0.0 + if (!$majorCheck || !$minorCheck || !$patchCheck) { + return false; + } } return $this->greaterThanOrEqualTo($versionString1, $versionString2); diff --git a/src/Classes/SemverComparatorFactory.php b/src/Classes/SemverComparatorFactory.php new file mode 100644 index 00000000..61f52577 --- /dev/null +++ b/src/Classes/SemverComparatorFactory.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace RobinTheHood\ModifiedModuleLoaderClient; + +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Parser; + +class SemverComparatorFactory +{ + /** + * @return Comparator + */ + public static function createComparator() + { + $comparator = new Comparator(new Parser(), Config::getDependenyMode()); + return $comparator; + } +} diff --git a/src/Templates/Settings.tmpl.php b/src/Templates/Settings.tmpl.php index e10665c5..283af1bd 100644 --- a/src/Templates/Settings.tmpl.php +++ b/src/Templates/Settings.tmpl.php @@ -1,8 +1,14 @@ In diesem Ordner werden Module für den MMLC heruntergeladen.
+ +Du kannst zwischen strict und lax wählen. Mit strict werden die Abhänigkeiten von Modulen mit einer Version kleiner als 1.0.0 genauer kontrolliert. Wenn sich einige Module nicht installieren lassen, kannst du es mit lax versuchen. Beachte, dass im Lex-Modus die Wahrscheinlichkeit größer ist, dass verschiedene Module nicht miteinander harmonieren.