1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 00:17:11 -07:00

More moving classes around.

This commit is contained in:
Cedric Beust 2015-12-15 04:37:46 +04:00
parent 3592243bd8
commit 6b1b141943
22 changed files with 281 additions and 261 deletions

View file

@ -5,15 +5,15 @@ import com.beust.kobalt.api.IClasspathDependency
import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.api.PluginTask
import com.beust.kobalt.api.Project
import com.beust.kobalt.Args
import com.beust.kobalt.app.BuildFileCompiler
import com.beust.kobalt.app.MainModule
import com.beust.kobalt.app.ProjectGenerator
import com.beust.kobalt.app.UpdateKobalt
import com.beust.kobalt.app.remote.KobaltClient
import com.beust.kobalt.app.remote.KobaltServer
import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.TaskManager
import com.beust.kobalt.internal.build.BuildFile
import com.beust.kobalt.internal.build.BuildFileCompiler
import com.beust.kobalt.internal.remote.KobaltClient
import com.beust.kobalt.internal.remote.KobaltServer
import com.beust.kobalt.maven.DepFactory
import com.beust.kobalt.maven.Http
import com.beust.kobalt.maven.LocalRepo

View file

@ -1,11 +1,8 @@
package com.beust.kobalt.api
import com.beust.kobalt.Args
import com.beust.kobalt.Constants
import com.beust.kobalt.HostConfig
import com.beust.kobalt.Plugins
import com.beust.kobalt.misc.MainModule
import com.google.inject.Guice
import com.google.inject.Injector
import java.io.InputStream
import java.util.*
@ -15,7 +12,7 @@ public class Kobalt {
// This injector will eventually be replaced with a different injector initialized with the
// correct arguments (or with a TestModule) but it's necessary to give it a default value
// here so the kobalt-plugin.xml file can be read since this is done very early
var INJECTOR : Injector = Guice.createInjector(MainModule(Args()))
lateinit var INJECTOR : Injector
var context: KobaltContext? = null

View file

@ -1,4 +1,4 @@
package com.beust.kobalt.internal.build
package com.beust.kobalt.app
import com.beust.kobalt.Args
import com.beust.kobalt.Constants
@ -9,6 +9,9 @@ import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.PluginProperties
import com.beust.kobalt.api.Project
import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.build.BuildFile
import com.beust.kobalt.app.ParsedBuildFile
import com.beust.kobalt.internal.build.VersionFile
import com.beust.kobalt.kotlin.kotlinCompilePrivate
import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.misc.KFiles

View file

@ -1,6 +1,5 @@
package com.beust.kobalt.internal
package com.beust.kobalt.app
import com.beust.kobalt.app.ProjectGenerator
import com.beust.kobalt.api.IInitContributor
import com.beust.kobalt.maven.Pom
import com.beust.kobalt.misc.KFiles

View file

@ -1,4 +1,4 @@
package com.beust.kobalt.internal.build
package com.beust.kobalt.app
import com.beust.kobalt.KobaltException
import com.beust.kobalt.Plugins
@ -7,6 +7,7 @@ import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.internal.TaskManager
import com.beust.kobalt.internal.build.BuildFile
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.Topological
import com.beust.kobalt.misc.log

View file

@ -0,0 +1,65 @@
package com.beust.kobalt.app
import com.beust.kobalt.Args
import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.maven.ArtifactFetcher
import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.maven.Pom
import com.beust.kobalt.maven.PomGenerator
import com.beust.kobalt.misc.DependencyExecutor
import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.plugin.publish.JCenterApi
import com.google.inject.AbstractModule
import com.google.inject.Provider
import com.google.inject.Singleton
import com.google.inject.TypeLiteral
import com.google.inject.assistedinject.FactoryModuleBuilder
import java.util.concurrent.ExecutorService
public open class MainModule(val args: Args) : AbstractModule() {
val executors = KobaltExecutors()
open fun configureTest() {
bind(LocalRepo::class.java)
}
override fun configure() {
configureTest()
val builder = FactoryModuleBuilder()
arrayListOf(
PomGenerator.IFactory::class.java,
JCenterApi.IFactory::class.java,
Pom.IFactory::class.java,
BuildFileCompiler.IFactory::class.java,
ArtifactFetcher.IFactory::class.java)
.forEach {
install(builder.build(it))
}
// bind(javaClass<TaskManager>()).toProvider(javaClass<TaskManagerProvider>())
// .`in`(Scopes.SINGLETON)
bind(object: TypeLiteral<KobaltExecutors>() {}).toInstance(executors)
bind(object: TypeLiteral<ExecutorService>() {}).annotatedWith(DependencyExecutor::class.java)
.toInstance(executors.dependencyExecutor)
bind(Args::class.java).toProvider(Provider<Args> {
args
})
bind(PluginInfo::class.java).toProvider(Provider<PluginInfo> {
PluginInfo.readKobaltPluginXml()
}).`in`(Singleton::class.java)
// bindListener(Matchers.any(), object: TypeListener {
// override fun <I> hear(typeLiteral: TypeLiteral<I>?, typeEncounter: TypeEncounter<I>?) {
// val bean = object: InjectionListener<I> {
// override public fun afterInjection(injectee: I) {
// if (Scopes.isCircularProxy(injectee)) {
// println("CYCLE: " + typeLiteral?.getRawType()?.getName());
// }
// }
// }
// typeEncounter?.register(bean)
// }
// })
}
}

View file

@ -1,13 +1,15 @@
package com.beust.kobalt.internal.build
package com.beust.kobalt.app
import com.beust.kobalt.Plugins
import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project
import com.beust.kobalt.internal.build.BuildFile
import com.beust.kobalt.internal.build.VersionFile
import com.beust.kobalt.kotlin.kotlinCompilePrivate
import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.countChar
import com.beust.kobalt.misc.log
import com.beust.kobalt.kotlin.kotlinCompilePrivate
import java.io.File
import java.net.URL
import java.nio.charset.Charset

View file

@ -0,0 +1,79 @@
package com.beust.kobalt.app.remote
import com.beust.kobalt.Args
import com.beust.kobalt.api.IClasspathDependency
import com.beust.kobalt.api.Project
import com.beust.kobalt.app.BuildFileCompiler
import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.build.BuildFile
import com.beust.kobalt.internal.remote.CommandData
import com.beust.kobalt.internal.remote.ICommand
import com.beust.kobalt.internal.remote.ICommandSender
import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.maven.dependency.MavenDependency
import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.misc.log
import com.google.gson.Gson
import com.google.gson.JsonObject
import java.io.File
import java.net.URL
import java.nio.file.Paths
import javax.inject.Inject
/**
* This command returns the list of dependencies for the given buildFile.
* Payload:
* { "name" : "getDependencies", "buildFile": "/Users/beust/kotlin/kobalt/kobalt/src/Build.kt" }
* The response is a GetDependenciesData.
*/
class GetDependenciesCommand @Inject constructor(val executors: KobaltExecutors,
val buildFileCompilerFactory: BuildFileCompiler.IFactory, val args: Args,
val dependencyManager: DependencyManager, val pluginInfo: PluginInfo) : ICommand {
override val name = "getDependencies"
override fun run(sender: ICommandSender, received: JsonObject) {
val buildFile = BuildFile(Paths.get(received.get("buildFile").asString), "GetDependenciesCommand")
val buildFileCompiler = buildFileCompilerFactory.create(listOf(buildFile), pluginInfo)
val projects = buildFileCompiler.compileBuildFiles(args)
sender.sendData(toData(projects, buildFileCompiler.parsedBuildFiles.flatMap { it.pluginUrls }))
}
private fun toData(projects: List<Project>, pluginUrls: List<URL>) : CommandData {
val projectDatas = arrayListOf<ProjectData>()
val executor = executors.miscExecutor
fun toDependencyData(d: IClasspathDependency, scope: String) : DependencyData {
val dep = MavenDependency.create(d.id, executor)
return DependencyData(d.id, scope, dep.jarFile.get().absolutePath)
}
fun allDeps(l: List<IClasspathDependency>) = dependencyManager.transitiveClosure(l)
val pluginDependencies = pluginUrls.map { File(it.toURI()) }.map { FileDependency(it.absolutePath) }
projects.forEach { project ->
val allDependencies =
pluginDependencies.map { toDependencyData(it, "compile")} +
allDeps(project.compileDependencies).map { toDependencyData(it, "compile") } +
allDeps(project.compileProvidedDependencies).map { toDependencyData(it, "provided") } +
allDeps(project.compileRuntimeDependencies).map { toDependencyData(it, "runtime") } +
allDeps(project.testDependencies).map { toDependencyData(it, "testCompile") } +
allDeps(project.testProvidedDependencies).map { toDependencyData(it, "testProvided") }
projectDatas.add(ProjectData(project.name, allDependencies))
}
log(1, "Returning BuildScriptInfo")
val result = toCommandData(Gson().toJson(GetDependenciesData(projectDatas)))
log(2, " $result")
return result
}
/////
// The JSON payloads that this command uses
//
class DependencyData(val id: String, val scope: String, val path: String)
class ProjectData( val name: String, val dependencies: List<DependencyData>)
class GetDependenciesData(val projects: List<ProjectData>)
}

View file

@ -1,4 +1,4 @@
package com.beust.kobalt.internal.remote
package com.beust.kobalt.app.remote
import com.beust.kobalt.SystemProperties
import com.beust.kobalt.misc.log

View file

@ -0,0 +1,97 @@
package com.beust.kobalt.app.remote
import com.beust.kobalt.Args
import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.internal.remote.CommandData
import com.beust.kobalt.internal.remote.ICommandSender
import com.beust.kobalt.internal.remote.PingCommand
import com.beust.kobalt.misc.log
import com.google.gson.Gson
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import com.google.inject.Singleton
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintWriter
import java.net.ServerSocket
import java.net.SocketException
import javax.inject.Inject
@Singleton
public class KobaltServer @Inject constructor(val args: Args) : Runnable, ICommandSender {
var outgoing: PrintWriter? = null
val pending = arrayListOf<CommandData>()
private val COMMAND_CLASSES = listOf(GetDependenciesCommand::class.java, PingCommand::class.java)
private val COMMANDS = COMMAND_CLASSES.map {
Kobalt.INJECTOR.getInstance(it).let { Pair(it.name, it) }
}.toMap()
override fun run() {
val portNumber = args.port
log(1, "Listening to port $portNumber")
var quit = false
val serverSocket = ServerSocket(portNumber)
var clientSocket = serverSocket.accept()
while (!quit) {
outgoing = PrintWriter(clientSocket.outputStream, true)
if (pending.size > 0) {
log(1, "Emptying the queue, size $pending.size()")
synchronized(pending) {
pending.forEach { sendData(it) }
pending.clear()
}
}
val ins = BufferedReader(InputStreamReader(clientSocket.inputStream))
var commandName: String? = null
try {
var line = ins.readLine()
while (!quit && line != null) {
log(1, "Received from client $line")
val jo = JsonParser().parse(line) as JsonObject
commandName = jo.get("name").asString
if ("quit" == commandName) {
log(1, "Quitting")
quit = true
} else {
runCommand(jo)
// Done, send a quit to the client
sendData(CommandData("quit", ""))
line = ins.readLine()
}
}
} catch(ex: SocketException) {
log(1, "Client disconnected, resetting")
clientSocket = serverSocket.accept()
} catch(ex: Throwable) {
ex.printStackTrace()
sendData(CommandData(commandName!!, null, ex.message))
log(1, "Command failed: ${ex.message}")
}
}
}
private fun runCommand(jo: JsonObject) {
val command = jo.get("name").asString
if (command != null) {
COMMANDS.getOrElse(command, { COMMANDS.get("ping") })!!.run(this, jo)
} else {
error("Did not find a name in command: $jo")
}
}
override fun sendData(commandData: CommandData) {
val content = Gson().toJson(commandData)
if (outgoing != null) {
outgoing!!.println(content)
} else {
log(1, "Queuing $content")
synchronized(pending) {
pending.add(commandData)
}
}
}
}

View file

@ -1,81 +1,8 @@
package com.beust.kobalt.internal.remote
import com.beust.kobalt.Args
import com.beust.kobalt.Constants
import com.beust.kobalt.api.IClasspathDependency
import com.beust.kobalt.api.Project
import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.build.BuildFile
import com.beust.kobalt.internal.build.BuildFileCompiler
import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.dependency.FileDependency
import com.beust.kobalt.maven.dependency.MavenDependency
import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.misc.log
import com.google.gson.Gson
import com.google.gson.JsonObject
import java.io.PrintWriter
import java.net.Socket
import java.net.URL
import java.nio.file.Paths
import javax.inject.Inject
/**
* This command returns the list of dependencies for the given buildFile.
* Payload:
* { "name" : "getDependencies", "buildFile": "/Users/beust/kotlin/kobalt/kobalt/src/Build.kt" }
* The response is a GetDependenciesData.
*/
class GetDependenciesCommand @Inject constructor(val executors: KobaltExecutors,
val buildFileCompilerFactory: BuildFileCompiler.IFactory, val args: Args,
val dependencyManager: DependencyManager, val pluginInfo: PluginInfo) : ICommand {
override val name = "getDependencies"
override fun run(sender: ICommandSender, received: JsonObject) {
val buildFile = BuildFile(Paths.get(received.get("buildFile").asString), "GetDependenciesCommand")
val buildFileCompiler = buildFileCompilerFactory.create(listOf(buildFile), pluginInfo)
val projects = buildFileCompiler.compileBuildFiles(args)
sender.sendData(toData(projects, buildFileCompiler.parsedBuildFiles.flatMap { it.pluginUrls }))
}
private fun toData(projects: List<Project>, pluginUrls: List<URL>) : CommandData {
val projectDatas = arrayListOf<ProjectData>()
val executor = executors.miscExecutor
fun toDependencyData(d: IClasspathDependency, scope: String) : DependencyData {
val dep = MavenDependency.create(d.id, executor)
return DependencyData(d.id, scope, dep.jarFile.get().absolutePath)
}
fun allDeps(l: List<IClasspathDependency>) = dependencyManager.transitiveClosure(l)
val pluginDependencies = pluginUrls.map { java.io.File(it.toURI()) }.map { FileDependency(it.absolutePath) }
projects.forEach { project ->
val allDependencies =
pluginDependencies.map { toDependencyData(it, "compile")} +
allDeps(project.compileDependencies).map { toDependencyData(it, "compile") } +
allDeps(project.compileProvidedDependencies).map { toDependencyData(it, "provided") } +
allDeps(project.compileRuntimeDependencies).map { toDependencyData(it, "runtime") } +
allDeps(project.testDependencies).map { toDependencyData(it, "testCompile") } +
allDeps(project.testProvidedDependencies).map { toDependencyData(it, "testProvided") }
projectDatas.add(ProjectData(project.name, allDependencies))
}
log(1, "Returning BuildScriptInfo")
val result = toCommandData(Gson().toJson(GetDependenciesData(projectDatas)))
log(2, " $result")
return result
}
/////
// The JSON payloads that this command uses
//
class DependencyData(val id: String, val scope: String, val path: String)
class ProjectData( val name: String, val dependencies: List<DependencyData>)
class GetDependenciesData(val projects: List<ProjectData>)
}
fun main(argv: Array<String>) {
val socket = Socket("localhost", 1234)

View file

@ -1,18 +1,6 @@
package com.beust.kobalt.internal.remote
import com.beust.kobalt.Args
import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.misc.log
import com.google.gson.Gson
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import com.google.inject.Singleton
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintWriter
import java.net.ServerSocket
import java.net.SocketException
import javax.inject.Inject
/**
* All commands implement this interface.
@ -53,83 +41,4 @@ interface ICommandSender {
*/
class CommandData(val name: String, val data: String?, val error: String? = null)
@Singleton
public class KobaltServer @Inject constructor(val args: Args) : Runnable, ICommandSender {
var outgoing: PrintWriter? = null
val pending = arrayListOf<CommandData>()
private val COMMAND_CLASSES = listOf(GetDependenciesCommand::class.java, PingCommand::class.java)
private val COMMANDS = COMMAND_CLASSES.map {
Kobalt.INJECTOR.getInstance(it).let { Pair(it.name, it) }
}.toMap()
override fun run() {
val portNumber = args.port
log(1, "Listening to port $portNumber")
var quit = false
val serverSocket = ServerSocket(portNumber)
var clientSocket = serverSocket.accept()
while (!quit) {
outgoing = PrintWriter(clientSocket.outputStream, true)
if (pending.size > 0) {
log(1, "Emptying the queue, size $pending.size()")
synchronized(pending) {
pending.forEach { sendData(it) }
pending.clear()
}
}
val ins = BufferedReader(InputStreamReader(clientSocket.inputStream))
var commandName: String? = null
try {
var line = ins.readLine()
while (!quit && line != null) {
log(1, "Received from client $line")
val jo = JsonParser().parse(line) as JsonObject
commandName = jo.get("name").asString
if ("quit" == commandName) {
log(1, "Quitting")
quit = true
} else {
runCommand(jo)
// Done, send a quit to the client
sendData(CommandData("quit", ""))
line = ins.readLine()
}
}
} catch(ex: SocketException) {
log(1, "Client disconnected, resetting")
clientSocket = serverSocket.accept()
} catch(ex: Throwable) {
ex.printStackTrace()
sendData(CommandData(commandName!!, null, ex.message))
log(1, "Command failed: ${ex.message}")
}
}
}
private fun runCommand(jo: JsonObject) {
val command = jo.get("name").asString
if (command != null) {
COMMANDS.getOrElse(command, { COMMANDS.get("ping") })!!.run(this, jo)
} else {
error("Did not find a name in command: $jo")
}
}
override fun sendData(commandData: CommandData) {
val content = Gson().toJson(commandData)
if (outgoing != null) {
outgoing!!.println(content)
} else {
log(1, "Queuing $content")
synchronized(pending) {
pending.add(commandData)
}
}
}
}

View file

@ -2,7 +2,7 @@ package com.beust.kobalt.kotlin
import com.beust.kobalt.TaskResult
import com.beust.kobalt.api.*
import com.beust.kobalt.app.ParentLastClassLoader
import com.beust.kobalt.kotlin.ParentLastClassLoader
import com.beust.kobalt.internal.ICompilerAction
import com.beust.kobalt.internal.JvmCompiler
import com.beust.kobalt.maven.DepFactory

View file

@ -1,4 +1,4 @@
package com.beust.kobalt.app
package com.beust.kobalt.kotlin
import java.net.URL
import java.net.URLClassLoader

View file

@ -1,8 +1,6 @@
package com.beust.kobalt.misc
import com.beust.kobalt.IFileSpec
import com.beust.kobalt.plugin.packaging.Direction
import com.beust.kobalt.plugin.packaging.IncludedFile
import com.google.common.io.CharStreams
import java.io.*
import java.util.jar.JarEntry
@ -142,6 +140,21 @@ public class JarUtils {
}
}
open class Direction(open val p: String) {
override public fun toString() = path
public val path: String get() = if (p.isEmpty() or p.endsWith("/")) p else p + "/"
}
class IncludedFile(val fromOriginal: From, val toOriginal: To, val specs: List<IFileSpec>) {
constructor(specs: List<IFileSpec>) : this(From(""), To(""), specs)
public val from: String get() = fromOriginal.path.replace("\\", "/")
public val to: String get() = toOriginal.path.replace("\\", "/")
override public fun toString() = toString("IncludedFile",
"files", specs.map { it.toString() }.joinToString(", "),
"from", from,
"to", to)
}
class From(override val p: String) : Direction(p)
class To(override val p: String) : Direction(p)

View file

@ -1,16 +1,6 @@
package com.beust.kobalt.misc
import com.beust.kobalt.Args
import com.beust.kobalt.internal.PluginInfo
import com.beust.kobalt.internal.build.BuildFileCompiler
import com.beust.kobalt.maven.ArtifactFetcher
import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.maven.Pom
import com.beust.kobalt.maven.PomGenerator
import com.beust.kobalt.plugin.publish.JCenterApi
import com.google.inject.*
import com.google.inject.assistedinject.FactoryModuleBuilder
import java.util.concurrent.ExecutorService
import com.google.inject.BindingAnnotation
//@Singleton
//class TaskManagerProvider @Inject constructor(val plugins: Plugins) : Provider<TaskManager> {
@ -23,50 +13,3 @@ import java.util.concurrent.ExecutorService
@Retention(AnnotationRetention.RUNTIME)
annotation class DependencyExecutor
public open class MainModule(val args: Args) : AbstractModule() {
val executors = KobaltExecutors()
open fun configureTest() {
bind(LocalRepo::class.java)
}
override fun configure() {
configureTest()
val builder = FactoryModuleBuilder()
arrayListOf(
PomGenerator.IFactory::class.java,
JCenterApi.IFactory::class.java,
Pom.IFactory::class.java,
BuildFileCompiler.IFactory::class.java,
ArtifactFetcher.IFactory::class.java)
.forEach {
install(builder.build(it))
}
// bind(javaClass<TaskManager>()).toProvider(javaClass<TaskManagerProvider>())
// .`in`(Scopes.SINGLETON)
bind(object: TypeLiteral<KobaltExecutors>() {}).toInstance(executors)
bind(object: TypeLiteral<ExecutorService>() {}).annotatedWith(DependencyExecutor::class.java)
.toInstance(executors.dependencyExecutor)
bind(Args::class.java).toProvider(Provider<Args> {
args
})
bind(PluginInfo::class.java).toProvider(Provider<PluginInfo> {
PluginInfo.readKobaltPluginXml()
}).`in`(Singleton::class.java)
// bindListener(Matchers.any(), object: TypeListener {
// override fun <I> hear(typeLiteral: TypeLiteral<I>?, typeEncounter: TypeEncounter<I>?) {
// val bean = object: InjectionListener<I> {
// override public fun afterInjection(injectee: I) {
// if (Scopes.isCircularProxy(injectee)) {
// println("CYCLE: " + typeLiteral?.getRawType()?.getName());
// }
// }
// }
// typeEncounter?.register(bean)
// }
// })
}
}

View file

@ -1,6 +1,6 @@
package com.beust.kobalt.plugin.java
import com.beust.kobalt.internal.BuildGenerator
import com.beust.kobalt.app.BuildGenerator
import com.google.inject.Inject
public class JavaBuildGenerator @Inject constructor (val projectInfo: JavaProjectInfo) : BuildGenerator() {

View file

@ -1,6 +1,6 @@
package com.beust.kobalt.plugin.kotlin
import com.beust.kobalt.internal.BuildGenerator
import com.beust.kobalt.app.BuildGenerator
import com.google.inject.Inject
public class KotlinBuildGenerator @Inject constructor (val projectInfo: KotlinProjectInfo) : BuildGenerator() {

View file

@ -410,21 +410,6 @@ open class Zip(open var name: String? = null) {
}
open class Direction(open val p: String) {
override public fun toString() = path
public val path: String get() = if (p.isEmpty() or p.endsWith("/")) p else p + "/"
}
class IncludedFile(val fromOriginal: From, val toOriginal: To, val specs: List<IFileSpec>) {
constructor(specs: List<IFileSpec>) : this(From(""), To(""), specs)
public val from: String get() = fromOriginal.path.replace("\\", "/")
public val to: String get() = toOriginal.path.replace("\\", "/")
override public fun toString() = toString("IncludedFile",
"files", specs.map { it.toString() }.joinToString(", "),
"from", from,
"to", to)
}
interface AttributeHolder {
fun addAttribute(k: String, v: String)
}

View file

@ -1 +1 @@
kobalt.version=0.338
kobalt.version=0.339

View file

@ -2,7 +2,7 @@ package com.beust.kobalt
import com.beust.kobalt.Args
import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.misc.MainModule
import com.beust.kobalt.app.MainModule
import com.google.inject.Scopes
import java.io.File

View file

@ -4,7 +4,7 @@ import com.beust.kobalt.Args
import com.beust.kobalt.TestModule
import com.beust.kobalt.maven.dependency.MavenDependency
import com.beust.kobalt.misc.DependencyExecutor
import com.beust.kobalt.misc.MainModule
import com.beust.kobalt.app.MainModule
import com.google.inject.Guice
import org.testng.Assert
import org.testng.annotations.Test