@@ -34,16 +34,20 @@ abstract class GraphfityTask : DefaultTask() {
3434 val nodesLevel = HashMap <String , Int >()
3535 val dotFile = createDotFile(dotPath)
3636
37- obtainDependenciesData(rootProject, nodes, dependencies, nodeTypes, nodesLevel)
37+ obtainNodesAndDependencies(rootProject, nodes, dependencies, nodeTypes)
38+ obtainNodesLevels(projectRootName, dependencies, nodesLevel)
3839 addNodesToFile(dotFile, nodes)
3940 addDependenciesToFile(dotFile, dependencies)
4041 addNodeLevelsToFile(dotFile, nodesLevel)
4142 generateGraph(dotFile)
4243 }
4344
4445 private fun getRootProject (projectRootName : String ): Project {
45- return project.findProject(projectRootName)
46- ? : throw kotlin.IllegalArgumentException (" The property provided as projectRootPath: $projectRootName does not correspond to any project" )
46+ return requireNotNull(
47+ project.findProject(projectRootName)
48+ ) {
49+ " The property provided as projectRootPath: $projectRootName does not correspond to any project"
50+ }
4751 }
4852
4953 private fun loadNodeTypes (nodeTypesPath : String ): List <NodeType > {
@@ -86,23 +90,16 @@ abstract class GraphfityTask : DefaultTask() {
8690 }
8791 }
8892
89- private fun obtainDependenciesData (
93+ private fun obtainNodesAndDependencies (
9094 project : Project ,
9195 projects : HashSet <NodeData >,
9296 dependencies : HashSet <Pair <NodeData , NodeData >>,
9397 nodeTypes : List <NodeType >,
94- nodesLevel : HashMap <String , Int >,
95- level : Int = 0
9698 ) {
9799 val projectNodeData = mapProjectToNode(project, nodeTypes)
98100
99101 if (projectNodeData != null && projectNodeData.nodeType.isEnabled) {
100102 projects.add(projectNodeData)
101-
102- val nodeLevel = nodesLevel[project.path]
103- if (nodeLevel == null || level > nodeLevel) {
104- nodesLevel[projectNodeData.path] = level
105- }
106103 }
107104
108105 project.configurations.forEach { config ->
@@ -115,26 +112,41 @@ abstract class GraphfityTask : DefaultTask() {
115112 if (dependencyProjectNodeData != null && projectNodeData != null &&
116113 dependencyProjectNodeData.nodeType.isEnabled
117114 ) {
118- projects .add(dependencyProjectNodeData)
115+ dependencies .add(Pair (projectNodeData, dependencyProjectNodeData) )
119116
120- val nodeLevel = nodesLevel[dependencyProjectNodeData.path]
121- if (nodeLevel == null || level > nodeLevel) {
122- nodesLevel[dependencyProjectNodeData.path] = level + 1
117+ if (dependencyProjectNodeData !in projects) {
118+ obtainNodesAndDependencies(
119+ project = dependencyProject,
120+ projects = projects,
121+ dependencies = dependencies,
122+ nodeTypes = nodeTypes,
123+ )
123124 }
124- dependencies.add(Pair (projectNodeData, dependencyProjectNodeData))
125- obtainDependenciesData(
126- dependencyProject,
127- projects,
128- dependencies,
129- nodeTypes,
130- nodesLevel,
131- level + 1
132- )
133125 }
134126 }
135127 }
136128 }
137129
130+ private fun obtainNodesLevels (
131+ rootProjectName : String ,
132+ dependencies : HashSet <Pair <NodeData , NodeData >>,
133+ nodeLevel : HashMap <String , Int >,
134+ ) {
135+ var currentLevel = listOf (rootProjectName)
136+ var level = 0
137+ while (currentLevel.isNotEmpty()) {
138+ currentLevel
139+ .forEach { nodeLevel[it] = level }
140+
141+ val nextLevel = dependencies
142+ .filter { it.first.path in currentLevel }
143+ .map { it.second.path }
144+
145+ currentLevel = nextLevel
146+ level++
147+ }
148+ }
149+
138150 private fun createDotFile (dotPath : String ): File = File (dotPath + DOT_FILE ).apply {
139151 delete()
140152 parentFile.mkdirs()
0 commit comments