diff --git a/lib/modules/contracts_manager/index.js b/lib/modules/contracts_manager/index.js index 8f2d54af..69fbca44 100644 --- a/lib/modules/contracts_manager/index.js +++ b/lib/modules/contracts_manager/index.js @@ -286,6 +286,40 @@ class ContractsManager { } } callback(); + }, + function setDependencyCount(callback) { + let className; + + function getDependencyCount(contractName, cycleDetector) { + if (!self.contractDependencies[contractName] || !self.contractDependencies[contractName].length) { + self.contracts[contractName].dependencyCount = 0; + return 0; + } + if (self.contracts[contractName].dependencyCount) { + // Already have that count + return self.contracts[contractName].dependencyCount; + } + let total = self.contractDependencies[contractName].length; + self.contractDependencies[contractName].some(dependencyName => { + if (cycleDetector.indexOf(dependencyName) > -1) { + // We are in a cycle because of the dependency, set both to Infinity + self.contracts[dependencyName].dependencyCount = Infinity; + total = Infinity; + return true; + } + cycleDetector.push(dependencyName); + total += getDependencyCount(dependencyName, cycleDetector); + }); + self.contracts[contractName].dependencyCount = total; + return total; + } + + let cycleDetector; + for (className in self.contracts) { + cycleDetector = []; + getDependencyCount(className, cycleDetector); + } + callback(); } ], function (err) { if (err) { diff --git a/lib/modules/deployment/index.js b/lib/modules/deployment/index.js index 8c6445d4..9e6e3a82 100644 --- a/lib/modules/deployment/index.js +++ b/lib/modules/deployment/index.js @@ -1,4 +1,5 @@ let async = require('async'); +const _ = require('underscore'); const ContractDeployer = require('./contract_deployer.js'); const cloneDeep = require('clone-deep');