Add cycle detection to celerity mapper
Summary: create CelerityResourceGraph, which extends AbstractDirectedGraph. since we've done a bunch of work already to load the resource graph into memory CelerityResourceGraph simply stores a copy and makes loadEdges work off that stored copy. Test Plan: made phabricator-prefab require herald-rule-editor ~/code/phabricator> ./scripts/celerity_mapper.php webroot Finding static resources... Processing 154 files.......................................................................................................................................................... [2011-11-22 11:28:29] EXCEPTION: (Exception) Cycle detected in resource graph: phabricator-prefab => herald-rule-editor => phabricator-prefab at [/Users/btrahan/Dropbox/code/phabricator/scripts/celerity_mapper.php:173] fixed phabricator-prefab requiring herald-rule-editor. re-ran celerity_mapper and no errors! Reviewers: epriestley Reviewed By: epriestley CC: aran, btrahan, epriestley Differential Revision: 1132
This commit is contained in:
		@@ -130,7 +130,7 @@ foreach ($files as $path => $hash) {
 | 
				
			|||||||
echo "\n";
 | 
					echo "\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$runtime_map = array();
 | 
					$runtime_map = array();
 | 
				
			||||||
 | 
					$resource_graph = array();
 | 
				
			||||||
$hash_map = array();
 | 
					$hash_map = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$parser = new PhutilDocblockParser();
 | 
					$parser = new PhutilDocblockParser();
 | 
				
			||||||
@@ -168,6 +168,8 @@ foreach ($file_map as $path => $info) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  $hash_map[$provides] = $info['hash'];
 | 
					  $hash_map[$provides] = $info['hash'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $resource_graph[$provides] = $requires;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $runtime_map[$provides] = array(
 | 
					  $runtime_map[$provides] = array(
 | 
				
			||||||
    'uri'       => $uri,
 | 
					    'uri'       => $uri,
 | 
				
			||||||
    'type'      => $type,
 | 
					    'type'      => $type,
 | 
				
			||||||
@@ -176,6 +178,20 @@ foreach ($file_map as $path => $info) {
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$celerity_resource_graph = new CelerityResourceGraph();
 | 
				
			||||||
 | 
					$celerity_resource_graph->addNodes($resource_graph);
 | 
				
			||||||
 | 
					$celerity_resource_graph->setResourceGraph($resource_graph);
 | 
				
			||||||
 | 
					$celerity_resource_graph->loadGraph();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					foreach ($resource_graph as $provides => $requires) {
 | 
				
			||||||
 | 
					  $cycle = $celerity_resource_graph->detectCycles($provides);
 | 
				
			||||||
 | 
					  if ($cycle) {
 | 
				
			||||||
 | 
					    throw new Exception(
 | 
				
			||||||
 | 
					      "Cycle detected in resource graph: ". implode($cycle, " => ")
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$package_map = array();
 | 
					$package_map = array();
 | 
				
			||||||
foreach ($package_spec as $name => $package) {
 | 
					foreach ($package_spec as $name => $package) {
 | 
				
			||||||
  $hashes = array();
 | 
					  $hashes = array();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,6 +83,7 @@ phutil_register_library_map(array(
 | 
				
			|||||||
    'AphrontWriteGuard' => 'aphront/writeguard',
 | 
					    'AphrontWriteGuard' => 'aphront/writeguard',
 | 
				
			||||||
    'CelerityAPI' => 'infrastructure/celerity/api',
 | 
					    'CelerityAPI' => 'infrastructure/celerity/api',
 | 
				
			||||||
    'CelerityResourceController' => 'infrastructure/celerity/controller',
 | 
					    'CelerityResourceController' => 'infrastructure/celerity/controller',
 | 
				
			||||||
 | 
					    'CelerityResourceGraph' => 'infrastructure/celerity/graph',
 | 
				
			||||||
    'CelerityResourceMap' => 'infrastructure/celerity/map',
 | 
					    'CelerityResourceMap' => 'infrastructure/celerity/map',
 | 
				
			||||||
    'CelerityStaticResourceResponse' => 'infrastructure/celerity/response',
 | 
					    'CelerityStaticResourceResponse' => 'infrastructure/celerity/response',
 | 
				
			||||||
    'ConduitAPIMethod' => 'applications/conduit/method/base',
 | 
					    'ConduitAPIMethod' => 'applications/conduit/method/base',
 | 
				
			||||||
@@ -813,6 +814,7 @@ phutil_register_library_map(array(
 | 
				
			|||||||
    'AphrontTypeaheadTemplateView' => 'AphrontView',
 | 
					    'AphrontTypeaheadTemplateView' => 'AphrontView',
 | 
				
			||||||
    'AphrontWebpageResponse' => 'AphrontResponse',
 | 
					    'AphrontWebpageResponse' => 'AphrontResponse',
 | 
				
			||||||
    'CelerityResourceController' => 'AphrontController',
 | 
					    'CelerityResourceController' => 'AphrontController',
 | 
				
			||||||
 | 
					    'CelerityResourceGraph' => 'AbstractDirectedGraph',
 | 
				
			||||||
    'ConduitAPI_arcanist_Method' => 'ConduitAPIMethod',
 | 
					    'ConduitAPI_arcanist_Method' => 'ConduitAPIMethod',
 | 
				
			||||||
    'ConduitAPI_arcanist_projectinfo_Method' => 'ConduitAPI_arcanist_Method',
 | 
					    'ConduitAPI_arcanist_projectinfo_Method' => 'ConduitAPI_arcanist_Method',
 | 
				
			||||||
    'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod',
 | 
					    'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod',
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								src/infrastructure/celerity/graph/CelerityResourceGraph.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/infrastructure/celerity/graph/CelerityResourceGraph.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2011 Facebook, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final class CelerityResourceGraph extends AbstractDirectedGraph {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private $resourceGraph = array();
 | 
				
			||||||
 | 
					  private $graphSet = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected function loadEdges(array $nodes) {
 | 
				
			||||||
 | 
					    if (!$this->graphSet) {
 | 
				
			||||||
 | 
					      throw new Exception(
 | 
				
			||||||
 | 
					        "Call setResourceGraph before loading the graph!"
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $graph = $this->getResourceGraph();
 | 
				
			||||||
 | 
					    $edges = array();
 | 
				
			||||||
 | 
					    foreach ($nodes as $node) {
 | 
				
			||||||
 | 
					      $edges[$node] = idx($graph, $node, array());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return $edges;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final public function setResourceGraph(array $graph) {
 | 
				
			||||||
 | 
					    $this->resourceGraph = $graph;
 | 
				
			||||||
 | 
					    $this->graphSet = true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private function getResourceGraph() {
 | 
				
			||||||
 | 
					    return $this->resourceGraph;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/infrastructure/celerity/graph/__init__.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/infrastructure/celerity/graph/__init__.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This file is automatically generated. Lint this module to rebuild it.
 | 
				
			||||||
 | 
					 * @generated
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					phutil_require_module('phutil', 'utils');
 | 
				
			||||||
 | 
					phutil_require_module('phutil', 'utils/abstractgraph');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					phutil_require_source('CelerityResourceGraph.php');
 | 
				
			||||||
		Reference in New Issue
	
	Block a user