diff --git a/build.gradle.kts b/build.gradle.kts index b14d54343..a0bb1050e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,7 +41,7 @@ idea { } val clean by tasks.registering(Delete::class) { - delete(buildDir) + delete("build") } val printVersion by tasks.registering { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6c61d5079..e8bf11759 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.config.JvmTarget + plugins { `kotlin-dsl` } @@ -19,3 +21,13 @@ java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } + +kotlin { + target { + compilations.configureEach { + kotlinOptions { + jvmTarget = "11" + } + } + } +} diff --git a/buildSrc/src/main/kotlin/pklFatJar.gradle.kts b/buildSrc/src/main/kotlin/pklFatJar.gradle.kts index 084cdba76..844cee2d2 100644 --- a/buildSrc/src/main/kotlin/pklFatJar.gradle.kts +++ b/buildSrc/src/main/kotlin/pklFatJar.gradle.kts @@ -105,7 +105,7 @@ tasks.check { } val validateFatJar by tasks.registering { - val outputFile = file("$buildDir/validateFatJar/result.txt") + val outputFile = file("build/validateFatJar/result.txt") inputs.files(tasks.shadowJar) inputs.property("nonRelocations", nonRelocations) outputs.file(outputFile) @@ -138,7 +138,7 @@ tasks.check { val resolveSourcesJars by tasks.registering(ResolveSourcesJars::class) { configuration.set(configurations.runtimeClasspath) - outputDir.set(project.file("$buildDir/resolveSourcesJars")) + outputDir.set(project.file("build/resolveSourcesJars")) } val fatSourcesJar by tasks.registering(MergeSourcesJars::class) { diff --git a/buildSrc/src/main/kotlin/pklHtmlValidator.gradle.kts b/buildSrc/src/main/kotlin/pklHtmlValidator.gradle.kts index 6d09f01b9..9eef0a6d6 100644 --- a/buildSrc/src/main/kotlin/pklHtmlValidator.gradle.kts +++ b/buildSrc/src/main/kotlin/pklHtmlValidator.gradle.kts @@ -33,7 +33,7 @@ dependencies { } val validateHtml by tasks.registering(JavaExec::class) { - val resultFile = file("$buildDir/validateHtml/result.txt") + val resultFile = file("build/validateHtml/result.txt") inputs.files(htmlValidator.sources) outputs.file(resultFile) diff --git a/buildSrc/src/main/kotlin/pklJavaLibrary.gradle.kts b/buildSrc/src/main/kotlin/pklJavaLibrary.gradle.kts index 720eb746f..93679dbc6 100644 --- a/buildSrc/src/main/kotlin/pklJavaLibrary.gradle.kts +++ b/buildSrc/src/main/kotlin/pklJavaLibrary.gradle.kts @@ -55,7 +55,7 @@ val workAroundKotlinGradlePluginBug by tasks.registering { // A problem was found with the configuration of task ':pkl-executor:compileJava' (type 'JavaCompile'). // > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main' // specified for property 'compileKotlinOutputClasses' does not exist. - file("$buildDir/classes/kotlin/main").mkdirs() + file("build/classes/kotlin/main").mkdirs() } } diff --git a/buildSrc/src/main/kotlin/pklPublishLibrary.gradle.kts b/buildSrc/src/main/kotlin/pklPublishLibrary.gradle.kts index 17d3b4b69..212227bc8 100644 --- a/buildSrc/src/main/kotlin/pklPublishLibrary.gradle.kts +++ b/buildSrc/src/main/kotlin/pklPublishLibrary.gradle.kts @@ -54,7 +54,7 @@ val validatePom by tasks.registering { return@registering } val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class) - val outputFile = file("$buildDir/validatePom") // dummy output to satisfy up-to-date check + val outputFile = file("build/validatePom") // dummy output to satisfy up-to-date check dependsOn(generatePomFileForLibraryPublication) inputs.file(generatePomFileForLibraryPublication.get().destination) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a4..d64cd4917 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8049c684f..15230dffb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c + diff --git a/gradlew b/gradlew index 1b6c78733..1aa94a426 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (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/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# 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"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else 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 location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( 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 ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | 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" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# 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: +# * DEFAULT_JVM_OPTS, JAVA_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 -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f93..7101f8e46 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/pkl-cli/pkl-cli.gradle.kts b/pkl-cli/pkl-cli.gradle.kts index b4f76c806..a98d977ea 100644 --- a/pkl-cli/pkl-cli.gradle.kts +++ b/pkl-cli/pkl-cli.gradle.kts @@ -56,11 +56,11 @@ dependencies { testImplementation(projects.pklCommonsTest) - stagedMacAmd64Executable(files("$buildDir/executable/pkl-macos-amd64")) - stagedMacAarch64Executable(files("$buildDir/executable/pkl-macos-aarch64")) - stagedLinuxAmd64Executable(files("$buildDir/executable/pkl-linux-amd64")) - stagedLinuxAarch64Executable(files("$buildDir/executable/pkl-linux-aarch64")) - stagedAlpineLinuxAmd64Executable(files("$buildDir/executable/pkl-alpine-linux-amd64")) + stagedMacAmd64Executable(files("build/executable/pkl-macos-amd64")) + stagedMacAarch64Executable(files("build/executable/pkl-macos-aarch64")) + stagedLinuxAmd64Executable(files("build/executable/pkl-linux-amd64")) + stagedLinuxAarch64Executable(files("build/executable/pkl-linux-aarch64")) + stagedAlpineLinuxAmd64Executable(files("build/executable/pkl-alpine-linux-amd64")) } tasks.jar { @@ -90,7 +90,7 @@ tasks.shadowJar { val javaExecutable by tasks.registering(ExecutableJar::class) { inJar.set(tasks.shadowJar.flatMap { it.archiveFile }) - outJar.set(file("$buildDir/executable/jpkl")) + outJar.set(file("build/executable/jpkl")) // uncomment for debugging //jvmArgs.addAll("-ea", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005") @@ -117,7 +117,7 @@ tasks.check { // To catch this and similar problems, test that Java executable starts successfully. val testStartJavaExecutable by tasks.registering(Exec::class) { dependsOn(javaExecutable) -val outputFile = file("$buildDir/testStartJavaExecutable") // dummy output to satisfy up-to-date check +val outputFile = file("build/testStartJavaExecutable") // dummy output to satisfy up-to-date check outputs.file(outputFile) executable = javaExecutable.get().outputs.files.singleFile.toString() @@ -209,7 +209,7 @@ fun Exec.configureExecutable(isEnabled: Boolean, outputFile: File, extraArgs: Li * Builds the pkl CLI for macOS/amd64. */ val macExecutableAmd64: TaskProvider by tasks.registering(Exec::class) { - configureExecutable(buildInfo.os.isMacOsX && buildInfo.graalVm.isGraal22, file("$buildDir/executable/pkl-macos-amd64")) + configureExecutable(buildInfo.os.isMacOsX && buildInfo.graalVm.isGraal22, file("build/executable/pkl-macos-amd64")) } /** @@ -221,7 +221,7 @@ val macExecutableAmd64: TaskProvider by tasks.registering(Exec::class) { val macExecutableAarch64: TaskProvider by tasks.registering(Exec::class) { configureExecutable( buildInfo.os.isMacOsX && !buildInfo.graalVm.isGraal22, - file("$buildDir/executable/pkl-macos-aarch64"), + file("build/executable/pkl-macos-aarch64"), listOf( "--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess", "-H:+AllowDeprecatedBuilderClassesOnImageClasspath" @@ -233,7 +233,7 @@ val macExecutableAarch64: TaskProvider by tasks.registering(Exec::class) { * Builds the pkl CLI for linux/amd64. */ val linuxExecutableAmd64: TaskProvider by tasks.registering(Exec::class) { - configureExecutable(buildInfo.os.isLinux && buildInfo.arch == "amd64", file("$buildDir/executable/pkl-linux-amd64")) + configureExecutable(buildInfo.os.isLinux && buildInfo.arch == "amd64", file("build/executable/pkl-linux-amd64")) } /** @@ -243,7 +243,7 @@ val linuxExecutableAmd64: TaskProvider by tasks.registering(Exec::class) { * ARM instances. */ val linuxExecutableAarch64: TaskProvider by tasks.registering(Exec::class) { - configureExecutable(buildInfo.os.isLinux && buildInfo.arch == "aarch64", file("$buildDir/executable/pkl-linux-aarch64")) + configureExecutable(buildInfo.os.isLinux && buildInfo.arch == "aarch64", file("build/executable/pkl-linux-aarch64")) } /** @@ -255,7 +255,7 @@ val linuxExecutableAarch64: TaskProvider by tasks.registering(Exec::class) val alpineExecutableAmd64: TaskProvider by tasks.registering(Exec::class) { configureExecutable( buildInfo.os.isLinux && buildInfo.arch == "amd64" && buildInfo.hasMuslToolchain, - file("$buildDir/executable/pkl-alpine-linux-amd64"), + file("build/executable/pkl-alpine-linux-amd64"), listOf( "--static", "--libc=musl", diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliPackageDownloaderTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliPackageDownloaderTest.kt index fa10f5eee..2d1c58138 100644 --- a/pkl-cli/src/test/kotlin/org/pkl/cli/CliPackageDownloaderTest.kt +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliPackageDownloaderTest.kt @@ -109,7 +109,7 @@ class CliPackageDownloaderTest { packageUris = listOf( PackageUri( - "package://localhost:12110/birds@0.5.0::sha256:3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "package://localhost:12110/birds@0.5.0::sha256:0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" ), ), noTransitive = true @@ -140,7 +140,7 @@ class CliPackageDownloaderTest { """ Cannot download package `package://localhost:12110/birds@0.5.0` because the computed checksum for package metadata does not match the expected checksum. - Computed checksum: "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + Computed checksum: "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" Expected checksum: "intentionallyBogusChecksum" Asset URL: "https://localhost:12110/birds@0.5.0" """ @@ -204,7 +204,7 @@ class CliPackageDownloaderTest { Failed to download package://localhost:12110/badChecksum@1.0.0 because: Cannot download package `package://localhost:12110/badChecksum@1.0.0` because the computed checksum does not match the expected checksum. - Computed checksum: "0ec8a501e974802d0b71b8d58141e1e6eaa10bc2033e18200be3a978823d98aa" + Computed checksum: "a6bf858cdd1c09da475c2abe50525902580910ee5cc1ff624999170591bf8f69" Expected checksum: "intentionally bogus checksum" Asset URL: "https://localhost:12110/badChecksum@1.0.0/badChecksum@1.0.0.zip" diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectPackagerTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectPackagerTest.kt index 180f14ee3..c8056557e 100644 --- a/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectPackagerTest.kt +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectPackagerTest.kt @@ -248,7 +248,7 @@ class CliProjectPackagerTest { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } } @@ -915,7 +915,7 @@ class CliProjectPackagerTest { Package `package://localhost:12110/birds@0.5.0` was already published with different contents. Computed checksum: 7324e17214b6dcda63ebfb57d5a29b077af785c13bed0dc22b5138628a3f8d8f - Published checksum: 3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118 + Published checksum: 0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453 """ .trimIndent() ) diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectResolverTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectResolverTest.kt index 67abeab3a..3c1e97e30 100644 --- a/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectResolverTest.kt +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectResolverTest.kt @@ -102,14 +102,14 @@ class CliProjectResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/birds@0.5.0", "checksums": { - "sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" } }, "package://localhost:12110/fruit@1": { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } } @@ -157,14 +157,14 @@ class CliProjectResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/birds@0.5.0", "checksums": { - "sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" } }, "package://localhost:12110/fruit@1": { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } } @@ -255,14 +255,14 @@ class CliProjectResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/birds@0.5.0", "checksums": { - "sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" } }, "package://localhost:12110/fruit@1": { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.1.0", "checksums": { - "sha256": "98ad9fc407a79dc3fd5595e7a29c3803ade0a6957c18ec94b8a1624360b24f01" + "sha256": "a82e92e0c259591111d09d18a14f5ad66e2b6e13d827ee3e6f7ce06f5d0fbe0c" } }, "package://localhost:12110/package2@5": { @@ -337,14 +337,14 @@ class CliProjectResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/birds@0.5.0", "checksums": { - "sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" } }, "package://localhost:12110/fruit@1": { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } } @@ -420,14 +420,14 @@ class CliProjectResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/birds@0.5.0", "checksums": { - "sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" } }, "package://localhost:12110/fruit@1": { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } } @@ -445,7 +445,7 @@ class CliProjectResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.1.0", "checksums": { - "sha256": "98ad9fc407a79dc3fd5595e7a29c3803ade0a6957c18ec94b8a1624360b24f01" + "sha256": "a82e92e0c259591111d09d18a14f5ad66e2b6e13d827ee3e6f7ce06f5d0fbe0c" } } } diff --git a/pkl-commons-test/pkl-commons-test.gradle.kts b/pkl-commons-test/pkl-commons-test.gradle.kts index 19ffe9793..25e47634b 100644 --- a/pkl-commons-test/pkl-commons-test.gradle.kts +++ b/pkl-commons-test/pkl-commons-test.gradle.kts @@ -16,116 +16,113 @@ dependencies { runtimeOnly(projects.pklCerts) } - /** * Creates test packages from the `src/test/files/packages` directory. * * These packages are used by PackageServer to serve assets when running * LanguageSnippetTests and PackageResolversTest. */ -val createTestPackages = tasks.create("createTestPackages") - -fun toHex(hash: ByteArray): String { - val hexDigitTable = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f') - val builder = StringBuilder(hash.size * 2) - for (b in hash) { - builder.append(hexDigitTable[b.toInt() shr 4 and 0xF]) - builder.append(hexDigitTable[b.toInt() and 0xF]) - } - return builder.toString() -} +val createTestPackages by tasks.registering -fun File.computeChecksum(): String { - val md = MessageDigest.getInstance("SHA-256") - val hash = md.digest(readBytes()) - return toHex(hash) -} - -tasks.processResources { +tasks.test { dependsOn(createTestPackages) - dependsOn(generateCerts) + dependsOn(exportCerts) } -val mainSourceSet by sourceSets.named("main") { - resources { - srcDir(buildDir.resolve("test-packages/")) - srcDir(buildDir.resolve("keystore/")) - } -} - -val sourcesJar = tasks.named("sourcesJar").get() - for (packageDir in file("src/main/files/packages").listFiles()!!) { if (!packageDir.isDirectory) continue - val destinationDir = buildDir.resolve("test-packages/org/pkl/commons/test/packages/${packageDir.name}") - val metadataJson = packageDir.resolve("${packageDir.name}.json") + val destinationDir = file("build/test-packages/${packageDir.name}") + val metadataJson = file("$packageDir/${packageDir.name}.json") val packageContents = packageDir.resolve("package") val zipFileName = "${packageDir.name}.zip" val archiveFile = destinationDir.resolve(zipFileName) - tasks.create("zip-${packageDir.name}", Zip::class) { + val zipTask = tasks.register("zip-${packageDir.name}", Zip::class) { + destinationDirectory.set(destinationDir) archiveFileName.set(zipFileName) from(packageContents) - destinationDirectory.set(destinationDir) // required so that checksums are reproducible isPreserveFileTimestamps = false isReproducibleFileOrder = true } - val copyTask = tasks.create("copy-${packageDir.name}", Copy::class) { - dependsOn("zip-${packageDir.name}") + val copyTask = tasks.register("copy-${packageDir.name}", Copy::class) { + dependsOn(zipTask) from(metadataJson) into(destinationDir) val shasumFile = file("$destinationDir/${packageDir.name}.json.sha256") outputs.file(shasumFile) - doFirst { - expand(mapOf("computedChecksum" to archiveFile.computeChecksum())) + filter { line -> + line.replaceFirst("\$computedChecksum", archiveFile.computeChecksum()) } doLast { - val outputFile = file("$destinationDir").resolve("${packageDir.name}.json") + val outputFile = destinationDir.resolve("${packageDir.name}.json") shasumFile.writeText(outputFile.computeChecksum()) } - createTestPackages.dependsOn(this) } - sourcesJar.dependsOn.add(copyTask) + createTestPackages.configure { + dependsOn(copyTask) + } } +val keystoreDir = file("build/keystore") +val keystoreName = "localhost.p12" +val certsFileName = "localhost.pem" + val generateKeys by tasks.registering(JavaExec::class) { - val outputFile = file("$buildDir/keystore/localhost.p12") + val outputFile = file("$keystoreDir/$keystoreName") outputs.file(outputFile) mainClass.set("sun.security.tools.keytool.Main") args = listOf( "-genkeypair", "-keyalg", "RSA", "-alias", "integ_tests", - "-keystore", "localhost.p12", + "-keystore", keystoreName, "-storepass", "password", "-dname", "CN=localhost" ) - workingDir = file("$buildDir/keystore/") - onlyIf { !outputFile.exists() } + workingDir = keystoreDir doFirst { workingDir.mkdirs() + outputFile.delete() } } -val generateCerts by tasks.registering(JavaExec::class) { - dependsOn("generateKeys") - val outputFile = file("$buildDir/keystore/localhost.pem") +val exportCerts by tasks.registering(JavaExec::class) { + val outputFile = file("$keystoreDir/$certsFileName") + dependsOn(generateKeys) + inputs.file("$keystoreDir/$keystoreName") outputs.file(outputFile) mainClass.set("sun.security.tools.keytool.Main") args = listOf( "-exportcert", "-alias", "integ_tests", "-storepass", "password", - "-keystore", "localhost.p12", + "-keystore", keystoreName, "-rfc", - "-file", "localhost.pem" + "-file", certsFileName ) - workingDir = file("$buildDir/keystore/") - onlyIf { !outputFile.exists() } + workingDir = keystoreDir doFirst { workingDir.mkdirs() + outputFile.delete() } } + +fun toHex(hash: ByteArray): String { + val hexDigitTable = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f') + val builder = StringBuilder(hash.size * 2) + for (b in hash) { + builder.append(hexDigitTable[b.toInt() shr 4 and 0xF]) + builder.append(hexDigitTable[b.toInt() and 0xF]) + } + return builder.toString() +} + +fun File.computeChecksum(): String { + val md = MessageDigest.getInstance("SHA-256") + val hash = md.digest(readBytes()) + return toHex(hash) +} + diff --git a/pkl-commons-test/src/main/files/packages/birds@0.5.0/birds@0.5.0.json b/pkl-commons-test/src/main/files/packages/birds@0.5.0/birds@0.5.0.json index 8d734c849..2c8e52b5c 100644 --- a/pkl-commons-test/src/main/files/packages/birds@0.5.0/birds@0.5.0.json +++ b/pkl-commons-test/src/main/files/packages/birds@0.5.0/birds@0.5.0.json @@ -7,7 +7,7 @@ "fruities": { "uri": "package://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } }, diff --git a/pkl-commons-test/src/main/kotlin/org/pkl/commons/test/PackageServer.kt b/pkl-commons-test/src/main/kotlin/org/pkl/commons/test/PackageServer.kt index e7f0755e3..e3cc5690a 100644 --- a/pkl-commons-test/src/main/kotlin/org/pkl/commons/test/PackageServer.kt +++ b/pkl-commons-test/src/main/kotlin/org/pkl/commons/test/PackageServer.kt @@ -22,6 +22,7 @@ import java.security.KeyStore import java.util.concurrent.Executors import javax.net.ssl.KeyManagerFactory import javax.net.ssl.SSLContext +import kotlin.io.path.inputStream import kotlin.io.path.isRegularFile import org.pkl.commons.createParentDirectories import org.pkl.commons.deleteRecursively @@ -66,26 +67,20 @@ class PackageServer : AutoCloseable { // Modified by RequestRewritingClient if testPort is set. private const val PORT = 12110 - // When tests are run via Gradle (i.e. from ./gradlew check), resources are packaged into a jar. - // When run directly in IntelliJ, resources are just directories. - private val packagesDir: Path by lazy { - val uri = PackageServer::class.java.getResource("packages")!!.toURI() - try { - Path.of(uri) - } catch (e: FileSystemNotFoundException) { - FileSystems.newFileSystem(uri, mapOf()) - Path.of(uri) - } - } + private val packagesDir: Path = + FileTestUtils.rootProjectDir.resolve("pkl-commons-test/build/test-packages") private val simpleHttpsConfigurator by lazy { val sslContext = SSLContext.getInstance("SSL").apply { val pass = "password".toCharArray() - val keystore = PackageServer::class.java.getResource("/localhost.p12")!! - val ks = KeyStore.getInstance("PKCS12").apply { load(keystore.openStream(), pass) } - val kmf = KeyManagerFactory.getInstance("SunX509").apply { init(ks, pass) } - init(kmf.keyManagers, null, null) + val keystore = + FileTestUtils.rootProjectDir.resolve("pkl-commons-test/build/keystore/localhost.p12") + keystore.inputStream().use { stream -> + val ks = KeyStore.getInstance("PKCS12").apply { load(stream, pass) } + val kmf = KeyManagerFactory.getInstance("SunX509").apply { init(ks, pass) } + init(kmf.keyManagers, null, null) + } } val engine = sslContext.createSSLEngine() object : HttpsConfigurator(sslContext) { diff --git a/pkl-core/pkl-core.gradle.kts b/pkl-core/pkl-core.gradle.kts index d2f117b73..532768c31 100644 --- a/pkl-core/pkl-core.gradle.kts +++ b/pkl-core/pkl-core.gradle.kts @@ -129,7 +129,7 @@ tasks.processResources { include("*.pkl") exclude("doc-package-info.pkl") }.map { "pkl:" + it.nameWithoutExtension } - .sortedBy { it.toLowerCase() } + .sortedBy { it.lowercase() } filter("tokens" to mapOf( "version" to buildInfo.pklVersion, @@ -282,7 +282,7 @@ tasks.testNative { tasks.clean { delete("generated/") - delete("$buildDir/test-packages") + delete("build/test-packages") } spotless { diff --git a/pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/PklProject.deps.json b/pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/PklProject.deps.json index 4df96deaf..2d73ff81f 100644 --- a/pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/PklProject.deps.json +++ b/pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/PklProject.deps.json @@ -5,7 +5,7 @@ "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.0.5", "checksums": { - "sha256": "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + "sha256": "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" } } } diff --git a/pkl-core/src/test/kotlin/org/pkl/core/packages/PackageResolversTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/packages/PackageResolversTest.kt index 79cc00f45..ecd67a457 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/packages/PackageResolversTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/packages/PackageResolversTest.kt @@ -181,7 +181,7 @@ class PackageResolversTest { null) } assertThat(error).hasMessageContaining(""" - Computed checksum: "0ec8a501e974802d0b71b8d58141e1e6eaa10bc2033e18200be3a978823d98aa" + Computed checksum: "a6bf858cdd1c09da475c2abe50525902580910ee5cc1ff624999170591bf8f69" Expected checksum: "intentionally bogus checksum" """.trimIndent()) } diff --git a/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectDependenciesResolverTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectDependenciesResolverTest.kt index bea064f0d..483187819 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectDependenciesResolverTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectDependenciesResolverTest.kt @@ -50,14 +50,14 @@ class ProjectDependenciesResolverTest { "type": "remote", "uri": "projectpackage://localhost:12110/birds@0.5.0", "checksums": { - "sha256": "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + "sha256": "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" } }, "package://localhost:12110/fruit@1": { "type": "remote", "uri": "projectpackage://localhost:12110/fruit@1.1.0", "checksums": { - "sha256": "98ad9fc407a79dc3fd5595e7a29c3803ade0a6957c18ec94b8a1624360b24f01" + "sha256": "a82e92e0c259591111d09d18a14f5ad66e2b6e13d827ee3e6f7ce06f5d0fbe0c" } }, "package://localhost:12110/project3@1": { @@ -81,7 +81,7 @@ class ProjectDependenciesResolverTest { assertThat(e).hasMessage(""" Computed checksum did not match declared checksum for dependency `package://localhost:12110/birds@0.5.0`. - Computed: "3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118" + Computed: "0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453" Declared: "intentionally bogus value" """.trimIndent()) } diff --git a/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectTest.kt index 304216980..690fc57dd 100644 --- a/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectTest.kt +++ b/pkl-core/src/test/kotlin/org/pkl/core/project/ProjectTest.kt @@ -153,7 +153,7 @@ class ProjectTest { –– Pkl Error –– Cannot download package `package://localhost:12110/fruit@1.0.5` because the computed checksum for package metadata does not match the expected checksum. - Computed checksum: "b4ea243de781feeab7921227591e6584db5d0673340f30fab2ffe8ad5c9f75f5" + Computed checksum: "abd173e8a25f5b930b0e34269a441e32c9d95e0b0a715bc6eff918f0afd0688e" Expected checksum: "intentionally bogus checksum" Asset URL: "https://localhost:12110/fruit@1.0.5" diff --git a/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/birds/0.5.0/index.html b/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/birds/0.5.0/index.html index d9897f86a..a59b13c1c 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/birds/0.5.0/index.html +++ b/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/birds/0.5.0/index.html @@ -39,7 +39,7 @@

localhost:12110/birds0
Dependencies:
fruit:1.0.5, pkl:0.24.0
Checksum:
-
3f19ab9fcee2f44f93a75a09e531db278c6d2cd25206836c8c2c4071cd7d3118
+
0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453
diff --git a/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/fruit/1.1.0/index.html b/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/fruit/1.1.0/index.html index ce6610046..bbed1aba2 100644 --- a/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/fruit/1.1.0/index.html +++ b/pkl-doc/src/test/files/DocGeneratorTest/output/localhost:12110/fruit/1.1.0/index.html @@ -39,7 +39,7 @@

localhost:12110/fruit1
Dependencies:
pkl:0.24.0
Checksum:
-
98ad9fc407a79dc3fd5595e7a29c3803ade0a6957c18ec94b8a1624360b24f01
+
a82e92e0c259591111d09d18a14f5ad66e2b6e13d827ee3e6f7ce06f5d0fbe0c
diff --git a/pkl-gradle/pkl-gradle.gradle.kts b/pkl-gradle/pkl-gradle.gradle.kts index 24a5d719c..5412031c0 100644 --- a/pkl-gradle/pkl-gradle.gradle.kts +++ b/pkl-gradle/pkl-gradle.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.kotlin.utils.keysToMap - plugins { pklAllProjects pklJavaLibrary @@ -71,3 +69,29 @@ signing { } } } + +tasks.compileTestKotlin { + // Work around a conflict between Pkl's and Gradle's + // Kotlin dependencies on the test compile class path. + // + // My preferred solution would be to clean up the test + // compile class path to no longer contain a Gradle distribution. + // However, my Gradle knowledge proved insufficient to accomplish this. + // + // Another potential workaround is to port plugin tests to Java. + // (If the plugin was written in Kotlin, its compilation would + // currently fail with the same error.) + kotlinOptions { + freeCompilerArgs += "-Xskip-metadata-version-check" + } +} + +// for debugging +val printCompileClasspath by tasks.registering { + doLast { println(configurations.compileClasspath.get().files) } +} + +// for debugging +val printTestCompileClasspath by tasks.registering { + doLast { println(configurations.testCompileClasspath.get().files) } +} diff --git a/pkl-gradle/src/test/kotlin/org/pkl/gradle/AbstractTest.kt b/pkl-gradle/src/test/kotlin/org/pkl/gradle/AbstractTest.kt index 59c3ed12c..f0fa276f6 100644 --- a/pkl-gradle/src/test/kotlin/org/pkl/gradle/AbstractTest.kt +++ b/pkl-gradle/src/test/kotlin/org/pkl/gradle/AbstractTest.kt @@ -28,7 +28,7 @@ abstract class AbstractTest { .withProjectDir(testProjectDir.toFile()) .withArguments("--stacktrace", "--no-build-cache", taskName) .withPluginClasspath() - .withDebug(true) + //.withDebug(true) if (gradleVersion != null) { runner.withGradleVersion(gradleVersion) diff --git a/stdlib/stdlib.gradle.kts b/stdlib/stdlib.gradle.kts index 6ae89e393..48cd0b156 100644 --- a/stdlib/stdlib.gradle.kts +++ b/stdlib/stdlib.gradle.kts @@ -10,7 +10,7 @@ plugins { // create and publish a self-contained stdlib archive // purpose is to provide non-jvm tools/projects with a versioned stdlib val stdlibZip by tasks.registering(Zip::class) { - destinationDirectory.set(file("$buildDir/libs")) + destinationDirectory.set(file("build/libs")) archiveBaseName.set("pkl-stdlib") archiveVersion.set(project.version as String) into("org/pkl/stdlib") {