25 Commits

Author SHA1 Message Date
2a9648c014 v0.17.0 2025-04-10 21:16:06 -07:00
f91316fef3 it works! 2025-04-10 21:11:27 -07:00
d228685b59 fix and update github workflows 2025-04-10 20:36:14 -07:00
610ba483ca Start work on v0.17.0-SNAPSHOT 2025-04-10 20:29:44 -07:00
61b1abd335 v0.16.0 2025-04-10 20:29:37 -07:00
1a968a6489 Cleanup smart downloader utility. 2023-03-18 14:55:19 -07:00
aa2750bdc0 Start work on v0.16.0-SNAPSHOT 2023-03-16 17:44:48 -07:00
075cd169bb v0.15.0 2023-03-16 17:44:27 -07:00
d561146024 Fix samples. 2023-03-16 17:39:48 -07:00
900b430e58 v0.15.0 2023-03-16 17:36:12 -07:00
4cec9a74a9 Implement support for custom concrete items. 2023-03-16 17:35:40 -07:00
bb3d3cb6bc Start work on v0.15.0-SNAPSHOT 2023-03-13 16:27:25 -07:00
3042512a92 v0.14.0 2023-03-13 16:27:02 -07:00
6d6a71b4f8 Fix bug in update manifest generation. 2023-03-13 16:26:30 -07:00
2a38525180 Begin work on v0.14.0-SNAPSHOT 2023-03-13 16:07:18 -07:00
b910e3b2ff v0.13.0 2023-03-13 16:06:41 -07:00
89664eb5d7 Switch to plugin {} for concrete plugin dependency sets. 2023-03-13 16:00:49 -07:00
aaf15e5270 Start on v0.13.0-SANPSHOT 2023-03-13 15:51:12 -07:00
353f62dfc8 v0.12.0 2023-03-13 15:50:44 -07:00
e6f1efb346 Gradle 8.0.2 2023-03-13 15:50:27 -07:00
df8f755ff7 Extensible manifest format. 2023-03-13 15:49:59 -07:00
0478616f34 Upgrade to Gradle v8.0.1 2023-02-19 21:28:18 -08:00
43d76cfb96 Upgrade to Gradle v8.0 2023-02-15 21:47:36 -08:00
0d60664838 Update plugin descriptions. 2023-02-08 18:21:35 -05:00
02abbabb08 Start work on v0.12.0-SNAPSHOT 2023-02-07 18:23:47 -05:00
44 changed files with 405 additions and 197 deletions

View File

@ -5,13 +5,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v3 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v3 uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with: with:
java-version: '17' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Build with Gradle - name: Build with Gradle
uses: gradle/gradle-build-action@v2 run: ./gradlew build
with:
arguments: build

View File

@ -8,13 +8,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v3 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v3 uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with: with:
java-version: '17' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Publish with Gradle - name: Publish with Gradle
uses: gradle/gradle-build-action@v2 run: "./gradlew publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PLUGIN_PUBLISHING_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PLUGIN_PUBLISHING_SECRET }}"
with:
arguments: "publishPlugins -Pgradle.publish.key=${{ secrets.GRADLE_PLUGIN_PUBLISHING_KEY }} -Pgradle.publish.secret=${{ secrets.GRADLE_PLUGIN_PUBLISHING_SECRET }}"

View File

@ -8,16 +8,16 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v3 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v3 uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with: with:
java-version: '17' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
- name: Publish with Gradle - name: Setup Gradle
uses: gradle/gradle-build-action@v2 uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
with: - name: Build with Gradle
arguments: publishAllPublicationsToGitHubPackagesRepository publishAllPublicationsToGitLabRepository run: ./gradlew publishAllPublicationsToGitHubPackagesRepository publishAllPublicationsToGitLabRepository
env: env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
GITLAB_TOKEN: "${{ secrets.GITLAB_TOKEN }}" GITLAB_TOKEN: "${{ secrets.GITLAB_TOKEN }}"

View File

@ -1,16 +0,0 @@
name: Qodona
on: [push]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Qodana Scan
uses: JetBrains/qodana-action@main
env:
QODANA_TOKEN: "${{ secrets.QODANA_TOKEN }}"
- name: Upload CodeQL SARIF
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: "${{ runner.temp }}/qodana/results/qodana.sarif.json"

View File

@ -5,21 +5,17 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v3 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Set up JDK 17 - name: Set up JDK 21
uses: actions/setup-java@v3 uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4
with: with:
java-version: '17' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4
- name: Build mixed sample with Gradle - name: Build mixed sample with Gradle
uses: gradle/gradle-build-action@v2 run: ./gradlew -p samples/mixed build
with:
arguments: -p samples/mixed build
- name: Build shared sample with Gradle - name: Build shared sample with Gradle
uses: gradle/gradle-build-action@v2 run: ./gradlew -p samples/shared build
with:
arguments: -p samples/shared build
- name: Build simple sample with Gradle - name: Build simple sample with Gradle
uses: gradle/gradle-build-action@v2 run: ./gradlew -p samples/simple build
with:
arguments: -p samples/simple build

View File

@ -1,15 +1,16 @@
@file:Suppress("UnstableApiUsage") import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
`kotlin-dsl` `kotlin-dsl`
`maven-publish` `maven-publish`
`java-gradle-plugin` `java-gradle-plugin`
id("com.gradle.plugin-publish") version "1.1.0" id("com.gradle.plugin-publish") version "1.3.1"
} }
group = "gay.pizza.foundation" group = "gay.pizza.foundation"
version = "0.11.0" version = "0.17.0"
repositories { repositories {
mavenCentral() mavenCentral()
@ -17,13 +18,13 @@ repositories {
} }
dependencies { dependencies {
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10") implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20")
implementation("org.jetbrains.kotlin:kotlin-serialization:1.8.10") implementation("org.jetbrains.kotlin:kotlin-serialization:2.1.20")
implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.2") implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:8.3.6")
implementation("com.google.code.gson:gson:2.10.1") implementation("com.google.code.gson:gson:2.12.1")
// Implementation of crypto used in smart downloader. // Implementation of crypto used in smart downloader.
implementation("org.bouncycastle:bcprov-jdk15on:1.70") implementation("org.bouncycastle:bcprov-jdk18on:1.80")
} }
gradlePlugin { gradlePlugin {
@ -36,7 +37,7 @@ gradlePlugin {
implementationClass = "gay.pizza.foundation.concrete.ConcreteRootPlugin" implementationClass = "gay.pizza.foundation.concrete.ConcreteRootPlugin"
displayName = "Concrete Root" displayName = "Concrete Root"
description = "Concrete project root." description = "Gradle conventions for Foundation Bukkit plugins. Root project plugin."
} }
create("concrete-base") { create("concrete-base") {
@ -44,7 +45,7 @@ gradlePlugin {
implementationClass = "gay.pizza.foundation.concrete.ConcreteBasePlugin" implementationClass = "gay.pizza.foundation.concrete.ConcreteBasePlugin"
displayName = "Concrete Base" displayName = "Concrete Base"
description = "Concrete project base." description = "Gradle conventions for Foundation Bukkit plugins. Base project plugin."
} }
create("concrete-library") { create("concrete-library") {
@ -52,7 +53,7 @@ gradlePlugin {
implementationClass = "gay.pizza.foundation.concrete.ConcreteLibraryPlugin" implementationClass = "gay.pizza.foundation.concrete.ConcreteLibraryPlugin"
displayName = "Concrete Library" displayName = "Concrete Library"
description = "Concrete project library." description = "Gradle conventions for Foundation Bukkit plugins. Library project plugin."
} }
create("concrete-plugin") { create("concrete-plugin") {
@ -60,7 +61,7 @@ gradlePlugin {
implementationClass = "gay.pizza.foundation.concrete.ConcretePluginPlugin" implementationClass = "gay.pizza.foundation.concrete.ConcretePluginPlugin"
displayName = "Concrete Library" displayName = "Concrete Library"
description = "Concrete project plugin." description = "Gradle conventions for Foundation Bukkit plugins. Plugin project plugin."
} }
forEach { declaration -> forEach { declaration ->
@ -78,14 +79,14 @@ if (gradlePublishingKey != null && gradlePublishingSecret != null) {
} }
java { java {
val version = JavaVersion.toVersion("17") val version = JavaVersion.toVersion("21")
sourceCompatibility = version sourceCompatibility = version
targetCompatibility = version targetCompatibility = version
} }
tasks.compileKotlin { tasks.compileKotlin {
kotlinOptions { compilerOptions {
jvmTarget = "17" jvmTarget.value(JvmTarget.JVM_21)
} }
} }
@ -128,7 +129,7 @@ publishing {
} }
tasks.withType<Wrapper> { tasks.withType<Wrapper> {
gradleVersion = "7.6" gradleVersion = "8.13"
} }
java { java {

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000 networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

11
gradlew vendored
View File

@ -85,9 +85,6 @@ done
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -144,7 +141,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
@ -152,7 +149,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045 # shellcheck disable=SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -197,6 +194,10 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command; # Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in # shell script including quotes and variable substitutions, so put them in

View File

@ -2,9 +2,10 @@ plugins {
id("gay.pizza.foundation.concrete-root") id("gay.pizza.foundation.concrete-root")
} }
concrete { concreteRoot {
minecraftServerPath.set("server") minecraftServerPath.set("server")
paperServerVersionGroup.set("1.19") paperServerVersionGroup.set("1.21")
paperApiVersion.set("1.19.3-R0.1-SNAPSHOT") paperApiVersion.set("1.21.4-R0.1-SNAPSHOT")
acceptServerEula.set(true) acceptServerEula.set(true)
expansiveItemInclusion.set(true)
} }

View File

@ -6,3 +6,7 @@ dependencies {
implementation(project(":other-library")) implementation(project(":other-library"))
implementation(project(":bukkit-plugins:common-library")) implementation(project(":bukkit-plugins:common-library"))
} }
concreteItem {
dependency(project(":bukkit-plugins:goodbye-world"))
}

Binary file not shown.

View File

@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

37
samples/mixed/gradlew vendored
View File

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -80,13 +82,11 @@ do
esac esac
done done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # This is normally unused
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -133,22 +133,29 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -193,11 +200,15 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
# shell script including quotes and variable substitutions, so put them in DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded. # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \

View File

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@ -26,6 +28,7 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -42,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail

View File

@ -1,3 +1,10 @@
plugins { plugins {
id("gay.pizza.foundation.concrete-base") id("gay.pizza.foundation.concrete-base")
} }
concreteItem {
type.set("library")
fileInclusion {
tasks.jar.get().outputs.files.associateWith { "library-jar" }
}
}

View File

@ -3,9 +3,9 @@ plugins {
id("gay.pizza.foundation.concrete-plugin") id("gay.pizza.foundation.concrete-plugin")
} }
concrete { concreteRoot {
minecraftServerPath.set("server") minecraftServerPath.set("server")
paperServerVersionGroup.set("1.19") paperServerVersionGroup.set("1.21")
paperApiVersion.set("1.19.3-R0.1-SNAPSHOT") paperApiVersion.set("1.21.4-R0.1-SNAPSHOT")
acceptServerEula.set(true) acceptServerEula.set(true)
} }

Binary file not shown.

View File

@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -80,13 +82,11 @@ do
esac esac
done done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # This is normally unused
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -133,22 +133,29 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -193,11 +200,15 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
# shell script including quotes and variable substitutions, so put them in DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded. # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \

View File

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@ -26,6 +28,7 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -42,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail

View File

@ -2,9 +2,9 @@ plugins {
id("gay.pizza.foundation.concrete-root") id("gay.pizza.foundation.concrete-root")
} }
concrete { concreteRoot {
minecraftServerPath.set("server") minecraftServerPath.set("server")
paperServerVersionGroup.set("1.19") paperServerVersionGroup.set("1.21")
paperApiVersion.set("1.19.3-R0.1-SNAPSHOT") paperApiVersion.set("1.21.4-R0.1-SNAPSHOT")
acceptServerEula.set(true) acceptServerEula.set(true)
} }

Binary file not shown.

View File

@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -80,13 +82,11 @@ do
esac esac
done done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # This is normally unused
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -133,22 +133,29 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -193,11 +200,15 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
# shell script including quotes and variable substitutions, so put them in DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded. # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \

View File

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@ -26,6 +28,7 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -42,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail

View File

@ -11,7 +11,7 @@ open class ConcreteBaseBukkitPlugin : ConcreteBasePlugin() {
project.repositories { project.repositories {
maven { maven {
name = "papermc" name = "papermc"
url = URI.create("https://papermc.io/repo/repository/maven-public/") url = URI.create("https://repo.papermc.io/repository/maven-public/")
} }
} }

View File

@ -4,8 +4,10 @@ import org.gradle.api.JavaVersion
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.withType import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
open class ConcreteBasePlugin : Plugin<Project> { open class ConcreteBasePlugin : Plugin<Project> {
@ -28,17 +30,19 @@ open class ConcreteBasePlugin : Plugin<Project> {
project.plugins.apply("org.jetbrains.kotlin.plugin.serialization") project.plugins.apply("org.jetbrains.kotlin.plugin.serialization")
project.extensions.getByType<JavaPluginExtension>().apply { project.extensions.getByType<JavaPluginExtension>().apply {
val javaVersion = JavaVersion.toVersion(17) val javaVersion = JavaVersion.toVersion(21)
sourceCompatibility = javaVersion sourceCompatibility = javaVersion
targetCompatibility = javaVersion targetCompatibility = javaVersion
} }
project.tasks.withType<KotlinCompile>().forEach { project.tasks.withType<KotlinCompile>().forEach {
it.apply { it.apply {
kotlinOptions.apply { compilerOptions {
jvmTarget = "17" jvmTarget.value(JvmTarget.JVM_21)
} }
} }
} }
project.extensions.create<ConcreteItemExtension>("concreteItem")
} }
} }

View File

@ -0,0 +1,21 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DomainObjectSet
import org.gradle.api.Project
import org.gradle.api.provider.Property
import java.io.File
interface ConcreteItemExtension {
val type: Property<String>
val version: Property<String>
val dependencies: DomainObjectSet<Project>
val fileInclusion: Property<() -> Map<File, String>>
fun dependency(project: Project) {
dependencies.add(project)
}
fun fileInclusion(inclusion: () -> Map<File, String>) {
fileInclusion.set(inclusion)
}
}

View File

@ -4,12 +4,11 @@ import org.gradle.api.Project
import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.get
import org.gradle.language.jvm.tasks.ProcessResources import org.gradle.language.jvm.tasks.ProcessResources
@Suppress("UnstableApiUsage")
class ConcretePluginPlugin : ConcreteBaseBukkitPlugin() { class ConcretePluginPlugin : ConcreteBaseBukkitPlugin() {
override fun apply(project: Project) { override fun apply(project: Project) {
super.apply(project) super.apply(project)
project.plugins.apply("com.github.johnrengelman.shadow") project.plugins.apply("com.gradleup.shadow")
// During IDEA project import, if this code is active, it will print warnings. // During IDEA project import, if this code is active, it will print warnings.
// This will make the VERSION field unexpanded if you run using the IntelliJ build system. // This will make the VERSION field unexpanded if you run using the IntelliJ build system.

View File

@ -2,9 +2,10 @@ package gay.pizza.foundation.concrete
import org.gradle.api.provider.Property import org.gradle.api.provider.Property
interface ConcreteExtension { interface ConcreteRootExtension {
val paperServerVersionGroup: Property<String> val paperServerVersionGroup: Property<String>
val paperApiVersion: Property<String> val paperApiVersion: Property<String>
val minecraftServerPath: Property<String> val minecraftServerPath: Property<String>
val acceptServerEula: Property<Boolean> val acceptServerEula: Property<Boolean>
val expansiveItemInclusion: Property<Boolean>
} }

View File

@ -4,14 +4,15 @@ import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.register
import java.nio.file.Paths import java.nio.file.Paths
class ConcreteRootPlugin : Plugin<Project> { class ConcreteRootPlugin : Plugin<Project> {
override fun apply(project: Project) { override fun apply(project: Project) {
project.apply(plugin = "base") project.apply(plugin = "base")
project.extensions.create<ConcreteExtension>("concrete") project.extensions.create<ConcreteRootExtension>("concreteRoot")
val setupPaperServer = project.tasks.create<SetupPaperServer>("setupPaperServer") val setupPaperServer = project.tasks.register<SetupPaperServer>("setupPaperServer").get()
val runPaperServer = project.tasks.create<RunPaperServer>("runPaperServer") val runPaperServer = project.tasks.register<RunPaperServer>("runPaperServer").get()
runPaperServer.dependsOn(setupPaperServer) runPaperServer.dependsOn(setupPaperServer)
val maybeLocalServerPathString = project.properties["localMinecraftServerPath"]?.toString() val maybeLocalServerPathString = project.properties["localMinecraftServerPath"]?.toString()
@ -20,8 +21,8 @@ class ConcreteRootPlugin : Plugin<Project> {
val localServerJarFileName = project.properties["localMinecraftServerJarFileName"]?.toString() ?: "server.jar" val localServerJarFileName = project.properties["localMinecraftServerJarFileName"]?.toString() ?: "server.jar"
val currentWorkingDirectory = System.getProperty("user.dir") val currentWorkingDirectory = System.getProperty("user.dir")
val localServerDirectory = Paths.get(currentWorkingDirectory).resolve(maybeLocalServerPathString).toFile() val localServerDirectory = Paths.get(currentWorkingDirectory).resolve(maybeLocalServerPathString).toFile()
val setupLocalMinecraftServer = project.tasks.create<SetupLocalMinecraftServer>("setupLocalMinecraftServer") val setupLocalMinecraftServer = project.tasks.register<SetupLocalMinecraftServer>("setupLocalMinecraftServer").get()
val runLocalMinecraftServer = project.tasks.create<RunLocalMinecraftServer>("runLocalMinecraftServer") val runLocalMinecraftServer = project.tasks.register<RunLocalMinecraftServer>("runLocalMinecraftServer").get()
runLocalMinecraftServer.dependsOn(setupLocalMinecraftServer) runLocalMinecraftServer.dependsOn(setupLocalMinecraftServer)
setupLocalMinecraftServer.minecraftServerDirectory = localServerDirectory setupLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
@ -29,7 +30,7 @@ class ConcreteRootPlugin : Plugin<Project> {
runLocalMinecraftServer.serverJarFileName = localServerJarFileName runLocalMinecraftServer.serverJarFileName = localServerJarFileName
} }
val updateManifests = project.tasks.create<UpdateManifestTask>("updateManifests") val updateManifests = project.tasks.register<UpdateManifestTask>("updateManifests")
project.tasks.getByName("assemble").dependsOn(updateManifests) project.tasks.getByName("assemble").dependsOn(updateManifests)
} }
} }

View File

@ -0,0 +1,55 @@
package gay.pizza.foundation.concrete
/**
* The extensible update manifest format.
*/
data class ExtensibleManifest(
/**
* The items the manifest describes.
*/
val items: List<ExtensibleManifestItem>
)
/**
* An item in the update manifest.
*/
data class ExtensibleManifestItem(
/**
* The name of the item.
*/
val name: String,
/**
* The type of item.
*/
val type: String,
/**
* The version of the item.
*/
val version: String,
/**
* The dependencies of the item.
*/
val dependencies: List<String>,
/**
* The files that are required to install the item.
*/
val files: List<ExtensibleManifestItemFile>
)
/**
* A file built from the item.
*/
data class ExtensibleManifestItemFile(
/**
* The name of the file.
*/
val name: String,
/**
* A type of file.
*/
val type: String,
/**
* The relative path to download the file.
*/
val path: String
)

View File

@ -1,7 +1,9 @@
package gay.pizza.foundation.concrete package gay.pizza.foundation.concrete
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder
object Globals { object Globals {
val gson = Gson() val gsonPretty: Gson = GsonBuilder().setPrettyPrinting().create()
val gson: Gson = Gson()
} }

View File

@ -10,7 +10,7 @@ class PaperVersionClient(
private val client: HttpClient = HttpClient.newHttpClient(), private val client: HttpClient = HttpClient.newHttpClient(),
private val gson: Gson = Globals.gson private val gson: Gson = Globals.gson
) { ) {
private val apiBaseUrl = URI.create("https://papermc.io/api/v2/") private val apiBaseUrl = URI.create("https://api.papermc.io/v2/")
fun getVersionBuilds(group: String): List<PaperBuild> { fun getVersionBuilds(group: String): List<PaperBuild> {
val response = client.send( val response = client.send(

View File

@ -1,9 +1,11 @@
package gay.pizza.foundation.concrete package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.gradle.process.ExecOperations
import java.io.File import java.io.File
import javax.inject.Inject
open class RunLocalMinecraftServer : RunMinecraftServer() { open class RunLocalMinecraftServer @Inject constructor(execOperations: ExecOperations) : RunMinecraftServer(execOperations) {
@Internal @Internal
lateinit var minecraftServerDirectory: File lateinit var minecraftServerDirectory: File

View File

@ -4,10 +4,12 @@ import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
import java.io.File import java.io.File
import java.util.jar.JarFile import java.util.jar.JarFile
import javax.inject.Inject
abstract class RunMinecraftServer : DefaultTask() { abstract class RunMinecraftServer @Inject constructor(private var execOperations: ExecOperations) : DefaultTask() {
init { init {
outputs.upToDateWhen { false } outputs.upToDateWhen { false }
} }
@ -24,7 +26,7 @@ abstract class RunMinecraftServer : DefaultTask() {
val serverJarFile = minecraftServerDirectory.resolve(getServerJarName()) val serverJarFile = minecraftServerDirectory.resolve(getServerJarName())
val mainClassName = readMainClass(serverJarFile) val mainClassName = readMainClass(serverJarFile)
project.javaexec { execOperations.javaexec {
classpath(serverJarFile.absolutePath) classpath(serverJarFile.absolutePath)
workingDir(minecraftServerDirectory) workingDir(minecraftServerDirectory)

View File

@ -2,16 +2,18 @@ package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.getByType
import org.gradle.process.ExecOperations
import java.io.File import java.io.File
import javax.inject.Inject
open class RunPaperServer : RunMinecraftServer() { open class RunPaperServer @Inject constructor(execOperations: ExecOperations) : RunMinecraftServer(execOperations) {
init { init {
outputs.upToDateWhen { false } outputs.upToDateWhen { false }
} }
@Internal @Internal
override fun getServerDirectory(): File { override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteExtension>() val concrete = project.extensions.getByType<ConcreteRootExtension>()
return project.file(concrete.minecraftServerPath.get()) return project.file(concrete.minecraftServerPath.get())
} }

View File

@ -34,7 +34,7 @@ abstract class SetupMinecraftServer : DefaultTask() {
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath()) Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
} }
val concrete = project.extensions.getByType<ConcreteExtension>() val concrete = project.extensions.getByType<ConcreteRootExtension>()
if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) { if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) {
val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter() val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter()
val properties = Properties() val properties = Properties()

View File

@ -18,8 +18,9 @@ open class SetupPaperServer : SetupMinecraftServer() {
@TaskAction @TaskAction
fun setupPaperServer() { fun setupPaperServer() {
val concrete = project.extensions.getByType<ConcreteExtension>() val concrete = project.extensions.getByType<ConcreteRootExtension>()
val minecraftServerDirectory = getServerDirectory() val minecraftServerDirectory = getServerDirectory()
minecraftServerDirectory.mkdirs()
val paperJarFile = project.file("${minecraftServerDirectory}/paper.jar") val paperJarFile = project.file("${minecraftServerDirectory}/paper.jar")
if (!paperJarFile.exists() || shouldUpdatePaperServer) { if (!paperJarFile.exists() || shouldUpdatePaperServer) {
downloadLatestBuild(concrete.paperServerVersionGroup.get(), paperJarFile) downloadLatestBuild(concrete.paperServerVersionGroup.get(), paperJarFile)
@ -50,7 +51,7 @@ open class SetupPaperServer : SetupMinecraftServer() {
@Internal @Internal
override fun getServerDirectory(): File { override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteExtension>() val concrete = project.extensions.getByType<ConcreteRootExtension>()
return project.file(concrete.minecraftServerPath.get()) return project.file(concrete.minecraftServerPath.get())
} }
} }

View File

@ -1,9 +1,13 @@
package gay.pizza.foundation.concrete package gay.pizza.foundation.concrete
import java.net.URI import java.net.URI
import java.nio.file.Files import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse.BodyHandlers
import java.nio.file.Path import java.nio.file.Path
import java.security.MessageDigest import java.security.MessageDigest
import kotlin.io.path.exists
import kotlin.io.path.inputStream
class SmartDownloader( class SmartDownloader(
private val localFilePath: Path, private val localFilePath: Path,
@ -20,23 +24,25 @@ class SmartDownloader(
} }
private fun downloadRemoteFile() { private fun downloadRemoteFile() {
val url = remoteDownloadUrl.toURL() val httpClient = HttpClient.newHttpClient()
val remoteFileStream = url.openStream() val request = HttpRequest.newBuilder()
val localFileStream = Files.newOutputStream(localFilePath) .GET()
remoteFileStream.transferTo(localFileStream) .uri(remoteDownloadUrl)
.build()
httpClient.send(request, BodyHandlers.ofFile(localFilePath))
val hashResult = checkLocalFileHash() val hashResult = checkLocalFileHash()
if (hashResult != HashResult.ValidHash) { if (hashResult != HashResult.ValidHash) {
throw RuntimeException("Download of $remoteDownloadUrl did not result in valid hash.") throw RuntimeException("Download of $remoteDownloadUrl did not result in a valid hash.")
} }
} }
private fun checkLocalFileHash(): HashResult { private fun checkLocalFileHash(): HashResult {
if (!Files.exists(localFilePath)) { if (!localFilePath.exists()) {
return HashResult.DoesNotExist return HashResult.DoesNotExist
} }
val digest = MessageDigest.getInstance("SHA-256") val digest = MessageDigest.getInstance("SHA-256")
val localFileStream = Files.newInputStream(localFilePath) val localFileStream = localFilePath.inputStream()
val buffer = ByteArray(16 * 1024) val buffer = ByteArray(16 * 1024)
while (true) { while (true) {

View File

@ -2,17 +2,23 @@ package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import kotlin.io.path.relativeTo
import kotlin.io.path.writeText
open class UpdateManifestTask : DefaultTask() { open class UpdateManifestTask : DefaultTask() {
@TaskAction @TaskAction
fun update() { fun update() {
val manifestsDir = ensureManifestsDirectory() val manifestsDir = ensureManifestsDirectory()
val updateFile = manifestsDir.resolve("update.json") val rootExtension = project.concreteRootExtension
val rootPath = project.rootProject.rootDir.toPath() val rootPath = if (rootExtension.expansiveItemInclusion.orNull == true) {
val updateManifest = project.findPluginProjects().mapNotNull { project -> project.rootProject.rootDir
val paths = project.shadowJarOutputs!!.allFilesRelativeToPath(rootPath) } else {
project.rootDir
}
val legacyUpdateManifest = project.findPluginProjects().mapNotNull { project ->
val paths = project.shadowJarOutputs!!.files.allFilesRelativeToPath(rootPath.toPath())
if (paths.isNotEmpty()) { if (paths.isNotEmpty()) {
project.name to mapOf( project.name to mapOf(
"version" to project.version, "version" to project.version,
@ -21,11 +27,43 @@ open class UpdateManifestTask : DefaultTask() {
} else null } else null
}.toMap() }.toMap()
Files.writeString(updateFile, Globals.gson.toJson(updateManifest)) val legacyUpdateFile = manifestsDir.resolve("update.json")
legacyUpdateFile.writeText(Globals.gson.toJson(legacyUpdateManifest))
val extensibleUpdateManifestItems = project.findItemProjects().map { project ->
val concreteItemExtension = project.concreteItemExtension!!
val pathInclusion = concreteItemExtension.fileInclusion.orNull ?: {
project.shadowJarOutputs!!.files.associateWith { "plugin-jar" }
}
val paths = pathInclusion()
val dependencies = concreteItemExtension.dependencies.map { it.name }
ExtensibleManifestItem(
name = project.name,
type = concreteItemExtension.type.orNull ?: "bukkit-plugin",
version = concreteItemExtension.version.orNull ?: project.version.toString(),
dependencies = dependencies,
files = paths.map { (path, type) ->
ExtensibleManifestItemFile(
name = path.name,
type = type,
path = path.toPath().relativeTo(rootPath.toPath()).toUnixString()
)
}
)
}
val extensibleUpdateManifest = ExtensibleManifest(
items = extensibleUpdateManifestItems
)
val extensibleUpdateManifestFile = manifestsDir.resolve("manifest.json")
extensibleUpdateManifestFile.writeText(Globals.gson.toJson(extensibleUpdateManifest) + "\n")
} }
private fun ensureManifestsDirectory(): Path { private fun ensureManifestsDirectory(): Path {
val manifestsDir = project.buildDir.resolve("manifests") val manifestsDir = project.layout.buildDirectory.asFile.get().resolve("manifests")
manifestsDir.mkdirs() manifestsDir.mkdirs()
return manifestsDir.toPath() return manifestsDir.toPath()
} }

View File

@ -4,6 +4,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskOutputs import org.gradle.api.tasks.TaskOutputs
import java.io.File
import java.nio.file.FileSystems import java.nio.file.FileSystems
import java.nio.file.Path import java.nio.file.Path
@ -12,11 +13,30 @@ import java.nio.file.Path
*/ */
internal fun Project.isPluginProject() = plugins.hasPlugin(ConcretePluginPlugin::class.java) internal fun Project.isPluginProject() = plugins.hasPlugin(ConcretePluginPlugin::class.java)
/**
* Checks if the project has the [ConcreteBasePlugin] applied and is opting into item behavior.
*/
internal fun Project.isConcreteItem() =
isPluginProject() || concreteItemExtension?.type?.orNull != null
/** /**
* Finds all projects in the project's hierarchy that are plugins. * Finds all projects in the project's hierarchy that are plugins.
*/ */
internal fun Project.findPluginProjects() = allprojects.filter { project -> project.isPluginProject() } internal fun Project.findPluginProjects() = allprojects.filter { project -> project.isPluginProject() }
/**
* Finds all projects in the project's hierarchy that are items.
*/
internal fun Project.findItemProjects(): List<Project> {
val optInExpansion = concreteRootExtension.expansiveItemInclusion.orNull ?: false
val searchScope = if (optInExpansion) {
project.rootProject.allprojects
} else {
allprojects
}
return searchScope.filter { project -> project.isConcreteItem() }
}
internal fun TaskContainer.addTaskDependency(dependent: String, dependency: String) { internal fun TaskContainer.addTaskDependency(dependent: String, dependency: String) {
getByName(dependent).dependsOn(getByName(dependency)) getByName(dependent).dependsOn(getByName(dependency))
} }
@ -30,20 +50,23 @@ internal val Project.shadowJarTask: ShadowJar?
internal val Project.shadowJarOutputs: TaskOutputs? internal val Project.shadowJarOutputs: TaskOutputs?
get() = shadowJarTask?.outputs get() = shadowJarTask?.outputs
internal val Project.concreteRootExtension: ConcreteExtension internal val Project.concreteRootExtension: ConcreteRootExtension
get() = findTargetParent( get() = findTargetParent(
valid = { extensions.findByType(ConcreteExtension::class.java) != null }, valid = { extensions.findByType(ConcreteRootExtension::class.java) != null },
extract = { extensions.findByType(ConcreteExtension::class.java)!! }, extract = { extensions.findByType(ConcreteRootExtension::class.java)!! },
error = { "Failed to find concrete root. Did you apply the concrete root plugin?" } error = { "Failed to find concrete root. Did you apply the concrete root plugin?" }
) )
internal val Project.concreteItemExtension: ConcreteItemExtension?
get() = extensions.findByType(ConcreteItemExtension::class.java)
/** /**
* Finds the concrete root project, which is the first project in the project hierarchy * Finds the concrete root project, which is the first project in the project hierarchy
* that has the concrete extension. * that has the concrete extension.
*/ */
internal val Project.concreteRootProject: Project internal val Project.concreteRootProject: Project
get() = findTargetParent( get() = findTargetParent(
valid = { extensions.findByType(ConcreteExtension::class.java) != null }, valid = { extensions.findByType(ConcreteRootExtension::class.java) != null },
extract = { this }, extract = { this },
error = { "Failed to find concrete root. Did you apply the concrete root plugin?" } error = { "Failed to find concrete root. Did you apply the concrete root plugin?" }
) )
@ -65,6 +88,6 @@ internal fun <T> Project.findTargetParent(valid: Project.() -> Boolean, extract:
throw RuntimeException(error()) throw RuntimeException(error())
} }
internal fun TaskOutputs.allFilesRelativeToPath(root: Path): List<Path> = files.map { root.relativize(it.toPath()) } internal fun Iterable<File>.allFilesRelativeToPath(root: Path): List<Path> = map { root.relativize(it.toPath()) }
internal fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/") internal fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/")

9
tools/build-samples.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
set -e
cd "$(dirname "${0}")/.."
for SAMPLE_PATH in samples/*
do
pushd "${SAMPLE_PATH}" > /dev/null
./gradlew -q build
popd > /dev/null
done