From 11c16b0ed1adff2c37f024ce329308860f031d87 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Sun, 8 Nov 2015 12:26:26 -0800 Subject: [PATCH] --resolve. --- src/main/kotlin/com/beust/kobalt/Args.kt | 3 + src/main/kotlin/com/beust/kobalt/AsciiArt.kt | 5 +- src/main/kotlin/com/beust/kobalt/Main.kt | 7 +- .../com/beust/kobalt/ResolveDependency.kt | 73 +++++++++++++++++++ 4 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/ResolveDependency.kt diff --git a/src/main/kotlin/com/beust/kobalt/Args.kt b/src/main/kotlin/com/beust/kobalt/Args.kt index 9719da97..d910349f 100644 --- a/src/main/kotlin/com/beust/kobalt/Args.kt +++ b/src/main/kotlin/com/beust/kobalt/Args.kt @@ -39,6 +39,9 @@ class Args { @Parameter(names = arrayOf("--port"), description = "Port, if --server was specified") var port: Int = DEFAULT_SERVER_PORT + @Parameter(names = arrayOf("--resolve"), description = "Resolve the given dependency and display its tree") + var dependency: String? = null + @Parameter(names = arrayOf("--server"), description = "Run in server mode") var serverMode: Boolean = false diff --git a/src/main/kotlin/com/beust/kobalt/AsciiArt.kt b/src/main/kotlin/com/beust/kobalt/AsciiArt.kt index 0715235a..15c7c6ea 100644 --- a/src/main/kotlin/com/beust/kobalt/AsciiArt.kt +++ b/src/main/kotlin/com/beust/kobalt/AsciiArt.kt @@ -43,9 +43,10 @@ class AsciiArt { bl + r(s.length + 2, h) + br) } - fun logBox(s: String) { + val defaultLog : (s: String) -> Unit = { log(1, " $it") } + fun logBox(s: String, print: (String) -> Unit = defaultLog) { box(s).forEach { - log(1, " $it") + print(it) } } } diff --git a/src/main/kotlin/com/beust/kobalt/Main.kt b/src/main/kotlin/com/beust/kobalt/Main.kt index 46d098e7..e2b7d78e 100644 --- a/src/main/kotlin/com/beust/kobalt/Main.kt +++ b/src/main/kotlin/com/beust/kobalt/Main.kt @@ -57,7 +57,8 @@ private class Main @Inject constructor( val client: KobaltClient, val server: KobaltServer, val pluginInfo: PluginInfo, - val projectGenerator: ProjectGenerator) { + val projectGenerator: ProjectGenerator, + val resolveDependency: ResolveDependency) { data class RunInfo(val jc: JCommander, val args: Args) @@ -140,6 +141,9 @@ private class Main @Inject constructor( jc.usage() } else if (args.serverMode) { server.run() + } else if (args.dependency != null) { + // --resolve + resolveDependency.run(args.dependency as String) } else { if (! buildFile.exists()) { error(buildFile.path.toFile().path + " does not exist") @@ -199,4 +203,3 @@ private class Main @Inject constructor( } } } - diff --git a/src/main/kotlin/com/beust/kobalt/ResolveDependency.kt b/src/main/kotlin/com/beust/kobalt/ResolveDependency.kt new file mode 100644 index 00000000..2ed52fcf --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/ResolveDependency.kt @@ -0,0 +1,73 @@ +package com.beust.kobalt + +import com.beust.kobalt.maven.* +import com.beust.kobalt.misc.Node +import com.beust.kobalt.misc.log +import com.google.inject.Inject +import java.util.* + +/** + * Display information about a Maven id. + */ +class ResolveDependency @Inject constructor(val repoFinder: RepoFinder) { + val increment = 4 + val leftFirst = "\u2558" + val leftMiddle = "\u255f" + val leftLast = "\u2559" + val vertical = "\u2551" + + class Dep(val dep: IClasspathDependency, val indent: Int) + + fun run(id: String) { + val indent = 0 + val dep = MavenDependency.create(id) + val root = Node(Dep(dep, indent)) + val seen = hashSetOf(id) + root.addChildren(findChildren(root, seen)) + val repoResult = repoFinder.findCorrectRepo(id) + AsciiArt.logBox(id, {s -> println(s) }) + val simpleDep = SimpleDep(MavenId(id)) + + println("Full URL: " + repoResult.repoUrl + simpleDep.toJarFile(repoResult)) + display(listOf(root)) + } + + private fun fill(n: Int) = StringBuffer().apply { repeat(n, { append(" ")})}.toString() + + private fun display(nodes: List>) { + nodes.withIndex().forEach { indexNode -> + val node = indexNode.value + println(fill(node.value.indent) + node.value.dep.id) + display(node.children) +// with(node.value) { +// val left = +// if (indexNode.index == nodes.size - 1) leftLast +// else leftMiddle +// for(i in 0..indent - increment) { +// if (i % increment == 0) print(vertical) +// else print(" ") +// } +// println(left + " " + dep.id) +// display(node.children) +// } + } + + } + + private fun findChildren(root: Node, seen: HashSet): List> { + val result = arrayListOf>() + root.value.dep.directDependencies().forEach { + if (! seen.contains(it.id)) { + val dep = Dep(it, root.value.indent + increment) + val node = Node(dep) + log(2, "Found dependency ${dep.dep.id} indent: ${dep.indent}") + result.add(node) + seen.add(it.id) + node.addChildren(findChildren(node, seen)) + } + } + log(2, "Children for ${root.value.dep.id}: ${result.size}") + return result + } +} +