diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 369f90c..fbdd2b6 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -3,4 +3,4 @@ set -e set -o pipefail -./gradlew --console=colored checkstyleMain checkstyleTest +./gradlew --console=colored compileJava compileTestJava diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4a577b4..cb3258e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,9 +44,6 @@ jobs: shell: bash - name: Build package run: ./gradlew --console=colored build -x test - env: - GITHUB_USER_NAME: ${{ github.actor }} - GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: aboutbits/github-actions-docker/build-push@v1 with: username: ${{ github.actor }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 96a3be2..4997018 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,6 +25,3 @@ jobs: :operator:test --fail-fast -Dquarkus.test.profile=test-pg${{ matrix.postgres-version }} - env: - GITHUB_USER_NAME: ${{ github.actor }} - GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index f3e9c81..ade063c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ ### PostgreSQL Operator ### -config/ # Written by the fabric8 Kubernetes client when the tests run against the Dev Service operator/.kube/ @@ -17,7 +16,6 @@ operator/.kube/ .idea/* !.idea/codeStyles !.idea/.gitignore -!.idea/checkstyle-idea.xml !.idea/encodings.xml !.idea/misc.xml !.idea/sqldialects.xml diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml deleted file mode 100644 index c6f79d7..0000000 --- a/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - 13.4.2 - JavaOnly - - - - \ No newline at end of file diff --git a/README.md b/README.md index 1dbda91..629202b 100644 --- a/README.md +++ b/README.md @@ -222,21 +222,6 @@ To build the project, the following prerequisites must be met: ### Setup -To get started, you first need to configure the GitHub Gradle Packages registry to be able to pull the [AbouBits Java Checkstyle Config](https://github.com/aboutbits/java-checkstyle-config) from the GitHub Packages registry. - -Follow https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry -The guide basically tells you to click on `Generate new token (classic)` on https://github.com/settings/tokens, add the permission `read:packages` and copy the token which we need below. - -If it does not exist yet, create a file `~/.gradle/gradle.properties` in your home directory and add the following lines. - -```properties -gpr.user= -# The token generated above -gpr.key= -``` - -Then call: - ```bash make init diff --git a/build.gradle.kts b/build.gradle.kts index 85ff274..3d80ead 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,3 @@ -import net.ltgt.gradle.errorprone.CheckSeverity import net.ltgt.gradle.errorprone.errorprone import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent @@ -6,7 +5,6 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent plugins { idea java - checkstyle id("io.quarkus").apply(false) alias(libs.plugins.axionReleasePlugin) alias(libs.plugins.errorPronePlugin) @@ -31,20 +29,10 @@ version = scmVersion.version allprojects { group = "it.aboutbits.postgresql" version = rootProject.version - - tasks.withType().configureEach { - dependsOn(":checkstyleExtractConfig") - - reports { - html.required = false - xml.required = false - } - } } subprojects { apply(plugin = "java") - apply(plugin = "checkstyle") apply(plugin = rootProject.libs.plugins.errorPronePlugin.get().pluginId) java { @@ -82,10 +70,8 @@ subprojects { options.compilerArgs.add("-parameters") options.errorprone { - check("NullAway", CheckSeverity.ERROR) - check("RequireExplicitNullMarking", CheckSeverity.ERROR) - option("NullAway:AnnotatedPackages", "it.aboutbits.postgresql") - option("NullAway:JSpecifyMode", "true") + // The checks live in errorprone.args, see https://github.com/tbroyer/gradle-errorprone-plugin#argument-files + argumentFiles.from(rootProject.layout.projectDirectory.file("errorprone.args")) } } @@ -126,34 +112,3 @@ subprojects { } } } - -val checkstyleConfig: Configuration by configurations.creating { - isCanBeConsumed = false - isCanBeResolved = true -} - -dependencies { - /** - * AboutBits Libraries - */ - checkstyleConfig(libs.checkstyleConfig) -} - -tasks.register("checkstyleExtractConfig") { - description = "Extracts the AboutBits Checkstyle configuration from the classpath." - group = JavaBasePlugin.CHECK_TASK_NAME - - from(zipTree(checkstyleConfig.singleFile)) { - include("checkstyle.xml", "checkstyle-suppressions.xml") - } - into(layout.projectDirectory.dir("config/checkstyle/")) -} - -checkstyle { - toolVersion = libs.versions.checkstyle.get() - isShowViolations = true - configFile = rootProject.file("config/checkstyle/checkstyle.xml") - configProperties = mapOf( - "suppressionFile" to rootProject.file("config/checkstyle/checkstyle-suppressions.xml") - ) -} diff --git a/errorprone.args b/errorprone.args new file mode 100644 index 0000000..00cf495 --- /dev/null +++ b/errorprone.args @@ -0,0 +1,117 @@ +# Error Prone and NullAway configuration. +# +# build.gradle.kts reads this file through options.errorprone.argumentFiles. +# +# Rules for this file: +# 1. Write one flag per line. +# 2. Write a check as the Xep prefix, then the check name, then the severity. +# A severity is ERROR, WARN or OFF. Omit the severity to keep the default. +# 3. Write a check option as the XepOpt prefix, then the key, then the value. +# 4. Never write an "at" sign in a comment. Error Prone reads it as a file reference. +# 5. Never start a comment word with a dash. Error Prone reads it as a flag. +# 6. This file cannot reference a second argument file. + +# Nullness +-Xep:NullAway:ERROR +-XepOpt:NullAway:AnnotatedPackages=it.aboutbits.postgresql +-XepOpt:NullAway:JSpecifyMode=true +-Xep:AnnotationPosition:ERROR +-Xep:EqualsMissingNullable:ERROR +-Xep:MultipleNullnessAnnotations:ERROR +-Xep:RequireExplicitNullMarking:ERROR + +# Javadoc +-Xep:AlmostJavadoc:ERROR +-Xep:DepAnn:ERROR +-Xep:EmptyBlockTag:ERROR +-Xep:EscapedEntity:ERROR +-Xep:InvalidBlockTag:ERROR +-Xep:InvalidInlineTag:ERROR +-Xep:InvalidLink:ERROR +-Xep:InvalidParam:ERROR +-Xep:InvalidThrows:ERROR +-Xep:MalformedInlineTag:ERROR +-Xep:MissingSummary:ERROR +-Xep:NotJavadoc:ERROR +-Xep:PreferThrowsTag:ERROR +-Xep:UnescapedEntity:ERROR +-Xep:UnrecognisedJavadocTag:ERROR + +# Imports +-Xep:BadImport:ERROR +-Xep:RemoveUnusedImports:ERROR +-Xep:UnnecessaryStaticImport:ERROR +-Xep:WildcardImport:ERROR + +# Naming and source layout +-Xep:ClassName:ERROR +-Xep:ConstantField:ERROR +-Xep:DefaultPackage:ERROR +-Xep:MultipleTopLevelClasses:ERROR +-Xep:PackageLocation:ERROR + +# Blocks, statements and switches +-Xep:EmptyCatch:ERROR +-Xep:EmptyIf:ERROR +-Xep:EmptyTopLevelDeclaration:ERROR +-Xep:MissingBraces:ERROR +-Xep:MissingCasesInEnumSwitch:ERROR +-Xep:MissingDefault:ERROR +-Xep:MultiVariableDeclaration:ERROR +-Xep:SwitchDefault:ERROR +-Xep:UseEnumSwitch:ERROR + +# Class design +-Xep:InterfaceWithOnlyStatics:ERROR +-Xep:MutablePublicArray:ERROR +-Xep:PrivateConstructorForUtilityClass:ERROR +-Xep:ProtectedMembersInFinalClass:ERROR +-Xep:TooManyParameters:ERROR + +# Correctness +-Xep:AmbiguousMethodReference:ERROR +-Xep:AssignmentExpression:ERROR +-Xep:BadInstanceof:ERROR +-Xep:CheckReturnValue:ERROR +-Xep:EqualsIncompatibleType:ERROR +-Xep:FallThrough:ERROR +-Xep:Finally:ERROR +-Xep:FunctionalInterfaceClash:ERROR +-Xep:HidingField:ERROR +# Important due to performance reasons, see +# https://github.com/uber/NullAway/wiki/Configuration#perform-exhaustive-override-checks +-Xep:MissingOverride:ERROR +-Xep:MockNotUsedInProduction:ERROR +-Xep:NarrowingCompoundAssignment:ERROR +-Xep:Overrides:ERROR +-Xep:PrimitiveArrayPassedToVarargsMethod:ERROR +-Xep:ReferenceEquality:ERROR +-Xep:SelfComparison:ERROR +-Xep:StaticQualifiedUsingExpression:ERROR +-Xep:SymbolToString:ERROR +-Xep:TypeToString:ERROR +-Xep:UnusedException:ERROR +-Xep:UnusedMethod:ERROR +-Xep:UnusedNestedClass:ERROR +-Xep:UnusedVariable:ERROR + +# Redundant code and house style +-Xep:BooleanLiteral:ERROR +-Xep:ComplexBooleanConstant:ERROR +-Xep:ExplicitArrayForVarargs:ERROR +-Xep:LongLiteralLowerCaseSuffix:ERROR +-Xep:MixedArrayDimensions:ERROR +-Xep:StringConcatToTextBlock:ERROR +-Xep:TryWithResourcesVariable:ERROR +-Xep:UnnecessaryAnonymousClass:ERROR +-Xep:UnnecessaryAssignment:ERROR +-Xep:UnnecessaryBoxedAssignment:ERROR +-Xep:UnnecessaryBoxedVariable:ERROR +-Xep:UnnecessaryFinal:ERROR +-Xep:UnnecessaryLambda:ERROR +-Xep:UnnecessaryMethodReference:ERROR +-Xep:UnnecessaryParentheses:ERROR +-Xep:Varifier:ERROR + +# Turn off as this check is too noisy +-Xep:StringSplitter:OFF diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1228662..506b34a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,4 @@ [versions] -## AboutBits Libraries ## -checkstyleConfig = "2.0.0-RC2" - # Axion Release Plugin # axionReleasePlugin = "1.21.1" @@ -17,8 +14,8 @@ scram-client = "3.2" assertj = "3.27.7" checkstyle = "13.4.2" datafaker = "2.5.4" -errorProne = "2.49.0" -errorPronePlugin = "5.1.0" +errorProne = "2.50.0" +errorPronePlugin = "5.1.1" nullAway = "0.13.4" [plugins] @@ -36,13 +33,6 @@ errorPronePlugin = { id = "net.ltgt.errorprone", version.ref = "errorPronePlugin jooqPlugin = { id = "org.jooq.jooq-codegen-gradle", version.ref = "jooq" } [libraries] -## AboutBits Libraries ## - -# https://github.com/aboutbits/java-checkstyle-config -checkstyleConfig = { group = "it.aboutbits", name = "java-checkstyle-config", version.ref = "checkstyleConfig" } - -## Libraries ## - # jOOQ # # https://www.jooq.org/ # https://www.jooq.org/download/versions @@ -87,11 +77,6 @@ scram-client = { group = "com.ongres.scram", name = "scram-client", version.ref # https://mvnrepository.com/artifact/org.assertj/assertj-core assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertj" } -# https://checkstyle.org/ -# https://github.com/checkstyle/checkstyle -# https://mvnrepository.com/artifact/com.puppycrawl.tools/checkstyle -checkstyle = { group = "com.puppycrawl.tools", name = "checkstyle", version.ref = "checkstyle" } - # https://datafaker.net/ # https://github.com/datafaker-net/datafaker # https://mvnrepository.com/artifact/net.datafaker/datafaker diff --git a/lombok.config b/lombok.config index a8fed54..fc8f4e3 100644 --- a/lombok.config +++ b/lombok.config @@ -7,3 +7,6 @@ lombok.addNullAnnotations = jspecify # Required for NullAway lombok.addLombokGeneratedAnnotation = true + +# Enable CheckReturnValue annotation on generated code for Error Prone and static analysis +lombok.checkReturnValueAnnotation = lombok diff --git a/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantReconciler.java b/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantReconciler.java index ead867b..1aba2a2 100644 --- a/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantReconciler.java +++ b/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantReconciler.java @@ -214,7 +214,7 @@ protected CRStatus newStatus() { return new CRStatus(); } - @SuppressWarnings({"checkstyle:MethodLength", "java:S3776"}) + @SuppressWarnings("java:S3776") private UpdateControl reconcileInTransaction( DSLContext tx, Grant resource, diff --git a/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantService.java b/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantService.java index c411175..4255943 100644 --- a/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantService.java +++ b/operator/src/main/java/it/aboutbits/postgresql/crd/grant/GrantService.java @@ -45,7 +45,6 @@ public class GrantService { /// @param tx The DSLContext for database operations. /// @param spec The GrantSpec containing the specification details. /// @return A map with object names as keys and lists of Privilege as values. - @SuppressWarnings("checkstyle:MethodLength") public Map> determineCurrentObjectPrivileges( DSLContext tx, GrantSpec spec @@ -216,7 +215,7 @@ public Map> determineCurrentObjectPrivileges( /// @param spec the GrantSpec object containing specifications about the target database objects and privileges /// @return a map where the keys represent object names and the values indicate ownership status, /// or `null` if the object does not exist - @SuppressWarnings({"checkstyle:MethodLength", "java:S3776"}) + @SuppressWarnings("java:S3776") public Map determineObjectExistenceAndOwnership( DSLContext tx, GrantSpec spec diff --git a/operator/src/test/java/it/aboutbits/postgresql/crd/grant/GrantReconcilerTest.java b/operator/src/test/java/it/aboutbits/postgresql/crd/grant/GrantReconcilerTest.java index f37df7f..80bcfe7 100644 --- a/operator/src/test/java/it/aboutbits/postgresql/crd/grant/GrantReconcilerTest.java +++ b/operator/src/test/java/it/aboutbits/postgresql/crd/grant/GrantReconcilerTest.java @@ -737,7 +737,6 @@ void grantOnTable( ); } - @SuppressWarnings("checkstyle:MethodLength") @ParameterizedTest @MethodSource("provideAllSupportedPrivileges") @DisplayName("Should grant and revoke privileges on all tables") @@ -1058,7 +1057,6 @@ void grantOnSequence() { ); } - @SuppressWarnings("checkstyle:MethodLength") @Test @DisplayName("Should grant and revoke privileges on all sequences") void grantOnAllSequences() { diff --git a/operator/src/test/java/it/aboutbits/postgresql/crd/role/RoleReconcilerTest.java b/operator/src/test/java/it/aboutbits/postgresql/crd/role/RoleReconcilerTest.java index 89551fc..26bee55 100644 --- a/operator/src/test/java/it/aboutbits/postgresql/crd/role/RoleReconcilerTest.java +++ b/operator/src/test/java/it/aboutbits/postgresql/crd/role/RoleReconcilerTest.java @@ -868,7 +868,7 @@ void deleteRole_removesFromDatabase() { .until(() -> !roleService.roleExists(dsl, role.getSpec())); } - private @Nullable T getRoleFlagValue( + private @Nullable T getRoleFlagValue( DSLContext dsl, String roleName, Field field diff --git a/operator/src/test/java/it/aboutbits/postgresql/helm/HelmTest.java b/operator/src/test/java/it/aboutbits/postgresql/helm/HelmTest.java index 6e284a2..dac3efb 100644 --- a/operator/src/test/java/it/aboutbits/postgresql/helm/HelmTest.java +++ b/operator/src/test/java/it/aboutbits/postgresql/helm/HelmTest.java @@ -71,7 +71,6 @@ class HelmTest { this.rootValuesAlias = rootValuesAlias; } - @SuppressWarnings("checkstyle:MethodLength") @Test @DisplayName("When the Helm chart is installed, the operator deployment should be created") void helmInstall_createsDeployment() throws IOException { diff --git a/settings.gradle.kts b/settings.gradle.kts index 05bf6d6..7670f4e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -23,33 +23,6 @@ dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { - val githubUser = providers.gradleProperty("gpr.user") - .orElse(providers.environmentVariable("GITHUB_USER_NAME")) - val githubToken = providers.gradleProperty("gpr.key") - .orElse(providers.environmentVariable("GITHUB_ACCESS_TOKEN")) - - fun addGitHubRepo(name: String): MavenArtifactRepository { - return maven { - this.name = name - url = uri("https://maven.pkg.github.com/aboutbits/$name") - credentials { - username = githubUser.orNull - password = githubToken.orNull - } - } - } - - // https://docs.gradle.org/current/userguide/best_practices_dependencies.html#use_content_filtering - exclusiveContent { - forRepositories( - addGitHubRepo("java-checkstyle-config"), - mavenLocal() - ) - filter { - includeGroupAndSubgroups("it.aboutbits") - } - } - mavenCentral() mavenLocal() }