From 986f1b01be40bb6ec270b42ed441144b9897eba2 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Thu, 18 Feb 2016 01:44:47 +0400 Subject: [PATCH] Fix source jar file. --- .../main/kotlin/com/beust/kobalt/FileSpec.kt | 10 ++--- .../beust/kobalt/internal/GenericRunner.kt | 4 +- .../kotlin/com/beust/kobalt/misc/JarUtils.kt | 38 ++++++++++++------- .../kobalt/plugin/packaging/JarGenerator.kt | 2 +- .../plugin/packaging/PackagingPlugin.kt | 6 +-- .../kobalt/plugin/packaging/ZipGenerator.kt | 5 +-- .../com/beust/kobalt/IncludeExcludeTest.kt | 14 ++++++- 7 files changed, 49 insertions(+), 30 deletions(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/FileSpec.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/FileSpec.kt index 480a8553..954e67f8 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/FileSpec.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/FileSpec.kt @@ -10,10 +10,10 @@ import java.nio.file.attribute.BasicFileAttributes * and GlobSpec (a spec defined by a glob, e.g. ** slash *Test.class) */ sealed class IFileSpec { - abstract fun toFiles(filePath: String, excludes: List = emptyList()): List + abstract fun toFiles(baseDir: String?, filePath: String, excludes: List = emptyList()): List class FileSpec(val spec: String) : IFileSpec() { - override public fun toFiles(filePath: String, excludes: List) = listOf(File(spec)) + override public fun toFiles(baseDir: String?, filePath: String, excludes: List) = listOf(File(spec)) override public fun toString() = spec } @@ -30,14 +30,14 @@ sealed class IFileSpec { } } if (includeMatchers.matches(rel)) { - log(2, "Including ${rel.toFile().absolutePath}") + log(2, "Including ${rel.toFile().path}") return true } log(2, "Excluding ${rel.toFile()} (not matching any include pattern") return false } - override fun toFiles(filePath: String, excludes: List): List { + override fun toFiles(baseDir: String?, filePath: String, excludes: List): List { val result = arrayListOf() val includes = Glob(*spec.toTypedArray()) @@ -45,7 +45,7 @@ sealed class IFileSpec { Files.walkFileTree(Paths.get(filePath), object : SimpleFileVisitor() { override public fun visitFile(path: Path, attrs: BasicFileAttributes): FileVisitResult { val rel = Paths.get(filePath).relativize(path) - if (isIncluded(includes, excludes, rel)) { + if (isIncluded(includes, excludes, path)) { result.add(rel.toFile()) } return FileVisitResult.CONTINUE diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt index 944b5827..51f45cbf 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/GenericRunner.kt @@ -24,10 +24,10 @@ abstract class GenericTestRunner : ITestRunnerContributor { else 0 protected fun findTestClasses(project: Project, testConfig: TestConfig): List { - val path = KFiles.joinDir(project.directory, project.buildDirectory, KFiles.TEST_CLASSES_DIR) + val path = KFiles.joinDir(project.buildDirectory, KFiles.TEST_CLASSES_DIR) val result = IFileSpec.GlobSpec(toClassPaths(testConfig.testIncludes)) - .toFiles(path, testConfig.testExcludes.map { + .toFiles(project.directory, path, testConfig.testExcludes.map { Glob(it) }).map { it.toString().replace("/", ".").replace("\\", ".").replace(".class", "") diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt index e70d01a9..ed015852 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt @@ -36,9 +36,16 @@ public class JarUtils { expandJarFiles: Boolean, onError: (Exception) -> Unit = DEFAULT_HANDLER) { val allFiles = file.allFromFiles(directory) allFiles.forEach { relSource -> - val source = - if (relSource.isAbsolute) relSource - else File(KFiles.joinDir(directory, file.from, relSource.path)) + val source = relSource + + val entryFile = if (File(source.path).isAbsolute) File(source.path) + else if (! file.fromOriginal.isCurrentDir()) File(KFiles.joinDir(file.from, source.path)) + else File(source.path) + + if (!entryFile.exists()) { + throw AssertionError("File should exist: $entryFile") + } + if (source.isDirectory) { log(2, "Writing contents of directory $source") @@ -61,22 +68,21 @@ public class JarUtils { } else { if (expandJarFiles && source.name.endsWith(".jar") && ! source.path.contains("resources")) { log(2, "Writing contents of jar file $source") - val stream = JarInputStream(FileInputStream(source)) + val stream = JarInputStream(FileInputStream(entryFile)) var entry = stream.nextEntry while (entry != null) { if (!entry.isDirectory && !KFiles.isExcluded(entry.name, DEFAULT_JAR_EXCLUDES)) { - val ins = JarFile(source).getInputStream(entry) + val ins = JarFile(entryFile).getInputStream(entry) addEntry(ins, JarEntry(entry), outputStream, onError) } entry = stream.nextEntry } } else { - val entry = JarEntry(file.to + relSource.path.replace("\\", "/")) + val fixedSource = relSource.path.replace("\\", "/") + val entryFileName = if (file.toOriginal.isCurrentDir()) fixedSource + else file.to + fixedSource + val entry = JarEntry(entryFileName) entry.time = source.lastModified() - val entryFile = source - if (!entryFile.exists()) { - throw AssertionError("File should exist: $entryFile") - } addEntry(FileInputStream(entryFile), entry, outputStream, onError) } } @@ -143,8 +149,12 @@ 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 + "/" + override fun toString() = path + fun isCurrentDir() = path == "./" + val path: String get() = + if (p.isEmpty()) "./" + else if (p.startsWith("/") || p.endsWith("/")) p + else p + "/" } class IncludedFile(val fromOriginal: From, val toOriginal: To, val specs: List) { @@ -159,8 +169,8 @@ class IncludedFile(val fromOriginal: From, val toOriginal: To, val specs: List { val result = arrayListOf() specs.forEach { spec -> - val fullDir = if (directory == null) from else KFiles.joinDir(directory, from) - spec.toFiles(fullDir).forEach { source -> +// val fullDir = if (directory == null) from else KFiles.joinDir(directory, from) + spec.toFiles(directory, from).forEach { source -> result.add(if (source.isAbsolute) source else File(source.path)) } } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/JarGenerator.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/JarGenerator.kt index e00287b4..bb2e57cc 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/JarGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/JarGenerator.kt @@ -38,7 +38,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) filesNotExcluded.forEach { fileSpecs.add(IFileSpec.FileSpec(it.path.toString().substring(prefixPath.toString().length + 1))) } - result.add(IncludedFile(From(prefixPath.toString() + "/"), To(""), fileSpecs)) + result.add(IncludedFile(From(project.directory + "/" + prefixPath.toString() + "/"), To(""), fileSpecs)) // Resources, if applicable context.variant.resourceDirectories(project).forEach { diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt index ece0d713..07218b55 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt @@ -48,9 +48,9 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana files.forEach { includedFile -> val includedSpecs = arrayListOf() includedFile.specs.forEach { spec -> - val fromPath = directory + "/" + includedFile.from + val fromPath = includedFile.from if (File(fromPath).exists()) { - spec.toFiles(fromPath).forEach { file -> + spec.toFiles(directory, fromPath).forEach { file -> val fullFile = File(fromPath, file.path) if (! fullFile.exists()) { throw AssertionError("File should exist: $fullFile") @@ -245,7 +245,7 @@ class PackageConfig(val project: Project) : AttributeHolder { jar { name = "${project.name}-${project.version}-sources.jar" project.sourceDirectories.forEach { - include(from(it), to(""), glob("src/**")) + include(from(project.directory + "/" + it), to(""), glob("**")) } } jar { diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt index 60d3e1d7..0608b0ea 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt @@ -6,11 +6,8 @@ import com.beust.kobalt.maven.DependencyManager import com.google.inject.Inject class ZipGenerator @Inject constructor(val dependencyManager: DependencyManager){ - fun findIncludedFiles(project: Project, context: KobaltContext, zip: Zip) - = PackagingPlugin.findIncludedFiles(project.directory, zip.includedFiles, zip.excludes) - fun generateZip(project: Project, context: KobaltContext, zip: Zip) { - val allFiles = findIncludedFiles(project, context, zip) + val allFiles = PackagingPlugin.findIncludedFiles(project.directory, zip.includedFiles, zip.excludes) PackagingPlugin.generateArchive(project, context, zip.name, ".zip", allFiles) } } diff --git a/src/test/kotlin/com/beust/kobalt/IncludeExcludeTest.kt b/src/test/kotlin/com/beust/kobalt/IncludeExcludeTest.kt index 94ca63f0..dd021a8b 100644 --- a/src/test/kotlin/com/beust/kobalt/IncludeExcludeTest.kt +++ b/src/test/kotlin/com/beust/kobalt/IncludeExcludeTest.kt @@ -1,5 +1,8 @@ package com.beust.kobalt +import com.beust.kobalt.misc.From +import com.beust.kobalt.misc.IncludedFile +import com.beust.kobalt.misc.To import org.testng.Assert import org.testng.annotations.BeforeClass import org.testng.annotations.DataProvider @@ -45,7 +48,16 @@ class IncludeExcludeTest : KobaltTest() { @Test(dataProvider = "dp") fun shouldInclude(root: File, includedSpec: List, excludedSpec: List, expectedFiles: List) { val g = IFileSpec.GlobSpec(includedSpec) - val files = g.toFiles(root.path, excludedSpec.map { Glob(it) }) + val files = g.toFiles("", root.path, excludedSpec.map { Glob(it) }) Assert.assertEquals(files.map { it.name }, expectedFiles) } + + @Test + private fun f() { + val spec = IFileSpec.GlobSpec("src/**") + val files = spec.toFiles(homeDir("kotlin/kobalt"), "src/main/kotlin") + val inc = IncludedFile(From("src/main/kotlin"), To(""), listOf(IFileSpec.GlobSpec("**"))) +// val files = inc.allFromFiles(homeDir("kotlin/kobalt")) + println("FILES: " + files) + } }