Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
$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;