Skip to content

Commit

Permalink
Updated version of assemble_maven rewritten in Kotlin (typedb#293)
Browse files Browse the repository at this point in the history
## What is the goal of this PR?

Rewrite `assemble_maven` in Kotlin in order for us to understand it better and improve its maintability/readability.

## What are the changes implemented in this PR?

Implement `assemble_maven` in `@graknlabs_bazel_distribution//maven:new_rules.bzl`
  • Loading branch information
vmax authored Mar 25, 2021
1 parent f3a3934 commit 75fbb79
Show file tree
Hide file tree
Showing 7 changed files with 643 additions and 3 deletions.
23 changes: 22 additions & 1 deletion WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,28 @@ workspace(name="graknlabs_bazel_distribution")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

# Load @rules_python
load("//common:deps.bzl", "rules_python")
load("//common:deps.bzl", "rules_python", "rules_kotlin", "rules_jvm_external")
rules_python()
rules_kotlin()
rules_jvm_external()

# Load @io_bazel_rules_kotlin
load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains")
kotlin_repositories()
kt_register_toolchains()

load("@graknlabs_bazel_distribution//maven:deps.bzl", "maven_artifacts_with_versions")
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = maven_artifacts_with_versions,
repositories = [
"https://repo1.maven.org/maven2",
],
strict_visibility = True,
version_conflict_policy = "pinned",
fetch_sources = True,
)


# Load @graknlabs_bazel_distribution_pip
load("//pip:deps.bzl", pip_deps = "deps")
Expand All @@ -43,3 +63,4 @@ git_repository(
)
load("@io_bazel_stardoc//:setup.bzl", "stardoc_repositories")
stardoc_repositories()

19 changes: 19 additions & 0 deletions common/deps.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,22 @@ def rules_pkg():
],
patch_args = ["-p1"],
)


def rules_kotlin():
http_archive(
name = "io_bazel_rules_kotlin",
urls = ["https://github.com/bazelbuild/rules_kotlin/archive/legacy-1.3.0.zip"],
type = "zip",
strip_prefix = "rules_kotlin-legacy-1.3.0",
sha256 = "4fd769fb0db5d3c6240df8a9500515775101964eebdf85a3f9f0511130885fde",
)


def rules_jvm_external():
http_archive(
name = "rules_jvm_external",
strip_prefix = "rules_jvm_external-3.2",
sha256 = "82262ff4223c5fda6fb7ff8bd63db8131b51b413d26eb49e3131037e79e324af",
url = "https://github.com/bazelbuild/rules_jvm_external/archive/3.2.zip",
)
45 changes: 43 additions & 2 deletions maven/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,56 @@ py_binary(
# FIXME(vmax): I couldn't make it a kt_jvm_binary because
# it complained it couldn't find `java` executable
kt_jvm_library(
name = "repackager_lib",
name = "repackager-lib",
srcs = ["Repackager.kt"],
)


kt_jvm_library(
name = "pom-generator-lib",
deps = [
"@maven//:com_eclipsesource_minimal_json_minimal_json",
"@maven//:info_picocli_picocli",
],
srcs = [
"PomGenerator.kt",
]
)

java_binary(
name = "pom-generator",
runtime_deps = [
":pom-generator-lib"
],
main_class = "PomGeneratorKt",
visibility = ["//visibility:public"]
)

java_binary(
name = "repackager",
runtime_deps = [
":repackager_lib"
":repackager-lib"
],
main_class = "RepackagerKt",
visibility = ["//visibility:public"]
)


kt_jvm_library(
name = "jar-assembler-lib",
deps = [
"@maven//:info_picocli_picocli",
],
srcs = [
"JarAssembler.kt"
]
)

java_binary(
name = "jar-assembler",
runtime_deps = [
":jar-assembler-lib"
],
main_class = "JarAssemblerKt",
visibility = ["//visibility:public"]
)
68 changes: 68 additions & 0 deletions maven/JarAssembler.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import picocli.CommandLine
import picocli.CommandLine.Command
import picocli.CommandLine.Option
import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileOutputStream
import java.util.*
import java.util.concurrent.Callable
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import java.util.zip.ZipOutputStream
import kotlin.system.exitProcess


@Command(name = "jar-assembler", mixinStandardHelpOptions = true)
class JarAssembler : Callable<Unit> {

@Option(names = ["--output"], required = true)
lateinit var output_file: File

@Option(names = ["--prefix"])
lateinit var prefix: String

@Option(names = ["--group-id"])
var groupId = ""

@Option(names = ["--artifact-id"])
var artifactId = ""

@Option(names = ["--pom-file"])
var pomFile: File? = null

@Option(names = ["--jars"], split = ";")
lateinit var jars: Array<File>

val entryNames = mutableSetOf<String>()

override fun call() {
ZipOutputStream(BufferedOutputStream(FileOutputStream(output_file))).use { out ->
if (pomFile != null) {
val pomFileEntry = ZipEntry("META-INF/maven/${groupId}/${artifactId}/pom.xml")
out.putNextEntry(pomFileEntry)
out.write(pomFile!!.readBytes())
}
for (jar in jars) {
ZipFile(jar).use { jarZip ->
jarZip.entries().asSequence().forEach { entry ->
if (entry.name.contains("META-INF")) {
return@forEach
}
if (entryNames.contains(entry.name)) {
return@forEach
}
entryNames.add(entry.name)
BufferedInputStream(jarZip.getInputStream(entry)).use { inputStream ->
val newEntry = ZipEntry(prefix + entry.name)
out.putNextEntry(newEntry)
inputStream.copyTo(out, 1024)
}
}
}
}
}
}
}

fun main(args: Array<String>): Unit = exitProcess(CommandLine(JarAssembler()).execute(*args))
Loading

0 comments on commit 75fbb79

Please sign in to comment.