initial commit
This commit is contained in:
commit
b4f5d8b797
41
.gitignore
vendored
Normal file
41
.gitignore
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
|
.kotlin/
|
||||||
|
/.profileconfig.json
|
3
.idea/.gitignore
vendored
Normal file
3
.idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
70
build.gradle.kts
Normal file
70
build.gradle.kts
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
kotlin("jvm") version "2.0.0"
|
||||||
|
`java-gradle-plugin`
|
||||||
|
`maven-publish`
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "dev.frogmc"
|
||||||
|
version = "0.0.1-alpha.1"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation("com.google.guava:guava:33.2.1-jre")
|
||||||
|
testImplementation(kotlin("test"))
|
||||||
|
}
|
||||||
|
|
||||||
|
gradlePlugin {
|
||||||
|
plugins {
|
||||||
|
create("meta-update") {
|
||||||
|
id = "dev.frogmc.meta-update"
|
||||||
|
implementationClass = "dev.frogmc.meta_update.MetaUpdatePlugin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.jar {
|
||||||
|
manifest {
|
||||||
|
attributes("Implementation-Version" to version,
|
||||||
|
"Implementation-Date" to Date(),
|
||||||
|
"Implementation-Name" to project.name
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
|
kotlin {
|
||||||
|
jvmToolchain(21)
|
||||||
|
}
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
name = "FrogMCSnapshotsMaven"
|
||||||
|
url = uri("https://maven.frogmc.dev/snapshots")
|
||||||
|
credentials(PasswordCredentials::class)
|
||||||
|
authentication {
|
||||||
|
create<BasicAuthentication>("basic")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
maven {
|
||||||
|
name = "FrogMCReleasesMaven"
|
||||||
|
url = uri("https://maven.frogmc.dev/releases")
|
||||||
|
credentials(PasswordCredentials::class)
|
||||||
|
authentication {
|
||||||
|
create<BasicAuthentication>("basic")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
gradle.properties
Normal file
1
gradle.properties
Normal file
|
@ -0,0 +1 @@
|
||||||
|
kotlin.code.style=official
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#Sun May 12 17:35:40 BST 2024
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
5
settings.gradle.kts
Normal file
5
settings.gradle.kts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
plugins {
|
||||||
|
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
|
||||||
|
}
|
||||||
|
rootProject.name = "meta-update"
|
||||||
|
|
10
src/main/kotlin/dev/frogmc/meta_update/MetaUpdatePlugin.kt
Normal file
10
src/main/kotlin/dev/frogmc/meta_update/MetaUpdatePlugin.kt
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package dev.frogmc.meta_update
|
||||||
|
|
||||||
|
import org.gradle.api.Plugin
|
||||||
|
import org.gradle.api.Project
|
||||||
|
|
||||||
|
class MetaUpdatePlugin: Plugin<Project> {
|
||||||
|
override fun apply(target: Project) {
|
||||||
|
val task = target.tasks.register("updateMeta", MetaV1UpdateTask::class.java)
|
||||||
|
}
|
||||||
|
}
|
145
src/main/kotlin/dev/frogmc/meta_update/MetaV1UpdateTask.kt
Normal file
145
src/main/kotlin/dev/frogmc/meta_update/MetaV1UpdateTask.kt
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
package dev.frogmc.meta_update
|
||||||
|
|
||||||
|
import com.google.common.hash.Hashing
|
||||||
|
import groovy.json.JsonOutput
|
||||||
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.artifacts.ResolvedArtifact
|
||||||
|
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
|
||||||
|
import org.gradle.api.plugins.JavaBasePlugin
|
||||||
|
import org.gradle.api.plugins.JavaPlugin
|
||||||
|
import org.gradle.api.tasks.TaskAction
|
||||||
|
import org.gradle.work.DisableCachingByDefault
|
||||||
|
import java.net.URI
|
||||||
|
import java.net.URLEncoder
|
||||||
|
import java.net.http.HttpClient
|
||||||
|
import java.net.http.HttpRequest
|
||||||
|
import java.net.http.HttpResponse.BodyHandlers
|
||||||
|
import java.nio.charset.StandardCharsets
|
||||||
|
import java.nio.file.Files
|
||||||
|
import java.time.ZoneOffset
|
||||||
|
import java.time.ZonedDateTime
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
|
@DisableCachingByDefault(because = "Not worth caching")
|
||||||
|
class MetaV1UpdateTask : DefaultTask() {
|
||||||
|
|
||||||
|
init {
|
||||||
|
dependsOn(project.tasks.getByName(JavaBasePlugin.BUILD_TASK_NAME))
|
||||||
|
}
|
||||||
|
|
||||||
|
private val timeFormat = DateTimeFormatter.ISO_LOCAL_DATE_TIME
|
||||||
|
private val client = HttpClient.newHttpClient()
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION") // Because SHA-1 is deprecated i suppose for being "neither secure nor fast"
|
||||||
|
@TaskAction
|
||||||
|
fun upload() {
|
||||||
|
|
||||||
|
if (project.name != "frogloader") {
|
||||||
|
error("Cannot upload invalid project to FrogMC Meta!")
|
||||||
|
}
|
||||||
|
|
||||||
|
val version = project.version.toString()
|
||||||
|
val date = ZonedDateTime.of(ZonedDateTime.now().toLocalDateTime(), ZoneOffset.UTC).format(timeFormat)
|
||||||
|
val libraries = project.configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)
|
||||||
|
.resolvedConfiguration.resolvedArtifacts.map {
|
||||||
|
val module = it.moduleVersion.id
|
||||||
|
val file = it.file
|
||||||
|
val url = findUrl(it)
|
||||||
|
if (url.isEmpty()) {
|
||||||
|
error("Failed to resolve original url of ${module.group + ":" + module.name + ":" + module.version}!")
|
||||||
|
}
|
||||||
|
return@map MetaLibrary(
|
||||||
|
module.group + ":" + module.name + ":" + module.version + (if (it.classifier != null) ":" + it.classifier else ""),
|
||||||
|
url, Files.size(file.toPath()), Hashing.sha1().hashBytes(file.readBytes()).toString()
|
||||||
|
)
|
||||||
|
}.toMutableList()
|
||||||
|
val builtFile = project.tasks.getByName(JavaBasePlugin.BUILD_TASK_NAME).outputs.files.files.find { !it.name.endsWith("-dev.jar") && !it.name.endsWith("-sources.jar") && !it.name.endsWith("-javadoc.jar") }
|
||||||
|
libraries.add(MetaLibrary(project.name, getOwnUrl(), Files.size(builtFile!!.toPath()), Hashing.sha1().hashBytes(builtFile.readBytes()).toString()))
|
||||||
|
|
||||||
|
val json = JsonOutput.toJson(MetaData(version, date, libraries))
|
||||||
|
|
||||||
|
println("Data for upload: $json")
|
||||||
|
|
||||||
|
val key = project.properties.getOrDefault("FrogMCMetaKey", "") as String
|
||||||
|
if (key.isEmpty()) {
|
||||||
|
error("No Authentication Key provided!")
|
||||||
|
}
|
||||||
|
val post = HttpRequest.newBuilder(URI.create(UPLOAD_LOADER_URL)).POST(HttpRequest.BodyPublishers.ofString(json))
|
||||||
|
.header("Authorization", key)
|
||||||
|
.build()
|
||||||
|
val response = client.send(post, BodyHandlers.ofString())
|
||||||
|
|
||||||
|
if (response.statusCode() == 200) {
|
||||||
|
println("Uploaded information for version ${project.version} to FrogMC Meta!")
|
||||||
|
} else {
|
||||||
|
error(buildString {
|
||||||
|
append("Failed to upload information for version ")
|
||||||
|
append(project.version)
|
||||||
|
append(" to FrogMC Meta!")
|
||||||
|
append("\n")
|
||||||
|
append("Status: ${response.statusCode()}\n")
|
||||||
|
append("Response body: " + response.body() + "\n")
|
||||||
|
append("Headers: " + response.headers().map())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findUrl(artifact: ResolvedArtifact): String {
|
||||||
|
val module = artifact.moduleVersion.id
|
||||||
|
val escapedVersion = URLEncoder.encode(module.version, StandardCharsets.UTF_8)
|
||||||
|
val escapedGroup = URLEncoder.encode(module.group, StandardCharsets.UTF_8).replace(".", "/")
|
||||||
|
val escapedName = URLEncoder.encode(module.name, StandardCharsets.UTF_8)
|
||||||
|
project.repositories.filterIsInstance<MavenArtifactRepository>().map { it.url }
|
||||||
|
.forEach {
|
||||||
|
val artifactUrl = "%s%s/%s/%s/%s-%s.jar".format(
|
||||||
|
it, escapedGroup, escapedName, escapedVersion, escapedName, escapedVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
runCatching {
|
||||||
|
val response = client.send(
|
||||||
|
HttpRequest.newBuilder().uri(URI.create(artifactUrl)).GET().build(),
|
||||||
|
BodyHandlers.discarding()
|
||||||
|
)
|
||||||
|
|
||||||
|
if (response.statusCode() == 200) {
|
||||||
|
return artifactUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getOwnUrl(): String {
|
||||||
|
val escapedVersion = URLEncoder.encode(project.version.toString(), StandardCharsets.UTF_8)
|
||||||
|
val escapedGroup = URLEncoder.encode(project.group.toString(), StandardCharsets.UTF_8).replace(".", "/")
|
||||||
|
val escapedName = URLEncoder.encode(project.name, StandardCharsets.UTF_8)
|
||||||
|
val url = "%s/%s/%s/%s-%s.jar".format(
|
||||||
|
escapedGroup, escapedName, escapedVersion, escapedName, escapedVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
runCatching {
|
||||||
|
val response = client.send(
|
||||||
|
HttpRequest.newBuilder().uri(URI.create(MAVEN_URL_RELEASES+url)).GET().build(),
|
||||||
|
BodyHandlers.discarding()
|
||||||
|
)
|
||||||
|
|
||||||
|
if (response.statusCode() == 200) {
|
||||||
|
return MAVEN_URL_RELEASES+url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return MAVEN_URL_SNAPSHOTS+url
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val META_URL = "https://meta.frogmc.dev/v1/"
|
||||||
|
private const val UPLOAD_LOADER_URL = META_URL + "loader/versions/upload"
|
||||||
|
private const val MAVEN_URL = "https://maven.frogmc.dev/"
|
||||||
|
private const val MAVEN_URL_RELEASES = "https://maven.frogmc.dev/releases"
|
||||||
|
private const val MAVEN_URL_SNAPSHOTS = "https://maven.frogmc.dev/snapshots"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MetaData(val version: String, val releaseDate: String, val libraries: List<MetaLibrary>)
|
||||||
|
class MetaLibrary(val name: String, val url: String, val size: Long, val sha1: String)
|
Loading…
Reference in a new issue