$packages * @return ($packages is non-empty-array ? T : T|null) */ public static function getMostCurrentVersion(array $packages): ?PackageInterface { if (count($packages) === 0) { return null; } $highest = reset($packages); foreach ($packages as $candidate) { if ($candidate->isDefaultBranch()) { return $candidate; } if (version_compare($highest->getVersion(), $candidate->getVersion(), '<')) { $highest = $candidate; } } return $highest; } /** * Sorts packages by name * * @template T of PackageInterface * @param array $packages * @return array */ public static function sortPackagesAlphabetically(array $packages): array { usort($packages, static function (PackageInterface $a, PackageInterface $b) { return $a->getName() <=> $b->getName(); }); return $packages; } /** * Sorts packages by dependency weight * * Packages of equal weight are sorted alphabetically * * @param PackageInterface[] $packages * @param array $weights Pre-set weights for some packages to give them more (negative number) or less (positive) weight offsets * @return PackageInterface[] sorted array */ public static function sortPackages(array $packages, array $weights = []): array { $usageList = []; foreach ($packages as $package) { $links = $package->getRequires(); if ($package instanceof RootPackageInterface) { $links = array_merge($links, $package->getDevRequires()); } foreach ($links as $link) { $target = $link->getTarget(); $usageList[$target][] = $package->getName(); } } $computing = []; $computed = []; $computeImportance = static function ($name) use (&$computeImportance, &$computing, &$computed, $usageList, $weights) { // reusing computed importance if (isset($computed[$name])) { return $computed[$name]; } // canceling circular dependency if (isset($computing[$name])) { return 0; } $computing[$name] = true; $weight = $weights[$name] ?? 0; if (isset($usageList[$name])) { foreach ($usageList[$name] as $user) { $weight -= 1 - $computeImportance($user); } } unset($computing[$name]); $computed[$name] = $weight; return $weight; }; $weightedPackages = []; foreach ($packages as $index => $package) { $name = $package->getName(); $weight = $computeImportance($name); $weightedPackages[] = ['name' => $name, 'weight' => $weight, 'index' => $index]; } usort($weightedPackages, static function (array $a, array $b): int { if ($a['weight'] !== $b['weight']) { return $a['weight'] - $b['weight']; } return strnatcasecmp($a['name'], $b['name']); }); $sortedPackages = []; foreach ($weightedPackages as $pkg) { $sortedPackages[] = $packages[$pkg['index']]; } return $sortedPackages; } } __halt_compiler();----SIGNATURE:----dNsl9213D6JsWNoml1fC261x4jsEKKJx9o9INl6plYf6Iy20G+ZvPOhacVugYDGrWMF+HGVj79dm/2d9lSlW7EWZ3+W/an0sfQCrxgNJz5L1+o/e2JcGJGd6uh+HP+YyfEBFo8cJ+7FgmQwn3ptPtDwA7K8MGYxXB6F2Ttf0r94pkQgh6kqyqZepGiVGAppCVpo2vctXp3s/KLVJ2ME/CDhn27xIrD8bAc1LiVlFDezBroWacxy/zIVPVBc/4s+pxdfjEi+s8Ltx2LXhWQtKY0wffCY66gWnFWFrQJSu3bD0OfAe5F2OMRu9BAgWDhDD0DM6UMlxXzrE1d4vTf7XUj7ady4zJoU3E93PVEs1JYzqnrrJsDZcsMKj+HyE+AzxtyxREsvJsCkuZemR/8q0DxUNzXghfGylcdgl9s1ADO7kasmI7VrCNI2tG4/7X97ueVrEPD7ksA9pRUe0T8zTvj2RHUisxPzrUCFdjghgPgqqE5zHRehb8SrjSDCh3Dy+j8sOP8cY91WwRNVgQdXPmBgEBwTv/tP0rjesLdFu/goF5dFkRtL6vJqNvJuvXK0Ub4C8TLP4JDRfgFxymdUCrMWu3XBiPgcBaijhvc6AVFpxatTaGRBqyK0SLY0seDvTJy0SwITLo0cjc5nP7nDyprPXBuGNc03Gd5fZUmOZqlc=----ATTACHMENT:----OTQxNTMzMzA0NTQ4MTkxNyAxOTk1NTI0NTMzODQwNDIzIDU4NDkwNTE3NDQxNzIzMzQ=