diff --git a/build.gradle.kts b/build.gradle.kts index 57fda841..4908f803 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,19 +1,23 @@ -import com.gradle.publish.* -import kotlinx.validation.build.* -import org.jetbrains.kotlin.gradle.tasks.* +import kotlinx.validation.build.mavenCentralMetadata +import kotlinx.validation.build.mavenRepositoryPublishing +import kotlinx.validation.build.signPublicationIfKeyPresent +import org.gradle.api.attributes.TestSuiteType.FUNCTIONAL_TEST +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { kotlin("jvm") `java-gradle-plugin` - id("com.gradle.plugin-publish") apply false + id("com.gradle.plugin-publish") + kotlinx.validation.build.conventions.`java-base` signing `maven-publish` + `jvm-test-suite` } -repositories { - mavenCentral() - gradlePluginPortal() - google() +group = "org.jetbrains.kotlinx" +providers.gradleProperty("DeployVersion").orNull?.let { + version = it } sourceSets { @@ -22,21 +26,6 @@ sourceSets { } } -sourceSets { - create("functionalTest") { - withConvention(org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet::class) { - } - compileClasspath += sourceSets.main.get().output + configurations.testRuntimeClasspath - runtimeClasspath += output + compileClasspath - } -} - -tasks.register("functionalTest") { - testClassesDirs = sourceSets["functionalTest"].output.classesDirs - classpath = sourceSets["functionalTest"].runtimeClasspath -} -tasks.check { dependsOn(tasks["functionalTest"]) } - // While gradle testkit supports injection of the plugin classpath it doesn't allow using dependency notation // to determine the actual runtime classpath for the plugin. It uses isolation, so plugins applied by the build // script are not visible in the plugin classloader. This means optional dependencies (dependent on applied plugins - @@ -44,7 +33,11 @@ tasks.check { dependsOn(tasks["functionalTest"]) } // extending the classpath. It is based upon: https://docs.gradle.org/6.0/userguide/test_kit.html#sub:test-kit-classpath-injection // Create a configuration to register the dependencies against -val testPluginRuntimeConfiguration = configurations.register("testPluginRuntime") +val testPluginRuntimeConfiguration = configurations.create("testPluginRuntime") { + isCanBeConsumed = false + isCanBeResolved = true + isVisible = false +} // The task that will create a file that stores the classpath needed for the plugin to have additional runtime dependencies // This file is then used in to tell TestKit which classpath to use. @@ -58,14 +51,11 @@ val createClasspathManifest = tasks.register("createClasspathManifest") { .withPropertyName("outputDir") doLast { - outputDir.mkdirs() - file(outputDir.resolve("plugin-classpath.txt")).writeText(testPluginRuntimeConfiguration.get().joinToString("\n")) + file(outputDir.resolve("plugin-classpath.txt")) + .writeText(testPluginRuntimeConfiguration.joinToString("\n")) } } -val kotlinVersion: String by project -val androidGradlePluginVersion: String = "7.2.2" - configurations.implementation { exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7") @@ -74,95 +64,137 @@ configurations.implementation { dependencies { implementation(gradleApi()) - implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.0") - implementation("org.ow2.asm:asm:9.2") - implementation("org.ow2.asm:asm-tree:9.2") - implementation("com.googlecode.java-diff-utils:diffutils:1.3.0") - compileOnly("org.jetbrains.kotlin.multiplatform:org.jetbrains.kotlin.multiplatform.gradle.plugin:1.8.10") -// compileOnly("com.android.tools.build:gradle:${androidGradlePluginVersion}") + implementation(libs.kotlinx.metadata) + implementation(libs.ow2.asm) + implementation(libs.ow2.asmTree) + implementation(libs.javaDiffUtils) + compileOnly(libs.gradlePlugin.kotlin) + + // Android support is not yet implemented https://github.com/Kotlin/binary-compatibility-validator/issues/94 + //compileOnly(libs.gradlePlugin.android) // The test needs the full kotlin multiplatform plugin loaded as it has no visibility of previously loaded plugins, // unlike the regular way gradle loads plugins. - add(testPluginRuntimeConfiguration.name, "org.jetbrains.kotlin.multiplatform:org.jetbrains.kotlin.multiplatform.gradle.plugin:$kotlinVersion") - add(testPluginRuntimeConfiguration.name, "com.android.tools.build:gradle:${androidGradlePluginVersion}") - - testImplementation(kotlin("test-junit")) - "functionalTestImplementation"(files(createClasspathManifest)) - - "functionalTestImplementation"("org.assertj:assertj-core:3.18.1") - "functionalTestImplementation"(gradleTestKit()) - "functionalTestImplementation"(kotlin("test-junit")) + testPluginRuntimeConfiguration(libs.gradlePlugin.android) + testPluginRuntimeConfiguration(libs.gradlePlugin.kotlin) } tasks.compileKotlin { - kotlinOptions.apply { - allWarningsAsErrors = true - - languageVersion = "1.4" - apiVersion = "1.4" - jvmTarget = "1.8" - + compilerOptions { + allWarningsAsErrors.set(true) + @Suppress("DEPRECATION") // Compatibility with Gradle 7 requires Kotlin 1.4 + languageVersion.set(KotlinVersion.KOTLIN_1_4) + apiVersion.set(languageVersion) + jvmTarget.set(JvmTarget.JVM_1_8) // Suppressing "w: Language version 1.4 is deprecated and its support will be removed" message // because LV=1.4 in practice is mandatory as it is a default language version in Gradle 7.0+ for users' kts scripts. - freeCompilerArgs += "-Xsuppress-version-warnings" + freeCompilerArgs.addAll( + "-Xsuppress-version-warnings" + ) } } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + withJavadocJar() + withSourcesJar() + toolchain { + languageVersion.set(JavaLanguageVersion.of(8)) + } } -tasks { - compileTestKotlin { - kotlinOptions { - languageVersion = "1.6" - } - } - test { - systemProperty("overwrite.output", System.getProperty("overwrite.output", "false")) - systemProperty("testCasesClassesDirs", sourceSets.test.get().output.classesDirs.asPath) - jvmArgs("-ea") +tasks.compileTestKotlin { + compilerOptions { + languageVersion.set(KotlinVersion.KOTLIN_1_6) } } -properties["DeployVersion"]?.let { version = it } +tasks.withType().configureEach { + systemProperty("overwrite.output", System.getProperty("overwrite.output", "false")) + systemProperty("testCasesClassesDirs", sourceSets.test.get().output.classesDirs.asPath) + jvmArgs("-ea") +} publishing { publications { create("maven") { from(components["java"]) - mavenCentralMetadata() - mavenCentralArtifacts(project, project.sourceSets.main.get().allSource) + artifact(tasks.javadocJar) + artifact(tasks.sourcesJar) } mavenRepositoryPublishing(project) mavenCentralMetadata() } - publications.withType(MavenPublication::class).all { + publications.withType().all { signPublicationIfKeyPresent(this) } -} -apply(plugin = "org.gradle.java-gradle-plugin") -apply(plugin = "com.gradle.plugin-publish") - -extensions.getByType(PluginBundleExtension::class).apply { - website = "https://github.com/Kotlin/binary-compatibility-validator" - vcsUrl = "https://github.com/Kotlin/binary-compatibility-validator" - tags = listOf("kotlin", "api-management", "binary-compatibility") + // a publication will be created automatically by com.gradle.plugin-publish } +@Suppress("UnstableApiUsage") gradlePlugin { - testSourceSets(sourceSets["functionalTest"]) + website.set("https://github.com/Kotlin/binary-compatibility-validator") + vcsUrl.set("https://github.com/Kotlin/binary-compatibility-validator") + + plugins.configureEach { + tags.addAll("kotlin", "api-management", "binary-compatibility") + } plugins { create("binary-compatibility-validator") { id = "org.jetbrains.kotlinx.binary-compatibility-validator" implementationClass = "kotlinx.validation.BinaryCompatibilityValidatorPlugin" displayName = "Binary compatibility validator" - description = "Produces binary API dumps and compares them in order to verify that binary API is preserved" + description = + "Produces binary API dumps and compares them in order to verify that binary API is preserved" } } } + +@Suppress("UnstableApiUsage") +testing { + suites { + withType().configureEach { + useJUnit() + dependencies { + implementation(project()) + implementation(libs.assertJ.core) + implementation(libs.kotlin.test) + } + } + + val test by getting(JvmTestSuite::class) { + description = "Regular unit tests" + } + + val functionalTest by creating(JvmTestSuite::class) { + testType.set(FUNCTIONAL_TEST) + description = "Functional Plugin tests using Gradle TestKit" + + dependencies { + implementation(files(createClasspathManifest)) + + implementation(gradleApi()) + implementation(gradleTestKit()) + } + + targets.configureEach { + testTask.configure { + shouldRunAfter(test) + } + } + } + + gradlePlugin.testSourceSets(functionalTest.sources) + + tasks.check { + dependsOn(functionalTest) + } + } +} + +tasks.withType().configureEach { + onlyIf("only sign if signatory is present") { signatory?.keyId != null } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 4d776fc5..08cd884b 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -3,45 +3,20 @@ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ -import org.jetbrains.kotlin.gradle.plugin.* +import java.util.Properties import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.util.* plugins { `kotlin-dsl` } -repositories { - jcenter() -} - -val props = Properties().apply { - project.file("../gradle.properties").inputStream().use { load(it) } -} - -val kotlinVersion: String = props.getProperty("kotlinVersion") - dependencies { - implementation(kotlin("gradle-plugin-api", kotlinVersion)) -} - -sourceSets["main"].withConvention(KotlinSourceSet::class) { kotlin.srcDirs("src") } - -kotlinDslPluginOptions { - experimentalWarning.set(false) + implementation(libs.gradlePlugin.kotlin) + implementation(libs.gradlePlugin.pluginPublishing) } tasks.withType().configureEach { - kotlinOptions.apply { + kotlinOptions { allWarningsAsErrors = true - apiVersion = "1.3" - freeCompilerArgs += "-Xskip-runtime-version-check" } } - -// Silence the following warning: -// 'compileJava' task (current target is 17) and 'compileKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version. -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} \ No newline at end of file diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 00000000..a53be96e --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,31 @@ +/* + * Copyright 2016-2023 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ +import org.gradle.api.initialization.resolve.RepositoriesMode.PREFER_SETTINGS + +rootProject.name = "buildSrc" + +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + } +} + +@Suppress("UnstableApiUsage") +dependencyResolutionManagement { + + repositoriesMode.set(PREFER_SETTINGS) + + repositories { + mavenCentral() + gradlePluginPortal() + } + + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} diff --git a/buildSrc/src/MavenCentralMetadata.kt b/buildSrc/src/main/kotlin/MavenCentralMetadata.kt similarity index 64% rename from buildSrc/src/MavenCentralMetadata.kt rename to buildSrc/src/main/kotlin/MavenCentralMetadata.kt index 379b0b63..771aaecb 100644 --- a/buildSrc/src/MavenCentralMetadata.kt +++ b/buildSrc/src/main/kotlin/MavenCentralMetadata.kt @@ -1,16 +1,12 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. + * Copyright 2016-2023 JetBrains s.r.o. * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ - package kotlinx.validation.build -import org.gradle.api.* -import org.gradle.api.file.* -import org.gradle.api.publish.* -import org.gradle.api.publish.maven.* -import org.gradle.jvm.tasks.* -import org.gradle.kotlin.dsl.* +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.kotlin.dsl.withType fun PublishingExtension.mavenCentralMetadata() { publications.withType(MavenPublication::class) { @@ -41,16 +37,3 @@ fun PublishingExtension.mavenCentralMetadata() { } } } - -fun MavenPublication.mavenCentralArtifacts(project: Project, sources: SourceDirectorySet) { - val sourcesJar by project.tasks.creating(Jar::class) { - archiveClassifier.set("sources") - from(sources) - } - val javadocJar by project.tasks.creating(Jar::class) { - archiveClassifier.set("javadoc") - // contents are deliberately left empty - } - artifact(sourcesJar) - artifact(javadocJar) -} diff --git a/buildSrc/src/Publishing.kt b/buildSrc/src/main/kotlin/Publishing.kt similarity index 100% rename from buildSrc/src/Publishing.kt rename to buildSrc/src/main/kotlin/Publishing.kt diff --git a/buildSrc/src/main/kotlin/conventions/base.gradle.kts b/buildSrc/src/main/kotlin/conventions/base.gradle.kts new file mode 100644 index 00000000..232dc36f --- /dev/null +++ b/buildSrc/src/main/kotlin/conventions/base.gradle.kts @@ -0,0 +1,32 @@ +/* + * Copyright 2016-2023 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ +package kotlinx.validation.build.conventions + +import java.time.Duration + +plugins { + base +} + +// common config for all projects + +if (project != rootProject) { + project.version = rootProject.version + project.group = rootProject.group +} + +tasks.withType().configureEach { + // https://docs.gradle.org/current/userguide/working_with_files.html#sec:reproducible_archives + isPreserveFileTimestamps = false + isReproducibleFileOrder = true +} + +tasks.withType().configureEach { + timeout.set(Duration.ofMinutes(60)) +} + +tasks.withType().configureEach { + includeEmptyDirs = false +} diff --git a/buildSrc/src/main/kotlin/conventions/java-base.gradle.kts b/buildSrc/src/main/kotlin/conventions/java-base.gradle.kts new file mode 100644 index 00000000..006a8c1b --- /dev/null +++ b/buildSrc/src/main/kotlin/conventions/java-base.gradle.kts @@ -0,0 +1,22 @@ +/* + * Copyright 2016-2023 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ +package kotlinx.validation.build.conventions + +plugins { + id("kotlinx.validation.build.conventions.base") + `java` +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(8)) + } + withSourcesJar() + withJavadocJar() +} + +tasks.withType().configureEach { + useJUnit() +} diff --git a/gradle.properties b/gradle.properties index 9b9e38d3..b6f07ba7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,3 @@ version=0.13.1-SNAPSHOT -group=org.jetbrains.kotlinx - -kotlinVersion=1.8.10 -pluginPublishVersion=0.10.1 kotlin.stdlib.default.dependency=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..db91a5e2 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,40 @@ +[versions] + +kotlin = "1.8.10" + +javaDiffUtils = "4.12" +junit = "5.9.2" +kotest = "5.5.5" +kotlinx-bcv = "0.13.0" +ow2Asm = "9.2" + +gradlePluginPublishPlugin = "1.1.0" +androidGradlePlugin = "7.2.2" + +[libraries] + +## region Application libraries +kotlinx-metadata = { module = "org.jetbrains.kotlinx:kotlinx-metadata-jvm", version = "0.6.0" } + +javaDiffUtils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "javaDiffUtils" } + +ow2-asm = { module = "org.ow2.asm:asm", version.ref = "ow2Asm" } +ow2-asmTree = { module = "org.ow2.asm:asm-tree", version.ref = "ow2Asm" } +## endregion + + +## region Test libraries +junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } +junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } + +assertJ-core = { module = "org.assertj:assertj-core", version = "3.18.1" } + +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } +## endregion + + +## region Gradle Plugins +gradlePlugin-pluginPublishing = { module = "com.gradle.publish:plugin-publish-plugin", version.ref = "gradlePluginPublishPlugin" } +gradlePlugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +gradlePlugin-android = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" } +## endregion diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c0..ccebba77 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 92f06b50..bdc9a83b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0c..79a61d42 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (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 +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +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. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi 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. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +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=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=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# 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. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + 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. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 107acd32..6689b85b 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "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. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -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. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="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 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +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. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +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. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +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! +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 + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts index 09a3a356..e822cdb7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,17 +1,26 @@ +/* + * Copyright 2016-2023 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ +import org.gradle.api.initialization.resolve.RepositoriesMode.PREFER_SETTINGS + rootProject.name = "binary-compatibility-validator" pluginManagement { - resolutionStrategy { - val kotlinVersion: String by settings - val pluginPublishVersion: String by settings - eachPlugin { - if (requested.id.namespace?.startsWith("org.jetbrains.kotlin") == true) { - useVersion(kotlinVersion) - } - if (requested.id.id == "com.gradle.plugin-publish") { - useVersion(pluginPublishVersion) - } - } + repositories { + gradlePluginPortal() + mavenCentral() + } +} + +@Suppress("UnstableApiUsage") +dependencyResolutionManagement { + + repositoriesMode.set(PREFER_SETTINGS) + + repositories { + mavenCentral() + google() } } diff --git a/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt b/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt index f47f3034..0b8d8c63 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt @@ -5,9 +5,10 @@ package kotlinx.validation.api -import kotlinx.validation.API_DIR -import org.gradle.testkit.runner.* import java.io.* +import kotlinx.validation.API_DIR +import org.gradle.testkit.runner.GradleRunner +import org.intellij.lang.annotations.Language internal fun BaseKotlinGradleTest.test(fn: BaseKotlinScope.() -> Unit): GradleRunner { val baseKotlinScope = BaseKotlinScope() @@ -30,6 +31,7 @@ internal fun BaseKotlinGradleTest.test(fn: BaseKotlinScope.() -> Unit): GradleRu .withProjectDir(rootProjectDir) .withPluginClasspath() .withArguments(baseKotlinScope.runner.arguments) + .withGradleVersion("7.4.2") .addPluginTestRuntimeClasspath() // disabled because of: https://github.com/gradle/gradle/issues/6862 // .withDebug(baseKotlinScope.runner.debug) @@ -38,7 +40,11 @@ internal fun BaseKotlinGradleTest.test(fn: BaseKotlinScope.() -> Unit): GradleRu /** * same as [file][FileContainer.file], but prepends "src/${sourceSet}/kotlin" before given `classFileName` */ -internal fun FileContainer.kotlin(classFileName: String, sourceSet:String = "main", fn: AppendableScope.() -> Unit) { +internal fun FileContainer.kotlin( + classFileName: String, + sourceSet: String = "main", + fn: AppendableScope.() -> Unit, +) { require(classFileName.endsWith(".kt")) { "ClassFileName must end with '.kt'" } @@ -50,7 +56,11 @@ internal fun FileContainer.kotlin(classFileName: String, sourceSet:String = "mai /** * same as [file][FileContainer.file], but prepends "src/${sourceSet}/java" before given `classFileName` */ -internal fun FileContainer.java(classFileName: String, sourceSet:String = "main", fn: AppendableScope.() -> Unit) { +internal fun FileContainer.java( + classFileName: String, + sourceSet: String = "main", + fn: AppendableScope.() -> Unit, +) { require(classFileName.endsWith(".java")) { "ClassFileName must end with '.java'" } @@ -110,7 +120,7 @@ internal fun BaseKotlinScope.runner(fn: Runner.() -> Unit) { this.runner = runner } -internal fun AppendableScope.resolve(fileName: String) { +internal fun AppendableScope.resolve(@Language("file-reference") fileName: String) { this.files.add(fileName) } @@ -132,7 +142,7 @@ internal class BaseKotlinScope : FileContainer { internal class DirectoryScope( val dirPath: String, val parent: FileContainer -): FileContainer { +) : FileContainer { override fun file(fileName: String, fn: AppendableScope.() -> Unit) { parent.file("$dirPath/$fileName", fn) @@ -147,8 +157,8 @@ internal class Runner { val arguments: MutableList = mutableListOf("--configuration-cache") } -internal fun readFileList(fileName: String): String { - val resource = BaseKotlinGradleTest::class.java.classLoader.getResource(fileName) +internal fun readFileList(@Language("file-reference") fileName: String): String { + val resource = BaseKotlinGradleTest::class.java.getResource(fileName) ?: throw IllegalStateException("Could not find resource '$fileName'") return File(resource.toURI()).readText() } diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/AndroidLibraryTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/AndroidLibraryTest.kt index 736649e6..884c4c38 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/AndroidLibraryTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/AndroidLibraryTest.kt @@ -86,33 +86,33 @@ internal class AndroidLibraryTest : BaseKotlinGradleTest() { */ private fun BaseKotlinScope.createProjectWithSubModules() { settingsGradleKts { - resolve("examples/gradle/settings/settings-android-project.gradle.kts") + resolve("/examples/gradle/settings/settings-android-project.gradle.kts") } buildGradleKts { - resolve("examples/gradle/base/androidProjectRoot.gradle.kts") + resolve("/examples/gradle/base/androidProjectRoot.gradle.kts") } initLocalProperties() dir("kotlin-library") { buildGradleKts { - resolve("examples/gradle/base/androidKotlinLibrary.gradle.kts") + resolve("/examples/gradle/base/androidKotlinLibrary.gradle.kts") } kotlin("KotlinLib.kt") { - resolve("examples/classes/KotlinLib.kt") + resolve("/examples/classes/KotlinLib.kt") } apiFile(projectName = "kotlin-library") { - resolve("examples/classes/KotlinLib.dump") + resolve("/examples/classes/KotlinLib.dump") } } dir("java-library") { buildGradleKts { - resolve("examples/gradle/base/androidJavaLibrary.gradle.kts") + resolve("/examples/gradle/base/androidJavaLibrary.gradle.kts") } java("JavaLib.java") { - resolve("examples/classes/JavaLib.java") + resolve("/examples/classes/JavaLib.java") } apiFile(projectName = "java-library") { - resolve("examples/classes/JavaLib.dump") + resolve("/examples/classes/JavaLib.dump") } } } diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/DefaultConfigTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/DefaultConfigTests.kt index b286f995..97886950 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/DefaultConfigTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/DefaultConfigTests.kt @@ -16,7 +16,7 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiCheck should fail, when there is no api directory, even if there are no Kotlin sources`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } runner { arguments.add(":apiCheck") @@ -33,7 +33,7 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `check should fail, when there is no api directory, even if there are no Kotlin sources`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } runner { @@ -51,7 +51,7 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiCheck should succeed, when api-File is empty, but no kotlin files are included in SourceSet`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } emptyApiFile(projectName = rootProjectDir.name) @@ -70,13 +70,13 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiCheck should succeed when public classes match api file`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } kotlin("AnotherBuildConfig.kt") { - resolve("examples/classes/AnotherBuildConfig.kt") + resolve("/examples/classes/AnotherBuildConfig.kt") } apiFile(projectName = rootProjectDir.name) { - resolve("examples/classes/AnotherBuildConfig.dump") + resolve("/examples/classes/AnotherBuildConfig.dump") } runner { @@ -93,13 +93,13 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiCheck should succeed when public classes match api file ignoring case`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } kotlin("AnotherBuildConfig.kt") { - resolve("examples/classes/AnotherBuildConfig.kt") + resolve("/examples/classes/AnotherBuildConfig.kt") } apiFile(projectName = rootProjectDir.name.uppercase()) { - resolve("examples/classes/AnotherBuildConfig.dump") + resolve("/examples/classes/AnotherBuildConfig.dump") } runner { @@ -116,11 +116,11 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiCheck should fail, when a public class is not in api-File`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } kotlin("BuildConfig.kt") { - resolve("examples/classes/BuildConfig.kt") + resolve("/examples/classes/BuildConfig.kt") } emptyApiFile(projectName = rootProjectDir.name) @@ -148,7 +148,7 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiDump should create empty api file when there are no Kotlin sources`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } runner { @@ -169,10 +169,10 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiDump should create api file with the name of the project, respecting settings file`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } settingsGradleKts { - resolve("examples/gradle/settings/settings-name-testproject.gradle.kts") + resolve("/examples/gradle/settings/settings-name-testproject.gradle.kts") } runner { @@ -197,10 +197,10 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiDump should dump public classes`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } kotlin("AnotherBuildConfig.kt") { - resolve("examples/classes/AnotherBuildConfig.kt") + resolve("/examples/classes/AnotherBuildConfig.kt") } runner { @@ -213,7 +213,7 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { assertTrue(rootProjectApiDump.exists(), "api dump file should exist") - val expected = readFileList("examples/classes/AnotherBuildConfig.dump") + val expected = readFileList("/examples/classes/AnotherBuildConfig.dump") Assertions.assertThat(rootProjectApiDump.readText()).isEqualToIgnoringNewLines(expected) } } @@ -222,7 +222,7 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() { fun `apiCheck should be run when we run check`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } emptyApiFile(projectName = rootProjectDir.name) diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/IgnoredClassesTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/IgnoredClassesTests.kt index 492d8d76..5ccfee54 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/IgnoredClassesTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/IgnoredClassesTests.kt @@ -24,12 +24,12 @@ internal class IgnoredClassesTests : BaseKotlinGradleTest() { fun `apiCheck should succeed, when given class is not in api-File, but is ignored via ignoredClasses`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts") } kotlin("BuildConfig.kt") { - resolve("examples/classes/BuildConfig.kt") + resolve("/examples/classes/BuildConfig.kt") } emptyApiFile(projectName = rootProjectDir.name) @@ -48,12 +48,12 @@ internal class IgnoredClassesTests : BaseKotlinGradleTest() { fun `apiCheck should succeed, when given class is not in api-File, but is ignored via ignoredPackages`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/ignoredPackages/oneValidPackage.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/ignoredPackages/oneValidPackage.gradle.kts") } kotlin("BuildConfig.kt") { - resolve("examples/classes/BuildConfig.kt") + resolve("/examples/classes/BuildConfig.kt") } emptyApiFile(projectName = rootProjectDir.name) @@ -72,14 +72,14 @@ internal class IgnoredClassesTests : BaseKotlinGradleTest() { fun `apiDump should not dump ignoredClasses, when class is excluded via ignoredClasses`() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts") } kotlin("BuildConfig.kt") { - resolve("examples/classes/BuildConfig.kt") + resolve("/examples/classes/BuildConfig.kt") } kotlin("AnotherBuildConfig.kt") { - resolve("examples/classes/AnotherBuildConfig.kt") + resolve("/examples/classes/AnotherBuildConfig.kt") } runner { @@ -92,7 +92,7 @@ internal class IgnoredClassesTests : BaseKotlinGradleTest() { assertTrue(rootProjectApiDump.exists(), "api dump file should exist") - val expected = readFileList("examples/classes/AnotherBuildConfig.dump") + val expected = readFileList("/examples/classes/AnotherBuildConfig.dump") Assertions.assertThat(rootProjectApiDump.readText()).isEqualToIgnoringNewLines(expected) } } diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/InputJarTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/InputJarTest.kt index 61c03c42..b980eaf0 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/InputJarTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/InputJarTest.kt @@ -14,16 +14,16 @@ class InputJarTest : BaseKotlinGradleTest() { fun testOverrideInputJar() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/jarAsInput/inputJar.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts") } kotlin("Properties.kt") { - resolve("examples/classes/Properties.kt") + resolve("/examples/classes/Properties.kt") } apiFile(projectName = rootProjectDir.name) { - resolve("examples/classes/PropertiesJarTransformed.dump") + resolve("/examples/classes/PropertiesJarTransformed.dump") } runner { diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt index be9b83cf..0c89f317 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt @@ -6,10 +6,6 @@ package kotlinx.validation.test import kotlinx.validation.api.* -import kotlinx.validation.api.buildGradleKts -import kotlinx.validation.api.kotlin -import kotlinx.validation.api.resolve -import kotlinx.validation.api.test import org.junit.Test class MixedMarkersTest : BaseKotlinGradleTest() { @@ -18,16 +14,16 @@ class MixedMarkersTest : BaseKotlinGradleTest() { fun testMixedMarkers() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/publicMarkers/mixedMarkers.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/publicMarkers/mixedMarkers.gradle.kts") } kotlin("MixedAnnotations.kt") { - resolve("examples/classes/MixedAnnotations.kt") + resolve("/examples/classes/MixedAnnotations.kt") } apiFile(projectName = rootProjectDir.name) { - resolve("examples/classes/MixedAnnotations.dump") + resolve("/examples/classes/MixedAnnotations.dump") } runner { diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/MultiPlatformSingleJvmTargetTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/MultiPlatformSingleJvmTargetTest.kt index 22cf9ab2..631cf047 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/MultiPlatformSingleJvmTargetTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/MultiPlatformSingleJvmTargetTest.kt @@ -13,10 +13,10 @@ import java.io.File internal class MultiPlatformSingleJvmTargetTest : BaseKotlinGradleTest() { private fun BaseKotlinScope.createProjectHierarchyWithPluginOnRoot() { settingsGradleKts { - resolve("examples/gradle/settings/settings-name-testproject.gradle.kts") + resolve("/examples/gradle/settings/settings-name-testproject.gradle.kts") } buildGradleKts { - resolve("examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts") + resolve("/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts") } } @@ -31,17 +31,17 @@ internal class MultiPlatformSingleJvmTargetTest : BaseKotlinGradleTest() { dir("api/") { file("testproject.api") { - resolve("examples/classes/Subsub1Class.dump") - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } dir("src/jvmMain/kotlin") {} kotlin("Subsub1Class.kt", "commonMain") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } kotlin("Subsub2Class.kt", "jvmMain") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } @@ -63,17 +63,17 @@ internal class MultiPlatformSingleJvmTargetTest : BaseKotlinGradleTest() { dir("api/") { file("testproject.api") { - resolve("examples/classes/Subsub2Class.dump") - resolve("examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub1Class.dump") } } dir("src/jvmMain/kotlin") {} kotlin("Subsub1Class.kt", "commonMain") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } kotlin("Subsub2Class.kt", "jvmMain") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } @@ -98,10 +98,10 @@ internal class MultiPlatformSingleJvmTargetTest : BaseKotlinGradleTest() { dir("src/jvmMain/kotlin") {} kotlin("Subsub1Class.kt", "commonMain") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } kotlin("Subsub2Class.kt", "jvmMain") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } @@ -109,9 +109,9 @@ internal class MultiPlatformSingleJvmTargetTest : BaseKotlinGradleTest() { runner.build().apply { assertTaskSuccess(":apiDump") - val commonExpectedApi = readFileList("examples/classes/Subsub1Class.dump") + val commonExpectedApi = readFileList("/examples/classes/Subsub1Class.dump") - val mainExpectedApi = commonExpectedApi + "\n" + readFileList("examples/classes/Subsub2Class.dump") + val mainExpectedApi = commonExpectedApi + "\n" + readFileList("/examples/classes/Subsub2Class.dump") assertThat(jvmApiDump.readText()).isEqualToIgnoringNewLines(mainExpectedApi) } } diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/MultipleJvmTargetsTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/MultipleJvmTargetsTest.kt index e718f67f..0b1933bf 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/MultipleJvmTargetsTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/MultipleJvmTargetsTest.kt @@ -15,10 +15,10 @@ import java.io.InputStreamReader internal class MultipleJvmTargetsTest : BaseKotlinGradleTest() { private fun BaseKotlinScope.createProjectHierarchyWithPluginOnRoot() { settingsGradleKts { - resolve("examples/gradle/settings/settings-name-testproject.gradle.kts") + resolve("/examples/gradle/settings/settings-name-testproject.gradle.kts") } buildGradleKts { - resolve("examples/gradle/base/multiplatformWithJvmTargets.gradle.kts") + resolve("/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts") } } @@ -32,23 +32,23 @@ internal class MultipleJvmTargetsTest : BaseKotlinGradleTest() { dir("api/jvm/") { file("testproject.api") { - resolve("examples/classes/Subsub1Class.dump") - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } dir("api/anotherJvm/") { file("testproject.api") { - resolve("examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub1Class.dump") } } dir("src/jvmMain/kotlin") {} kotlin("Subsub1Class.kt", "commonMain") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } kotlin("Subsub2Class.kt", "jvmMain") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } @@ -71,23 +71,23 @@ internal class MultipleJvmTargetsTest : BaseKotlinGradleTest() { dir("api/jvm/") { file("testproject.api") { - resolve("examples/classes/Subsub2Class.dump") - resolve("examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub1Class.dump") } } dir("api/anotherJvm/") { file("testproject.api") { - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } dir("src/jvmMain/kotlin") {} kotlin("Subsub1Class.kt", "commonMain") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } kotlin("Subsub2Class.kt", "jvmMain") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } @@ -112,10 +112,10 @@ internal class MultipleJvmTargetsTest : BaseKotlinGradleTest() { dir("src/jvmMain/kotlin") {} kotlin("Subsub1Class.kt", "commonMain") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } kotlin("Subsub2Class.kt", "jvmMain") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } @@ -126,10 +126,10 @@ internal class MultipleJvmTargetsTest : BaseKotlinGradleTest() { System.err.println(output) - val anotherExpectedApi = readFileList("examples/classes/Subsub1Class.dump") + val anotherExpectedApi = readFileList("/examples/classes/Subsub1Class.dump") assertThat(anotherApiDump.readText()).isEqualToIgnoringNewLines(anotherExpectedApi) - val mainExpectedApi = anotherExpectedApi + "\n" + readFileList("examples/classes/Subsub2Class.dump") + val mainExpectedApi = anotherExpectedApi + "\n" + readFileList("/examples/classes/Subsub2Class.dump") assertThat(jvmApiDump.readText()).isEqualToIgnoringNewLines(mainExpectedApi) } } diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt index 83a0852f..a263d350 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt @@ -14,16 +14,16 @@ class NonPublicMarkersTest : BaseKotlinGradleTest() { fun testIgnoredMarkersOnProperties() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/nonPublicMarkers/markers.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/nonPublicMarkers/markers.gradle.kts") } kotlin("Properties.kt") { - resolve("examples/classes/Properties.kt") + resolve("/examples/classes/Properties.kt") } apiFile(projectName = rootProjectDir.name) { - resolve("examples/classes/Properties.dump") + resolve("/examples/classes/Properties.dump") } runner { diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt b/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt index 7da7010b..43fe5fc7 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt @@ -18,20 +18,20 @@ class PublicMarkersTest : BaseKotlinGradleTest() { fun testPublicMarkers() { val runner = test { buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") - resolve("examples/gradle/configuration/publicMarkers/markers.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/publicMarkers/markers.gradle.kts") } kotlin("ClassWithPublicMarkers.kt") { - resolve("examples/classes/ClassWithPublicMarkers.kt") + resolve("/examples/classes/ClassWithPublicMarkers.kt") } kotlin("ClassInPublicPackage.kt") { - resolve("examples/classes/ClassInPublicPackage.kt") + resolve("/examples/classes/ClassInPublicPackage.kt") } apiFile(projectName = rootProjectDir.name) { - resolve("examples/classes/ClassWithPublicMarkers.dump") + resolve("/examples/classes/ClassWithPublicMarkers.dump") } runner { diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnRootTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnRootTests.kt index 742c464b..52628f32 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnRootTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnRootTests.kt @@ -32,29 +32,29 @@ internal class SubprojectsWithPluginOnRootTests : BaseKotlinGradleTest() { */ private fun BaseKotlinScope.createProjectHierarchyWithPluginOnRoot() { settingsGradleKts { - resolve("examples/gradle/settings/settings-with-hierarchy.gradle.kts") + resolve("/examples/gradle/settings/settings-with-hierarchy.gradle.kts") } buildGradleKts { - resolve("examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/base/withPlugin.gradle.kts") } dir("sub1") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } dir("subsub1") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } } dir("subsub2") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } } } dir("sub2") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } } } @@ -181,10 +181,10 @@ internal class SubprojectsWithPluginOnRootTests : BaseKotlinGradleTest() { dir("sub1") { dir("subsub2") { kotlin("Subsub2Class.kt") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } apiFile(projectName = "subsub2") { - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } } @@ -211,18 +211,18 @@ internal class SubprojectsWithPluginOnRootTests : BaseKotlinGradleTest() { dir("subsub1") { kotlin("Subsub1Class.kt") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } apiFile(projectName = "subsub1") { - resolve("examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub1Class.dump") } } dir("subsub2") { kotlin("Subsub2Class.kt") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } apiFile(projectName = "subsub2") { - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } } @@ -273,12 +273,12 @@ internal class SubprojectsWithPluginOnRootTests : BaseKotlinGradleTest() { dir("sub1") { dir("subsub1") { kotlin("Subsub1Class.kt") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } } dir("subsub2") { kotlin("Subsub2Class.kt") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } } @@ -304,12 +304,12 @@ internal class SubprojectsWithPluginOnRootTests : BaseKotlinGradleTest() { val apiSubsub1 = rootProjectDir.resolve("sub1/subsub1/api/subsub1.api") assertTrue(apiSubsub1.exists(), "api dump file ${apiSubsub1.path} should exist") - val apiSubsub1Expected = readFileList("examples/classes/Subsub1Class.dump") + val apiSubsub1Expected = readFileList("/examples/classes/Subsub1Class.dump") Assertions.assertThat(apiSubsub1.readText()).isEqualToIgnoringNewLines(apiSubsub1Expected) val apiSubsub2 = rootProjectDir.resolve("sub1/subsub2/api/subsub2.api") assertTrue(apiSubsub2.exists(), "api dump file ${apiSubsub2.path} should exist") - val apiSubsub2Expected = readFileList("examples/classes/Subsub2Class.dump") + val apiSubsub2Expected = readFileList("/examples/classes/Subsub2Class.dump") Assertions.assertThat(apiSubsub2.readText()).isEqualToIgnoringNewLines(apiSubsub2Expected) val apiSub2 = rootProjectDir.resolve("sub2/api/sub2.api") diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnSubTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnSubTests.kt index 5982a4e8..89f22acb 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnSubTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/SubprojectsWithPluginOnSubTests.kt @@ -33,29 +33,29 @@ internal class SubprojectsWithPluginOnSubTests : BaseKotlinGradleTest() { */ private fun BaseKotlinScope.createProjectHierarchyWithPluginOnSub1() { settingsGradleKts { - resolve("examples/gradle/settings/settings-with-hierarchy.gradle.kts") + resolve("/examples/gradle/settings/settings-with-hierarchy.gradle.kts") } buildGradleKts { - resolve("examples/gradle/base/withoutPlugin.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin.gradle.kts") } dir("sub1") { buildGradleKts { - resolve("examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts") } dir("subsub1") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } } dir("subsub2") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } } } dir("sub2") { buildGradleKts { - resolve("examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") + resolve("/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts") } } } @@ -170,10 +170,10 @@ internal class SubprojectsWithPluginOnSubTests : BaseKotlinGradleTest() { dir("sub1") { dir("subsub2") { kotlin("Subsub2Class.kt") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } apiFile(projectName = "subsub2") { - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } } @@ -198,18 +198,18 @@ internal class SubprojectsWithPluginOnSubTests : BaseKotlinGradleTest() { dir("subsub1") { kotlin("Subsub1Class.kt") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } apiFile(projectName = "subsub1") { - resolve("examples/classes/Subsub1Class.dump") + resolve("/examples/classes/Subsub1Class.dump") } } dir("subsub2") { kotlin("Subsub2Class.kt") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } apiFile(projectName = "subsub2") { - resolve("examples/classes/Subsub2Class.dump") + resolve("/examples/classes/Subsub2Class.dump") } } } @@ -256,12 +256,12 @@ internal class SubprojectsWithPluginOnSubTests : BaseKotlinGradleTest() { dir("sub1") { dir("subsub1") { kotlin("Subsub1Class.kt") { - resolve("examples/classes/Subsub1Class.kt") + resolve("/examples/classes/Subsub1Class.kt") } } dir("subsub2") { kotlin("Subsub2Class.kt") { - resolve("examples/classes/Subsub2Class.kt") + resolve("/examples/classes/Subsub2Class.kt") } } } @@ -286,12 +286,12 @@ internal class SubprojectsWithPluginOnSubTests : BaseKotlinGradleTest() { val apiSubsub1 = rootProjectDir.resolve("sub1/subsub1/api/subsub1.api") assertTrue(apiSubsub1.exists(), "api dump file ${apiSubsub1.path} should exist") - val apiSubsub1Expected = readFileList("examples/classes/Subsub1Class.dump") + val apiSubsub1Expected = readFileList("/examples/classes/Subsub1Class.dump") Assertions.assertThat(apiSubsub1.readText()).isEqualToIgnoringNewLines(apiSubsub1Expected) val apiSubsub2 = rootProjectDir.resolve("sub1/subsub2/api/subsub2.api") assertTrue(apiSubsub2.exists(), "api dump file ${apiSubsub2.path} should exist") - val apiSubsub2Expected = readFileList("examples/classes/Subsub2Class.dump") + val apiSubsub2Expected = readFileList("/examples/classes/Subsub2Class.dump") Assertions.assertThat(apiSubsub2.readText()).isEqualToIgnoringNewLines(apiSubsub2Expected) val apiSub2 = rootProjectDir.resolve("sub2/api/sub2.api") diff --git a/src/main/kotlin/KotlinApiCompareTask.kt b/src/main/kotlin/KotlinApiCompareTask.kt index 66f242fd..88596dfa 100644 --- a/src/main/kotlin/KotlinApiCompareTask.kt +++ b/src/main/kotlin/KotlinApiCompareTask.kt @@ -5,14 +5,15 @@ package kotlinx.validation -import difflib.* +import com.github.difflib.DiffUtils +import com.github.difflib.UnifiedDiffUtils +import java.io.* +import java.util.TreeMap +import javax.inject.Inject import org.gradle.api.* import org.gradle.api.file.* import org.gradle.api.model.ObjectFactory import org.gradle.api.tasks.* -import java.io.* -import java.util.TreeMap -import javax.inject.Inject open class KotlinApiCompareTask @Inject constructor(private val objects: ObjectFactory): DefaultTask() { @@ -123,7 +124,7 @@ open class KotlinApiCompareTask @Inject constructor(private val objects: ObjectF return null val patch = DiffUtils.diff(checkLines, builtLines) - val diff = DiffUtils.generateUnifiedDiff(checkFile.toString(), builtFile.toString(), checkLines, patch, 3) + val diff = UnifiedDiffUtils.generateUnifiedDiff(checkFile.toString(), builtFile.toString(), checkLines, patch, 3) return diff.joinToString("\n") } }