Jelix\Installer\ModuleInstallLauncher::getUpgraders PHP Method

getUpgraders() public method

this method should be called after verifying and resolving dependencies. Needed components (modules or plugins) should be installed/upgraded before calling this method
public getUpgraders ( EntryPoint $ep ) : ModuleInstaller[]
$ep EntryPoint the entry point
return ModuleInstaller[]
    function getUpgraders(EntryPoint $ep)
    {
        $epId = $ep->getEpId();
        if ($this->moduleUpgraders === null) {
            $this->moduleUpgraders = array();
            $p = $this->moduleInfos->getPath() . 'install/';
            if (!file_exists($p) || $this->moduleStatuses[$epId]->skipInstaller) {
                return array();
            }
            // we get the list of files for the upgrade
            $fileList = array();
            if ($handle = opendir($p)) {
                while (false !== ($f = readdir($handle))) {
                    if (!is_dir($p . $f)) {
                        if (preg_match('/^upgrade_to_([^_]+)_([^\\.]+)\\.php$/', $f, $m)) {
                            $fileList[] = array($f, $m[1], $m[2]);
                        } else {
                            if (preg_match('/^upgrade_([^\\.]+)\\.php$/', $f, $m)) {
                                $fileList[] = array($f, '', $m[1]);
                            }
                        }
                    }
                }
                closedir($handle);
            }
            if (!count($fileList)) {
                return array();
            }
            // now we order the list of file
            foreach ($fileList as $fileInfo) {
                require_once $p . $fileInfo[0];
                $cname = $this->moduleInfos->name . 'ModuleUpgrader_' . $fileInfo[2];
                if (!class_exists($cname)) {
                    throw new Exception("module.upgrader.class.not.found", array($cname, $this->name));
                }
                $upgrader = new $cname($this->moduleInfos->name, $fileInfo[2], $this->moduleInfos->getPath(), $fileInfo[1], false);
                if ($fileInfo[1] && count($upgrader->targetVersions) == 0) {
                    $upgrader->targetVersions = array($fileInfo[1]);
                }
                $this->moduleUpgraders[] = $upgrader;
            }
        }
        $list = array();
        foreach ($this->moduleUpgraders as $upgrader) {
            $foundVersion = '';
            // check the version
            foreach ($upgrader->targetVersions as $version) {
                if (VersionComparator::compareVersion($this->moduleStatuses[$epId]->version, $version) >= 0) {
                    // we don't execute upgraders having a version lower than the installed version (they are old upgrader)
                    continue;
                }
                if (VersionComparator::compareVersion($this->moduleInfos->version, $version) < 0) {
                    // we don't execute upgraders having a version higher than the version indicated in the module.xml/jelix-module.json
                    continue;
                }
                $foundVersion = $version;
                // when multiple version are specified, we take the first one which is ok
                break;
            }
            if (!$foundVersion) {
                continue;
            }
            $upgrader->version = $foundVersion;
            // we have to check now the date of versions
            // we should not execute the updater in some case.
            // for example, we have an updater for the 1.2 and 2.3 version
            // we have the 1.4 installed, and want to upgrade to the 2.5 version
            // we should not execute the update for 2.3 since modifications have already been
            // made into the 1.4. The only way to now that, is to compare date of versions
            if ($upgrader->date != '' && $this->mainInstaller) {
                $upgraderDate = $this->_formatDate($upgrader->date);
                // the date of the first version installed into the application
                $firstVersionDate = $this->_formatDate($this->mainInstaller->installerIni->getValue($this->moduleInfos->name . '.firstversion.date', $epId));
                if ($firstVersionDate !== null) {
                    if ($firstVersionDate >= $upgraderDate) {
                        continue;
                    }
                }
                // the date of the current installed version
                $currentVersionDate = $this->_formatDate($this->mainInstaller->installerIni->getValue($this->moduleInfos->name . '.version.date', $epId));
                if ($currentVersionDate !== null) {
                    if ($currentVersionDate >= $upgraderDate) {
                        continue;
                    }
                }
            }
            $upgrader->setParameters($this->moduleStatuses[$epId]->parameters);
            $class = get_class($upgrader);
            if (!isset($this->upgradersContexts[$class])) {
                $this->upgradersContexts[$class] = array();
            }
            $upgrader->setEntryPoint($ep, $this->moduleStatuses[$epId]->dbProfile, $this->upgradersContexts[$class]);
            $list[] = $upgrader;
        }
        // now let's sort upgrader, to execute them in the right order (oldest before newest)
        usort($list, function ($upgA, $upgB) {
            return VersionComparator::compareVersion($upgA->version, $upgB->version);
        });
        return $list;
    }