Neos\Flow\Package\PackageOrderResolver::sortPackage PHP Method

sortPackage() protected method

Recursively sort dependencies of a package. This is a depth-first approach that recursively adds all dependent packages to the sorted list before adding the given package. Visited packages are flagged to break up cyclic dependencies.
protected sortPackage ( string $packageKey ) : boolean
$packageKey string Package key to process
return boolean true if package was sorted; false otherwise.
    protected function sortPackage($packageKey)
    {
        if (!isset($this->packageStates[$packageKey])) {
            // Package does not exist; so that means it is just skipped; but that's to the outside as if sorting was successful.
            return true;
        }
        if (!isset($this->unsortedPackages[$packageKey])) {
            // Safeguard: Package is not unsorted anymore.
            return true;
        }
        $iterationForPackage = $this->unsortedPackages[$packageKey];
        // $iterationForPackage will be -1 if the package is already worked on in a stack, in that case we will return instantly.
        if ($iterationForPackage === -1) {
            return false;
        }
        $this->unsortedPackages[$packageKey] = -1;
        $packageComposerManifest = $this->manifestData[$packageKey];
        $unresolvedDependencies = 0;
        $packageRequirements = isset($packageComposerManifest['require']) ? array_keys($packageComposerManifest['require']) : [];
        $unresolvedDependencies += $this->sortListBefore($packageKey, $packageRequirements);
        if (isset($packageComposerManifest['extra']['neos']['loading-order']['after']) && is_array($packageComposerManifest['extra']['neos']['loading-order']['after'])) {
            $sortingConfiguration = $packageComposerManifest['extra']['neos']['loading-order']['after'];
            $unresolvedDependencies += $this->sortListBefore($packageKey, $sortingConfiguration);
        }
        /** @var array $packageState */
        $packageState = $this->packageStates[$packageKey];
        $this->unsortedPackages[$packageKey] = $iterationForPackage + 1;
        if ($unresolvedDependencies === 0) {
            // we are validly able to sort the package to this position.
            unset($this->unsortedPackages[$packageKey]);
            $this->sortedPackages[$packageKey] = $packageState;
            return true;
        }
        if ($this->unsortedPackages[$packageKey] > 20) {
            // SECOND case: ERROR case. This happens with MANY cyclic dependencies, in this case we just degrade by arbitarily sorting the package; and continue. Alternative would be throwing an Exception.
            unset($this->unsortedPackages[$packageKey]);
            // In order to be able to debug this kind of error (if we hit it), we at least try to write to PackageStates.php
            // so if people send it to us, we have some chance of finding the error.
            $packageState['error-sorting-limit-reached'] = true;
            $this->sortedPackages[$packageKey] = $packageState;
            return true;
        }
        return false;
    }