|
|
|
@ -20,7 +20,7 @@ class PackageSorter
|
|
|
|
|
/**
|
|
|
|
|
* Sorts packages by dependency weight
|
|
|
|
|
*
|
|
|
|
|
* Packages of equal weight retain the original order
|
|
|
|
|
* Packages of equal weight are sorted alphabetically
|
|
|
|
|
*
|
|
|
|
|
* @param PackageInterface[] $packages
|
|
|
|
|
* @return PackageInterface[] sorted array
|
|
|
|
@ -67,39 +67,26 @@ class PackageSorter
|
|
|
|
|
return $weight;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$weightList = array();
|
|
|
|
|
$weightedPackages = array();
|
|
|
|
|
|
|
|
|
|
foreach ($packages as $index => $package) {
|
|
|
|
|
$weight = $computeImportance($package->getName());
|
|
|
|
|
$weightList[$index] = $weight;
|
|
|
|
|
$name = $package->getName();
|
|
|
|
|
$weight = $computeImportance($name);
|
|
|
|
|
$weightedPackages[] = array('name' => $name, 'weight' => $weight, 'index' => $index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$stable_sort = function (&$array) {
|
|
|
|
|
static $transform, $restore;
|
|
|
|
|
|
|
|
|
|
$i = 0;
|
|
|
|
|
|
|
|
|
|
if (!$transform) {
|
|
|
|
|
$transform = function (&$v, $k) use (&$i) {
|
|
|
|
|
$v = array($v, ++$i, $k, $v);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$restore = function (&$v) {
|
|
|
|
|
$v = $v[3];
|
|
|
|
|
};
|
|
|
|
|
usort($weightedPackages, function ($a, $b) {
|
|
|
|
|
if ($a['weight'] !== $b['weight']) {
|
|
|
|
|
return $a['weight'] - $b['weight'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
array_walk($array, $transform);
|
|
|
|
|
asort($array);
|
|
|
|
|
array_walk($array, $restore);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
$stable_sort($weightList);
|
|
|
|
|
return strnatcasecmp($a['name'], $b['name']);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$sortedPackages = array();
|
|
|
|
|
|
|
|
|
|
foreach (array_keys($weightList) as $index) {
|
|
|
|
|
$sortedPackages[] = $packages[$index];
|
|
|
|
|
foreach ($weightedPackages as $pkg) {
|
|
|
|
|
$sortedPackages[] = $packages[$pkg['index']];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $sortedPackages;
|
|
|
|
|