blob: a63f33d41954495763a42c07e5aad5f444cd383e [file] [log] [blame]
/*
* Copyright 2018 The Bazel Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.bazel.kotlin.builder.mode.jvm.actions
import io.bazel.kotlin.builder.BuildAction
import io.bazel.kotlin.builder.Context
import io.bazel.kotlin.builder.KotlinToolchain
import io.bazel.kotlin.builder.model.Metas
import io.bazel.kotlin.builder.utils.executeAndAwaitSuccess
import java.nio.file.Paths
/**
* Unpack files with the srcjar extension into a temp directory.
*/
class UnpackSourceJars(toolchain: KotlinToolchain) : BuildAction("unpack srcjars", toolchain) {
override fun invoke(ctx: Context): Int {
if (ctx.flags.sourceJars != null) {
check(ctx.flags.sourceJars.isNotEmpty())
val unpackDir = ctx.flags.tempDirPath.value.resolve("_srcjars").toFile()
.also {
try {
it.mkdirs()
} catch (ex: Exception) {
throw RuntimeException("could not create unpack directory at $it", ex)
}
}
ctx.flags.sourceJars.map { Paths.get(it) }.forEach { srcjar ->
try {
mutableListOf(
Paths.get(toolchain.JAR_TOOL_PATH).toAbsolutePath().toString(),
"xf", srcjar.toAbsolutePath().toString()
).also {
executeAndAwaitSuccess(10, unpackDir, it)
}
} catch (e: Exception) {
throw RuntimeException("unable to unpack source jar: $srcjar", e)
}
}
unpackDir.walk()
.filter { it.name.endsWith(".kt") || it.name.endsWith(".java") }
.map { it.toString() }
.toList()
// bind the sources even if the list is empty. throw an appropriate error if needed in Initialize.
.also { Metas.UNPACKED_SOURCES[ctx] = it }
return 0
} else {
return 0
}
}
}