18 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
43 changed files with 297 additions and 207 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.12.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 {
@ -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 = "8.0" 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-8.0.2-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

7
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
@ -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

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

Binary file not shown.

View File

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

33
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/HEAD/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/.
@ -83,10 +85,8 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || 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
@ -133,10 +133,13 @@ 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.
@ -144,7 +147,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=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
@ -152,7 +155,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=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
@ -197,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 ##########################################################################
@ -43,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
@ -57,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,6 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000 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/HEAD/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/.
@ -83,10 +85,8 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || 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
@ -133,10 +133,13 @@ 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.
@ -144,7 +147,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=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
@ -152,7 +155,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=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
@ -197,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 ##########################################################################
@ -43,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
@ -57,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,6 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000 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/HEAD/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/.
@ -83,10 +85,8 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || 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
@ -133,10 +133,13 @@ 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.
@ -144,7 +147,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=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
@ -152,7 +155,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=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
@ -197,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 ##########################################################################
@ -43,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
@ -57,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

@ -1,12 +0,0 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DomainObjectSet
import org.gradle.api.Project
interface ConcretePluginExtension {
val dependencies: DomainObjectSet<Project>
fun dependency(project: Project) {
dependencies.add(project)
}
}

View File

@ -4,14 +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.extensions.create("concrete", ConcretePluginExtension::class.java) project.plugins.apply("com.gradleup.shadow")
project.plugins.apply("com.github.johnrengelman.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

@ -7,4 +7,5 @@ interface ConcreteRootExtension {
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<ConcreteRootExtension>("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

@ -19,7 +19,7 @@ data class ExtensibleManifestItem(
*/ */
val name: String, val name: String,
/** /**
* The type of item, for example "bukkit-plugin" * The type of item.
*/ */
val type: String, val type: String,
/** /**
@ -33,7 +33,7 @@ data class ExtensibleManifestItem(
/** /**
* The files that are required to install the item. * The files that are required to install the item.
*/ */
val files: List<String> val files: List<ExtensibleManifestItemFile>
) )
/** /**
@ -45,7 +45,7 @@ data class ExtensibleManifestItemFile(
*/ */
val name: String, val name: String,
/** /**
* A type of file. For example: "plugin-jar". * A type of file.
*/ */
val type: String, val type: String,
/** /**

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,9 +2,11 @@ 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 }
} }

View File

@ -20,6 +20,7 @@ open class SetupPaperServer : SetupMinecraftServer() {
fun setupPaperServer() { fun setupPaperServer() {
val concrete = project.extensions.getByType<ConcreteRootExtension>() 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)

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,16 +2,22 @@ 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 rootPath = project.projectDir.toPath() val rootExtension = project.concreteRootExtension
val rootPath = if (rootExtension.expansiveItemInclusion.orNull == true) {
project.rootProject.rootDir
} else {
project.rootDir
}
val legacyUpdateManifest = project.findPluginProjects().mapNotNull { project -> val legacyUpdateManifest = project.findPluginProjects().mapNotNull { project ->
val paths = project.shadowJarOutputs!!.allFilesRelativeToPath(rootPath) val paths = project.shadowJarOutputs!!.files.allFilesRelativeToPath(rootPath.toPath())
if (paths.isNotEmpty()) { if (paths.isNotEmpty()) {
project.name to mapOf( project.name to mapOf(
@ -22,18 +28,29 @@ open class UpdateManifestTask : DefaultTask() {
}.toMap() }.toMap()
val legacyUpdateFile = manifestsDir.resolve("update.json") val legacyUpdateFile = manifestsDir.resolve("update.json")
Files.writeString(legacyUpdateFile, Globals.gson.toJson(legacyUpdateManifest)) legacyUpdateFile.writeText(Globals.gson.toJson(legacyUpdateManifest))
val extensibleUpdateManifestItems = project.findPluginProjects().mapNotNull { project -> val extensibleUpdateManifestItems = project.findItemProjects().map { project ->
val paths = project.shadowJarOutputs!!.allFilesRelativeToPath(rootPath) 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 }
val dependencies = project.concretePluginExtension.dependencies.map { it.name }
ExtensibleManifestItem( ExtensibleManifestItem(
name = project.name, name = project.name,
type = "bukkit-plugin", type = concreteItemExtension.type.orNull ?: "bukkit-plugin",
version = project.version.toString(), version = concreteItemExtension.version.orNull ?: project.version.toString(),
dependencies = dependencies, dependencies = dependencies,
files = paths.map { it.toUnixString() } files = paths.map { (path, type) ->
ExtensibleManifestItemFile(
name = path.name,
type = type,
path = path.toPath().relativeTo(rootPath.toPath()).toUnixString()
)
}
) )
} }
@ -42,12 +59,11 @@ open class UpdateManifestTask : DefaultTask() {
) )
val extensibleUpdateManifestFile = manifestsDir.resolve("manifest.json") val extensibleUpdateManifestFile = manifestsDir.resolve("manifest.json")
Files.writeString( extensibleUpdateManifestFile.writeText(Globals.gson.toJson(extensibleUpdateManifest) + "\n")
extensibleUpdateManifestFile, Globals.gsonPretty.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))
} }
@ -37,8 +57,8 @@ internal val Project.concreteRootExtension: ConcreteRootExtension
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.concretePluginExtension: ConcretePluginExtension internal val Project.concreteItemExtension: ConcreteItemExtension?
get() = extensions.getByType(ConcretePluginExtension::class.java) 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
@ -68,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