summaryrefslogtreecommitdiff
path: root/build-logic
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-07-02 23:36:30 +0200
committerLinnea Gräf <nea@nea.moe>2025-07-02 23:36:30 +0200
commit1eae252f41eab7612864fb479263dc93310d8930 (patch)
treeb10172d42668cb8b5199565c0e2eee4ac3e9c5c3 /build-logic
downloadmossbar-1eae252f41eab7612864fb479263dc93310d8930.tar.gz
mossbar-1eae252f41eab7612864fb479263dc93310d8930.tar.bz2
mossbar-1eae252f41eab7612864fb479263dc93310d8930.zip
init
Diffstat (limited to 'build-logic')
-rw-r--r--build-logic/build.gradle.kts13
-rw-r--r--build-logic/src/main/kotlin/DownloadArchiveFile.kt71
-rw-r--r--build-logic/src/main/kotlin/DownloadExtension.kt27
-rw-r--r--build-logic/src/main/kotlin/DownloadTarFile.kt49
-rw-r--r--build-logic/src/main/kotlin/DownloadZipFile.kt35
-rw-r--r--build-logic/src/main/kotlin/mossbar.downloads.gradle.kts2
6 files changed, 197 insertions, 0 deletions
diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts
new file mode 100644
index 0000000..44083e8
--- /dev/null
+++ b/build-logic/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+ java
+ `kotlin-dsl`
+ kotlin("jvm") version "2.1.21"
+}
+repositories {
+ mavenCentral()
+}
+java.toolchain.languageVersion.set(JavaLanguageVersion.of(24))
+
+dependencies {
+ implementation("org.apache.commons:commons-compress:1.23.0")
+}
diff --git a/build-logic/src/main/kotlin/DownloadArchiveFile.kt b/build-logic/src/main/kotlin/DownloadArchiveFile.kt
new file mode 100644
index 0000000..c7f549c
--- /dev/null
+++ b/build-logic/src/main/kotlin/DownloadArchiveFile.kt
@@ -0,0 +1,71 @@
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.TaskAction
+import java.io.InputStream
+import java.net.URI
+
+abstract class DownloadArchiveFile<T : InputStream> : DefaultTask() {
+ @get:Input
+ abstract val url: Property<URI>
+
+ @get:Input
+ abstract val stripRoot: Property<Boolean>
+
+ @get:Input
+ abstract val subDirectory: Property<String>
+
+ @get:OutputDirectory
+ abstract val outputDir: DirectoryProperty
+
+ init {
+ subDirectory.convention("")
+ stripRoot.convention(false)
+ }
+
+ fun url(string: String) {
+ url.set(URI.create(string))
+ }
+
+ abstract fun mapInputStream(inputStream: InputStream): T
+ abstract fun nextEntry(stream: T): String?
+
+ @TaskAction
+ fun execute() {
+ val baseFolder = outputDir.get().asFile
+ baseFolder.deleteRecursively()
+ baseFolder.mkdirs()
+ val pathFilter = this.subDirectory.get()
+ require(pathFilter.isEmpty() || pathFilter.endsWith("/")) {
+ "subdirectory '$pathFilter' does not end with a /"
+ }
+ url.get().toURL().openStream().buffered().use { input ->
+ val mappedStream = mapInputStream(input)
+ while (true) {
+ val entry = nextEntry(mappedStream) ?: break
+ var name = entry
+ if (name.endsWith("/")) continue
+ if (stripRoot.get()) {
+ name = name.substringAfter("/")
+ }
+ if (pathFilter.isNotEmpty()) {
+ if (!name.startsWith(pathFilter)) {
+ continue
+ } else {
+ name = name.substring(pathFilter.length)
+ }
+ }
+ val fileLocation = baseFolder.resolve(name).absoluteFile
+ if (baseFolder !in generateSequence(fileLocation) { it.parentFile }) {
+ error("File escaping output jail: $name")
+ }
+ fileLocation.parentFile.mkdirs()
+ fileLocation.outputStream().use { output ->
+ mappedStream.copyTo(output)
+ }
+ }
+ }
+ }
+}
diff --git a/build-logic/src/main/kotlin/DownloadExtension.kt b/build-logic/src/main/kotlin/DownloadExtension.kt
new file mode 100644
index 0000000..efd9cbf
--- /dev/null
+++ b/build-logic/src/main/kotlin/DownloadExtension.kt
@@ -0,0 +1,27 @@
+import org.gradle.api.Project
+import org.gradle.api.tasks.TaskProvider
+import java.util.*
+import javax.inject.Inject
+
+abstract class DownloadExtension {
+ @get:Inject
+ abstract val project: Project
+
+ fun downloadTaskName(name: String) =
+ "download" + name.capitalize(Locale.ROOT)
+
+ inline fun <reified T : DownloadArchiveFile<*>> archive(name: String, noinline configure: T.() -> Unit)
+ : TaskProvider<T> =
+ project.tasks.register(downloadTaskName(name), T::class.java) {
+ outputDir.convention(project.layout.buildDirectory.dir("downloadedSources/$name"))
+ configure(this)
+ }
+
+ fun zip(name: String, configure: DownloadZipFile.() -> Unit): TaskProvider<DownloadZipFile> {
+ return archive(name, configure)
+ }
+
+ fun tar(name: String, configure: DownloadTarFile.() -> Unit): TaskProvider<DownloadTarFile> {
+ return archive(name, configure)
+ }
+}
diff --git a/build-logic/src/main/kotlin/DownloadTarFile.kt b/build-logic/src/main/kotlin/DownloadTarFile.kt
new file mode 100644
index 0000000..a23a336
--- /dev/null
+++ b/build-logic/src/main/kotlin/DownloadTarFile.kt
@@ -0,0 +1,49 @@
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import java.io.InputStream
+import java.net.URI
+import java.util.zip.GZIPInputStream
+
+abstract class DownloadTarFile : DownloadArchiveFile<TarArchiveInputStream>() {
+ @get:Input
+ abstract val gunzip: Property<Boolean>
+
+ init {
+ gunzip.convention(url.map { it.path.endsWith(".tar.gz") })
+ }
+
+ abstract class CGitSource {
+ abstract val domain: Property<String>
+ abstract val projectPath: Property<String>
+ abstract val hash: Property<String>
+
+ fun toUrl(): URI {
+ return URI.create("https://${domain.get()}/${projectPath.get()}/snapshot/${hash.get()}.tar.gz")
+ }
+ }
+
+ fun cGit(configure: CGitSource.() -> Unit) {
+ stripRoot.convention(true)
+ url.set(
+ project.provider(
+ project.objects.newInstance(CGitSource::class.java).also(configure)::toUrl
+ )
+ )
+ }
+
+
+ override fun mapInputStream(inputStream: InputStream): TarArchiveInputStream {
+ return TarArchiveInputStream(
+ if (gunzip.get()) {
+ GZIPInputStream(inputStream, 8192)
+ } else {
+ inputStream
+ }
+ )
+ }
+
+ override fun nextEntry(stream: TarArchiveInputStream): String? {
+ return stream.nextTarEntry?.name
+ }
+} \ No newline at end of file
diff --git a/build-logic/src/main/kotlin/DownloadZipFile.kt b/build-logic/src/main/kotlin/DownloadZipFile.kt
new file mode 100644
index 0000000..475f195
--- /dev/null
+++ b/build-logic/src/main/kotlin/DownloadZipFile.kt
@@ -0,0 +1,35 @@
+import org.gradle.api.provider.Property
+import java.io.InputStream
+import java.net.URI
+import java.util.zip.ZipInputStream
+
+abstract class DownloadZipFile : DownloadArchiveFile<ZipInputStream>() {
+ abstract class GitLabSource {
+ abstract val domain: Property<String>
+ abstract val owner: Property<String>
+ abstract val project: Property<String>
+ abstract val hash: Property<String>
+
+ fun toUrl(): URI {
+ return URI.create("https://${domain.get()}/${owner.get()}/${project.get()}/-/archive/${hash.get()}/${project.get()}-${hash.get()}.zip")
+ }
+
+ }
+
+ fun gitlab(configure: GitLabSource.() -> Unit) {
+ stripRoot.convention(true)
+ url.set(
+ project.provider(
+ project.objects.newInstance(GitLabSource::class.java).also(configure)::toUrl
+ )
+ )
+ }
+
+ override fun mapInputStream(inputStream: InputStream): ZipInputStream {
+ return ZipInputStream(inputStream)
+ }
+
+ override fun nextEntry(stream: ZipInputStream): String? {
+ return stream.nextEntry?.name
+ }
+} \ No newline at end of file
diff --git a/build-logic/src/main/kotlin/mossbar.downloads.gradle.kts b/build-logic/src/main/kotlin/mossbar.downloads.gradle.kts
new file mode 100644
index 0000000..63b6369
--- /dev/null
+++ b/build-logic/src/main/kotlin/mossbar.downloads.gradle.kts
@@ -0,0 +1,2 @@
+
+extensions.create("downloads", DownloadExtension::class)