From 2ec6e9c392526bfe36ee606d0dcd9077662bd2f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 12:29:08 -0400 Subject: [PATCH 01/21] Add renovate.json (#977) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..39a2b6e9 --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base" + ] +} From ee27125c1f78de8922b88680da0d6c452f337600 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 13:04:15 -0400 Subject: [PATCH 02/21] chore(deps): update plugin com.github.spotbugs to v5.1.4 (#978) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index f068d91c..487761af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { id("com.github.spotbugs.plugin-publish") id("com.github.spotbugs.test") id("org.sonarqube") - id("com.github.spotbugs") version "5.1.3" + id("com.github.spotbugs") version "5.1.4" } java { From 1cb4ffdcef162cbdce87428b12d54a2dfea23bb0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 13:04:48 -0400 Subject: [PATCH 03/21] chore(deps): update dependency gradle to v8.4 (#979) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 17 +++++++++-------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 28216 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9f4197d5..3fa8f862 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index fcb6fca1..1aa94a42 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -144,7 +145,7 @@ 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 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $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. +# 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" \ From b7e9489bd0beddbf61799319c8b3d0228dcfcee2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 14:12:34 -0400 Subject: [PATCH 04/21] chore(deps): update plugin com.gradle.enterprise to v3.15.1 (#982) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 3f278f33..f58c59e9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.enterprise") version("3.7.2") + id("com.gradle.enterprise") version("3.15.1") } rootProject.name = "spotbugs-gradle-plugin" From c1547707eace61e07f437d2becc3c4d833b969a2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 14:13:07 -0400 Subject: [PATCH 05/21] chore(deps): update junit5 monorepo to v5.10.0 (#981) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../com/github/spotbugs/com.github.spotbugs.test.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts index 6e9ecc1e..3f3cb4b8 100644 --- a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts +++ b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts @@ -7,7 +7,7 @@ plugins { id("org.sonarqube") } -val junitVersion = "5.8.1" +val junitVersion = "5.10.0" dependencies { testImplementation(gradleTestKit()) testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion") From 9e30c02d9d5affc1dd3b135d6b2bef8e9f7e416d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 14:55:31 -0400 Subject: [PATCH 06/21] chore(deps): update actions/checkout action to v4 (#984) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 2 +- .github/workflows/gradle.yml | 2 +- .github/workflows/javadoc.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 2c49fff7..fab47808 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index e18d066d..3276e16e 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -15,7 +15,7 @@ jobs: matrix: gradle: ['7.6.2', '8.0'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 11 diff --git a/.github/workflows/javadoc.yml b/.github/workflows/javadoc.yml index 25dc2834..d38bb7e7 100644 --- a/.github/workflows/javadoc.yml +++ b/.github/workflows/javadoc.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: persist-credentials: false - name: Set up JDK 11 From 697c8e3641399e35eb62d94d44119e1117b87a4e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:20:51 -0400 Subject: [PATCH 07/21] chore(deps): update github/codeql-action action to v2 (#986) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fab47808..13c1a915 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -37,7 +37,7 @@ jobs: run: | ./gradlew spotbugsMain - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v1 + uses: github/codeql-action/upload-sarif@v2 with: # Path to SARIF file relative to the root of the repository sarif_file: build/reports/spotbugs/main.sarif From f27d114680d82927e84c870cb36727127ac1896b Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 10 Oct 2023 19:02:33 -0500 Subject: [PATCH 08/21] misc: ignore .idea files (#988) Usually, we don't need to commit any file under .idea, some files changed on my local once and once again, be easy to mis-commit them. --- .gitignore | 66 ++----------------------------------- .idea/jarRepositories.xml | 30 ----------------- .idea/runConfigurations.xml | 10 ------ .idea/vcs.xml | 6 ---- 4 files changed, 3 insertions(+), 109 deletions(-) delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index 3674b13e..27b024b0 100644 --- a/.gitignore +++ b/.gitignore @@ -77,46 +77,13 @@ local.properties # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff -.idea/**/misc.xml -.idea/**/compiler.xml -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -.idea/modules.xml -.idea/*.iml -.idea/modules -# *.iml -# *.ipr +.idea + *.iml + *.ipr # CMake cmake-build-*/ -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - # File-based project format *.iws @@ -129,39 +96,12 @@ out/ # JIRA plugin atlassian-ide-plugin.xml -# Cursive Clojure plugin -.idea/replstate.xml - # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### JetBrains Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -.idea/**/sonarlint/ - -# SonarQube Plugin -.idea/**/sonarIssues.xml - -# Markdown Navigator plugin -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator/ - ### Linux ### *~ diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index 0380d8d3..00000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea5..00000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From be1e3bb44d5ed12917a0d4adde2b54913f4a9fe6 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 11 Oct 2023 17:07:40 -0500 Subject: [PATCH 09/21] misc: modernize things (#975) * Disable failed CI jobs in forks * Enable more Gradle flags to speed up build * Always publish build scans on CI * Use dependencyResolutionManagement * Cleanups * Simple property assignments in KTS * Use providers.environmentVariable * Declare pluginManagement * Tweak gradle-build-action usages * Move wrapper-validation-action into a new file * Add .editorconfig * Run CI for all PRs * Remove dependabot.yml * Can trigger CI via workflow_dispatch --- .editorconfig | 11 ++++++++ .github/dependabot.yml | 10 ------- .../.github/workflows/gradle-wrapper.yaml | 15 +++++++++++ .github/workflows/codeql.yml | 9 +++---- .github/workflows/gradle.yml | 15 +++++------ .github/workflows/javadoc.yml | 4 ++- .gitignore | 1 - build.gradle.kts | 27 ++++++++----------- ...m.github.spotbugs.gradle-plugin.gradle.kts | 2 +- ....github.spotbugs.plugin-publish.gradle.kts | 22 +++++++-------- .../com.github.spotbugs.test.gradle.kts | 10 +++---- gradle.properties | 3 +++ settings.gradle.kts | 18 +++++++++++++ 13 files changed, 87 insertions(+), 60 deletions(-) create mode 100644 .editorconfig delete mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/.github/workflows/gradle-wrapper.yaml create mode 100644 gradle.properties diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..328a07fc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{yml,yaml}] +indent_size = 2 \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 1504f502..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "gradle" - directory: "/" - schedule: - interval: "daily" - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" diff --git a/.github/workflows/.github/workflows/gradle-wrapper.yaml b/.github/workflows/.github/workflows/gradle-wrapper.yaml new file mode 100644 index 00000000..6f59f717 --- /dev/null +++ b/.github/workflows/.github/workflows/gradle-wrapper.yaml @@ -0,0 +1,15 @@ +name: gradle-wrapper + +on: + pull_request: + paths: + - 'gradlew' + - 'gradlew.bat' + - 'gradle/wrapper/' + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: gradle/wrapper-validation-action@v1 \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 13c1a915..d21a9731 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -6,12 +6,11 @@ on: branches: - master pull_request: - branches: - - master jobs: CodeQL-Build: runs-on: ubuntu-latest + if: github.repository == 'spotbugs/spotbugs-gradle-plugin' steps: - name: Checkout repository @@ -29,10 +28,8 @@ jobs: with: distribution: 'temurin' java-version: 11 - cache: gradle - - name: Gradle Wrapper Validation - uses: gradle/wrapper-validation-action@v1 - + - name: Gradle cache + uses: gradle/gradle-build-action@v2 - name: Build run: | ./gradlew spotbugsMain diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 3276e16e..44fe7192 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -5,8 +5,7 @@ on: branches: - master pull_request: - branches: - - master + workflow_dispatch: jobs: build: @@ -29,12 +28,10 @@ jobs: node-version-file: '.nvmrc' cache: npm if: matrix.gradle == '7.6.2' - - name: Gradle Wrapper Validation - uses: gradle/wrapper-validation-action@v1 - - name: Build with Gradle + - name: Gradle cache uses: gradle/gradle-build-action@v2 - with: - arguments: build -Dsnom.test.functional.gradle=${{ matrix.gradle }} --scan + - name: Build with Gradle + run: ./gradlew build -Dsnom.test.functional.gradle=${{ matrix.gradle }} - run: | echo Verifying the java version used in class files... cd build/classes/groovy/main @@ -46,7 +43,7 @@ jobs: rm -rf build/libs/*.jar npm ci npx semantic-release - if: matrix.gradle == '7.6.2' + if: matrix.gradle == '7.6.2' && github.repository == 'spotbugs/spotbugs-gradle-plugin' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SIGNING_KEY: ${{ secrets.SIGNING_KEY }} @@ -56,7 +53,7 @@ jobs: if [ "$SONAR_LOGIN" != "" ]; then ./gradlew sonarqube -Dsonar.login=$SONAR_LOGIN --no-daemon fi - if: matrix.gradle == '7.6.2' + if: matrix.gradle == '7.6.2' && github.repository == 'spotbugs/spotbugs-gradle-plugin' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_LOGIN: ${{ secrets.SONAR_LOGIN }} diff --git a/.github/workflows/javadoc.yml b/.github/workflows/javadoc.yml index d38bb7e7..ad96f08e 100644 --- a/.github/workflows/javadoc.yml +++ b/.github/workflows/javadoc.yml @@ -6,6 +6,7 @@ on: jobs: javadoc: runs-on: ubuntu-latest + if: github.repository == 'spotbugs/spotbugs-gradle-plugin' steps: - name: Checkout uses: actions/checkout@v4 @@ -16,12 +17,13 @@ jobs: with: distribution: 'temurin' java-version: 11 - cache: gradle - name: Set up Node.js uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' cache: npm + - name: Gradle cache + uses: gradle/gradle-build-action@v2 - name: Generate Groovydoc run: ./gradlew groovydoc - name: Prepare to Deploy diff --git a/.gitignore b/.gitignore index 27b024b0..1484a7db 100644 --- a/.gitignore +++ b/.gitignore @@ -251,7 +251,6 @@ $RECYCLE.BIN/ ### Gradle ### .gradle build/ -gradle.properties # Ignore Gradle GUI config gradle-app.setting diff --git a/build.gradle.kts b/build.gradle.kts index 487761af..0cd20cae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,14 +14,8 @@ java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } -group = "com.github.spotbugs.snom" -repositories { - // To download the Android Gradle Plugin - google() - // To download trove4j required by the Android Gradle Plugin - mavenCentral() -} +group = "com.github.spotbugs.snom" val errorproneVersion = "2.22.0" val spotBugsVersion = "4.7.3" @@ -36,8 +30,8 @@ dependencies { testImplementation("com.tngtech.archunit:archunit:1.1.0") } -val signingKey: String? = System.getenv("SIGNING_KEY") -val signingPassword: String? = System.getenv("SIGNING_PASSWORD") +val signingKey: String? = providers.environmentVariable("SIGNING_KEY").orNull +val signingPassword: String? = providers.environmentVariable("SIGNING_PASSWORD").orNull signing { if (!signingKey.isNullOrBlank() && !signingPassword.isNullOrBlank()) { @@ -49,28 +43,29 @@ signing { } spotbugs { - ignoreFailures.set(true) + ignoreFailures = true } + tasks { - named("spotbugsMain") { + spotbugsMain { reports { register("sarif") { - required.set(true) + required = true } } } val processVersionFile by registering(WriteProperties::class) { - outputFile = file("src/main/resources/spotbugs-gradle-plugin.properties") + destinationFile = file("src/main/resources/spotbugs-gradle-plugin.properties") property("slf4j-version", slf4jVersion) property("spotbugs-version", spotBugsVersion) } - named("processResources") { + processResources { dependsOn(processVersionFile) } - withType { + withType().configureEach { dependsOn(processResources) } } -defaultTasks("spotlessApply", "build") +defaultTasks(tasks.spotlessApply.name, tasks.build.name) diff --git a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.gradle-plugin.gradle.kts b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.gradle-plugin.gradle.kts index 4caed177..fa582a22 100644 --- a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.gradle-plugin.gradle.kts +++ b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.gradle-plugin.gradle.kts @@ -8,7 +8,7 @@ plugins { tasks.withType().configureEach { // disable warnings in generated code by immutables // https://github.com/google/error-prone/issues/329 - options.errorprone.disableWarningsInGeneratedCode.set(true) + options.errorprone.disableWarningsInGeneratedCode = true } tasks.withType().configureEach { diff --git a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.plugin-publish.gradle.kts b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.plugin-publish.gradle.kts index 3117f0c3..522f432c 100644 --- a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.plugin-publish.gradle.kts +++ b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.plugin-publish.gradle.kts @@ -5,30 +5,30 @@ plugins { } gradlePlugin { - website.set("https://github.com/spotbugs/spotbugs-gradle-plugin") - vcsUrl.set("https://github.com/spotbugs/spotbugs-gradle-plugin") + website = "https://github.com/spotbugs/spotbugs-gradle-plugin" + vcsUrl = "https://github.com/spotbugs/spotbugs-gradle-plugin" plugins { create("spotbugsGradleBasePlugin") { id = "com.github.spotbugs-base" displayName = "Official SpotBugs Gradle Base Plugin" description = "A base Gradle plugin that runs static bytecode analysis by SpotBugs" implementationClass = "com.github.spotbugs.snom.SpotBugsBasePlugin" - tags.set(listOf( + tags = listOf( "spotbugs", "static analysis", "code quality" - )) + ) } create("spotbugsGradlePlugin") { id = "com.github.spotbugs" displayName = "Official SpotBugs Gradle Plugin" description = "A Gradle plugin that runs static bytecode analysis by SpotBugs" implementationClass = "com.github.spotbugs.snom.SpotBugsPlugin" - tags.set(listOf( + tags = listOf( "spotbugs", "static analysis", "code quality" - )) + ) } } } @@ -36,14 +36,14 @@ gradlePlugin { publishing.publications.withType { pom { scm { - connection.set("scm:git:git@github.com:spotbugs/spotbugs-gradle-plugin.git") - developerConnection.set("scm:git:git@github.com:spotbugs/spotbugs-gradle-plugin.git") - url.set("https://github.com/spotbugs/spotbugs-gradle-plugin/") + connection = "scm:git:git@github.com:spotbugs/spotbugs-gradle-plugin.git" + developerConnection = "scm:git:git@github.com:spotbugs/spotbugs-gradle-plugin.git" + url = "https://github.com/spotbugs/spotbugs-gradle-plugin/" } licenses { license { - name.set("Apache License 2.0") - url.set("https://spdx.org/licenses/Apache-2.0.html") + name = "Apache License 2.0" + url = "https://spdx.org/licenses/Apache-2.0.html" } } } diff --git a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts index 3f3cb4b8..9ac7dfa5 100644 --- a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts +++ b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts @@ -34,7 +34,7 @@ testing { @Suppress("UNUSED_VARIABLE") val functionalTest by registering(JvmTestSuite::class) { useSpock() - testType.set(TestSuiteType.FUNCTIONAL_TEST) + testType = TestSuiteType.FUNCTIONAL_TEST targets { all { testTask.configure { @@ -51,9 +51,9 @@ gradlePlugin { testSourceSets(sourceSets["functionalTest"]) } -val jacocoTestReport = tasks.named("jacocoTestReport") { +tasks.jacocoTestReport { reports.named("xml") { - required.set(true) + required = true } } @@ -62,7 +62,7 @@ sonarqube { property("sonar.projectKey", "com.github.spotbugs.gradle") property("sonar.organization", "spotbugs") property("sonar.host.url", "https://sonarcloud.io") - property("sonar.coverage.jacoco.xmlReportPaths", jacocoTestReport.flatMap { it.reports.xml.outputLocation }) + property("sonar.coverage.jacoco.xmlReportPaths", tasks.jacocoTestReport.flatMap { it.reports.xml.outputLocation }) } } @@ -73,5 +73,5 @@ tasks { } tasks.check { dependsOn(tasks.named("functionalTest")) - dependsOn(jacocoTestReport) + dependsOn(tasks.jacocoTestReport) } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..9affcefb --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx4g +org.gradle.parallel=true +org.gradle.caching=true diff --git a/settings.gradle.kts b/settings.gradle.kts index f58c59e9..f2ce8add 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,12 +1,30 @@ +pluginManagement { + repositories { + gradlePluginPortal() + } +} + plugins { id("com.gradle.enterprise") version("3.15.1") } +dependencyResolutionManagement { + repositories { + // To download the Android Gradle Plugin + google() + // To download trove4j required by the Android Gradle Plugin + mavenCentral() + } +} + rootProject.name = "spotbugs-gradle-plugin" +val isCiBuild = providers.environmentVariable("CI").isPresent + gradleEnterprise { buildScan { termsOfServiceUrl = "https://gradle.com/terms-of-service" termsOfServiceAgree = "yes" + publishAlwaysIf(isCiBuild) } } From 17eccf7c58573576dee682b4669f6f76d7180d26 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:04:29 -0400 Subject: [PATCH 10/21] fix: update dependency com.github.spotbugs:spotbugs to v4.8.0 (#990) * fix(deps): update dependency com.github.spotbugs:spotbugs to v4.8.0 * [ci] Note gradle plugin 5.1.5 uses spotbugs 4.8.0 --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jeremy Landis --- README.md | 1 + build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d5249c8..db83d0a5 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ You can change SpotBugs version by [the `toolVersion` property of the spotbugs e | Gradle Plugin | SpotBugs | |--------------:|---------:| +| 5.1.5 | 4.8.0 | | 5.0.13 | 4.7.3 | | 5.0.12 | 4.7.2 | | 5.0.9 | 4.7.1 | diff --git a/build.gradle.kts b/build.gradle.kts index 0cd20cae..af524533 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ java { group = "com.github.spotbugs.snom" val errorproneVersion = "2.22.0" -val spotBugsVersion = "4.7.3" +val spotBugsVersion = "4.8.0" val slf4jVersion = "2.0.0" val androidGradlePluginVersion = "7.3.1" From 72100dd86a4567635074ec30d77e865617cce192 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 18:26:35 -0400 Subject: [PATCH 11/21] chore(deps): update plugin com.github.spotbugs to v5.1.5 (#992) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index af524533..2265cdc9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { id("com.github.spotbugs.plugin-publish") id("com.github.spotbugs.test") id("org.sonarqube") - id("com.github.spotbugs") version "5.1.4" + id("com.github.spotbugs") version "5.1.5" } java { From f1c16a34f86e87e948b33fa6fa3caba0a9eacc03 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 18:26:51 -0400 Subject: [PATCH 12/21] chore(deps): update dependency lint-staged to v15 (#999) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 152 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 91 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index f062cd50..895b5d26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "conventional-changelog-conventionalcommits": "^7.0.2", "gradle-semantic-release-plugin": "1.7.7", "husky": "^8.0.3", - "lint-staged": "^14.0.1", + "lint-staged": "^15.0.0", "pinst": "^3.0.0", "prettier": "^3.0.3", "semantic-release": "21.1.2" @@ -1868,9 +1868,9 @@ "dev": true }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -3106,27 +3106,27 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.0.tgz", + "integrity": "sha512-OdrAd/qZhO4MnPyNRehI1Fh6j8kcfQoGpjQ1Vw8dSkDkNONdqe/HpKXqtKpFIPCAYeF4/tfnE11MnjLYuLKjqA==", "dev": true, "dependencies": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.1", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.2" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" @@ -3145,35 +3145,47 @@ } }, "node_modules/lint-staged/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16.17.0" } }, "node_modules/lint-staged/node_modules/is-stream": { @@ -3242,6 +3254,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -3255,9 +3279,9 @@ } }, "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", + "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -3269,14 +3293,6 @@ }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } } }, "node_modules/listr2/node_modules/ansi-regex": { @@ -8894,9 +8910,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, "engines": { "node": ">= 14" @@ -10284,9 +10300,9 @@ "dev": true }, "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, "compare-func": { @@ -11161,21 +11177,21 @@ "dev": true }, "lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.0.tgz", + "integrity": "sha512-OdrAd/qZhO4MnPyNRehI1Fh6j8kcfQoGpjQ1Vw8dSkDkNONdqe/HpKXqtKpFIPCAYeF4/tfnE11MnjLYuLKjqA==", "dev": true, "requires": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.1", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.2" }, "dependencies": { "chalk": { @@ -11185,26 +11201,32 @@ "dev": true }, "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true }, "is-stream": { @@ -11243,6 +11265,12 @@ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -11252,9 +11280,9 @@ } }, "listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", + "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -15100,9 +15128,9 @@ "dev": true }, "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 7d651642..93487745 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "conventional-changelog-conventionalcommits": "^7.0.2", "gradle-semantic-release-plugin": "1.7.7", "husky": "^8.0.3", - "lint-staged": "^14.0.1", + "lint-staged": "^15.0.0", "pinst": "^3.0.0", "prettier": "^3.0.3", "semantic-release": "21.1.2" From 11def93e6c38f6cf792ab3134881871db41d7b53 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 18:27:22 -0400 Subject: [PATCH 13/21] chore(deps): update commitlint monorepo to v17.8.0 (#998) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 72 +++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 895b5d26..3fa1ed71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,14 +66,14 @@ } }, "node_modules/@commitlint/cli": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.7.2.tgz", - "integrity": "sha512-t3N7TZq7lOeqTOyEgfGcaltHqEJf7YDlPg75MldeVPPyz14jZq/+mbGF9tueDLFX8R6RwdymrN6D+U5XwZ8Iwg==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.0.tgz", + "integrity": "sha512-D3LdyZYbiRyAChfJMNlAd9f2P9vNQ7GWbI9gN2o7L5hF07QJDqj4z/pcJF3PjDbJWOaUUXla287RdDmmKqH2WQ==", "dev": true, "dependencies": { "@commitlint/format": "^17.4.4", - "@commitlint/lint": "^17.7.0", - "@commitlint/load": "^17.7.2", + "@commitlint/lint": "^17.8.0", + "@commitlint/load": "^17.8.0", "@commitlint/read": "^17.5.1", "@commitlint/types": "^17.4.4", "execa": "^5.0.0", @@ -90,9 +90,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.7.0.tgz", - "integrity": "sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.0.tgz", + "integrity": "sha512-MgiFXujmqAvi7M33C7OSMTznwrVkckrbXe/aZWQ/+KFGLLF6IE50XIcjGrW0/uiDGb/im5qbqF2dh1dCFNa+sQ==", "dev": true, "dependencies": { "conventional-changelog-conventionalcommits": "^6.1.0" @@ -236,9 +236,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz", - "integrity": "sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.0.tgz", + "integrity": "sha512-8bR6rxNcWaNprPBdE4ePIOwbxutTQGOsRPYWssX+zjGxnEljzaZSGzFUOMxapYILlf8Tts/O1wPQgG549Rdvdg==", "dev": true, "dependencies": { "@commitlint/types": "^17.4.4", @@ -249,12 +249,12 @@ } }, "node_modules/@commitlint/lint": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.7.0.tgz", - "integrity": "sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.0.tgz", + "integrity": "sha512-4ihwnqOY4TcJN6iz5Jv1LeYavvBllONwFyGxOIWmCT5s4PNMb43cws2TUdbXTZL1Vq59etGKd5LWYDFPVbs5EA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^17.7.0", + "@commitlint/is-ignored": "^17.8.0", "@commitlint/parse": "^17.7.0", "@commitlint/rules": "^17.7.0", "@commitlint/types": "^17.4.4" @@ -264,9 +264,9 @@ } }, "node_modules/@commitlint/load": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.7.2.tgz", - "integrity": "sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.0.tgz", + "integrity": "sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw==", "dev": true, "dependencies": { "@commitlint/config-validator": "^17.6.7", @@ -9010,14 +9010,14 @@ "optional": true }, "@commitlint/cli": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.7.2.tgz", - "integrity": "sha512-t3N7TZq7lOeqTOyEgfGcaltHqEJf7YDlPg75MldeVPPyz14jZq/+mbGF9tueDLFX8R6RwdymrN6D+U5XwZ8Iwg==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.0.tgz", + "integrity": "sha512-D3LdyZYbiRyAChfJMNlAd9f2P9vNQ7GWbI9gN2o7L5hF07QJDqj4z/pcJF3PjDbJWOaUUXla287RdDmmKqH2WQ==", "dev": true, "requires": { "@commitlint/format": "^17.4.4", - "@commitlint/lint": "^17.7.0", - "@commitlint/load": "^17.7.2", + "@commitlint/lint": "^17.8.0", + "@commitlint/load": "^17.8.0", "@commitlint/read": "^17.5.1", "@commitlint/types": "^17.4.4", "execa": "^5.0.0", @@ -9028,9 +9028,9 @@ } }, "@commitlint/config-conventional": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.7.0.tgz", - "integrity": "sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.0.tgz", + "integrity": "sha512-MgiFXujmqAvi7M33C7OSMTznwrVkckrbXe/aZWQ/+KFGLLF6IE50XIcjGrW0/uiDGb/im5qbqF2dh1dCFNa+sQ==", "dev": true, "requires": { "conventional-changelog-conventionalcommits": "^6.1.0" @@ -9139,9 +9139,9 @@ } }, "@commitlint/is-ignored": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz", - "integrity": "sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.0.tgz", + "integrity": "sha512-8bR6rxNcWaNprPBdE4ePIOwbxutTQGOsRPYWssX+zjGxnEljzaZSGzFUOMxapYILlf8Tts/O1wPQgG549Rdvdg==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", @@ -9149,21 +9149,21 @@ } }, "@commitlint/lint": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.7.0.tgz", - "integrity": "sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.0.tgz", + "integrity": "sha512-4ihwnqOY4TcJN6iz5Jv1LeYavvBllONwFyGxOIWmCT5s4PNMb43cws2TUdbXTZL1Vq59etGKd5LWYDFPVbs5EA==", "dev": true, "requires": { - "@commitlint/is-ignored": "^17.7.0", + "@commitlint/is-ignored": "^17.8.0", "@commitlint/parse": "^17.7.0", "@commitlint/rules": "^17.7.0", "@commitlint/types": "^17.4.4" } }, "@commitlint/load": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.7.2.tgz", - "integrity": "sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.0.tgz", + "integrity": "sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw==", "dev": true, "requires": { "@commitlint/config-validator": "^17.6.7", From 3ec98033678c4669af007d1ea31ec2ebf4aec4dd Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 14 Oct 2023 17:28:14 -0500 Subject: [PATCH 14/21] Fix gradle-wrapper job path (#995) --- .../{.github/workflows/gradle-wrapper.yaml => gradle-wrapper.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{.github/workflows/gradle-wrapper.yaml => gradle-wrapper.yml} (100%) diff --git a/.github/workflows/.github/workflows/gradle-wrapper.yaml b/.github/workflows/gradle-wrapper.yml similarity index 100% rename from .github/workflows/.github/workflows/gradle-wrapper.yaml rename to .github/workflows/gradle-wrapper.yml From 4b567d965cb326d31a3a96897cd2d1c95dda534b Mon Sep 17 00:00:00 2001 From: Christoph Loy Date: Sun, 15 Oct 2023 02:02:17 +0200 Subject: [PATCH 15/21] feat: create Configurations lazily (#996) Gradle has powerful [configuration avoidance API](https://docs.gradle.org/current/userguide/task_configuration_avoidance.html). This is already used to great extent in this project. But configurations were still created eagerly. This commit fixes that. --- .../spotbugs/snom/SpotBugsBasePlugin.java | 84 ++++++++++--------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/src/main/groovy/com/github/spotbugs/snom/SpotBugsBasePlugin.java b/src/main/groovy/com/github/spotbugs/snom/SpotBugsBasePlugin.java index 213c1617..76950e9b 100644 --- a/src/main/groovy/com/github/spotbugs/snom/SpotBugsBasePlugin.java +++ b/src/main/groovy/com/github/spotbugs/snom/SpotBugsBasePlugin.java @@ -20,8 +20,8 @@ import java.util.Properties; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.DependencySet; +import org.gradle.api.artifacts.ConfigurationContainer; +import org.gradle.api.artifacts.Dependency; import org.gradle.api.plugins.ReportingBasePlugin; import org.gradle.util.GradleVersion; @@ -45,7 +45,7 @@ public void apply(Project project) { SpotBugsExtension extension = createExtension(project); createConfiguration(project, extension); - createPluginConfiguration(project); + createPluginConfiguration(project.getConfigurations()); String enableWorkerApi = getPropertyOrDefault(project, FEATURE_FLAG_WORKER_API, "true"); String enableHybridWorker = getPropertyOrDefault(project, FEATURE_FLAG_HYBRID_WORKER, "true"); @@ -70,36 +70,39 @@ private SpotBugsExtension createExtension(Project project) { private void createConfiguration(Project project, SpotBugsExtension extension) { Properties props = loadProperties(); extension.getToolVersion().convention(props.getProperty("spotbugs-version")); - - Configuration configuration = - project - .getConfigurations() - .create(SpotBugsPlugin.CONFIG_NAME) - .setDescription("configuration for the SpotBugs engine") - .setVisible(false) - .setTransitive(true); - - configuration.defaultDependencies( - (DependencySet dependencies) -> - dependencies.add( - project - .getDependencies() - .create("com.github.spotbugs:spotbugs:" + extension.getToolVersion().get()))); - - Configuration spotbugsSlf4j = - project - .getConfigurations() - .create(SpotBugsPlugin.SLF4J_CONFIG_NAME) - .setDescription("configuration for the SLF4J provider to run SpotBugs") - .setVisible(false) - .setTransitive(true); - - spotbugsSlf4j.defaultDependencies( - (DependencySet dependencies) -> - dependencies.add( - project - .getDependencies() - .create("org.slf4j:slf4j-simple:" + props.getProperty("slf4j-version")))); + ConfigurationContainer configs = project.getConfigurations(); + + configs.register( + SpotBugsPlugin.CONFIG_NAME, + c -> { + c.setDescription("configuration for the SpotBugs engine"); + c.setVisible(false); + c.setTransitive(true); + c.defaultDependencies( + d -> { + Dependency dep = + project + .getDependencies() + .create("com.github.spotbugs:spotbugs:" + extension.getToolVersion().get()); + d.add(dep); + }); + }); + + configs.register( + SpotBugsPlugin.SLF4J_CONFIG_NAME, + c -> { + c.setDescription("configuration for the SLF4J provider to run SpotBugs"); + c.setVisible(false); + c.setTransitive(true); + c.defaultDependencies( + d -> { + Dependency dep = + project + .getDependencies() + .create("org.slf4j:slf4j-simple:" + props.getProperty("slf4j-version")); + d.add(dep); + }); + }); } Properties loadProperties() { @@ -114,13 +117,14 @@ Properties loadProperties() { } } - private Configuration createPluginConfiguration(Project project) { - return project - .getConfigurations() - .create(SpotBugsPlugin.PLUGINS_CONFIG_NAME) - .setDescription("configuration for the external SpotBugs plugins") - .setVisible(false) - .setTransitive(false); + private void createPluginConfiguration(ConfigurationContainer configs) { + configs.register( + SpotBugsPlugin.PLUGINS_CONFIG_NAME, + c -> { + c.setDescription("configuration for the external SpotBugs plugins"); + c.setVisible(false); + c.setTransitive(false); + }); } void verifyGradleVersion(GradleVersion version) { From 256af7e9b739158778a8da3b13f470fd8872f068 Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 14 Oct 2023 19:25:47 -0500 Subject: [PATCH 16/21] chore: polish functional tests (#989) * Add BaseFunctionalTest to reuse configurations * Remove outdated supportsAGP42 check * Use gradleRunner syntax * Cleanups * Reuse more buildDir * Add TestGradleRunner to reuse arguments * Reuse --info flag * Reuse --debug flag * Test on Gradle 8.4 * Use current Gradle version on CI --- .github/workflows/gradle.yml | 2 +- .../com.github.spotbugs.test.gradle.kts | 6 +- .../snom/AndroidFunctionalTest.groovy | 42 +--- .../spotbugs/snom/BaseFunctionalTest.groovy | 48 ++++ .../snom/BasePluginFunctionalTest.groovy | 38 +-- .../snom/CacheabilityFunctionalTest.groovy | 70 ++---- .../snom/ExtensionFunctionalTest.groovy | 96 ++----- ...JavaToolchainsSupportFunctionalTest.groovy | 21 +- .../com/github/spotbugs/snom/Issue196.groovy | 23 +- .../com/github/spotbugs/snom/Issue909.groovy | 16 +- .../com/github/spotbugs/snom/Issue910.groovy | 18 +- .../KotlinBuildScriptFunctionalTest.groovy | 50 +--- .../snom/MultiProjectFunctionalTest.groovy | 45 +--- .../spotbugs/snom/ReportFunctionalTest.groovy | 134 +++------- .../snom/StandardFunctionalTest.groovy | 234 +++++------------- 15 files changed, 229 insertions(+), 614 deletions(-) create mode 100644 src/functionalTest/groovy/com/github/spotbugs/snom/BaseFunctionalTest.groovy diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 44fe7192..cd54fea0 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - gradle: ['7.6.2', '8.0'] + gradle: ['7.6.2', 'current'] steps: - uses: actions/checkout@v4 with: diff --git a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts index 9ac7dfa5..936d7960 100644 --- a/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts +++ b/buildSrc/src/main/kotlin/com/github/spotbugs/com.github.spotbugs.test.gradle.kts @@ -39,7 +39,11 @@ testing { all { testTask.configure { description = "Runs the functional tests." - systemProperty("snom.test.functional.gradle", System.getProperty("snom.test.functional.gradle", gradle.gradleVersion)) + var testGradleVersion = providers.gradleProperty("snom.test.functional.gradle").getOrElse("current") + if (testGradleVersion == "current") { + testGradleVersion = gradle.gradleVersion + } + systemProperty("snom.test.functional.gradle", testGradleVersion) } } } diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/AndroidFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/AndroidFunctionalTest.groovy index caa817c2..daf22d4b 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/AndroidFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/AndroidFunctionalTest.groovy @@ -13,43 +13,20 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner -import org.gradle.util.GradleVersion import spock.lang.Ignore import spock.lang.Requires -import spock.lang.Specification import static org.gradle.testkit.runner.TaskOutcome.SUCCESS @Ignore -class AndroidFunctionalTest extends Specification { - static String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) - - /** - * AGP 4.2 is only supported by Gradle 6.7.1 and up - * @see Android Gradle plugin release notes - */ - private static boolean supportsAGP42() { - GradleVersion.version(version) >= GradleVersion.version("6.7.1") - } - - File rootDir - - def setup() { - rootDir = Files.createTempDir() - } - - void cleanup() { - rootDir.deleteDir() - } +class AndroidFunctionalTest extends BaseFunctionalTest { @Requires({env['ANDROID_SDK_ROOT']}) - @Requires({AndroidFunctionalTest.supportsAGP42()}) def "can generate spotbugsRelease depending on app variant compilation task with AGP 4.2.0"() { given: "a Gradle project to build an Android app" - GradleRunner runner = getGradleRunner() + GradleRunner runner = gradleRunner writeAppBuildFile(runner, '4.2.0') writeSourceFile() writeManifestFile() @@ -62,10 +39,9 @@ class AndroidFunctionalTest extends Specification { } @Requires({env['ANDROID_SDK_ROOT']}) - @Requires({AndroidFunctionalTest.supportsAGP42()}) def "can generate spotbugsRelease depending on library variant compilation task with AGP 4.2.0"() { given: "a Gradle project to build an Android library" - GradleRunner runner = getGradleRunner() + GradleRunner runner = gradleRunner writeLibraryBuildFile(runner, '4.2.0') writeSourceFile() writeManifestFile() @@ -79,20 +55,9 @@ class AndroidFunctionalTest extends Specification { private BuildResult build(GradleRunner runner) { runner.withArguments(":spotbugsRelease", '-s') - .withGradleVersion(version) .build() } - private GradleRunner getGradleRunner() { - GradleRunner runner = - GradleRunner.create() - .withProjectDir(rootDir) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) - runner - } - def writeAppBuildFile(runner, agpVersion) { File buildFile = new File(rootDir, 'build.gradle') buildFile << """ @@ -185,6 +150,7 @@ public class Foo { void writeManifestFile() { File manifestFile = new File(rootDir, "src/main/AndroidManifest.xml") manifestFile.parentFile.mkdirs() + //noinspection HttpUrlsUsage manifestFile << """ """ diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/BaseFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/BaseFunctionalTest.groovy new file mode 100644 index 00000000..c9d32ba3 --- /dev/null +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/BaseFunctionalTest.groovy @@ -0,0 +1,48 @@ +/* + * Copyright 2023 SpotBugs team + * + *

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + *

http://www.apache.org/licenses/LICENSE-2.0 + * + *

Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.spotbugs.snom + +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.internal.DefaultGradleRunner +import org.gradle.util.GradleVersion +import spock.lang.Specification +import spock.lang.TempDir + +abstract class BaseFunctionalTest extends Specification { + static String gradleVersion = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) + + @TempDir + File rootDir + + GradleRunner getGradleRunner() { + return new TestGradleRunner() + .withGradleVersion(gradleVersion) + .withProjectDir(rootDir) + .withArguments('--debug', '--stacktrace') + .forwardOutput() + .withPluginClasspath() + } + + class TestGradleRunner extends DefaultGradleRunner { + @Override + DefaultGradleRunner withArguments(List arguments) { + return super.withArguments(this.arguments + arguments) + } + + @Override + DefaultGradleRunner withArguments(String... arguments) { + return withArguments(Arrays.asList(arguments)) + } + } +} diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/BasePluginFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/BasePluginFunctionalTest.groovy index 1b6b9b54..8d6f7366 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/BasePluginFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/BasePluginFunctionalTest.groovy @@ -13,23 +13,14 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import org.gradle.util.GradleVersion -import spock.lang.Specification import spock.lang.Unroll -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS - -class BasePluginFunctionalTest extends Specification { - File rootDir +class BasePluginFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDir() buildFile = new File(rootDir, 'build.gradle') buildFile << """ plugins { @@ -57,13 +48,8 @@ public class Foo { def "does not create SpotBugsTask by default"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":check") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -80,13 +66,8 @@ task spotbugsMain(type: com.github.spotbugs.snom.SpotBugsTask) { } """ when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":spotbugsMain") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -103,13 +84,8 @@ task spotbugsMain(type: com.github.spotbugs.snom.SpotBugsTask) { } """ when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":spotbugsMain") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -138,12 +114,8 @@ task spotbugsMain(type: com.github.spotbugs.snom.SpotBugsTask) { if (!isWorkerApi) { arguments.add('-Pcom.github.spotbugs.snom.worker=false') } - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .withDebug(true) def result = runner.buildAndFail() diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/CacheabilityFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/CacheabilityFunctionalTest.groovy index fde5d06a..ccc5a40e 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/CacheabilityFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/CacheabilityFunctionalTest.groovy @@ -14,32 +14,21 @@ package com.github.spotbugs.snom import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import org.gradle.util.GradleVersion -import spock.lang.Specification import java.nio.file.Files -class CacheabilityFunctionalTest extends Specification { +class CacheabilityFunctionalTest extends BaseFunctionalTest { /** * @see GitHub Issues */ def 'spotbugsMain task runs with configuration cache'() { given: - def buildDir = Files.createTempDirectory(null).toFile() - def version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) - - initializeBuildFile(buildDir) + initializeBuildFile(rootDir) when: - BuildResult result = - GradleRunner.create() - .withProjectDir(buildDir) + BuildResult result = gradleRunner .withArguments(':spotbugsMain', '--configuration-cache') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -47,12 +36,8 @@ class CacheabilityFunctionalTest extends Specification { result.output.contains("Configuration cache entry stored.") when: - BuildResult resultOfCachedBuild = GradleRunner.create() - .withProjectDir(buildDir) + BuildResult resultOfCachedBuild = gradleRunner .withArguments(':spotbugsMain', '--configuration-cache') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: resultOfCachedBuild.task(":spotbugsMain").outcome == TaskOutcome.UP_TO_DATE @@ -75,19 +60,13 @@ class CacheabilityFunctionalTest extends Specification { def buildDir1 = Files.createTempDirectory(null).toFile() def buildDir2 = Files.createTempDirectory(null).toFile() - def version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) - initializeBuildFile(buildDir1) initializeBuildFile(buildDir2) when: - BuildResult result1 = - GradleRunner.create() + BuildResult result1 = gradleRunner .withProjectDir(buildDir1) .withArguments(':spotbugsMain') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() def hashKeyLine1 = getHashKeyLine(result1) @@ -95,13 +74,9 @@ class CacheabilityFunctionalTest extends Specification { hashKeyLine1 when: - BuildResult result2 = - GradleRunner.create() + BuildResult result2 = gradleRunner .withProjectDir(buildDir2) .withArguments(':spotbugsMain', '--scan') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() def hashKeyLine2 = getHashKeyLine(result2) @@ -112,11 +87,9 @@ class CacheabilityFunctionalTest extends Specification { def 'spotbugsMain is cacheable even when no report is configured'() { given: - def buildDir = Files.createTempDirectory(null).toFile() - def version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) - def buildFile = new File(buildDir, "build.gradle") + def buildFile = new File(rootDir, "build.gradle") - initializeBuildFile(buildDir) + initializeBuildFile(rootDir) buildFile.write """ |plugins { | id 'java' @@ -131,20 +104,11 @@ class CacheabilityFunctionalTest extends Specification { |""".stripMargin() when: - GradleRunner.create() - .withProjectDir(buildDir) + gradleRunner .withArguments(':spotbugsMain', '--build-cache') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() - BuildResult result = - GradleRunner.create() - .withProjectDir(buildDir) + BuildResult result = gradleRunner .withArguments(':spotbugsMain', '--build-cache') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -156,13 +120,11 @@ class CacheabilityFunctionalTest extends Specification { */ def 'spotbugsMain is cacheable even if a stylesheet is set as String for the HTML report'() { given: - def buildDir = Files.createTempDirectory(null).toFile() - def version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) - def buildFile = new File(buildDir, "build.gradle") + def buildFile = new File(rootDir, "build.gradle") - initializeBuildFile(buildDir) + initializeBuildFile(rootDir) buildFile.delete() - new File(buildDir, "build.gradle.kts") << """ + new File(rootDir, "build.gradle.kts") << """ |import com.github.spotbugs.snom.SpotBugsTask |plugins { | `java` @@ -182,12 +144,8 @@ class CacheabilityFunctionalTest extends Specification { |""".stripMargin() when: - def result = GradleRunner.create() - .withProjectDir(buildDir) + def result = gradleRunner .withArguments(':spotbugsMain', '--configuration-cache') - .withPluginClasspath() - .withGradleVersion(version) - .forwardOutput() .build() then: diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/ExtensionFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/ExtensionFunctionalTest.groovy index 6a35e470..f588de4c 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/ExtensionFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/ExtensionFunctionalTest.groovy @@ -13,22 +13,15 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner -import org.gradle.testkit.runner.TaskOutcome -import org.gradle.util.GradleVersion -import spock.lang.Specification import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -class ExtensionFunctionalTest extends Specification { - File rootDir +class ExtensionFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDir() + buildFile = new File(rootDir, 'build.gradle') buildFile << """ plugins { @@ -65,11 +58,8 @@ spotbugs { """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -89,11 +79,8 @@ spotbugs { """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -113,11 +100,8 @@ spotbugs { """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -133,11 +117,8 @@ spotbugs { visitors = [ 'FindSqlInjection', 'SwitchFallthrough' ] }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -151,11 +132,8 @@ spotbugs { omitVisitors = [ 'FindSqlInjection', 'SwitchFallthrough' ] }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -169,11 +147,8 @@ spotbugs { onlyAnalyze = ['com.foobar.MyClass', 'com.foobar.mypkg.*'] }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -188,11 +163,8 @@ spotbugs { jvmArgs = ['-Duser.language=ja'] }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -207,11 +179,8 @@ spotbugs { maxHeapSize = '256m' }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -226,11 +195,8 @@ spotbugs { reportLevel = 'high' }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -246,17 +212,12 @@ spotbugs { toolVersion = "4.0.0-beta4" }""" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(":spotbugsMain", "--info") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments(":spotbugsMain") .build() then: - TaskOutcome.SUCCESS == result.task(":spotbugsMain").outcome + SUCCESS == result.task(":spotbugsMain").outcome result.output.contains("SpotBugs 4.0.0-beta4") || result.output.contains("spotbugs-4.0.0-beta4.jar") } @@ -270,17 +231,12 @@ dependencies { compileOnly "com.github.spotbugs:spotbugs-annotations:\${spotbugs.toolVersion.get()}" }""" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(":spotbugsMain", "--debug") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments(":spotbugsMain") .build() then: - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS result.output.contains("com.github.spotbugs:spotbugs-annotations:4.0.2") } } diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/GradleJavaToolchainsSupportFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/GradleJavaToolchainsSupportFunctionalTest.groovy index 72d6e329..781ce5fa 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/GradleJavaToolchainsSupportFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/GradleJavaToolchainsSupportFunctionalTest.groovy @@ -13,21 +13,14 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files -import org.gradle.testkit.runner.GradleRunner -import org.gradle.util.GradleVersion -import spock.lang.Specification import spock.lang.Unroll import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -class GradleJavaToolchainsSupportFunctionalTest extends Specification { - File rootDir +class GradleJavaToolchainsSupportFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDir() buildFile = new File(rootDir, 'build.gradle') buildFile << """ plugins { @@ -76,12 +69,8 @@ plugins { def arguments = [':spotbugsMain', '-is'] arguments.add(processConfigurationArgument) - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner.build() @@ -102,12 +91,8 @@ plugins { def arguments = [':spotbugsMain', '-is'] arguments.add(processConfigurationArgument) - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner.build() diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/Issue196.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/Issue196.groovy index e642dc0c..6e9a7599 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/Issue196.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/Issue196.groovy @@ -13,29 +13,17 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import org.gradle.util.GradleVersion -import spock.lang.Specification -import spock.lang.Unroll - -import java.nio.file.Paths - -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS /** * https://github.com/lazystone/spotbugs-bugs/blob/master/build.gradle.kts * https://github.com/spotbugs/spotbugs-gradle-plugin/issues/196 */ -class Issue196 extends Specification { - File rootDir +class Issue196 extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDir() buildFile = new File(rootDir, 'build.gradle.kts') buildFile << """ plugins { @@ -60,13 +48,8 @@ public class Foo { def "can run analysis when check task is triggered"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments("check", "--debug") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments("check") .build() then: diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/Issue909.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/Issue909.groovy index 4fb45d27..c884e2f9 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/Issue909.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/Issue909.groovy @@ -13,23 +13,17 @@ */ package com.github.spotbugs.snom -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import spock.lang.Specification - -import java.nio.file.Files import java.nio.file.Path /** * @see GitHub Issues */ -class Issue909 extends Specification { - Path rootDir +class Issue909 extends BaseFunctionalTest { Path buildFile def setup() { - rootDir = Files.createTempDirectory("spotbugs-gradle-plugin") - buildFile = rootDir.resolve("build.gradle") + buildFile = rootDir.toPath().resolve("build.gradle") buildFile.toFile() << """ plugins { id "java" @@ -47,7 +41,7 @@ tasks.spotbugsMain { } } """ - Path sourceDir = rootDir.resolve("src").resolve("main").resolve("java") + Path sourceDir = rootDir.toPath().resolve("src").resolve("main").resolve("java") sourceDir.toFile().mkdirs() Path sourceFile = sourceDir.resolve("Foo.java") sourceFile.toFile() << """ @@ -61,10 +55,8 @@ public class Foo { def "cannot generate HTML report if invalid XSL is provided"() { when: - def result = GradleRunner.create() - .withProjectDir(rootDir.toFile()) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() .buildAndFail() then: diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/Issue910.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/Issue910.groovy index 0753c619..5feb98ba 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/Issue910.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/Issue910.groovy @@ -14,20 +14,14 @@ package com.github.spotbugs.snom import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import spock.lang.Specification - -import java.nio.file.Files import java.nio.file.Path -class Issue910 extends Specification { - Path rootDir +class Issue910 extends BaseFunctionalTest { Path buildFile def setup() { - rootDir = Files.createTempDirectory("spotbugs-gradle-plugin") - buildFile = rootDir.resolve("build.gradle.kts") + buildFile = rootDir.toPath().resolve("build.gradle.kts") buildFile.toFile() << """ plugins { id("com.github.spotbugs") @@ -40,7 +34,7 @@ dependencies { spotbugsPlugins("com.mebigfatguy.sb-contrib:sb-contrib:7.6.0") } """ - Path sourceDir = rootDir.resolve("src").resolve("main").resolve("java") + Path sourceDir = rootDir.toPath().resolve("src").resolve("main").resolve("java") sourceDir.toFile().mkdirs() Path sourceFile = sourceDir.resolve("Foo.java") sourceFile.toFile() << """ @@ -54,12 +48,8 @@ public class Foo { def "can build with the sb-contrib 7-6-0"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir.toFile()) + BuildResult result = gradleRunner .withArguments("check") - .withPluginClasspath() - .forwardOutput() .build() then: diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/KotlinBuildScriptFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/KotlinBuildScriptFunctionalTest.groovy index b3adc086..05970cba 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/KotlinBuildScriptFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/KotlinBuildScriptFunctionalTest.groovy @@ -14,21 +14,13 @@ package com.github.spotbugs.snom import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner -import org.gradle.util.GradleVersion -import spock.lang.Specification - -import java.nio.file.Files import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -class KotlinBuildScriptFunctionalTest extends Specification { - File rootDir +class KotlinBuildScriptFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDirectory("KotlinBuildScriptFunctionalTest").toFile() buildFile = new File(rootDir, 'build.gradle.kts') buildFile << """ plugins { @@ -80,11 +72,8 @@ spotbugs { new File(rootDir, "baseline.xml") << "" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('check', '--info') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('check') .build() then: @@ -100,11 +89,8 @@ dependencies { """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('check', '--debug', "-Pcom.github.spotbugs.snom.javaexec-in-worker=false") - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('check', "-Pcom.github.spotbugs.snom.javaexec-in-worker=false") .build() then: @@ -120,13 +106,8 @@ dependencies { spotbugs("com.github.spotbugs:spotbugs:4.0.0-beta4") }""" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(":spotbugsMain", "--info") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments(":spotbugsMain") .build() then: @@ -145,12 +126,8 @@ tasks.spotbugsMain { } """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('check') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -168,17 +145,12 @@ dependencies { } """ when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(":spotbugsMain", "--debug") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments(":spotbugsMain") .build() then: result.task(":spotbugsMain").outcome == SUCCESS result.output.contains("com.github.spotbugs:spotbugs-annotations:4.0.2") } -} \ No newline at end of file +} diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/MultiProjectFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/MultiProjectFunctionalTest.groovy index fc9152b7..04c40e55 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/MultiProjectFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/MultiProjectFunctionalTest.groovy @@ -13,24 +13,18 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import org.gradle.util.GradleVersion import spock.lang.Ignore -import spock.lang.Specification import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -class MultiProjectFunctionalTest extends Specification { - File rootDir +class MultiProjectFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) + File subBuildFile def setup() { - rootDir = Files.createTempDir() buildFile = new File(rootDir, 'build.gradle') buildFile << """ plugins { @@ -70,28 +64,19 @@ repositories { def "can create spotbugsMain task depending on classes task"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":sub:spotbugsMain") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: - TaskOutcome.SUCCESS == result.task(":sub:classes").outcome - TaskOutcome.SUCCESS == result.task(":sub:spotbugsMain").outcome + SUCCESS == result.task(":sub:classes").outcome + SUCCESS == result.task(":sub:spotbugsMain").outcome } def "can use project name of sub project"() { when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(':sub:spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) - .forwardOutput() + def result = gradleRunner + .withArguments(':sub:spotbugsMain') .build() then: @@ -111,12 +96,8 @@ subprojects { """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(':sub:spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) - .forwardOutput() + def result = gradleRunner + .withArguments(':sub:spotbugsMain') .build() then: @@ -133,12 +114,8 @@ spotbugs { """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(':sub:spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) - .forwardOutput() + def result = gradleRunner + .withArguments(':sub:spotbugsMain') .build() then: diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/ReportFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/ReportFunctionalTest.groovy index b3ada51e..0dd1ca31 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/ReportFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/ReportFunctionalTest.groovy @@ -12,11 +12,6 @@ * limitations under the License. */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files -import org.gradle.util.GradleVersion -import spock.lang.Specification - -import org.gradle.testkit.runner.GradleRunner import static org.gradle.testkit.runner.TaskOutcome.FAILED @@ -24,13 +19,10 @@ import java.nio.file.Path import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -class ReportFunctionalTest extends Specification { - File rootDir +class ReportFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDir() buildFile = new File(rootDir, 'build.gradle') buildFile << """ plugins { @@ -65,11 +57,8 @@ public class Foo { |} |'''.stripMargin() when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .buildAndFail() then: @@ -86,11 +75,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain', '-is') - .withPluginClasspath() - .withGradleVersion(version) .build() then: @@ -109,10 +95,8 @@ spotbugsMain { buildDir = 'new-build-dir' """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() .build() then: @@ -140,10 +124,8 @@ buildDir = 'new-build-dir' |'''.stripMargin() when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() .buildAndFail() then: @@ -162,10 +144,8 @@ spotbugsMain { buildDir = 'new-build-dir' """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() .build() then: @@ -184,10 +164,8 @@ spotbugsMain { buildDir = 'new-build-dir' """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() .build() then: @@ -204,12 +182,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -238,11 +212,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', "--debug") - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -268,11 +239,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -290,11 +258,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: @@ -315,16 +280,13 @@ spotbugsMain { } """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: SUCCESS == result.task(":spotbugsMain").outcome - File reportsDir = rootDir.toPath().resolve("build").resolve("spotbugs").toFile(); + File reportsDir = rootDir.toPath().resolve("build").resolve("spotbugs").toFile() reportsDir.isDirectory() File report = reportsDir.toPath().resolve("main.txt").toFile() report.isFile() @@ -338,11 +300,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .buildAndFail() then: @@ -352,12 +311,8 @@ spotbugsMain { def "can run task by Worker Process"() { when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--info') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -370,12 +325,8 @@ spotbugsMain { com.github.spotbugs.snom.worker=false """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--info') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -385,12 +336,8 @@ com.github.spotbugs.snom.worker=false def "can run task by JavaExec by commandline option"() { when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '-Pcom.github.spotbugs.snom.worker=false', '--info') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain', '-Pcom.github.spotbugs.snom.worker=false') .build() then: @@ -414,12 +361,8 @@ configurations.spotbugs { } """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -438,16 +381,13 @@ reporting { baseDir "\$buildDir/our-reports" }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: SUCCESS == result.task(":spotbugsMain").outcome - File reportsDir = rootDir.toPath().resolve("build").resolve("our-reports").resolve("spotbugs").toFile(); + File reportsDir = rootDir.toPath().resolve("build").resolve("our-reports").resolve("spotbugs").toFile() reportsDir.isDirectory() File report = reportsDir.toPath().resolve("main.txt").toFile() report.isFile() @@ -461,11 +401,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: @@ -483,11 +420,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: @@ -506,11 +440,8 @@ spotbugsMain { } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: @@ -526,17 +457,14 @@ spotbugsMain { reports { xml.required = true } - + reports { xml.required = false } }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: diff --git a/src/functionalTest/groovy/com/github/spotbugs/snom/StandardFunctionalTest.groovy b/src/functionalTest/groovy/com/github/spotbugs/snom/StandardFunctionalTest.groovy index 05fa2592..c98a3af4 100644 --- a/src/functionalTest/groovy/com/github/spotbugs/snom/StandardFunctionalTest.groovy +++ b/src/functionalTest/groovy/com/github/spotbugs/snom/StandardFunctionalTest.groovy @@ -13,25 +13,18 @@ */ package com.github.spotbugs.snom -import org.gradle.internal.impldep.com.google.common.io.Files import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome -import org.gradle.util.GradleVersion -import spock.lang.Specification import spock.lang.Unroll import java.nio.file.Paths import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -class StandardFunctionalTest extends Specification { - File rootDir +class StandardFunctionalTest extends BaseFunctionalTest { File buildFile - String version = System.getProperty('snom.test.functional.gradle', GradleVersion.current().version) def setup() { - rootDir = Files.createTempDir() buildFile = new File(rootDir, 'build.gradle') buildFile << """ plugins { @@ -59,33 +52,23 @@ public class Foo { def "can create spotbugsMain task depending on classes task"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":spotbugsMain") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: - TaskOutcome.SUCCESS == result.task(":classes").outcome - TaskOutcome.SUCCESS == result.task(":spotbugsMain").outcome + SUCCESS == result.task(":classes").outcome + SUCCESS == result.task(":spotbugsMain").outcome } def "can be listed in the task list"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":tasks") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: - result.task(":tasks").outcome == TaskOutcome.SUCCESS + result.task(":tasks").outcome == SUCCESS result.output.contains("spotbugsMain - Run SpotBugs analysis for the source set 'main'") result.output.contains("spotbugsTest - Run SpotBugs analysis for the source set 'test'") } @@ -97,17 +80,12 @@ dependencies { spotbugs "com.github.spotbugs:spotbugs:4.0.0-beta4" }""" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(":spotbugsMain", "--info") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments(":spotbugsMain") .build() then: - TaskOutcome.SUCCESS == result.task(":classes").outcome + SUCCESS == result.task(":classes").outcome result.output.contains("SpotBugs 4.0.0-beta4") || result.output.contains("spotbugs-4.0.0-beta4.jar") } @@ -118,13 +96,8 @@ dependencies { sourceFile.delete() when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":spotbugsMain") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: @@ -138,11 +111,8 @@ spotbugsMain { reportLevel = 'high' }""" when: - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments('spotbugsMain', '--debug') - .withPluginClasspath() - .withGradleVersion(version) + def result = gradleRunner + .withArguments('spotbugsMain') .build() then: @@ -163,11 +133,8 @@ spotbugsMain { } """ when: - def result = GradleRunner.create() - .withProjectDir(rootDir) + def result = gradleRunner .withArguments('spotbugsMain') - .withPluginClasspath() - .withGradleVersion(version) .build() then: @@ -184,18 +151,11 @@ spotbugsMain { }""" when: - GradleRunner.create() - .withProjectDir(rootDir) + gradleRunner .withArguments(":spotbugsMain") - .withPluginClasspath() - .withGradleVersion(version) .build() - def result = GradleRunner.create() - .withProjectDir(rootDir) - .withArguments(":spotbugsMain", "--info") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + def result = gradleRunner + .withArguments(":spotbugsMain") .build() then: @@ -228,17 +188,13 @@ spotbugsMain { '-is' ] arguments.add('-Pcom.github.spotbugs.snom.javaexec-in-worker=' + isHybridApi) - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner.build() then: - result.task(':spotbugsMain').outcome == TaskOutcome.SUCCESS + result.task(':spotbugsMain').outcome == SUCCESS where: isHybridApi << [true, false] @@ -259,12 +215,8 @@ spotbugsMain { if(!isWorkerApi) { arguments.add('-Pcom.github.spotbugs.snom.worker=false') } - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner.buildAndFail() @@ -295,17 +247,13 @@ spotbugs { if(!isWorkerApi) { arguments.add('-Pcom.github.spotbugs.snom.worker=false') } - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner. build() then: - result.task(':spotbugsMain').outcome == TaskOutcome.SUCCESS + result.task(':spotbugsMain').outcome == SUCCESS result.output.contains('\tat ') || result.output.contains('SpotBugs ended with exit code 1') where: @@ -332,17 +280,13 @@ spotbugs { if(!isWorkerApi) { arguments.add('-Pcom.github.spotbugs.snom.worker=false') } - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner. build() then: - result.task(':spotbugsMain').outcome == TaskOutcome.SUCCESS + result.task(':spotbugsMain').outcome == SUCCESS !(result.output.contains('\tat ')) where: @@ -363,17 +307,13 @@ spotbugsMain { classes = classes.filter { it.name.contains 'Foo' } }""" when: - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(':spotbugsMain', '-is') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner. build() then: - result.task(':spotbugsMain').outcome == TaskOutcome.SUCCESS + result.task(':spotbugsMain').outcome == SUCCESS } def 'analyse main sourceset only'() { given: @@ -393,17 +333,13 @@ public class Foo { } """ when: - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(':spotbugsMain', ':spotbugsTest') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner.build() then: - TaskOutcome.SUCCESS == result.task(':spotbugsMain').outcome + SUCCESS == result.task(':spotbugsMain').outcome TaskOutcome.SKIPPED == result.task(':spotbugsTest').outcome } @@ -434,17 +370,13 @@ public class Foo { """ when: - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(':spotbugsAnother') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) def result = runner.build() then: - TaskOutcome.SUCCESS == result.task(':spotbugsAnother').outcome + SUCCESS == result.task(':spotbugsAnother').outcome } def "can pass the analysis when classDirs contain no .class file"() { @@ -457,33 +389,23 @@ public class Foo { File xml = new File(resourceDir, "bar.xml") xml << "" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments(":spotbugsMain") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: - result.task(":classes").outcome == TaskOutcome.SUCCESS + result.task(":classes").outcome == SUCCESS result.task(":spotbugsMain").outcome == TaskOutcome.NO_SOURCE } def "can run analysis when check task is triggered"() { when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult result = gradleRunner .withArguments("clean", "check") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS } def "can apply plugin"() { @@ -493,17 +415,12 @@ dependencies{ spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0' }""" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments("spotbugsMain", "--debug", "-Pcom.github.spotbugs.snom.javaexec-in-worker=false") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments("spotbugsMain", "-Pcom.github.spotbugs.snom.javaexec-in-worker=false") .build() then: - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS result.output.contains("Applying com.h3xstream.findsecbugs.PredictableRandomDetector to Foo") !result.output.contains("Trying to add already registered factory") } @@ -528,18 +445,13 @@ public class FooTest { } }""" when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments("spotbugsMain", "spotbugsTest", "--debug", "-Pcom.github.spotbugs.snom.javaexec-in-worker=false") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments("spotbugsMain", "spotbugsTest", "-Pcom.github.spotbugs.snom.javaexec-in-worker=false") .build() then: - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS - result.task(":spotbugsTest").outcome == TaskOutcome.SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS + result.task(":spotbugsTest").outcome == SUCCESS result.output.contains("Applying com.h3xstream.findsecbugs.PredictableRandomDetector to Foo") result.output.contains("Applying com.h3xstream.findsecbugs.PredictableRandomDetector to FooTest") !result.output.contains("Trying to add already registered factory") @@ -559,7 +471,7 @@ dependencies { public class MyFoo { public static void main(String... args) { java.util.Map items = com.google.common.collect.ImmutableMap.of("coin", 3, "glass", 4, "pencil", 1); - + items.entrySet() .stream() .forEach(System.out::println); @@ -568,33 +480,23 @@ public class MyFoo { """ when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments("spotbugsMain", '--debug') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments("spotbugsMain") .build() then: - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS result.output.contains("Using auxclasspath file") def expectedOutput = File.separator + "build" + File.separator + "spotbugs" + File.separator + "auxclasspath" + File.separator + "spotbugsMain" result.output.contains(expectedOutput) when: - BuildResult repeatedResult = - GradleRunner.create() - .withProjectDir(rootDir) + BuildResult repeatedResult = gradleRunner .withArguments("spotbugsMain", '--rerun-tasks', '-s') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .build() then: - repeatedResult.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + repeatedResult.task(":spotbugsMain").outcome == SUCCESS } def "can apply plugin using useAuxclasspathFile flag in parallel"() { @@ -615,7 +517,7 @@ dependencies { public class MyFoo { public static void main(String... args) { java.util.Map items = com.google.common.collect.ImmutableMap.of("coin", 3, "glass", 4, "pencil", 1); - + items.entrySet() .stream() .forEach(System.out::println); @@ -629,9 +531,9 @@ public class MyFoo { testSourceFile << """ import org.junit.*; import static org.junit.Assert.*; - + import java.util.*; - + public class SimpleTest { @Test public void testEmptyCollection() { @@ -642,17 +544,12 @@ public class SimpleTest { """ when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments("spotbugsMain", "spotbugsTest", '--parallel', '--debug') - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments("spotbugsMain", "spotbugsTest", '--parallel') .build() then: - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS result.output.contains("Using auxclasspath file") def expectedOutputMain = File.separator + "build" + File.separator + "spotbugs" + File.separator + "auxclasspath" + File.separator + "spotbugsMain" result.output.contains(expectedOutputMain) @@ -682,12 +579,8 @@ spotbugsMain { if(!isWorkerApi) { arguments.add('-Pcom.github.spotbugs.snom.worker=false') } - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .withDebug(true) def result = runner.buildAndFail() @@ -754,18 +647,14 @@ spotbugs { if(!isWorkerApi) { arguments.add('-Pcom.github.spotbugs.snom.worker=false') } - def runner = GradleRunner.create() - .withProjectDir(rootDir) + def runner = gradleRunner .withArguments(arguments) - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) .withDebug(true) def result = runner.build() then: - result.task(':spotbugsMain').outcome == TaskOutcome.SUCCESS + result.task(':spotbugsMain').outcome == SUCCESS where: isWorkerApi << [true, false] @@ -780,17 +669,12 @@ spotbugs { """ when: - BuildResult result = - GradleRunner.create() - .withProjectDir(rootDir) - .withArguments("build", "--stacktrace", "--debug") - .withPluginClasspath() - .forwardOutput() - .withGradleVersion(version) + BuildResult result = gradleRunner + .withArguments("build") .build() then: - result.task(":compileJava").outcome == TaskOutcome.SUCCESS - result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS + result.task(":compileJava").outcome == SUCCESS + result.task(":spotbugsMain").outcome == SUCCESS } } From 0c5bd21a063be217ccb3af467c044a60fd0ad91c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 03:43:14 +0000 Subject: [PATCH 17/21] chore(deps): update plugin com.github.spotbugs to v5.2.0 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2265cdc9..76658708 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { id("com.github.spotbugs.plugin-publish") id("com.github.spotbugs.test") id("org.sonarqube") - id("com.github.spotbugs") version "5.1.5" + id("com.github.spotbugs") version "5.2.0" } java { From 527068f5cae0eb8df632840d33dd8d63a58907d8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 07:39:21 +0000 Subject: [PATCH 18/21] chore(deps): update dependency lint-staged to v15.0.1 --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3fa1ed71..2c28e6bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3106,9 +3106,9 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.0.tgz", - "integrity": "sha512-OdrAd/qZhO4MnPyNRehI1Fh6j8kcfQoGpjQ1Vw8dSkDkNONdqe/HpKXqtKpFIPCAYeF4/tfnE11MnjLYuLKjqA==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", + "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -11177,9 +11177,9 @@ "dev": true }, "lint-staged": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.0.tgz", - "integrity": "sha512-OdrAd/qZhO4MnPyNRehI1Fh6j8kcfQoGpjQ1Vw8dSkDkNONdqe/HpKXqtKpFIPCAYeF4/tfnE11MnjLYuLKjqA==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", + "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", "dev": true, "requires": { "chalk": "5.3.0", From cc7699ca271ee184c6d750bb08ca8daa1a978546 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 19:58:07 -0400 Subject: [PATCH 19/21] fix(deps): update dependency com.google.errorprone:error_prone_core to v2.23.0 (#1010) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 76658708..5b3feb9e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ java { group = "com.github.spotbugs.snom" -val errorproneVersion = "2.22.0" +val errorproneVersion = "2.23.0" val spotBugsVersion = "4.8.0" val slf4jVersion = "2.0.0" val androidGradlePluginVersion = "7.3.1" From a2ab8c18b5e6938287f9eb91c41d61f61b330ef3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 03:09:18 +0000 Subject: [PATCH 20/21] chore(deps): update plugin com.github.spotbugs to v5.2.1 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5b3feb9e..305cb924 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { id("com.github.spotbugs.plugin-publish") id("com.github.spotbugs.test") id("org.sonarqube") - id("com.github.spotbugs") version "5.2.0" + id("com.github.spotbugs") version "5.2.1" } java { From ff1525a417bdeb59fbcfdb1677e796e83a129e5c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 12:28:04 +0000 Subject: [PATCH 21/21] chore(deps): update dependency lint-staged to v15.0.2 --- package-lock.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c28e6bf..eaccd7fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3106,9 +3106,9 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", - "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -3116,11 +3116,11 @@ "debug": "4.3.4", "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "7.0.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.2" + "yaml": "2.3.3" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -3279,9 +3279,9 @@ } }, "node_modules/listr2": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", - "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -8910,9 +8910,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true, "engines": { "node": ">= 14" @@ -11177,9 +11177,9 @@ "dev": true }, "lint-staged": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", - "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "requires": { "chalk": "5.3.0", @@ -11187,11 +11187,11 @@ "debug": "4.3.4", "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "7.0.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.2" + "yaml": "2.3.3" }, "dependencies": { "chalk": { @@ -11280,9 +11280,9 @@ } }, "listr2": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", - "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -15128,9 +15128,9 @@ "dev": true }, "yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true }, "yargs": {