diff options
| author | Linnea Gräf <nea@nea.moe> | 2025-07-02 23:36:30 +0200 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-07-02 23:36:30 +0200 |
| commit | 1eae252f41eab7612864fb479263dc93310d8930 (patch) | |
| tree | b10172d42668cb8b5199565c0e2eee4ac3e9c5c3 /build-logic | |
| download | mossbar-1eae252f41eab7612864fb479263dc93310d8930.tar.gz mossbar-1eae252f41eab7612864fb479263dc93310d8930.tar.bz2 mossbar-1eae252f41eab7612864fb479263dc93310d8930.zip | |
init
Diffstat (limited to 'build-logic')
| -rw-r--r-- | build-logic/build.gradle.kts | 13 | ||||
| -rw-r--r-- | build-logic/src/main/kotlin/DownloadArchiveFile.kt | 71 | ||||
| -rw-r--r-- | build-logic/src/main/kotlin/DownloadExtension.kt | 27 | ||||
| -rw-r--r-- | build-logic/src/main/kotlin/DownloadTarFile.kt | 49 | ||||
| -rw-r--r-- | build-logic/src/main/kotlin/DownloadZipFile.kt | 35 | ||||
| -rw-r--r-- | build-logic/src/main/kotlin/mossbar.downloads.gradle.kts | 2 |
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) |
