protected function getPackageSortOrder() { $packageSortOrder = $this->getCachedValue('packageSortOrder'); if ($packageSortOrder === false) { $data = $this->dataProvider->getData(); // get flat list of package dependencies for each package $packageDependencies = array(); foreach ($data as $packageId => $info) { if (!isset($packageDependencies[$packageId])) { $packageDependencies[$packageId] = array(); } $depends = $this->getDependsForPackage($packageId); $packageDependencies[$packageId] = array_merge($packageDependencies[$packageId], $depends); } // build into a graph $graph = new Concentrate_Graph(); $nodes = array(); foreach ($packageDependencies as $packageId => $dependencies) { if ($packageId === '__site__') { // special package '__site__' is not sorted with other // packages. It gets put at the end. continue; } if (!isset($nodes[$packageId])) { $nodes[$packageId] = new Concentrate_Graph_Node($graph, $packageId); } foreach ($dependencies as $dependentPackageId) { if ($dependentPackageId === '__site__') { // special package '__site__' is not sorted with other // packages. It gets put at the end. continue; } if (!isset($nodes[$dependentPackageId])) { $nodes[$dependentPackageId] = new Concentrate_Graph_Node($graph, $dependentPackageId); } } } foreach ($packageDependencies as $packageId => $dependencies) { foreach ($dependencies as $dependentPackageId) { $nodes[$packageId]->connectTo($nodes[$dependentPackageId]); } } $sorter = new Concentrate_Graph_TopologicalSorter(); try { $sortedNodes = $sorter->sort($graph); } catch (Concentrate_CyclicDependencyException $e) { throw new Concentrate_CyclicDependencyException('Package dependency order can not be determined because ' . 'package dependencies contain one more more cycles. ' . 'There is likely a typo in the package dependency ' . 'section of one or more YAML files.'); } $order = array(); foreach ($sortedNodes as $node) { $order[] = $node->getData(); } // special package __site__ is always counted last by default $order[] = '__site__'; // return indexed by package id, with values being the relative // sort order $packageSortOrder = array_flip($order); $this->setCachedValue('packageSortOrder', $packageSortOrder); } return $packageSortOrder; }
$swat = new Concentrate_Graph_Node($graph, 'Swat'); $store = new Concentrate_Graph_Node($graph, 'Store'); $swatYui = new Concentrate_Graph_Node($graph, 'SwatYui'); $admin = new Concentrate_Graph_Node($graph, 'Admin'); $site = new Concentrate_Graph_Node($graph, 'Site'); $xmlRpcAjax = new Concentrate_Graph_Node($graph, 'XML_RPCAjax'); $blorg = new Concentrate_Graph_Node($graph, 'Blorg'); $pinhole = new Concentrate_Graph_Node($graph, 'Pinhole'); $swat->connectTo($swatYui); $store->connectTo($swat); $store->connectTo($site); $site->connectTo($xmlRpcAjax); $site->connectTo($swat); $admin->connectTo($swat); $admin->connectTo($site); $blorg->connectTo($swat); $blorg->connectTo($site); $blorg->connectTo($admin); $pinhole->connectTo($swat); $pinhole->connectTo($site); $pinhole->connectTo($blorg); $sorter = new Concentrate_Graph_TopologicalSorter(); $sorted = $sorter->sort($graph); echo PHP_EOL; echo $graph; echo PHP_EOL; echo 'Sorted: ', PHP_EOL; foreach ($sorted as $k => $nodes) { echo ' - ', $k, ' => ', implode(', ', $nodes), PHP_EOL; } echo PHP_EOL;