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;
    }
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;
    }
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 ; }
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.

@param string $packageKey Package key to process
@return boolean true if package was sorted; false otherwise.
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 .