mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-26 16:28:12 -07:00
Fix test includes/excludes.
This commit is contained in:
parent
77e895d3a0
commit
6aa3c16d38
5 changed files with 77 additions and 59 deletions
|
@ -3,70 +3,87 @@ package com.beust.kobalt
|
||||||
import com.beust.kobalt.misc.log
|
import com.beust.kobalt.misc.log
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.nio.file.*
|
import java.nio.file.*
|
||||||
import java.nio.file.FileVisitResult.CONTINUE
|
|
||||||
import java.nio.file.attribute.BasicFileAttributes
|
import java.nio.file.attribute.BasicFileAttributes
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subclasses of IFileSpec can be turned into a list of files. There are two kings: FileSpec (a single file)
|
||||||
|
* and GlobSpec (a spec defined by a glob, e.g. ** slash *Test.class)
|
||||||
|
*/
|
||||||
sealed class IFileSpec {
|
sealed class IFileSpec {
|
||||||
abstract fun toFiles(directory: String): List<File>
|
abstract fun toFiles(filePath: String, excludes: List<Glob> = emptyList<Glob>()): List<File>
|
||||||
|
|
||||||
class FileSpec(val spec: String) : IFileSpec() {
|
class FileSpec(val spec: String) : IFileSpec() {
|
||||||
override public fun toFiles(directory: String) = listOf(File(spec))
|
override public fun toFiles(filePath: String, excludes: List<Glob>) = listOf(File(spec))
|
||||||
|
|
||||||
override public fun toString() = spec
|
override public fun toString() = spec
|
||||||
}
|
}
|
||||||
|
|
||||||
class GlobSpec(val includeSpec: ArrayList<String>, val excludeSpec: ArrayList<String>) : IFileSpec() {
|
class GlobSpec(val spec: ArrayList<String>) : IFileSpec() {
|
||||||
|
|
||||||
constructor(spec: String) : this(arrayListOf(spec), arrayListOf())
|
constructor(spec: String) : this(arrayListOf(spec))
|
||||||
|
|
||||||
override public fun toFiles(directory: String): List<File> {
|
private fun isIncluded(includeMatchers: Glob, excludes: List<Glob>, rel: Path) : Boolean {
|
||||||
|
excludes.forEach {
|
||||||
val result = arrayListOf<File>()
|
if (it.matches(rel)) {
|
||||||
val includeMatchers = prepareMatchers(includeSpec.toTypedArray())
|
log(2, "Excluding ${rel.toFile()}")
|
||||||
val excludeMatchers = prepareMatchers(excludeSpec.toTypedArray())
|
return false
|
||||||
|
|
||||||
Files.walkFileTree(Paths.get(directory), object : SimpleFileVisitor<Path>() {
|
|
||||||
override public fun visitFile(path: Path, attrs: BasicFileAttributes): FileVisitResult {
|
|
||||||
|
|
||||||
val rel = Paths.get(directory).relativize(path)
|
|
||||||
excludeMatchers.forEach {
|
|
||||||
if (it.matches(rel)) {
|
|
||||||
log(3, "Excluding ${rel.toFile()}")
|
|
||||||
return CONTINUE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
includeMatchers.forEach {
|
|
||||||
if (it.matches(rel)) {
|
|
||||||
log(3, "Including ${rel.toFile()}")
|
|
||||||
result.add(rel.toFile())
|
|
||||||
return CONTINUE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return CONTINUE
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
if (includeMatchers.matches(rel)) {
|
||||||
|
log(2, "Including ${rel.toFile()}")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
log(2, "Excluding ${rel.toFile()} (not matching any include pattern")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override public fun toFiles(filePath: String, excludes: List<Glob>): List<File> {
|
||||||
|
val result = arrayListOf<File>()
|
||||||
|
val includes = Glob(*spec.toTypedArray())
|
||||||
|
|
||||||
|
if (File(filePath).isDirectory) {
|
||||||
|
Files.walkFileTree(Paths.get(filePath), object : SimpleFileVisitor<Path>() {
|
||||||
|
override public fun visitFile(path: Path, attrs: BasicFileAttributes): FileVisitResult {
|
||||||
|
val rel = Paths.get(filePath).relativize(path)
|
||||||
|
if (isIncluded(includes, excludes, rel)) {
|
||||||
|
result.add(rel.toFile())
|
||||||
|
}
|
||||||
|
return FileVisitResult.CONTINUE
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
if (isIncluded(includes, excludes, Paths.get(filePath))) {
|
||||||
|
result.add(File(filePath))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
override public fun toString(): String {
|
override public fun toString(): String {
|
||||||
var result = ""
|
var result = ""
|
||||||
includeSpec.apply {
|
spec.apply {
|
||||||
if (!isEmpty()) {
|
if (!isEmpty()) {
|
||||||
result += "Included files: " + joinToString { ", " }
|
result += "Included files: " + joinToString { ", " }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
excludeSpec.apply {
|
|
||||||
if (!isEmpty()) {
|
|
||||||
result += "Excluded files: " + joinToString { ", " }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun prepareMatchers(specs: Array<String>): List<PathMatcher> =
|
|
||||||
specs.map { it -> FileSystems.getDefault().getPathMatcher("glob:$it") }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Glob is a simple file name matcher.
|
||||||
|
*/
|
||||||
|
class Glob(vararg specs: String) {
|
||||||
|
val matchers = prepareMatchers(specs.toList())
|
||||||
|
|
||||||
|
private fun prepareMatchers(specs: List<String>): List<PathMatcher> =
|
||||||
|
specs.map { it -> FileSystems.getDefault().getPathMatcher("glob:$it") }
|
||||||
|
|
||||||
|
fun matches(s: String) = matches(Paths.get(s))
|
||||||
|
|
||||||
|
fun matches(path: Path) = matchers.any { it.matches(path) }
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
package com.beust.kobalt.internal
|
package com.beust.kobalt.internal
|
||||||
|
|
||||||
import com.beust.kobalt.IFileSpec
|
import com.beust.kobalt.*
|
||||||
import com.beust.kobalt.JavaInfo
|
|
||||||
import com.beust.kobalt.SystemProperties
|
|
||||||
import com.beust.kobalt.TaskResult
|
|
||||||
import com.beust.kobalt.api.*
|
import com.beust.kobalt.api.*
|
||||||
import com.beust.kobalt.misc.KFiles
|
import com.beust.kobalt.misc.KFiles
|
||||||
import com.beust.kobalt.misc.log
|
import com.beust.kobalt.misc.log
|
||||||
|
@ -29,8 +26,10 @@ abstract class GenericTestRunner : ITestRunnerContributor {
|
||||||
protected fun findTestClasses(project: Project): List<String> {
|
protected fun findTestClasses(project: Project): List<String> {
|
||||||
val path = KFiles.joinDir(project.directory, project.buildDirectory, KFiles.TEST_CLASSES_DIR)
|
val path = KFiles.joinDir(project.directory, project.buildDirectory, KFiles.TEST_CLASSES_DIR)
|
||||||
|
|
||||||
val result = IFileSpec.GlobSpec(toClassPaths(project.testIncludes), toClassPaths(project.testExcludes))
|
val result = IFileSpec.GlobSpec(toClassPaths(project.testIncludes))
|
||||||
.toFiles(path).map {
|
.toFiles(path, project.testExcludes.map {
|
||||||
|
Glob(it)
|
||||||
|
}).map {
|
||||||
it.toString().replace("/", ".").replace("\\", ".").replace(".class", "")
|
it.toString().replace("/", ".").replace("\\", ".").replace(".class", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +38,7 @@ abstract class GenericTestRunner : ITestRunnerContributor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun toClassPaths(paths: List<String>): ArrayList<String> =
|
private fun toClassPaths(paths: List<String>): ArrayList<String> =
|
||||||
paths.map { if (it.endsWith(".class")) it else it + ".class" }.toArrayList()
|
paths.map { if (it.endsWith("class")) it else it + "class" }.toArrayList()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true if all the tests passed
|
* @return true if all the tests passed
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.beust.kobalt.misc
|
package com.beust.kobalt.misc
|
||||||
|
|
||||||
|
import com.beust.kobalt.Glob
|
||||||
import com.beust.kobalt.IFileSpec
|
import com.beust.kobalt.IFileSpec
|
||||||
import com.google.common.io.CharStreams
|
import com.google.common.io.CharStreams
|
||||||
import java.io.*
|
import java.io.*
|
||||||
|
@ -29,8 +30,7 @@ public class JarUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
private val DEFAULT_JAR_EXCLUDES =
|
private val DEFAULT_JAR_EXCLUDES =
|
||||||
IFileSpec.GlobSpec(arrayListOf(),
|
Glob("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA")
|
||||||
arrayListOf("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA"))
|
|
||||||
|
|
||||||
public fun addSingleFile(directory: String, file: IncludedFile, outputStream: ZipOutputStream,
|
public fun addSingleFile(directory: String, file: IncludedFile, outputStream: ZipOutputStream,
|
||||||
expandJarFiles: Boolean, onError: (Exception) -> Unit = DEFAULT_HANDLER) {
|
expandJarFiles: Boolean, onError: (Exception) -> Unit = DEFAULT_HANDLER) {
|
||||||
|
|
|
@ -277,10 +277,13 @@ class KFiles {
|
||||||
|
|
||||||
fun makeOutputTestDir(project: Project) : File = makeDir(project, KFiles.TEST_CLASSES_DIR)
|
fun makeOutputTestDir(project: Project) : File = makeDir(project, KFiles.TEST_CLASSES_DIR)
|
||||||
|
|
||||||
fun isExcluded(file: File, excludes: IFileSpec.GlobSpec) = isExcluded(file.path, excludes)
|
fun isExcluded(file: String, excludes: Glob) = isExcluded(file, listOf(excludes))
|
||||||
|
|
||||||
fun isExcluded(file: String, excludes: IFileSpec.GlobSpec): Boolean =
|
fun isExcluded(file: File, excludes: Glob) = isExcluded(file.path, listOf(excludes))
|
||||||
excludes.toFiles(file).isEmpty()
|
|
||||||
|
fun isExcluded(file: File, excludes: List<Glob>) = isExcluded(file.path, excludes)
|
||||||
|
|
||||||
|
fun isExcluded(file: String, excludes: List<Glob>): Boolean = excludes.any { it.matches(file) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findRecursively(directory: File, function: Function1<String, Boolean>): List<String> {
|
fun findRecursively(directory: File, function: Function1<String, Boolean>): List<String> {
|
||||||
|
|
|
@ -42,8 +42,7 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana
|
||||||
const val TASK_ASSEMBLE: String = "assemble"
|
const val TASK_ASSEMBLE: String = "assemble"
|
||||||
const val TASK_INSTALL: String = "install"
|
const val TASK_INSTALL: String = "install"
|
||||||
|
|
||||||
|
fun findIncludedFiles(directory: String, files: List<IncludedFile>, excludes: List<Glob>)
|
||||||
fun findIncludedFiles(directory: String, files: List<IncludedFile>, excludes: IFileSpec.GlobSpec)
|
|
||||||
: List<IncludedFile> {
|
: List<IncludedFile> {
|
||||||
val result = arrayListOf<IncludedFile>()
|
val result = arrayListOf<IncludedFile>()
|
||||||
files.forEach { includedFile ->
|
files.forEach { includedFile ->
|
||||||
|
@ -312,7 +311,7 @@ class PackageConfig(val project: Project) : AttributeHolder {
|
||||||
|
|
||||||
open class Zip(open var name: String? = null) {
|
open class Zip(open var name: String? = null) {
|
||||||
// internal val includes = arrayListOf<IFileSpec>()
|
// internal val includes = arrayListOf<IFileSpec>()
|
||||||
internal val excludes = GlobSpec(arrayListOf(), arrayListOf())
|
internal val excludes = arrayListOf<Glob>()
|
||||||
|
|
||||||
@Directive
|
@Directive
|
||||||
public fun from(s: String) = From(s)
|
public fun from(s: String) = From(s)
|
||||||
|
@ -322,12 +321,12 @@ open class Zip(open var name: String? = null) {
|
||||||
|
|
||||||
@Directive
|
@Directive
|
||||||
public fun exclude(vararg files: String) {
|
public fun exclude(vararg files: String) {
|
||||||
files.forEach { excludes.excludeSpec.add(it) }
|
files.forEach { excludes.add(Glob(it)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Directive
|
@Directive
|
||||||
public fun exclude(vararg specs: GlobSpec) {
|
public fun exclude(vararg specs: Glob) {
|
||||||
specs.forEach { excludes.excludeSpec.addAll(it.excludeSpec) }
|
specs.forEach { excludes.add(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Directive
|
@Directive
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue