From d6e98488f5b0f67dc38736929e73a2f57831ce7d Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 23 Mar 2023 18:33:50 +0300 Subject: [PATCH] Migration to Gradle (#1625) --- .editorconfig | 3 + .github/workflows/build_and_test.yml | 139 ++-- .github/workflows/codeql-analysis.yml | 22 +- .github/workflows/detekt.yml | 39 +- .github/workflows/diktat.yml | 48 +- .github/workflows/diktat_snapshot.yml | 96 ++- .github/workflows/metrics_for_master.yml | 39 -- .gitignore | 3 + build.gradle.kts | 108 +++ diktat-common/build.gradle.kts | 19 + diktat-common/pom.xml | 98 --- diktat-dev-ksp/build.gradle.kts | 8 + .../diktat/ruleset/generation/EnumNames.kt | 14 + .../generation/EnumNamesSymbolProcessor.kt | 103 +++ .../EnumNamesSymbolProcessorProvider.kt | 16 + ...ols.ksp.processing.SymbolProcessorProvider | 1 + diktat-gradle-plugin/build.gradle.kts | 83 +-- .../gradle-plugin-marker/pom.xml | 40 -- diktat-gradle-plugin/pom.xml | 208 ------ diktat-gradle-plugin/settings.gradle.kts | 6 - .../org/cqfn/diktat/plugin/gradle/Utils.kt | 31 +- .../plugin/gradle/DiktatJavaExecTaskBase.kt | 1 + diktat-maven-plugin/build.gradle.kts | 53 ++ diktat-maven-plugin/pom.xml | 347 ---------- .../diktat/plugin/maven/DiktatBaseMojoTest.kt | 10 +- diktat-rules/build.gradle.kts | 45 ++ diktat-rules/pom.xml | 152 ----- .../src/main/kotlin/generated/WarningNames.kt | 279 -------- .../cqfn/diktat/ruleset/constants/Warnings.kt | 5 + .../diktat/ruleset/generation/Generation.kt | 56 -- diktat-ruleset/build.gradle.kts | 61 ++ diktat-ruleset/pom.xml | 229 ------- .../ruleset/smoke/DiktatSaveSmokeTest.kt | 3 +- .../ruleset/smoke/DiktatSmokeTestBase.kt | 2 +- .../{build.gradle_.kts => build.gradle.kts_} | 0 diktat-test-framework/build.gradle.kts | 17 + diktat-test-framework/pom.xml | 123 ---- gradle.properties | 13 + gradle/libs.versions.toml | 157 +++++ gradle/plugins/build.gradle.kts | 45 ++ gradle/plugins/settings.gradle.kts | 9 + gradle/plugins/src/main/kotlin/Versions.kt | 8 + .../diktat/buildutils/JacocoConfiguration.kt | 41 ++ .../buildutils/PublishingConfiguration.kt | 168 +++++ .../buildutils/VersioningConfiguration.kt | 39 ++ .../code-quality-convention.gradle.kts | 6 + ...detekt-convention-configuration.gradle.kts | 39 ++ ...diktat-convention-configuration.gradle.kts | 34 + ...ktat-version-file-configuration.gradle.kts | 50 ++ .../git-hook-configuration.gradle.kts | 14 + .../kotlin-jvm-configuration.gradle.kts | 32 + .../publishing-configuration.gradle.kts | 37 ++ ...g-signing-default-configuration.gradle.kts | 21 + .../versioning-configuration.gradle.kts | 3 + .../wrapper/gradle-wrapper.jar | Bin 61574 -> 61608 bytes .../wrapper/gradle-wrapper.properties | 0 diktat-gradle-plugin/gradlew => gradlew | 4 +- .../gradlew.bat => gradlew.bat | 0 pom.xml | 625 ------------------ settings.gradle.kts | 54 ++ 60 files changed, 1500 insertions(+), 2406 deletions(-) delete mode 100644 .github/workflows/metrics_for_master.yml create mode 100644 build.gradle.kts create mode 100644 diktat-common/build.gradle.kts delete mode 100644 diktat-common/pom.xml create mode 100644 diktat-dev-ksp/build.gradle.kts create mode 100644 diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNames.kt create mode 100644 diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessor.kt create mode 100644 diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessorProvider.kt create mode 100644 diktat-dev-ksp/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider delete mode 100644 diktat-gradle-plugin/gradle-plugin-marker/pom.xml delete mode 100644 diktat-gradle-plugin/pom.xml delete mode 100644 diktat-gradle-plugin/settings.gradle.kts create mode 100644 diktat-maven-plugin/build.gradle.kts delete mode 100644 diktat-maven-plugin/pom.xml create mode 100644 diktat-rules/build.gradle.kts delete mode 100644 diktat-rules/pom.xml delete mode 100644 diktat-rules/src/main/kotlin/generated/WarningNames.kt delete mode 100644 diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/generation/Generation.kt create mode 100644 diktat-ruleset/build.gradle.kts delete mode 100644 diktat-ruleset/pom.xml rename diktat-ruleset/src/test/resources/test/smoke/{build.gradle_.kts => build.gradle.kts_} (100%) create mode 100644 diktat-test-framework/build.gradle.kts delete mode 100644 diktat-test-framework/pom.xml create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/plugins/build.gradle.kts create mode 100644 gradle/plugins/settings.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/Versions.kt create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/JacocoConfiguration.kt create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/PublishingConfiguration.kt create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/VersioningConfiguration.kt create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/code-quality-convention.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/detekt-convention-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-convention-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-version-file-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/git-hook-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/kotlin-jvm-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-signing-default-configuration.gradle.kts create mode 100644 gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/versioning-configuration.gradle.kts rename {diktat-gradle-plugin/gradle => gradle}/wrapper/gradle-wrapper.jar (67%) rename {diktat-gradle-plugin/gradle => gradle}/wrapper/gradle-wrapper.properties (100%) rename diktat-gradle-plugin/gradlew => gradlew (99%) rename diktat-gradle-plugin/gradlew.bat => gradlew.bat (100%) delete mode 100644 pom.xml create mode 100644 settings.gradle.kts diff --git a/.editorconfig b/.editorconfig index a54359c8a0..5f30b45a1d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,6 +14,9 @@ ij_smart_tabs = false ij_visual_guides = 80,120,180 ij_wrap_on_typing = false +[{*.yaml,*.yml}] +indent_size = 2 + [{*.kt,*.kts}] ij_kotlin_align_in_columns_case_branch = false ij_kotlin_align_multiline_binary_operation = false diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 07b048030a..981a3fae74 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -7,6 +7,13 @@ on: branches: - 'master' +concurrency: + # https://docs.github.com/en/actions/using-jobs/using-concurrency + # The latest queued workflow is preferred; the ones already in progress get cancelled + # Workflows on master branch shouldn't be cancelled, that's why they are identified by commit SHA + group: ${{ github.ref == 'refs/heads/master' && format('{0}-{1}', github.workflow, github.sha) || format('{0}-{1}', github.workflow, github.ref) }} + cancel-in-progress: true + jobs: build_and_test_with_code_coverage: name: Build, test and upload code coverage @@ -14,40 +21,53 @@ jobs: steps: - uses: actions/checkout@v3 + with: + # required for correct codecov upload + fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: zulu java-version: 11 - - name: Cache local Maven repository + distribution: temurin + - name: Retrieve Kotlin version + run: | + kv=$(cat gradle/libs.versions.toml | grep '^kotlin =' | awk -F'[=]' '{print $2}' | tr -d '" ') + echo KOTLIN_VERSION=$kv >> $GITHUB_ENV + shell: bash + - name: Cache konan uses: actions/cache@v3 with: - path: ~/.m2/repository - key: maven-build-${{ hashFiles('**/pom.xml') }} - restore-keys: | - maven-build- - - name: Maven Install - run: mvn -B -Dstyle.color=always clean install - - name: Code coverage report - uses: codecov/codecov-action@v3 + path: ~/.konan + key: ${{ runner.os }}-gradle-konan-${{ env.KOTLIN_VERSION }} + - name: Build all + uses: gradle/gradle-build-action@v2 + with: + gradle-version: wrapper + gradle-home-cache-cleanup: true + arguments: | + build + -x detekt + --scan + --build-cache + + - name: Upload gradle reports + if: ${{ always() }} + uses: actions/upload-artifact@v3 with: - files: '**/target/site/jacoco*/jacoco.xml,**/reports/jacoco/**/*.xml' - flags: unittests - fail_ci_if_error: true # optional (default = false) + name: gradle-reports + path: '**/build/reports/' + retention-days: 1 - name: Upload diktat jar uses: actions/upload-artifact@v3 with: name: diktat-ruleset - path: diktat-ruleset/target/diktat-*.jar + path: diktat-ruleset/build/libs/diktat-*.jar # no need to store artifact longer, it is used only by dependant jobs retention-days: 1 - - name: Upload gradle reports - if: ${{ failure() }} - uses: actions/upload-artifact@v3 + - name: Code coverage report + uses: codecov/codecov-action@v3 with: - name: gradle-test-report-${{ runner.os }} - path: 'diktat-gradle-plugin/build/reports/' - retention-days: 1 + fail_ci_if_error: false run_diktat_from_CLI: name: Run diktat via CLI @@ -60,10 +80,11 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Setup environment variables + + - name: Retrieve Ktlint version run: | - cat pom.xml | grep ".*" | head -1 | awk -F'[><]' '{ printf "DIKTAT_VERSION=%s\n",$3 }' >> $GITHUB_ENV - cat pom.xml | grep ".*" | head -1 | awk -F'[><]' '{ printf "KTLINT_VERSION=%s\n",$3 }' >> $GITHUB_ENV + ktlint_version=$(cat gradle/libs.versions.toml | grep '^ktlint =' | awk -F'[=]' '{print $2}' | tr -d '" ') + echo KTLINT_VERSION=$ktlint_version >> $GITHUB_ENV shell: bash - name: Setup environment @@ -77,10 +98,16 @@ jobs: with: name: diktat-ruleset + - name: Retrieve diktat jar file name + run: | + filename=$(ls diktat-*.jar) + echo DIKTAT_JAR=$filename >> $GITHUB_ENV + shell: bash + - name: Run diKTat from cli continue-on-error: true run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard 'examples/maven/src/main/kotlin/Test.kt' &>out.txt + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard 'examples/maven/src/main/kotlin/Test.kt' &>out.txt shell: bash - name: Check output @@ -94,14 +121,14 @@ jobs: continue-on-error: true if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }} run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard "$PWD/examples/maven/src/main/kotlin/Test.kt" &>out.txt + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard "$PWD/examples/maven/src/main/kotlin/Test.kt" &>out.txt shell: bash - name: Run diKTat from cli on windows (absolute paths) continue-on-error: true if: runner.os == 'Windows' run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard "%cd%/examples/maven/src/main/kotlin/Test.kt" > out.txt 2>&1 + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard "%cd%/examples/maven/src/main/kotlin/Test.kt" > out.txt 2>&1 shell: cmd - name: Check output (absolute paths) @@ -114,7 +141,7 @@ jobs: - name: Run diKTat from cli (glob paths, 1 of 4) continue-on-error: true run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard 'examples/maven/src/main/kotlin/*.kt' &>out.txt + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard 'examples/maven/src/main/kotlin/*.kt' &>out.txt shell: bash - name: Check output (glob paths, 1 of 4) @@ -127,7 +154,7 @@ jobs: - name: Run diKTat from cli (glob paths, 2 of 4) continue-on-error: true run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard 'examples/**/main/kotlin/*.kt' &>out.txt + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard 'examples/**/main/kotlin/*.kt' &>out.txt shell: bash - name: Check output (glob paths, 2 of 4) @@ -140,7 +167,7 @@ jobs: - name: Run diKTat from cli (glob paths, 3 of 4) continue-on-error: true run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard 'examples/**/*.kt' &>out.txt + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard 'examples/**/*.kt' &>out.txt shell: bash - name: Check output (glob paths, 3 of 4) @@ -153,7 +180,7 @@ jobs: - name: Run diKTat from cli (glob paths, 4 of 4) continue-on-error: true run: | - java -jar ktlint -R diktat-${{ env.DIKTAT_VERSION }}.jar --disabled_rules=standard '**/*.kt' &>out.txt + java -jar ktlint -R ${{ env.DIKTAT_JAR }} --disabled_rules=standard '**/*.kt' &>out.txt shell: bash - name: Check output (glob paths, 4 of 4) @@ -171,7 +198,7 @@ jobs: # test failures may be OS-specific (or the tests themselves flaky). fail-fast: false matrix: - os: [ windows-latest, macos-latest ] + os: [ ubuntu-latest, windows-latest, macos-latest ] # A possible workaround for . permissions: @@ -182,30 +209,35 @@ jobs: steps: - uses: actions/checkout@v3 + with: + # required for correct codecov upload + fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: zulu java-version: 11 - - name: Cache local Maven repository - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: maven-build-${{ hashFiles('**/pom.xml') }} - restore-keys: | - maven-build- - - - name: Maven Install - if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }} + distribution: temurin + - name: Retrieve Kotlin version run: | - mvn -B -Dstyle.color=always -T1C clean install + kv=$(cat gradle/libs.versions.toml | grep '^kotlin =' | awk -F'[=]' '{print $2}' | tr -d '" ') + echo KOTLIN_VERSION=$kv >> $GITHUB_ENV shell: bash + - name: Cache konan + uses: actions/cache@v3 + with: + path: ~/.konan + key: ${{ runner.os }}-gradle-konan-${{ env.KOTLIN_VERSION }} - - name: Maven Install on windows - if: runner.os == 'Windows' - run: | - mvn -B -Dstyle.color=always -T1C clean install - shell: cmd + - name: Build all + uses: gradle/gradle-build-action@v2 + with: + gradle-version: wrapper + gradle-home-cache-cleanup: true + arguments: | + build + -x detekt + --scan + --build-cache # This step needs a Git repository, so it's impossible to extract it # into a separate job (or, otherwise, we'd need to upload the content @@ -216,7 +248,7 @@ jobs: with: name: JUnit Tests (${{ runner.os }}, dorny/test-reporter@v1) # Comma-separated values. - path: "**/target/*-reports/TEST-*.xml, **/build/test-results/*/TEST-*.xml" + path: "**/build/test-results/*/TEST-*.xml" reporter: java-junit # Ignore the "Resource not accessible by integration" error when a PR # originates from a non-collaborator. This is @@ -230,17 +262,20 @@ jobs: with: name: xml-test-reports-${{ runner.os }} path: | - **/target/*-reports/TEST-*.xml **/build/test-results/*/TEST-*.xml retention-days: 1 - name: Upload gradle reports - if: ${{ failure() }} + if: ${{ always() }} uses: actions/upload-artifact@v3 with: name: gradle-test-report-${{ matrix.os }} - path: 'diktat-gradle-plugin/build/reports/' + path: '**/build/reports/' retention-days: 1 + - name: Code coverage report + uses: codecov/codecov-action@v3 + with: + fail_ci_if_error: false report: name: Publish JUnit test results diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3601aaad0e..0ca1abf585 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -24,7 +24,7 @@ jobs: matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['java'] + language: ['kotlin'] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection @@ -58,8 +58,24 @@ jobs: # and modify them (or add more) to build your code if your project # uses a compiled language - - run: | - mvn clean install + - uses: gradle/gradle-build-action@v2 + with: + gradle-version: wrapper + # The `--continue` flag is necessary so that Gradle keeps going after the 1st test failure. + # By default, when test for all MPP targets are executed, Kotlin Gradle Plugin generates a single aggregated HTML report. + # Property `kotlin.tests.individualTaskReports` enables individual Junit-style XML reports. + # See org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport. + arguments: | + build + --continue + -x detekt + -Pkotlin.tests.individualTaskReports=true + -Porg.gradle.caching=true + -Pdetekt.multiplatform.disabled=true + -PdisableRedundantTargets=true + -PenabledExecutables=debug + -PgprUser=${{ github.actor }} + -PgprKey=${{ secrets.GITHUB_TOKEN }} - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/detekt.yml b/.github/workflows/detekt.yml index 8af860eaf2..d43c342a6e 100644 --- a/.github/workflows/detekt.yml +++ b/.github/workflows/detekt.yml @@ -6,24 +6,37 @@ on: pull_request: jobs: - test: - name: Running detekt - runs-on: ubuntu-18.04 + detekt_check: + runs-on: ubuntu-latest + permissions: + # required for all workflows + security-events: write steps: - uses: actions/checkout@v3 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: zulu java-version: 11 - - name: Cache local Maven repository - uses: actions/cache@v3 + distribution: temurin + - uses: gradle/gradle-build-action@v2 with: - path: ~/.m2/repository - key: maven-detekt-${{ hashFiles('**/pom.xml') }} - restore-keys: | - maven-detekt- - # when running detekt with type resolution, we need to have all project modules compiled too - - name: running deteKT - run: mvn -B compile dependency:build-classpath@detekt detekt:check@detekt -DskipPluginMarker + gradle-version: wrapper + arguments: | + detektAll + --build-cache + --continue + -PgprUser=${{ github.actor }} + -PgprKey=${{ secrets.GITHUB_TOKEN }} + - name: Upload SARIF report to Github + uses: github/codeql-action/upload-sarif@v2 + if: ${{ always() }} + with: + sarif_file: build/detekt-sarif-reports/detekt-merged.sarif + - name: Upload SARIF artifacts + uses: actions/upload-artifact@v3 + if: ${{ failure() }} + with: + name: sarif-reports + path: "**/build/detekt-sarif-reports/" + retention-days: 1 diff --git a/.github/workflows/diktat.yml b/.github/workflows/diktat.yml index eab0baa8e0..5ac6eeab5d 100644 --- a/.github/workflows/diktat.yml +++ b/.github/workflows/diktat.yml @@ -8,31 +8,39 @@ on: jobs: diktat_check: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest + permissions: + # required for all workflows + security-events: write steps: - uses: actions/checkout@v3 - with: - # set this to 0 to fetch all tags too and be able to use them later - fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: zulu java-version: 11 - - name: Cache local Maven repository - uses: actions/cache@v3 + distribution: temurin + - uses: gradle/gradle-build-action@v2 + with: + gradle-version: wrapper + arguments: | + diktatCheck + mergeDiktatReports + -Pdiktat.githubActions=true + -Pdetekt.multiplatform.disabled=true + --build-cache + --continue + -PgprUser=${{ github.actor }} + -PgprKey=${{ secrets.GITHUB_TOKEN }} + - name: Upload SARIF report to Github + uses: github/codeql-action/upload-sarif@v2 + if: ${{ always() }} + with: + sarif_file: build/reports/diktat/diktat-merged.sarif + - name: Upload SARIF artifacts + uses: actions/upload-artifact@v3 + if: ${{ failure() }} with: - path: ~/.m2/repository - key: maven-diktat-${{ hashFiles('**/pom.xml') }} - restore-keys: | - maven-diktat- - - name: Substitute diktat config with the one from the latest release - # fixme: can be done from the fetched repo without additional network request - run: | - git fetch --tags - LATEST_TAG=$(git describe --tags --abbrev=0) - DIKTAT_CONFIG=diktat-analysis.yml - wget -O $DIKTAT_CONFIG https://raw.githubusercontent.com/saveourtool/diKTat/$LATEST_TAG/$DIKTAT_CONFIG - - name: Run diktat via maven plugin - run: mvn -B -Dstyle.color=always diktat:check@diktat -DskipPluginMarker + name: sarif-reports + path: "**/build/reports/diktat" + retention-days: 1 diff --git a/.github/workflows/diktat_snapshot.yml b/.github/workflows/diktat_snapshot.yml index 196e675897..6ab4b7e62f 100644 --- a/.github/workflows/diktat_snapshot.yml +++ b/.github/workflows/diktat_snapshot.yml @@ -6,49 +6,83 @@ on: pull_request: branches: [ master ] -env: - GRADLE_OPTS: -Dorg.gradle.daemon=false - jobs: diktat_snapshot_check: - runs-on: ubuntu-20.04 + name: 'Check the project using diktat snapshot plugin' + runs-on: ubuntu-latest + permissions: + # required for all workflows + security-events: write + steps: - uses: actions/checkout@v3 + with: + # Fetch Git tags, so that semantic version can be calculated. + # Alternatively, run `git fetch --prune --unshallow --tags` as the + # next step, see + # https://github.com/actions/checkout/issues/206#issuecomment-607496604. + fetch-depth: 0 + - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: zulu java-version: 11 - - name: Cache local Maven repository (shared with regular CI build) + distribution: temurin + + - name: 'Cache ~/.konan' + id: cache-konan uses: actions/cache@v3 with: - path: ~/.m2/repository - key: maven-build-${{ hashFiles('**/pom.xml') }} + path: | + ~/.konan + key: ${{ runner.os }}-konan-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties') }}-build-java${{ matrix.java-version }} restore-keys: | - maven-build - - name: Set version - # Set project version which will then be used to run diktat from local maven repo. - # Base version is stored in env variable for later usage. - # Note: maven-help-plugin requires non-interactive mode (do not add -B flag). - run: | - snapshot_version=$(printf 'VERSION=${project.version}\n0\n' | mvn help:evaluate 2>/dev/null | grep '^VERSION' | cut -d= -f2) - base_version=${snapshot_version%-SNAPSHOT} - echo "BASE_VERSION=$base_version" >> $GITHUB_ENV - mvn -B versions:set -DnewVersion=$base_version-pre - - name: Build and install - # install diktat with version 'base_version-pre' to local maven repo - run: mvn -B -Dstyle.color=always clean install -DskipTests=true --projects diktat-maven-plugin --also-make - - name: Revert project version and set proper version for diktat check - # revert project version to avoid cycle dependency - # set diktat version in plugin dependencies to the version which was built in the previous step - run: | - mvn -B versions:set -DnewVersion=${{ env.BASE_VERSION }}-SNAPSHOT - mvn -B versions:set-property -Dproperty=diktat-check.version -DnewVersion=${{ env.BASE_VERSION }}-pre - - name: Run diktat snapshot via maven plugin + ${{ runner.os }}-konan-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties') }}- + ${{ runner.os }}-konan- + + - name: 'Publish a snapshot version to local repo' + id: generateLibsForDiktatSnapshot + uses: gradle/gradle-build-action@v2 + with: + gradle-version: wrapper + arguments: | + :diktat-common:publishToMavenLocal + :diktat-rules:publishToMavenLocal + :diktat-gradle-plugin:publishToMavenLocal + :generateLibsForDiktatSnapshot + -x detekt + -x diktatCheck + -x test + + - name: 'Override ' run: | - mvn -B -X -Dstyle.color=always diktat:check@diktat -Ddiktat.debug=true -Ddiktat.githubActions=true - - name: Upload SARIF to Github using the upload-sarif action + mv gradle/libs.versions.toml gradle/libs.versions.toml_current + mv build/diktat-snapshot/libs.versions.toml_snapshot gradle/libs.versions.toml + + # copied from .github/workflows/diktat.yml + - uses: gradle/gradle-build-action@v2 + with: + gradle-version: wrapper + arguments: | + diktatCheck + mergeDiktatReports + -Pdiktat.githubActions=true + -Pdetekt.multiplatform.disabled=true + --build-cache + --continue + -PgprUser=${{ github.actor }} + -PgprKey=${{ secrets.GITHUB_TOKEN }} + - name: Upload SARIF report to Github uses: github/codeql-action/upload-sarif@v2 if: ${{ always() }} with: - sarif_file: ${{ github.workspace }} + sarif_file: build/reports/diktat/diktat-merged.sarif + # override category to have a different with release version + category: diktat (snapshot) + - name: Upload SARIF artifacts + uses: actions/upload-artifact@v3 + if: ${{ failure() }} + with: + name: sarif-reports + path: "**/build/reports/diktat" + retention-days: 1 diff --git a/.github/workflows/metrics_for_master.yml b/.github/workflows/metrics_for_master.yml deleted file mode 100644 index 09c83c91ed..0000000000 --- a/.github/workflows/metrics_for_master.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Update metrics for master branch - -on: - push: - branches: - - 'master' - -env: - GRADLE_OPTS: -Dorg.gradle.daemon=false - -jobs: - master_flow: - name: Master branch update - runs-on: ubuntu-18.04 - - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 11 - uses: actions/setup-java@v3 - with: - distribution: zulu - java-version: 11 - - name: Cache local Maven repository - uses: actions/cache@v3 - # keys are the same as in build_and_test workflow to make cache available for PRs - with: - path: ~/.m2/repository - key: maven-build-${{ hashFiles('**/pom.xml') }} - restore-keys: | - maven-build- - - name: Run tests - # we need to run `install` goal here so that gradle will be able to resolve dependencies and run tests on diktat-gradle-plugin - run: mvn -B -Dstyle.color=always install -DskipPluginMarker - - name: Generate code coverage report - uses: codecov/codecov-action@v3 - with: - files: '**/target/site/jacoco*/jacoco.xml,**/reports/jacoco/**/*.xml' - flags: unittests - fail_ci_if_error: true # optional (default = false) diff --git a/.gitignore b/.gitignore index 45550fe9ee..1d8b85b767 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ out/ *.swp *.sarif + +# a generated file for github action +/gradle/libs.versions.toml_snapshot diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000000..f4c6c56c5c --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,108 @@ +import org.cqfn.diktat.buildutils.configureSigning +import org.jetbrains.kotlin.incremental.createDirectory +import java.nio.file.Files + +@Suppress("DSL_SCOPE_VIOLATION", "RUN_IN_SCRIPT") // https://github.com/gradle/gradle/issues/22797 +plugins { + id("org.cqfn.diktat.buildutils.versioning-configuration") + id("org.cqfn.diktat.buildutils.git-hook-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") + id("org.cqfn.diktat.buildutils.publishing-configuration") + alias(libs.plugins.talaiot.base) + java + `maven-publish` +} + +talaiot { + metrics { + // disabling due to problems with OSHI on some platforms + performanceMetrics = false + environmentMetrics = false + } + publishers { + timelinePublisher = true + } +} + +project.description = "diKTat kotlin formatter and fixer" + +configureSigning() + +tasks.create("generateLibsForDiktatSnapshot") { + val dir = rootProject.buildDir.resolve("diktat-snapshot") + + val dependencies = setOf( + projects.diktatCommon, + projects.diktatRules, + projects.diktatGradlePlugin, + ) + mustRunAfter(dependencies.map { ":${it.name}:publishToMavenLocal" }) + val libsFile = rootProject.file("gradle/libs.versions.toml") + + inputs.file(libsFile) + inputs.files(dependencies.map { it.pomFile() }) + inputs.files(dependencies.map { it.artifactFile() }) + inputs.property("project-version", version.toString()) + outputs.dir(dir) + + doFirst { + dir.deleteRecursively() + dir.createDirectory() + } + doLast { + Files.readAllLines(libsFile.toPath()) + .map { line -> + when { + line.contains("diktat = ") -> "diktat = \"$version\"" + else -> line + } + } + .let { + val libsFileForDiktatSnapshot = dir.resolve("libs.versions.toml_snapshot") + Files.write(libsFileForDiktatSnapshot.toPath(), it) + } + + dependencies.forEach { dependency -> + val artifactDir = dir.pathToMavenArtifact(dependency) + .also { it.createDirectory() } + Files.copy(dependency.pomFile().toPath(), artifactDir.resolve(dependency.pomFileName()).toPath()) + Files.copy(dependency.artifactFile().toPath(), artifactDir.resolve(dependency.artifactFileName()).toPath()) + } + } +} + +/** + * @param projectDependency + * @return resolved path to directory according to maven coordinate + */ +fun File.pathToMavenArtifact(projectDependency: ProjectDependency): File = projectDependency.group.toString() + .split(".") + .fold(this) { dirToArtifact, newPart -> dirToArtifact.resolve(newPart) } + .resolve(projectDependency.name) + .resolve(projectDependency.version.toString()) + +/** + * @return generated pom.xml for project dependency + */ +fun ProjectDependency.pomFile(): File = rootProject.file("$name/build/publications/") + .let { publicationsDir -> + publicationsDir.resolve("pluginMaven") + .takeIf { it.exists() } + ?: publicationsDir.resolve("maven") + } + .resolve("pom-default.xml") + +/** + * @return file name of pom.xml for project dependency + */ +fun ProjectDependency.pomFileName(): String = "$name-$version.pom" + +/** + * @return generated artifact for project dependency + */ +fun ProjectDependency.artifactFile(): File = rootProject.file("$name/build/libs/$name-$version.jar") + +/** + * @return file name of artifact for project dependency + */ +fun ProjectDependency.artifactFileName(): String = "$name-$version.jar" diff --git a/diktat-common/build.gradle.kts b/diktat-common/build.gradle.kts new file mode 100644 index 0000000000..3dd6061bcc --- /dev/null +++ b/diktat-common/build.gradle.kts @@ -0,0 +1,19 @@ +@Suppress("DSL_SCOPE_VIOLATION", "RUN_IN_SCRIPT") // https://github.com/gradle/gradle/issues/22797 +plugins { + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") + id("org.cqfn.diktat.buildutils.publishing-signing-default-configuration") + alias(libs.plugins.kotlin.plugin.serialization) +} + +dependencies { + implementation(libs.kotlin.stdlib.jdk8) + api(libs.kotlinx.serialization.json) + api(libs.kaml) + implementation(libs.apache.commons.cli) + implementation(libs.kotlin.logging) + // ktlint-core is needed only for `initKtLintKLogger` method + implementation(libs.ktlint.core) + testImplementation(libs.junit.jupiter) + testImplementation(libs.assertj.core) +} diff --git a/diktat-common/pom.xml b/diktat-common/pom.xml deleted file mode 100644 index 22f839d977..0000000000 --- a/diktat-common/pom.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - 4.0.0 - diktat-common - diktat-common - Common part - - - org.cqfn.diktat - diktat-parent - 1.2.6-SNAPSHOT - - - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - org.jetbrains.kotlinx - kotlinx-serialization-json - - - com.charleskorn.kaml - kaml-jvm - - - commons-cli - commons-cli - - - io.github.microutils - kotlin-logging-jvm - - - - com.pinterest.ktlint - ktlint-core - - - org.junit.jupiter - junit-jupiter - test - - - org.assertj - assertj-core - test - - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - compile - process-sources - - compile - - - - test-compile - process-test-sources - - test-compile - - - - src/test/kotlin - src/test/resources - - - - - - - kotlinx-serialization - - - - - org.jetbrains.kotlin - kotlin-maven-serialization - ${kotlin.version} - - - - - - - diff --git a/diktat-dev-ksp/build.gradle.kts b/diktat-dev-ksp/build.gradle.kts new file mode 100644 index 0000000000..6556eecccd --- /dev/null +++ b/diktat-dev-ksp/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") +} + +dependencies { + implementation("com.google.devtools.ksp:symbol-processing-api:1.8.10-1.0.9") +} diff --git a/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNames.kt b/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNames.kt new file mode 100644 index 0000000000..001065646e --- /dev/null +++ b/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNames.kt @@ -0,0 +1,14 @@ +package org.cqfn.diktat.ruleset.generation + +/** + * Annotation that marks to generate an object with names from Enum + * + * @property generatedPackageName + * @property generatedClassName + */ +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.SOURCE) +annotation class EnumNames( + val generatedPackageName: String, + val generatedClassName: String, +) diff --git a/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessor.kt b/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessor.kt new file mode 100644 index 0000000000..824928d8a2 --- /dev/null +++ b/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessor.kt @@ -0,0 +1,103 @@ +package org.cqfn.diktat.ruleset.generation + +import com.google.devtools.ksp.processing.CodeGenerator +import com.google.devtools.ksp.processing.Dependencies +import com.google.devtools.ksp.processing.Resolver +import com.google.devtools.ksp.processing.SymbolProcessor +import com.google.devtools.ksp.symbol.ClassKind +import com.google.devtools.ksp.symbol.KSAnnotated +import com.google.devtools.ksp.symbol.KSAnnotation +import com.google.devtools.ksp.symbol.KSClassDeclaration + +/** + * [SymbolProcessor] to generate a class with contacts for names from provided enum + */ +class EnumNamesSymbolProcessor( + private val codeGenerator: CodeGenerator, +) : SymbolProcessor { + override fun process(resolver: Resolver): List { + resolver.getEnumDeclarations().forEach { doProcess(resolver, it) } + return emptyList() + } + + private fun doProcess(resolver: Resolver, enumDeclaration: KSClassDeclaration) { + val annotation = enumDeclaration.annotations + .single { + it.shortName.asString() == EnumNames::class.simpleName + } + val targetPackageName = annotation.getArgumentValue("generatedPackageName") + val targetClassName = annotation.getArgumentValue("generatedClassName") + if (resolver.isAlreadyGenerated(targetPackageName, targetClassName)) { + return + } + codeGenerator.createNewFile( + dependencies = Dependencies(false), + packageName = targetPackageName, + fileName = targetClassName, + ).bufferedWriter() + .use { writer -> + writer.write(autoGenerationComment) + writer.newLine() + writer.write("package $targetPackageName\n") + writer.newLine() + writer.write("import kotlin.String\n") + writer.newLine() + writer.write("object $targetClassName {\n") + enumDeclaration.declarations + .filterIsInstance() + .filter { it.classKind == ClassKind.ENUM_ENTRY } + .map { it.simpleName.asString() } + .forEach { enumEntryName -> + writer.write(" const val $enumEntryName: String = \"$enumEntryName\"\n") + } + writer.write("}\n") + } + } + + companion object { + /** + * The comment that will be added to the generated sources file. + */ + private val autoGenerationComment = + """ + |/** + | * This document was auto generated, please don't modify it. + | * This document contains all enum properties from Warnings.kt as Strings. + | */ + """.trimMargin() + private val annotationName: String = requireNotNull(EnumNames::class.qualifiedName) { + "Failed to retrieve a qualified name from ${EnumNames::class}" + } + + private fun Resolver.getEnumDeclarations(): Sequence = getSymbolsWithAnnotation(annotationName) + .filterIsInstance() + .onEach { candidate -> + require(candidate.classKind == ClassKind.ENUM_CLASS) { + "Annotated class ${candidate.qualifiedName} is not enum" + } + } + + private fun KSAnnotation.getArgumentValue(argumentName: String): String = arguments + .singleOrNull { it.name?.asString() == argumentName } + .let { + requireNotNull(it) { + "Not found $argumentName in $this" + } + } + .value + ?.let { it as? String } + .let { + requireNotNull(it) { + "Not found a value for $argumentName in $this" + } + } + + private fun Resolver.isAlreadyGenerated( + packageName: String, + className: String, + ): Boolean = getNewFiles() + .find { it.packageName.asString() == packageName && it.fileName == "$className.kt" } + ?.let { true } + ?: false + } +} diff --git a/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessorProvider.kt b/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessorProvider.kt new file mode 100644 index 0000000000..8deb6eb7dd --- /dev/null +++ b/diktat-dev-ksp/src/main/kotlin/org/cqfn/diktat/ruleset/generation/EnumNamesSymbolProcessorProvider.kt @@ -0,0 +1,16 @@ +package org.cqfn.diktat.ruleset.generation + +import com.google.devtools.ksp.processing.SymbolProcessor +import com.google.devtools.ksp.processing.SymbolProcessorEnvironment +import com.google.devtools.ksp.processing.SymbolProcessorProvider + +/** + * [SymbolProcessorProvider] for [EnumNamesSymbolProcessor] + */ +class EnumNamesSymbolProcessorProvider : SymbolProcessorProvider { + override fun create( + environment: SymbolProcessorEnvironment, + ): SymbolProcessor = EnumNamesSymbolProcessor( + codeGenerator = environment.codeGenerator, + ) +} diff --git a/diktat-dev-ksp/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/diktat-dev-ksp/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider new file mode 100644 index 0000000000..f1006ef2dd --- /dev/null +++ b/diktat-dev-ksp/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider @@ -0,0 +1 @@ +org.cqfn.diktat.ruleset.generation.EnumNamesSymbolProcessorProvider diff --git a/diktat-gradle-plugin/build.gradle.kts b/diktat-gradle-plugin/build.gradle.kts index cc2954524f..2fc6a6626e 100644 --- a/diktat-gradle-plugin/build.gradle.kts +++ b/diktat-gradle-plugin/build.gradle.kts @@ -1,42 +1,21 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.cqfn.diktat.buildutils.configureSigning import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.getCurrentOperatingSystem +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - `java-gradle-plugin` - kotlin("jvm") version "1.8.10" - jacoco + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") + id("org.cqfn.diktat.buildutils.diktat-version-file-configuration") id("pl.droidsonroids.jacoco.testkit") version "1.0.9" id("org.gradle.test-retry") version "1.5.2" + id("com.gradle.plugin-publish") version "1.1.0" } -repositories { - flatDir { - // to use snapshot diktat without necessary installing - dirs("../diktat-common/target") - content { - includeGroup("org.cqfn.diktat") - } - } - mavenCentral() - mavenLocal { - // to use snapshot diktat - content { - includeGroup("org.cqfn.diktat") - } - } -} - -// default value is needed for correct gradle loading in IDEA; actual value from maven is used during build -// To debug gradle plugin, please set `diktatVersion` manually to the current maven project version. -val ktlintVersion = project.properties.getOrDefault("ktlintVersion", "0.46.1") as String -val diktatVersion = project.version.takeIf { it.toString() != Project.DEFAULT_VERSION } ?: "1.2.3" -val junitVersion = project.properties.getOrDefault("junitVersion", "5.8.1") as String -val jacocoVersion = project.properties.getOrDefault("jacocoVersion", "0.8.7") as String dependencies { implementation(kotlin("gradle-plugin-api")) - implementation("io.github.detekt.sarif4k:sarif4k:0.3.0") + implementation(libs.sarif4k.jvm) - implementation("org.cqfn.diktat:diktat-common:$diktatVersion") { + api(projects.diktatCommon) { exclude("org.jetbrains.kotlin", "kotlin-compiler-embeddable") exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk7") @@ -45,41 +24,18 @@ dependencies { exclude("org.slf4j", "slf4j-log4j12") } - testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitVersion") + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) } -val generateVersionsFile by tasks.registering { - val versionsFile = File("$buildDir/generated/src/generated/Versions.kt") - - inputs.property("diktat version", diktatVersion) - inputs.property("ktlint version", ktlintVersion) - outputs.file(versionsFile) - - doFirst { - versionsFile.parentFile.mkdirs() - versionsFile.writeText( - """ - package generated - - internal const val DIKTAT_VERSION = "$diktatVersion" - internal const val KTLINT_VERSION = "$ktlintVersion" - - """.trimIndent() - ) - } -} -kotlin.sourceSets["main"].kotlin.srcDir("$buildDir/generated/src") - tasks.withType { kotlinOptions { // fixme: kotlin 1.3 is required for gradle <6.8 languageVersion = "1.3" apiVersion = "1.3" jvmTarget = "1.8" + freeCompilerArgs = freeCompilerArgs - "-Werror" } - - dependsOn.add(generateVersionsFile) } gradlePlugin { @@ -91,24 +47,21 @@ gradlePlugin { } } -java { - withSourcesJar() -} - // === testing & code coverage, jacoco is run independent from maven val functionalTestTask by tasks.register("functionalTest") tasks.withType { useJUnitPlatform() } -jacoco.toolVersion = jacocoVersion // === integration testing // fixme: should probably use KotlinSourceSet instead -val functionalTest = sourceSets.create("functionalTest") { +val functionalTest: SourceSet = sourceSets.create("functionalTest") { compileClasspath += sourceSets.main.get().output + configurations.testRuntimeClasspath.get() runtimeClasspath += output + compileClasspath } -tasks.getByName("functionalTest") { + +@Suppress("GENERIC_VARIABLE_WRONG_DECLARATION", "MAGIC_NUMBER") +val functionalTestProvider: TaskProvider = tasks.named("functionalTest") { shouldRunAfter("test") testClassesDirs = functionalTest.output.classesDirs classpath = functionalTest.runtimeClasspath @@ -129,8 +82,10 @@ tasks.getByName("functionalTest") { finalizedBy(tasks.jacocoTestReport) } tasks.check { dependsOn(tasks.jacocoTestReport) } + jacocoTestKit { - applyTo("functionalTestRuntimeOnly", tasks.named("functionalTest")) + @Suppress("UNCHECKED_CAST") + applyTo("functionalTestRuntimeOnly", functionalTestProvider as TaskProvider) } tasks.jacocoTestReport { shouldRunAfter(tasks.withType()) @@ -144,3 +99,5 @@ tasks.jacocoTestReport { xml.required.set(true) } } + +configureSigning() diff --git a/diktat-gradle-plugin/gradle-plugin-marker/pom.xml b/diktat-gradle-plugin/gradle-plugin-marker/pom.xml deleted file mode 100644 index aa821cb771..0000000000 --- a/diktat-gradle-plugin/gradle-plugin-marker/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - diktat-gradle-plugin - org.cqfn.diktat - 1.2.6-SNAPSHOT - - 4.0.0 - - org.cqfn.diktat.diktat-gradle-plugin - org.cqfn.diktat.diktat-gradle-plugin.gradle.plugin - pom - - - - org.cqfn.diktat - diktat-gradle-plugin - ${project.version} - - - - - - - org.jetbrains.dokka - dokka-maven-plugin - ${dokka.version} - - - none - - javadocJar - - - - - - - \ No newline at end of file diff --git a/diktat-gradle-plugin/pom.xml b/diktat-gradle-plugin/pom.xml deleted file mode 100644 index fe1f72e27d..0000000000 --- a/diktat-gradle-plugin/pom.xml +++ /dev/null @@ -1,208 +0,0 @@ - - - - diktat-parent - org.cqfn.diktat - 1.2.6-SNAPSHOT - - 4.0.0 - - diktat-gradle-plugin - - pom - - - ${project.basedir} - gradlew - build - build - false - false - - - - - org.cqfn.diktat - diktat-common - ${project.version} - - - - * - * - - - - - io.github.detekt.sarif4k - sarif4k-jvm - 0.3.0 - - - - - - - org.apache.maven.plugins - maven-clean-plugin - false - - - - ${project.basedir}/${gradle.builddir} - - - - - - org.codehaus.mojo - exec-maven-plugin - false - - ${gradle.workingDir} - ${gradle.workingDir}/${gradle.executable} - - - - gradle-test - test - - - clean - test - functionalTest - -Pgroup=${project.groupId} - -Pversion=${project.version} - -Pdescription=${project.description} - -PktlintVersion=${ktlint.version} - -PjunitVersion=${junit.version} - -PjacocoVersion=${jacoco.version} - -S - - ${skip.gradle.test} - - - exec - - - - gradle - prepare-package - - - ${gradle.task} - -Pgroup=${project.groupId} - -Pversion=${project.version} - -Pdescription=${project.description} - -PktlintVersion=${ktlint.version} - -PjunitVersion=${junit.version} - -PjacocoVersion=${jacoco.version} - -S - - - - ${skip.gradle.build} - - - exec - - - - - - org.codehaus.mojo - build-helper-maven-plugin - false - - - attach-artifacts - package - - attach-artifact - - - - - ${gradle.builddir}/libs/${project.artifactId}-${project.version}.jar - jar - - - - ${gradle.builddir}/libs/${project.artifactId}-${project.version}-sources.jar - jar - sources - - - ${skip.gradle.build} - - - - - - com.github.ozsie - detekt-maven-plugin - ${detekt.version} - - - detekt - none - - check - - - detekt-config.yml - - - 1.3 - 1.8 - **/resources/**/*.kt - - - - - - - - - - - - gradle-plugin-marker - - - - !skipPluginMarker - - - - gradle-plugin-marker - - - - local-win-build - - - windows - - - - gradlew.bat - - - - skip-gradle-tests - - - skipTests - true - - - - -xcheck - true - - - - diff --git a/diktat-gradle-plugin/settings.gradle.kts b/diktat-gradle-plugin/settings.gradle.kts deleted file mode 100644 index 1442a83658..0000000000 --- a/diktat-gradle-plugin/settings.gradle.kts +++ /dev/null @@ -1,6 +0,0 @@ -pluginManagement { - repositories { - mavenCentral() - gradlePluginPortal() - } -} diff --git a/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt b/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt index 1a973dc9ee..76db1c642d 100644 --- a/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt +++ b/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt @@ -18,20 +18,18 @@ internal fun createExampleProject(testProjectDir: TemporaryFolder, exampleProject.copyRecursively(testProjectDir.root) val buildFileName = buildInitDsl.fileNameFor("build") File(testProjectDir.root, buildFileName).delete() - testProjectDir.newFile(buildFileName).apply { - writeText( - """ - plugins { - id("org.cqfn.diktat.diktat-gradle-plugin") - } + testProjectDir.newFile(buildFileName).writeText( + """ + plugins { + id("org.cqfn.diktat.diktat-gradle-plugin") + } - repositories { - mavenLocal() - mavenCentral() - } - """.trimIndent() - ) - } + repositories { + mavenLocal() + mavenCentral() + } + """.trimIndent() + ) } /** @@ -57,7 +55,12 @@ internal fun runDiktat(testProjectDir: TemporaryFolder, "Running gradle returned exception $ex, cause: ${ex?.cause}" } } - .getOrNull()!! + .getOrNull() + .let { + requireNotNull(it) { + "Failed to get build result from running diktat" + } + } /** * This is support for jacoco reports in tests run with gradle TestKit diff --git a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt index abd9e6fccf..7c11bd46fc 100644 --- a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt +++ b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt @@ -78,6 +78,7 @@ open class DiktatJavaExecTaskBase @Inject constructor( // `main` is deprecated and replaced with `mainClass` since gradle 6.4 mainClass.set("com.pinterest.ktlint.Main") } else { + @Suppress("Deprecation") main = "com.pinterest.ktlint.Main" } diff --git a/diktat-maven-plugin/build.gradle.kts b/diktat-maven-plugin/build.gradle.kts new file mode 100644 index 0000000000..ba822027cb --- /dev/null +++ b/diktat-maven-plugin/build.gradle.kts @@ -0,0 +1,53 @@ +import de.benediktritter.maven.plugin.development.task.GenerateHelpMojoSourcesTask +import de.benediktritter.maven.plugin.development.task.GenerateMavenPluginDescriptorTask + +plugins { + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") + id("org.cqfn.diktat.buildutils.publishing-configuration") + id("de.benediktritter.maven-plugin-development") version "0.4.1" + `maven-publish` +} + +dependencies { + implementation(libs.maven.plugin.api) + compileOnly(libs.maven.plugin.annotations) + compileOnly(libs.maven.core) + + implementation(libs.kotlin.stdlib.jdk8) + implementation(projects.diktatRules) + implementation(libs.ktlint.core) + implementation(libs.ktlint.reporter.plain) + implementation(libs.ktlint.reporter.sarif) + implementation(libs.ktlint.reporter.json) + implementation(libs.ktlint.reporter.html) + implementation(libs.ktlint.reporter.baseline) + testImplementation(libs.junit.jupiter.api) + testImplementation(libs.junit.vintage.engine) + testImplementation(libs.junit.jupiter.extension.itf) + testImplementation(libs.maven.plugin.testing.harness) + // to use org.apache.maven.repository.RepositorySystem in newer maven versions and maybe other classes + testImplementation(libs.maven.compat) + testImplementation(libs.assertj.core) + testImplementation(libs.plexus.cipher) +} + +tasks.withType { + notCompatibleWithConfigurationCache("https://github.com/britter/maven-plugin-development/issues/8") +} + +tasks.withType { + notCompatibleWithConfigurationCache("https://github.com/britter/maven-plugin-development/issues/8") +} + +mavenPlugin { + goalPrefix.set("diktat") +} + +publishing { + publications { + create("mavenPlugin") { + from(components["java"]) + } + } +} diff --git a/diktat-maven-plugin/pom.xml b/diktat-maven-plugin/pom.xml deleted file mode 100644 index bb710b5bfb..0000000000 --- a/diktat-maven-plugin/pom.xml +++ /dev/null @@ -1,347 +0,0 @@ - - - - diktat-parent - org.cqfn.diktat - 1.2.6-SNAPSHOT - - 4.0.0 - - diktat-maven-plugin - maven-plugin - - - 3.9.1 - UTF-8 - 0.12.0 - - - - - - - - - - - org.apache.maven - maven-core - ${maven.api.version} - provided - - - org.apache.maven - maven-plugin-api - ${maven.api.version} - provided - - - org.apache.maven.plugin-tools - maven-plugin-annotations - ${maven-plugin-tools.version} - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - org.cqfn.diktat - diktat-rules - ${project.version} - - - com.pinterest.ktlint - ktlint-reporter-plain - - - com.pinterest.ktlint - ktlint-reporter-sarif - - - com.pinterest.ktlint - ktlint-reporter-json - - - com.pinterest.ktlint - ktlint-reporter-html - - - com.pinterest.ktlint - ktlint-reporter-baseline - - - org.junit.vintage - junit-vintage-engine - ${junit.version} - test - - - com.soebes.itf.jupiter.extension - itf-jupiter-extension - ${maven.itf.version} - test - - - org.apache.maven.plugin-testing - maven-plugin-testing-harness - 3.3.0 - test - - - - org.apache.maven - maven-compat - ${maven.api.version} - test - - - org.assertj - assertj-core - test - - - org.codehaus.plexus - plexus-cipher - 2.0 - test - - - - - src/main/kotlin - src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - compile - process-sources - - compile - - - - test-compile - process-test-sources - - test-compile - - - - - src/test/kotlin - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - *IntegrationTest* - - - - - com.soebes.itf.jupiter.extension - itf-maven-plugin - ${maven.itf.version} - - - installing - pre-integration-test - - install - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - ${maven.version} - ${maven.home} - - - **/*IntegrationTest* - - - - - - integration-test - verify - - - - - - - org.jacoco - jacoco-maven-plugin - - - - **/HelpMojo* - - - - - report-integration - - - merge - report-integration - - post-integration-test - - - - ${project.build.directory} - - - jacoco-it*.exec - - - - ${project.build.directory}/jacoco-it.exec - - - - - - - - ../examples/maven - - false - ${project.build.testOutputDirectory}/org/cqfn/diktat/plugin/maven/DiktatMavenPluginIntegrationTest/diktatCheck - - - ${project.basedir}/src/test/resources/.mvn - - true - ${project.build.testOutputDirectory}/org/cqfn/diktat/plugin/maven/DiktatMavenPluginIntegrationTest/diktatCheck/.mvn - - - ../examples/maven - false - ${project.build.testOutputDirectory}/org/cqfn/diktat/plugin/maven/DiktatMavenPluginIntegrationTest/diktatFix - - - ${project.basedir}/src/test/resources/.mvn - true - ${project.build.testOutputDirectory}/org/cqfn/diktat/plugin/maven/DiktatMavenPluginIntegrationTest/diktatFix/.mvn - - - - - - - - default - - true - - - - - org.apache.maven.plugins - maven-plugin-plugin - - diktat - true - - - - mojo-descriptor - - descriptor - - - - help-goal - - helpmojo - - - - - - - - - - release - - - - org.apache.maven.plugins - maven-plugin-plugin - - diktat - true - - - kotlin - - - - - mojo-descriptor - - descriptor - - - - help-goal - - helpmojo - - - - - - com.github.gantsign.maven.plugin-tools - kotlin-maven-plugin-tools - 1.1.0 - - - - - org.codehaus.mojo - properties-maven-plugin - 1.1.0 - - - - set-system-properties - - - - - idea.io.use.nio2 - true - - - idea.io.use.fallback - true - - - - - - - - - - - diff --git a/diktat-maven-plugin/src/test/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojoTest.kt b/diktat-maven-plugin/src/test/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojoTest.kt index ea1505fda8..b5aaab4e6d 100644 --- a/diktat-maven-plugin/src/test/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojoTest.kt +++ b/diktat-maven-plugin/src/test/kotlin/org/cqfn/diktat/plugin/maven/DiktatBaseMojoTest.kt @@ -7,6 +7,7 @@ import org.apache.maven.project.ProjectBuilder import org.apache.maven.project.ProjectBuildingRequest import org.eclipse.aether.DefaultRepositorySystemSession import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.jupiter.api.Assertions @@ -20,6 +21,7 @@ import kotlin.io.path.div */ @OptIn(ExperimentalPathApi::class) @Suppress("LongMethod", "TOO_LONG_FUNCTION") +@Ignore class DiktatBaseMojoTest { @get:Rule val mojoRule = MojoRule() private lateinit var buildingRequest: ProjectBuildingRequest @@ -46,11 +48,11 @@ class DiktatBaseMojoTest { xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + org.cqfn.diktat diktat-test 1.0.0-SNAPSHOT - + @@ -87,11 +89,11 @@ class DiktatBaseMojoTest { xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + org.cqfn.diktat diktat-test 1.0.0-SNAPSHOT - + diff --git a/diktat-rules/build.gradle.kts b/diktat-rules/build.gradle.kts new file mode 100644 index 0000000000..cde215dbc4 --- /dev/null +++ b/diktat-rules/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") + id("org.cqfn.diktat.buildutils.publishing-signing-default-configuration") + id("com.google.devtools.ksp") version "1.8.10-1.0.9" + idea +} + +project.description = "The main diktat ruleset" + +dependencies { + api(projects.diktatCommon) + testImplementation(projects.diktatTestFramework) + api(libs.ktlint.core) + implementation(libs.kotlin.stdlib.jdk8) + // guava is used for string case utils + implementation(libs.guava) + implementation(libs.kotlin.logging) + testImplementation(libs.junit.jupiter) + testImplementation(libs.junit.platform.suite) + testImplementation(libs.assertj.core) + testImplementation(libs.mockito) + // is used for simplifying boolean expressions + implementation(libs.jbool.expressions) + + // generating + compileOnly(projects.diktatDevKsp) + ksp(projects.diktatDevKsp) + testImplementation(libs.kotlin.reflect) +} + +kotlin { + sourceSets.main { + kotlin.srcDir("build/generated/ksp/main/kotlin") + } +} + +idea { + module { + // Not using += due to https://github.com/gradle/gradle/issues/8749 + sourceDirs = sourceDirs + file("build/generated/ksp/main/kotlin") // or tasks["kspKotlin"].destination + testSourceDirs = testSourceDirs + file("build/generated/ksp/test/kotlin") + generatedSourceDirs = generatedSourceDirs + file("build/generated/ksp/main/kotlin") + file("build/generated/ksp/test/kotlin") + } +} diff --git a/diktat-rules/pom.xml b/diktat-rules/pom.xml deleted file mode 100644 index 70ecd0cf76..0000000000 --- a/diktat-rules/pom.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - 4.0.0 - diktat-rules - diktat-rules - The main diktat ruleset - - - org.cqfn.diktat - diktat-parent - 1.2.6-SNAPSHOT - - - - - - - - com.squareup - kotlinpoet - true - - - org.cqfn.diktat - diktat-common - ${project.version} - - - org.cqfn.diktat - diktat-test-framework - ${project.version} - test - - - com.pinterest.ktlint - ktlint-core - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - - com.google.guava - guava - - - io.github.microutils - kotlin-logging-jvm - - - org.junit.jupiter - junit-jupiter - test - - - org.junit.platform - junit-platform-suite-engine - test - - - org.assertj - assertj-core - test - - - org.mockito - mockito-all - test - - - - com.bpodgursky - jbool_expressions - - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - build-generated-code - process-test-sources - - compile - - - - ${project.basedir}/src/main/kotlin/generated - - - - - compile - compile - - compile - - - - test-compile - process-test-sources - - test-compile - - - - - src/main/kotlin - src/test/kotlin - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - - - - - - org.codehaus.mojo - exec-maven-plugin - - - generate-warnings - generate-test-sources - - java - - - - - org.cqfn.diktat.ruleset.generation.GenerationKt - - ${project.build.sourceDirectory} - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - - - diff --git a/diktat-rules/src/main/kotlin/generated/WarningNames.kt b/diktat-rules/src/main/kotlin/generated/WarningNames.kt deleted file mode 100644 index 8ef79dfbe5..0000000000 --- a/diktat-rules/src/main/kotlin/generated/WarningNames.kt +++ /dev/null @@ -1,279 +0,0 @@ -// This document was auto generated, please don't modify it. -// This document contains all enum properties from Warnings.kt as Strings. -package generated - -import kotlin.String - -public object WarningNames { - public const val DUMMY_TEST_WARNING: String = "DUMMY_TEST_WARNING" - - public const val PACKAGE_NAME_MISSING: String = "PACKAGE_NAME_MISSING" - - public const val PACKAGE_NAME_INCORRECT_CASE: String = "PACKAGE_NAME_INCORRECT_CASE" - - public const val PACKAGE_NAME_INCORRECT_PREFIX: String = "PACKAGE_NAME_INCORRECT_PREFIX" - - public const val PACKAGE_NAME_INCORRECT_SYMBOLS: String = "PACKAGE_NAME_INCORRECT_SYMBOLS" - - public const val PACKAGE_NAME_INCORRECT_PATH: String = "PACKAGE_NAME_INCORRECT_PATH" - - public const val INCORRECT_PACKAGE_SEPARATOR: String = "INCORRECT_PACKAGE_SEPARATOR" - - public const val CLASS_NAME_INCORRECT: String = "CLASS_NAME_INCORRECT" - - public const val OBJECT_NAME_INCORRECT: String = "OBJECT_NAME_INCORRECT" - - public const val VARIABLE_NAME_INCORRECT_FORMAT: String = "VARIABLE_NAME_INCORRECT_FORMAT" - - public const val VARIABLE_NAME_INCORRECT: String = "VARIABLE_NAME_INCORRECT" - - public const val CONSTANT_UPPERCASE: String = "CONSTANT_UPPERCASE" - - public const val VARIABLE_HAS_PREFIX: String = "VARIABLE_HAS_PREFIX" - - public const val IDENTIFIER_LENGTH: String = "IDENTIFIER_LENGTH" - - public const val ENUM_VALUE: String = "ENUM_VALUE" - - public const val GENERIC_NAME: String = "GENERIC_NAME" - - public const val BACKTICKS_PROHIBITED: String = "BACKTICKS_PROHIBITED" - - public const val FUNCTION_NAME_INCORRECT_CASE: String = "FUNCTION_NAME_INCORRECT_CASE" - - public const val TYPEALIAS_NAME_INCORRECT_CASE: String = "TYPEALIAS_NAME_INCORRECT_CASE" - - public const val FUNCTION_BOOLEAN_PREFIX: String = "FUNCTION_BOOLEAN_PREFIX" - - public const val FILE_NAME_INCORRECT: String = "FILE_NAME_INCORRECT" - - public const val EXCEPTION_SUFFIX: String = "EXCEPTION_SUFFIX" - - public const val CONFUSING_IDENTIFIER_NAMING: String = "CONFUSING_IDENTIFIER_NAMING" - - public const val MISSING_KDOC_TOP_LEVEL: String = "MISSING_KDOC_TOP_LEVEL" - - public const val MISSING_KDOC_CLASS_ELEMENTS: String = "MISSING_KDOC_CLASS_ELEMENTS" - - public const val MISSING_KDOC_ON_FUNCTION: String = "MISSING_KDOC_ON_FUNCTION" - - public const val KDOC_TRIVIAL_KDOC_ON_FUNCTION: String = "KDOC_TRIVIAL_KDOC_ON_FUNCTION" - - public const val KDOC_WITHOUT_PARAM_TAG: String = "KDOC_WITHOUT_PARAM_TAG" - - public const val KDOC_WITHOUT_RETURN_TAG: String = "KDOC_WITHOUT_RETURN_TAG" - - public const val KDOC_WITHOUT_THROWS_TAG: String = "KDOC_WITHOUT_THROWS_TAG" - - public const val KDOC_EMPTY_KDOC: String = "KDOC_EMPTY_KDOC" - - public const val KDOC_WRONG_SPACES_AFTER_TAG: String = "KDOC_WRONG_SPACES_AFTER_TAG" - - public const val KDOC_WRONG_TAGS_ORDER: String = "KDOC_WRONG_TAGS_ORDER" - - public const val KDOC_NEWLINES_BEFORE_BASIC_TAGS: String = "KDOC_NEWLINES_BEFORE_BASIC_TAGS" - - public const val KDOC_NO_NEWLINES_BETWEEN_BASIC_TAGS: String = - "KDOC_NO_NEWLINES_BETWEEN_BASIC_TAGS" - - public const val KDOC_NO_NEWLINE_AFTER_SPECIAL_TAGS: String = - "KDOC_NO_NEWLINE_AFTER_SPECIAL_TAGS" - - public const val KDOC_NO_EMPTY_TAGS: String = "KDOC_NO_EMPTY_TAGS" - - public const val KDOC_NO_DEPRECATED_TAG: String = "KDOC_NO_DEPRECATED_TAG" - - public const val KDOC_NO_CONSTRUCTOR_PROPERTY: String = "KDOC_NO_CONSTRUCTOR_PROPERTY" - - public const val KDOC_NO_CLASS_BODY_PROPERTIES_IN_HEADER: String = - "KDOC_NO_CLASS_BODY_PROPERTIES_IN_HEADER" - - public const val KDOC_EXTRA_PROPERTY: String = "KDOC_EXTRA_PROPERTY" - - public const val KDOC_DUPLICATE_PROPERTY: String = "KDOC_DUPLICATE_PROPERTY" - - public const val KDOC_NO_CONSTRUCTOR_PROPERTY_WITH_COMMENT: String = - "KDOC_NO_CONSTRUCTOR_PROPERTY_WITH_COMMENT" - - public const val KDOC_CONTAINS_DATE_OR_AUTHOR: String = "KDOC_CONTAINS_DATE_OR_AUTHOR" - - public const val HEADER_WRONG_FORMAT: String = "HEADER_WRONG_FORMAT" - - public const val HEADER_MISSING_OR_WRONG_COPYRIGHT: String = "HEADER_MISSING_OR_WRONG_COPYRIGHT" - - public const val WRONG_COPYRIGHT_YEAR: String = "WRONG_COPYRIGHT_YEAR" - - public const val HEADER_MISSING_IN_NON_SINGLE_CLASS_FILE: String = - "HEADER_MISSING_IN_NON_SINGLE_CLASS_FILE" - - public const val HEADER_NOT_BEFORE_PACKAGE: String = "HEADER_NOT_BEFORE_PACKAGE" - - public const val COMMENTED_OUT_CODE: String = "COMMENTED_OUT_CODE" - - public const val COMMENTED_BY_KDOC: String = "COMMENTED_BY_KDOC" - - public const val WRONG_NEWLINES_AROUND_KDOC: String = "WRONG_NEWLINES_AROUND_KDOC" - - public const val FIRST_COMMENT_NO_BLANK_LINE: String = "FIRST_COMMENT_NO_BLANK_LINE" - - public const val COMMENT_WHITE_SPACE: String = "COMMENT_WHITE_SPACE" - - public const val IF_ELSE_COMMENTS: String = "IF_ELSE_COMMENTS" - - public const val FILE_IS_TOO_LONG: String = "FILE_IS_TOO_LONG" - - public const val FILE_CONTAINS_ONLY_COMMENTS: String = "FILE_CONTAINS_ONLY_COMMENTS" - - public const val FILE_INCORRECT_BLOCKS_ORDER: String = "FILE_INCORRECT_BLOCKS_ORDER" - - public const val FILE_NO_BLANK_LINE_BETWEEN_BLOCKS: String = "FILE_NO_BLANK_LINE_BETWEEN_BLOCKS" - - public const val FILE_UNORDERED_IMPORTS: String = "FILE_UNORDERED_IMPORTS" - - public const val FILE_WILDCARD_IMPORTS: String = "FILE_WILDCARD_IMPORTS" - - public const val UNUSED_IMPORT: String = "UNUSED_IMPORT" - - public const val NO_BRACES_IN_CONDITIONALS_AND_LOOPS: String = - "NO_BRACES_IN_CONDITIONALS_AND_LOOPS" - - public const val WRONG_ORDER_IN_CLASS_LIKE_STRUCTURES: String = - "WRONG_ORDER_IN_CLASS_LIKE_STRUCTURES" - - public const val BLANK_LINE_BETWEEN_PROPERTIES: String = "BLANK_LINE_BETWEEN_PROPERTIES" - - public const val TOP_LEVEL_ORDER: String = "TOP_LEVEL_ORDER" - - public const val BRACES_BLOCK_STRUCTURE_ERROR: String = "BRACES_BLOCK_STRUCTURE_ERROR" - - public const val WRONG_INDENTATION: String = "WRONG_INDENTATION" - - public const val EMPTY_BLOCK_STRUCTURE_ERROR: String = "EMPTY_BLOCK_STRUCTURE_ERROR" - - public const val MORE_THAN_ONE_STATEMENT_PER_LINE: String = "MORE_THAN_ONE_STATEMENT_PER_LINE" - - public const val LONG_LINE: String = "LONG_LINE" - - public const val REDUNDANT_SEMICOLON: String = "REDUNDANT_SEMICOLON" - - public const val WRONG_NEWLINES: String = "WRONG_NEWLINES" - - public const val TRAILING_COMMA: String = "TRAILING_COMMA" - - public const val COMPLEX_EXPRESSION: String = "COMPLEX_EXPRESSION" - - public const val COMPLEX_BOOLEAN_EXPRESSION: String = "COMPLEX_BOOLEAN_EXPRESSION" - - public const val STRING_CONCATENATION: String = "STRING_CONCATENATION" - - public const val TOO_MANY_BLANK_LINES: String = "TOO_MANY_BLANK_LINES" - - public const val WRONG_WHITESPACE: String = "WRONG_WHITESPACE" - - public const val TOO_MANY_CONSECUTIVE_SPACES: String = "TOO_MANY_CONSECUTIVE_SPACES" - - public const val ANNOTATION_NEW_LINE: String = "ANNOTATION_NEW_LINE" - - public const val ENUMS_SEPARATED: String = "ENUMS_SEPARATED" - - public const val WHEN_WITHOUT_ELSE: String = "WHEN_WITHOUT_ELSE" - - public const val LONG_NUMERICAL_VALUES_SEPARATED: String = "LONG_NUMERICAL_VALUES_SEPARATED" - - public const val MAGIC_NUMBER: String = "MAGIC_NUMBER" - - public const val WRONG_DECLARATIONS_ORDER: String = "WRONG_DECLARATIONS_ORDER" - - public const val WRONG_MULTIPLE_MODIFIERS_ORDER: String = "WRONG_MULTIPLE_MODIFIERS_ORDER" - - public const val LOCAL_VARIABLE_EARLY_DECLARATION: String = "LOCAL_VARIABLE_EARLY_DECLARATION" - - public const val STRING_TEMPLATE_CURLY_BRACES: String = "STRING_TEMPLATE_CURLY_BRACES" - - public const val STRING_TEMPLATE_QUOTES: String = "STRING_TEMPLATE_QUOTES" - - public const val FILE_NAME_MATCH_CLASS: String = "FILE_NAME_MATCH_CLASS" - - public const val COLLAPSE_IF_STATEMENTS: String = "COLLAPSE_IF_STATEMENTS" - - public const val CONVENTIONAL_RANGE: String = "CONVENTIONAL_RANGE" - - public const val DEBUG_PRINT: String = "DEBUG_PRINT" - - public const val NULLABLE_PROPERTY_TYPE: String = "NULLABLE_PROPERTY_TYPE" - - public const val TYPE_ALIAS: String = "TYPE_ALIAS" - - public const val SMART_CAST_NEEDED: String = "SMART_CAST_NEEDED" - - public const val SAY_NO_TO_VAR: String = "SAY_NO_TO_VAR" - - public const val GENERIC_VARIABLE_WRONG_DECLARATION: String = - "GENERIC_VARIABLE_WRONG_DECLARATION" - - public const val FLOAT_IN_ACCURATE_CALCULATIONS: String = "FLOAT_IN_ACCURATE_CALCULATIONS" - - public const val AVOID_NULL_CHECKS: String = "AVOID_NULL_CHECKS" - - public const val TOO_LONG_FUNCTION: String = "TOO_LONG_FUNCTION" - - public const val AVOID_NESTED_FUNCTIONS: String = "AVOID_NESTED_FUNCTIONS" - - public const val LAMBDA_IS_NOT_LAST_PARAMETER: String = "LAMBDA_IS_NOT_LAST_PARAMETER" - - public const val TOO_MANY_PARAMETERS: String = "TOO_MANY_PARAMETERS" - - public const val NESTED_BLOCK: String = "NESTED_BLOCK" - - public const val WRONG_OVERLOADING_FUNCTION_ARGUMENTS: String = - "WRONG_OVERLOADING_FUNCTION_ARGUMENTS" - - public const val RUN_BLOCKING_INSIDE_ASYNC: String = "RUN_BLOCKING_INSIDE_ASYNC" - - public const val TOO_MANY_LINES_IN_LAMBDA: String = "TOO_MANY_LINES_IN_LAMBDA" - - public const val CUSTOM_LABEL: String = "CUSTOM_LABEL" - - public const val PARAMETER_NAME_IN_OUTER_LAMBDA: String = "PARAMETER_NAME_IN_OUTER_LAMBDA" - - public const val INVERSE_FUNCTION_PREFERRED: String = "INVERSE_FUNCTION_PREFERRED" - - public const val SINGLE_CONSTRUCTOR_SHOULD_BE_PRIMARY: String = - "SINGLE_CONSTRUCTOR_SHOULD_BE_PRIMARY" - - public const val USE_DATA_CLASS: String = "USE_DATA_CLASS" - - public const val WRONG_NAME_OF_VARIABLE_INSIDE_ACCESSOR: String = - "WRONG_NAME_OF_VARIABLE_INSIDE_ACCESSOR" - - public const val MULTIPLE_INIT_BLOCKS: String = "MULTIPLE_INIT_BLOCKS" - - public const val CLASS_SHOULD_NOT_BE_ABSTRACT: String = "CLASS_SHOULD_NOT_BE_ABSTRACT" - - public const val CUSTOM_GETTERS_SETTERS: String = "CUSTOM_GETTERS_SETTERS" - - public const val COMPACT_OBJECT_INITIALIZATION: String = "COMPACT_OBJECT_INITIALIZATION" - - public const val USELESS_SUPERTYPE: String = "USELESS_SUPERTYPE" - - public const val TRIVIAL_ACCESSORS_ARE_NOT_RECOMMENDED: String = - "TRIVIAL_ACCESSORS_ARE_NOT_RECOMMENDED" - - public const val EXTENSION_FUNCTION_SAME_SIGNATURE: String = "EXTENSION_FUNCTION_SAME_SIGNATURE" - - public const val EMPTY_PRIMARY_CONSTRUCTOR: String = "EMPTY_PRIMARY_CONSTRUCTOR" - - public const val NO_CORRESPONDING_PROPERTY: String = "NO_CORRESPONDING_PROPERTY" - - public const val AVOID_USING_UTILITY_CLASS: String = "AVOID_USING_UTILITY_CLASS" - - public const val OBJECT_IS_PREFERRED: String = "OBJECT_IS_PREFERRED" - - public const val INLINE_CLASS_CAN_BE_USED: String = "INLINE_CLASS_CAN_BE_USED" - - public const val EXTENSION_FUNCTION_WITH_CLASS: String = "EXTENSION_FUNCTION_WITH_CLASS" - - public const val RUN_IN_SCRIPT: String = "RUN_IN_SCRIPT" - - public const val USE_LAST_INDEX: String = "USE_LAST_INDEX" -} diff --git a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/constants/Warnings.kt b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/constants/Warnings.kt index e6c2831dd4..56c54147e6 100644 --- a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/constants/Warnings.kt +++ b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/constants/Warnings.kt @@ -3,6 +3,7 @@ package org.cqfn.diktat.ruleset.constants import org.cqfn.diktat.common.config.rules.Rule import org.cqfn.diktat.common.config.rules.RulesConfig import org.cqfn.diktat.common.config.rules.isRuleEnabled +import org.cqfn.diktat.ruleset.generation.EnumNames import org.cqfn.diktat.ruleset.utils.isSuppressed import org.jetbrains.kotlin.com.intellij.lang.ASTNode @@ -27,6 +28,10 @@ typealias ListOfPairs = MutableList> "MaxLineLength", "WRONG_NEWLINES" ) +@EnumNames( + generatedPackageName = "generated", + generatedClassName = "WarningNames", +) enum class Warnings( @Suppress("PRIVATE_MEMBER") val canBeAutoCorrected: Boolean, val ruleId: String, diff --git a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/generation/Generation.kt b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/generation/Generation.kt deleted file mode 100644 index 70b7f78691..0000000000 --- a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/generation/Generation.kt +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file contains code for codegen: generating a list of WarningNames and adjusting current year for (c)opyright inspection tests. - */ - -package org.cqfn.diktat.ruleset.generation - -import org.cqfn.diktat.ruleset.constants.Warnings - -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.TypeSpec - -import java.nio.file.Paths - -/** - * The comment that will be added to the generated sources file. - */ -private val autoGenerationComment = - """ - | This document was auto generated, please don't modify it. - | This document contains all enum properties from Warnings.kt as Strings. - """.trimMargin() - -fun main(args: Array) { - require(args.size == 1) { - "Expected only one argument: " - } - generateWarningNames(args[0]) -} - -private fun generateWarningNames(sourceDirectory: String) { - val enumValNames = Warnings.values().map { it.name } - - val propertyList = enumValNames.map { - PropertySpec - .builder(it, String::class) - .addModifiers(KModifier.CONST) - .initializer("\"$it\"") - .build() - } - - val fileBody = TypeSpec - .objectBuilder("WarningNames") - .addProperties(propertyList) - .build() - - val kotlinFile = FileSpec - .builder("generated", "WarningNames") - .addType(fileBody) - .indent(" ") - .addFileComment(autoGenerationComment) - .build() - - kotlinFile.writeTo(Paths.get(sourceDirectory)) -} diff --git a/diktat-ruleset/build.gradle.kts b/diktat-ruleset/build.gradle.kts new file mode 100644 index 0000000000..e5f043e33a --- /dev/null +++ b/diktat-ruleset/build.gradle.kts @@ -0,0 +1,61 @@ +import com.github.jengelman.gradle.plugins.shadow.ShadowExtension +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") + id("org.cqfn.diktat.buildutils.publishing-configuration") + id("com.github.johnrengelman.shadow") version "7.1.2" + `maven-publish` +} + +project.description = "This module builds jar that can be used to run diktat using ktlint -R via command line" + +dependencies { + api(projects.diktatRules) { + // Kotlin runtime & libraries will be provided by ktlint executable + exclude("org.jetbrains.kotlin", "kotlin-stdlib-common") + exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") + exclude("org.jetbrains.kotlin", "kotlin-stdlib") + exclude("org.jetbrains.kotlin", "kotlin-compiler-embeddable") + } + testImplementation(projects.diktatTestFramework) + testImplementation(libs.kotlin.stdlib.common) + testImplementation(libs.kotlin.stdlib.jdk7) + testImplementation(libs.kotlin.stdlib.jdk8) + testImplementation(libs.kotlin.stdlib) + testImplementation(libs.kotlin.compiler.embeddable) + testImplementation(libs.junit.jupiter) + testImplementation(libs.junit.platform.suite) + testImplementation(libs.assertj.core) + testImplementation(libs.mockito) +} + +tasks.named("shadowJar") { + archiveBaseName.set("diktat") + archiveClassifier.set("") +} + +// disable default jar +tasks.named("jar") { + enabled = false +} + +// it triggers shadowJar with default build +tasks { + build { + dependsOn(shadowJar) + } +} + +// it creates a publication for shadowJar +publishing { + publications { + create("shadow") { + // https://github.com/johnrengelman/shadow/issues/417#issuecomment-830668442 + project.extensions.configure { + component(this@create) + } + } + } +} diff --git a/diktat-ruleset/pom.xml b/diktat-ruleset/pom.xml deleted file mode 100644 index 88407495ac..0000000000 --- a/diktat-ruleset/pom.xml +++ /dev/null @@ -1,229 +0,0 @@ - - - 4.0.0 - diktat - This module builds jar that can be used to run diktat using ktlint -R via command line - - - org.cqfn.diktat - diktat-parent - 1.2.6-SNAPSHOT - ../pom.xml - - - - - org.cqfn.diktat - diktat-rules - ${project.version} - - - - org.jetbrains.kotlin - kotlin-stdlib-common - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - org.jetbrains.kotlin - kotlin-stdlib - - - org.jetbrains.kotlin - kotlin-compiler-embeddable - - - - - - org.cqfn.diktat - diktat-test-framework - ${project.version} - test - - - org.jetbrains.kotlin - kotlin-stdlib-common - test - - - org.jetbrains.kotlin - kotlin-stdlib-jdk7 - test - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - test - - - org.jetbrains.kotlin - kotlin-stdlib - test - - - org.jetbrains.kotlin - kotlin-compiler-embeddable - test - - - org.junit.jupiter - junit-jupiter - test - - - org.junit.platform - junit-platform-suite-engine - test - - - org.assertj - assertj-core - test - - - org.mockito - mockito-all - test - - - - - ${project.basedir}/src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - test-compile - process-test-sources - - test-compile - - - - - src/main/kotlin - src/test/kotlin - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - - - - - - maven-jar-plugin - - - default-jar - none - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - jar-with-dependencies - - diktat-${project.version} - false - - - true - - - - - - make-assembly - package - - single - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/DiktatSaveSmokeTest.* - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - **/DiktatSaveSmokeTest.* - - - - - - integration-test - verify - - integration-test - - - - - - org.jacoco - jacoco-maven-plugin - - - - default-prepare-agent-integration - - prepare-agent-integration - - - - default-merge - post-integration-test - - merge - - - - - ${project.build.directory} - - jacoco.exec - jacoco-it.exec - - - - ${project.build.directory}/jacoco-merged.exec - - - - default-report-merged - - report-integration - - - ${project.reporting.outputDirectory}/jacoco - ${project.build.directory}/jacoco-merged.exec - - - - - - - diff --git a/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSaveSmokeTest.kt b/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSaveSmokeTest.kt index 04c35ae6ea..005a17077a 100644 --- a/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSaveSmokeTest.kt +++ b/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSaveSmokeTest.kt @@ -27,6 +27,7 @@ import kotlin.io.path.createDirectories import kotlin.io.path.div import kotlin.io.path.exists import kotlin.io.path.listDirectoryEntries +import kotlin.io.path.name import kotlin.io.path.outputStream import kotlin.io.path.readText import kotlin.io.path.relativeTo @@ -136,7 +137,7 @@ class DiktatSaveSmokeTest : DiktatSmokeTestBase() { @Suppress("EMPTY_BLOCK_STRUCTURE_ERROR") private val logger = KotlinLogging.loggerWithKtlintConfig { } private const val BASE_DIRECTORY = "src/test/resources/test/smoke" - private const val BUILD_DIRECTORY = "target" + private const val BUILD_DIRECTORY = "build/libs" private const val FAT_JAR_GLOB = "diktat-*.jar" private const val KTLINT_VERSION = "0.46.1" private const val SAVE_VERSION: String = "0.3.4" diff --git a/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSmokeTestBase.kt b/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSmokeTestBase.kt index cf31ebe8cd..785b50ccff 100644 --- a/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSmokeTestBase.kt +++ b/diktat-ruleset/src/test/kotlin/org/cqfn/diktat/ruleset/smoke/DiktatSmokeTestBase.kt @@ -383,7 +383,7 @@ abstract class DiktatSmokeTestBase { @Suppress("AVOID_NULL_CHECKS") internal fun createTmpFiles() { listOf( - "$RESOURCE_FILE_PATH/../../../build.gradle_.kts" to "build.gradle.kts", + "$RESOURCE_FILE_PATH/../../../build.gradle.kts_" to "build.gradle.kts", "$RESOURCE_FILE_PATH/Example1Test.kt" to "Example1-2Test.kt", ) .map { (resource, targetFileName) -> diff --git a/diktat-ruleset/src/test/resources/test/smoke/build.gradle_.kts b/diktat-ruleset/src/test/resources/test/smoke/build.gradle.kts_ similarity index 100% rename from diktat-ruleset/src/test/resources/test/smoke/build.gradle_.kts rename to diktat-ruleset/src/test/resources/test/smoke/build.gradle.kts_ diff --git a/diktat-test-framework/build.gradle.kts b/diktat-test-framework/build.gradle.kts new file mode 100644 index 0000000000..5878a32fcf --- /dev/null +++ b/diktat-test-framework/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id("org.cqfn.diktat.buildutils.kotlin-jvm-configuration") + id("org.cqfn.diktat.buildutils.code-quality-convention") +} + +project.description = "Test framework for diktat" + +dependencies { + api(projects.diktatCommon) + implementation(libs.kotlin.stdlib.jdk8) + implementation(libs.apache.commons.cli) + implementation(libs.apache.commons.io) + implementation(libs.kotlin.logging) + implementation(libs.kotlin.multiplatform.diff) + testImplementation(libs.junit.jupiter) + testImplementation(libs.assertj.core) +} diff --git a/diktat-test-framework/pom.xml b/diktat-test-framework/pom.xml deleted file mode 100644 index e3c021025d..0000000000 --- a/diktat-test-framework/pom.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - 4.0.0 - diktat-test-framework - diktat-test-framework - Test framework for diktat - - - org.cqfn.diktat - diktat-parent - 1.2.6-SNAPSHOT - - - - - org.cqfn.diktat - diktat-common - ${project.version} - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - - - commons-cli - commons-cli - - - commons-io - commons-io - - - io.github.microutils - kotlin-logging-jvm - - - io.github.petertrr - kotlin-multiplatform-diff-jvm - - - org.junit.jupiter - junit-jupiter - test - - - org.assertj - assertj-core - test - - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - compile - process-sources - - compile - - - - src/main/java - src/main/kotlin - src/main/resources - - - kotlinx-serialization - - - - - test-compile - process-test-sources - - test-compile - - - - src/test/java - src/test/kotlin - - - - - - - org.jetbrains.kotlin - kotlin-maven-serialization - ${kotlin.version} - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - compile - compile - - compile - - - - testCompile - test-compile - - testCompile - - - - - - - - diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..31df874aed --- /dev/null +++ b/gradle.properties @@ -0,0 +1,13 @@ +group=org.cqfn.diktat + +# gradle performance +org.gradle.jvmargs=-Xmx3g -XX:MaxMetaspaceSize=512m +org.gradle.parallel=true +org.gradle.vfs.watch=true + +# See +# +# If this is enabled, the Gradle Enterprise plug-in will be conflicting with +# the Test Retry plug-in (org.gradle.test-retry, +# ). +systemProp.gradle.enterprise.testretry.enabled=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000000..f98d588b81 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,157 @@ +[versions] +kotlin = "1.8.10" +serialization = "1.5.0" +ktlint = "0.46.1" +junit = "5.9.1" +junit-platfrom = "1.9.1" +guava = "31.1-jre" +commons-cli = "1.5.0" +commons-io = "2.11.0" +kotlinpoet = "1.12.0" +detekt = "1.22.0" +dokka = "1.7.20" +jacoco = "0.8.8" +# maven +maven-api = "3.8.6" +maven-plugin-tools = "3.7.0" +maven-plugin-testing-harness = "3.3.0" +plexus = "2.0" + +jbool = "1.24" +# downgraded to be compliance with ktlint +mu-logging = "2.1.23" +kaml = "0.47.0" +kotlin-multiplatform-diff = "0.4.0" +sarif4k = "0.3.0" +jupiter-itf-extension = "0.12.0" +# FIXME: need to migrate to mockito +mockito-all = "1.10.19" + + +# copied from save-cloud +jetbrains-annotations = "24.0.1" +save-cli = "0.3.9" +ktor = "2.2.4" +okio = "3.3.0" +kotlinx-datetime = "0.4.0" +kotlinx-coroutines = "1.6.4" +assertj = "3.24.2" +diktat = "1.2.5" +jgit = "6.5.0.202303070854-r" +mockito = "5.2.0" +mockito-kotlin = "4.1.0" +# only in save-cli +log4j = "2.20.0" +testcontainers = "1.17.6" +okhttp3 = "4.10.0" +reckon = "0.16.1" +commons-compress = "1.22" +zip4j = "2.11.5" +ktoml = "0.4.1" +springdoc = "1.6.15" +kotlinx-cli = "0.3.5" +spotless = "6.17.0" +arrow-kt = "1.1.5" +publish = "1.3.0" +download = "5.3.1" + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlin-js = { id = "org.jetbrains.kotlin.js", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotlin-plugin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +kotlin-plugin-jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" } +kotlin-plugin-allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin" } +talaiot-base = { id = "io.github.cdsap.talaiot.plugin.base", version = "1.5.3" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +spotless = { id = "com.diffplug.gradle.spotless", version.ref = "spotless" } +download = { id = "de.undercouch.download", version.ref = "download" } + +[libraries] +save-common = { module = "com.saveourtool.save:save-common", version.ref = "save-cli" } +save-common-jvm = { module = "com.saveourtool.save:save-common-jvm", version.ref = "save-cli" } +save-core = { module = "com.saveourtool.save:save-core", version.ref = "save-cli" } +save-core-jvm = { module = "com.saveourtool.save:save-core-jvm", version.ref = "save-cli" } +save-plugins-fix = { module = "com.saveourtool.save:fix-plugin", version.ref = "save-cli" } +save-plugins-fix-jvm = { module = "com.saveourtool.save:fix-plugin-jvm", version.ref = "save-cli" } +save-plugins-warn-jvm = { module = "com.saveourtool.save:warn-plugin-jvm", version.ref = "save-cli" } +save-plugins-fixAndWarn-jvm = { module = "com.saveourtool.save:fix-and-warn-plugin-jvm", version.ref = "save-cli" } +save-reporters = { module = "com.saveourtool.save:save-reporters", version.ref = "save-cli" } +publish-gradle-plugin = { module = "io.github.gradle-nexus:publish-plugin", version.ref = "publish"} +download-plugin = { module = "de.undercouch:gradle-download-task", version.ref = "download" } + +# kotlin +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } +kotlin-stdlib-common = { module = "org.jetbrains.kotlin:kotlin-stdlib-common", version.ref = "kotlin" } +kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" } +kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } +kotlin-compiler-embeddable = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable", version.ref = "kotlin" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } + + +# kotlinx serialization +kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } +kotlinx-serialization-json-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm", version.ref = "serialization" } +# another serialization +kaml = { module = "com.charleskorn.kaml:kaml", version.ref = "kaml" } + +#kotlin libs +kotlin-multiplatform-diff = { module = "io.github.petertrr:kotlin-multiplatform-diff", version.ref = "kotlin-multiplatform-diff" } + +# ktlint & detekt +ktlint-core = { module = "com.pinterest.ktlint:ktlint-core", version.ref = "ktlint" } +ktlint-reporter-plain = { module = "com.pinterest.ktlint:ktlint-reporter-plain", version.ref = "ktlint" } +ktlint-reporter-sarif = { module = "com.pinterest.ktlint:ktlint-reporter-sarif", version.ref = "ktlint" } +ktlint-reporter-json = { module = "com.pinterest.ktlint:ktlint-reporter-json", version.ref = "ktlint" } +ktlint-reporter-html = { module = "com.pinterest.ktlint:ktlint-reporter-html", version.ref = "ktlint" } +ktlint-reporter-baseline = { module = "com.pinterest.ktlint:ktlint-reporter-baseline", version.ref = "ktlint" } +sarif4k = { module = "io.github.detekt.sarif4k:sarif4k", version.ref = "sarif4k" } +sarif4k-jvm = { module = "io.github.detekt.sarif4k:sarif4k-jvm", version.ref = "sarif4k" } + +# apache +apache-commons-cli = { module = "commons-cli:commons-cli", version.ref = "commons-cli" } +apache-commons-io = { module = "commons-io:commons-io", version.ref = "commons-io" } + +# others +guava = { module = "com.google.guava:guava", version.ref = "guava" } +jbool-expressions = { module = "com.bpodgursky:jbool_expressions", version.ref = "jbool" } + +# logging +kotlin-logging = { module = "io.github.microutils:kotlin-logging", version.ref = "mu-logging" } + +# testing +junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } +junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } +junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" } +junit-vintage-engine = { module = "org.junit.vintage:junit-vintage-engine", version.ref = "junit" } +junit-jupiter-extension-itf = { module = "com.soebes.itf.jupiter.extension:itf-jupiter-extension", version.ref = "jupiter-itf-extension" } +assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } +junit-platform-suite = { module = "org.junit.platform:junit-platform-suite-engine", version.ref = "junit-platfrom" } +mockito = { module = "org.mockito:mockito-all", version.ref = "mockito-all" } + +# maven +maven-core = { module = "org.apache.maven:maven-core", version.ref = "maven-api" } +maven-embedder = { module = "org.apache.maven:maven-embedder", version.ref = "maven-api" } +maven-compat = { module = "org.apache.maven:maven-compat", version.ref = "maven-api" } +maven-plugin-api = { module = "org.apache.maven:maven-plugin-api", version.ref = "maven-api" } +maven-plugin-annotations = { module = "org.apache.maven.plugin-tools:maven-plugin-annotations", version.ref = "maven-plugin-tools" } +maven-plugin-testing-harness = { module = "org.apache.maven.plugin-testing:maven-plugin-testing-harness", version.ref = "maven-plugin-testing-harness" } +plexus-cipher = { module = "org.codehaus.plexus:plexus-cipher", version.ref = "plexus" } + +######### copied from save-cloud +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +kotlin-plugin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" } + + +jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" } + +# java core libraries +validation-api = { module = "jakarta.validation:jakarta.validation-api"} +annotation-api = { module = "jakarta.annotation:jakarta.annotation-api"} + +# code quality +diktat-gradle-plugin = { module = "org.cqfn.diktat:diktat-gradle-plugin", version.ref = "diktat" } +detekt-gradle-plugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } +gradle-plugin-spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } +reckon-gradle-plugin = { module = "org.ajoberstar.reckon:reckon-gradle", version.ref = "reckon" } diff --git a/gradle/plugins/build.gradle.kts b/gradle/plugins/build.gradle.kts new file mode 100644 index 0000000000..e51ffc142a --- /dev/null +++ b/gradle/plugins/build.gradle.kts @@ -0,0 +1,45 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` +} + +repositories { + file("$rootDir/../../build/diktat-snapshot") + .takeIf { it.exists() } + ?.run { + maven { + url = this@run.toURI() + } + } + mavenCentral() + gradlePluginPortal() +} + +dependencies { + // workaround https://github.com/gradle/gradle/issues/15383 + implementation(files(project.libs.javaClass.superclass.protectionDomain.codeSource.location)) + implementation(libs.kotlin.gradle.plugin) + implementation(libs.reckon.gradle.plugin) + implementation(libs.detekt.gradle.plugin) { + exclude("io.github.detekt.sarif4k", "sarif4k") + } + implementation(libs.diktat.gradle.plugin) { + exclude("io.github.detekt.sarif4k", "sarif4k") + } + implementation(libs.sarif4k) + implementation(libs.gradle.plugin.spotless) + implementation(libs.publish.gradle.plugin) + // extra dependencies + implementation(libs.kotlin.stdlib) + implementation(libs.kotlin.stdlib.common) + implementation(libs.kotlin.stdlib.jdk7) + implementation(libs.kotlin.stdlib.jdk8) + implementation(libs.jetbrains.annotations) +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = freeCompilerArgs + "-opt-in=kotlin.RequiresOptIn" + } +} diff --git a/gradle/plugins/settings.gradle.kts b/gradle/plugins/settings.gradle.kts new file mode 100644 index 0000000000..78b17f596a --- /dev/null +++ b/gradle/plugins/settings.gradle.kts @@ -0,0 +1,9 @@ +rootProject.name = "buildutils" + +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("../libs.versions.toml")) + } + } +} diff --git a/gradle/plugins/src/main/kotlin/Versions.kt b/gradle/plugins/src/main/kotlin/Versions.kt new file mode 100644 index 0000000000..d7936361ed --- /dev/null +++ b/gradle/plugins/src/main/kotlin/Versions.kt @@ -0,0 +1,8 @@ +@file:Suppress("CONSTANT_UPPERCASE", "PACKAGE_NAME_MISSING") + +object Versions { + /** + * JDK version which is used for building and running the project. + */ + const val jdk = "8" +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/JacocoConfiguration.kt b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/JacocoConfiguration.kt new file mode 100644 index 0000000000..aac1062534 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/JacocoConfiguration.kt @@ -0,0 +1,41 @@ +/** + * Configuration for code coverage calculation via Jacoco + */ + +package org.cqfn.diktat.buildutils + +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.api.Project +import org.gradle.api.tasks.testing.Test +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.named +import org.gradle.kotlin.dsl.the +import org.gradle.testing.jacoco.plugins.JacocoPlugin +import org.gradle.testing.jacoco.plugins.JacocoPluginExtension +import org.gradle.testing.jacoco.tasks.JacocoReport + +/** + * Configure jacoco for [this] project + */ +fun Project.configureJacoco() { + apply() + + configure { + toolVersion = the() + .versions + .jacoco + .get() + } + + tasks.named("test") { + finalizedBy("jacocoTestReport") + } + tasks.named("jacocoTestReport") { + dependsOn(tasks.named("test")) + reports { + xml.required.set(true) + html.required.set(true) + } + } +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/PublishingConfiguration.kt b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/PublishingConfiguration.kt new file mode 100644 index 0000000000..9577cc28c2 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/PublishingConfiguration.kt @@ -0,0 +1,168 @@ +/** + * Publishing configuration file. + */ + +@file:Suppress( + "MISSING_KDOC_TOP_LEVEL", + "MISSING_KDOC_ON_FUNCTION", +) + +package org.cqfn.diktat.buildutils + +import io.github.gradlenexus.publishplugin.NexusPublishExtension +import org.gradle.api.Named +import org.gradle.api.Project +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.bundling.Jar +import org.gradle.internal.logging.text.StyledTextOutput +import org.gradle.internal.logging.text.StyledTextOutput.Style.Failure +import org.gradle.internal.logging.text.StyledTextOutput.Style.Success +import org.gradle.internal.logging.text.StyledTextOutputFactory +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.support.serviceOf +import org.gradle.kotlin.dsl.withType +import org.gradle.plugins.signing.SigningExtension + +/** + * Enables signing of the artifacts if the `signingKey` project property is set. + * + * Should be explicitly called after each custom `publishing {}` section. + */ +fun Project.configureSigning() { + if (hasProperty("signingKey")) { + /* + * GitHub Actions. + */ + configureSigningCommon { + useInMemoryPgpKeys(property("signingKey") as String?, findProperty("signingPassword") as String?) + } + } else if ( + hasProperties( + "signing.keyId", + "signing.password", + "signing.secretKeyRingFile", + ) + ) { + /*- + * Pure-Java signing mechanism via `org.bouncycastle.bcpg`. + * + * Requires an 8-digit (short form) PGP key id and a present `~/.gnupg/secring.gpg` + * (for gpg 2.1, run + * `gpg --keyring secring.gpg --export-secret-keys >~/.gnupg/secring.gpg` + * to generate one). + */ + configureSigningCommon() + } else if (hasProperty("signing.gnupg.keyName")) { + /*- + * Use an external `gpg` executable. + * + * On Windows, you may need to additionally specify the path to `gpg` via + * `signing.gnupg.executable`. + */ + configureSigningCommon { + useGpgCmd() + } + } +} + +@Suppress("TOO_LONG_FUNCTION") +internal fun Project.configurePublications() { + val dokkaJar: Jar = tasks.create("dokkaJar") { + group = "documentation" + archiveClassifier.set("javadoc") + from(tasks.findByName("dokkaHtml")) + } + configure { + repositories { + mavenLocal() + } + publications.withType().configureEach { + /* + * The content of this section will get executed only if + * a particular module has a `publishing {}` section. + */ + this.artifact(dokkaJar) + this.pom { + name.set(project.name) + description.set(project.description ?: project.name) + url.set("https://www.cqfn.org/diKTat/") + licenses { + license { + name.set("MIT License") + url.set("http://www.opensource.org/licenses/mit-license.php") + } + } + developers { + developer { + id.set("akuleshov7") + name.set("Andrey Kuleshov") + email.set("andrewkuleshov7@gmail.com") + url.set("https://github.com/akuleshov7") + } + developer { + id.set("petertrr") + name.set("Peter Trifanov") + email.set("peter.trifanov@gmail.com") + url.set("https://github.com/petertrr") + } + } + scm { + connection.set("scm:git:git://github.com/saveourtool/diktat.git") + developerConnection.set("scm:git:ssh://github.com:saveourtool/diktat.git") + url.set("http://github.com/saveourtool/diktat/tree/master") + } + } + } + } +} + +internal fun Project.configureNexusPublishing() { + configure { + repositories { + sonatype { + nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/")) + snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")) + username.set(property("sonatypeUsername") as String) + password.set(property("sonatypePassword") as String) + } + } + } +} + +/** + * @param useKeys the block which configures the PGP keys. Use either + * [SigningExtension.useInMemoryPgpKeys], [SigningExtension.useGpgCmd], or an + * empty lambda. + * @see SigningExtension.useInMemoryPgpKeys + * @see SigningExtension.useGpgCmd + */ +private fun Project.configureSigningCommon(useKeys: SigningExtension.() -> Unit = {}) { + configure { + useKeys() + val publications = extensions.getByType().publications + val publicationCount = publications.size + val message = "The following $publicationCount publication(s) are getting signed: ${publications.map(Named::getName)}" + val style = when (publicationCount) { + 0 -> Failure + else -> Success + } + styledOut(logCategory = "signing").style(style).println(message) + sign(*publications.toTypedArray()) + } +} + +private fun Project.styledOut(logCategory: String): StyledTextOutput = + serviceOf().create(logCategory) + +/** + * Determines if this project has all the given properties. + * + * @param propertyNames the names of the properties to locate. + * @return `true` if this project has all the given properties, `false` otherwise. + * @see Project.hasProperty + */ +private fun Project.hasProperties(vararg propertyNames: String): Boolean = + propertyNames.asSequence().all(this::hasProperty) diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/VersioningConfiguration.kt b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/VersioningConfiguration.kt new file mode 100644 index 0000000000..0fd6b60073 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/VersioningConfiguration.kt @@ -0,0 +1,39 @@ +/** + * Configuration for project versioning + */ + +package org.cqfn.diktat.buildutils + +import org.ajoberstar.grgit.gradle.GrgitServiceExtension +import org.ajoberstar.grgit.gradle.GrgitServicePlugin +import org.ajoberstar.reckon.gradle.ReckonExtension +import org.ajoberstar.reckon.gradle.ReckonPlugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.getByType + +/** + * Configures reckon plugin for [this] project, should be applied for root project only + */ +fun Project.configureVersioning() { + apply() + apply() + + // should be provided in the gradle.properties + configure { + snapshots() + setScopeCalc(calcScopeFromProp()) + setStageCalc(calcStageFromProp()) + } + + val status = project.extensions.getByType() + .service + .map { it.grgit.repository.jgit.status().call() } + .get() + if (!status.isClean) { + logger.warn("git tree is not clean; " + + "Untracked files: ${status.untracked}, uncommitted changes: ${status.uncommittedChanges}" + ) + } +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/code-quality-convention.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/code-quality-convention.gradle.kts new file mode 100644 index 0000000000..c6dcf2513e --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/code-quality-convention.gradle.kts @@ -0,0 +1,6 @@ +package org.cqfn.diktat.buildutils + +plugins { + id("org.cqfn.diktat.buildutils.detekt-convention-configuration") + id("org.cqfn.diktat.buildutils.diktat-convention-configuration") +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/detekt-convention-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/detekt-convention-configuration.gradle.kts new file mode 100644 index 0000000000..a63ca336e7 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/detekt-convention-configuration.gradle.kts @@ -0,0 +1,39 @@ +package org.cqfn.diktat.buildutils + +import io.gitlab.arturbosch.detekt.Detekt +import io.gitlab.arturbosch.detekt.report.ReportMergeTask + +plugins { + id("io.gitlab.arturbosch.detekt") +} + +detekt { + config = rootProject.files("detekt-config.yml") + basePath = rootDir.canonicalPath + buildUponDefaultConfig = true +} + +@Suppress("RUN_IN_SCRIPT") +if (path == rootProject.path) { + tasks.register("detektAll") { + allprojects { + this@register.dependsOn(tasks.withType()) + } + } + + tasks.register("mergeDetektReports", ReportMergeTask::class) { + output.set(buildDir.resolve("detekt-sarif-reports/detekt-merged.sarif")) + } +} + +@Suppress("GENERIC_VARIABLE_WRONG_DECLARATION") +val reportMerge: TaskProvider = rootProject.tasks.named("mergeDetektReports") { + input.from( + tasks.withType().map { it.sarifReportFile } + ) + shouldRunAfter(tasks.withType()) +} +tasks.withType().configureEach { + reports.sarif.required.set(true) + finalizedBy(reportMerge) +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-convention-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-convention-configuration.gradle.kts new file mode 100644 index 0000000000..49bf317b0e --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-convention-configuration.gradle.kts @@ -0,0 +1,34 @@ +package org.cqfn.diktat.buildutils + +import org.cqfn.diktat.plugin.gradle.DiktatJavaExecTaskBase + +plugins { + id("org.cqfn.diktat.diktat-gradle-plugin") +} + +diktat { + diktatConfigFile = rootProject.file("diktat-analysis.yml") + githubActions = findProperty("diktat.githubActions")?.toString()?.toBoolean() ?: false + inputs { + // using `Project#path` here, because it must be unique in gradle's project hierarchy + if (path == rootProject.path) { + include("gradle/plugins/src/**/*.kt", "*.kts", "gradle/plugins/**/*.kts") + exclude("gradle/plugins/build/**") + } else { + include("src/**/*.kt", "**/*.kts") + exclude( + "src/test/**/*.kt", + "src/test/**/*.kts", + "src/*Test/**/*.kt", + "build/**/*.kts", + ) + } + } +} + +tasks.withType().configureEach { + javaLauncher.set(project.extensions.getByType().launcherFor { + // a temporary workaround -- diktat-gradle-plugin doesn't detect java version of `javaLauncher` + languageVersion.set(JavaLanguageVersion.of(11)) + }) +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-version-file-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-version-file-configuration.gradle.kts new file mode 100644 index 0000000000..fa5f3267f2 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/diktat-version-file-configuration.gradle.kts @@ -0,0 +1,50 @@ +package org.cqfn.diktat.buildutils + +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.kotlin.dsl.getValue +import org.gradle.kotlin.dsl.kotlin +import org.gradle.kotlin.dsl.provideDelegate +import org.gradle.kotlin.dsl.registering +import org.gradle.kotlin.dsl.the +import java.io.File + +plugins { + kotlin("jvm") +} + +val ktlintVersion: String = the() + .versions + .ktlint + .get() + +val generateVersionsFile by tasks.registering { + val outputDir = File("$buildDir/generated/src") + val versionsFile = outputDir.resolve("generated/Versions.kt") + + val diktatVersion = version.toString() + + inputs.property("diktat version", diktatVersion) + inputs.property("ktlint version", ktlintVersion) + outputs.dir(outputDir) + + doFirst { + versionsFile.parentFile.mkdirs() + versionsFile.writeText( + """ + package generated + + internal const val DIKTAT_VERSION = "$diktatVersion" + internal const val KTLINT_VERSION = "$ktlintVersion" + + """.trimIndent() + ) + } +} + +kotlin.sourceSets.getByName("main") { + kotlin.srcDir( + generateVersionsFile.map { + it.outputs.files.singleFile + } + ) +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/git-hook-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/git-hook-configuration.gradle.kts new file mode 100644 index 0000000000..33882d3f25 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/git-hook-configuration.gradle.kts @@ -0,0 +1,14 @@ +package org.cqfn.diktat.buildutils + +/** + * Task of type [Copy] that install git hooks from directory in repo to .git directory + */ +val installGitHooksTask = tasks.register("installGitHooks", Copy::class) { + from(file("$rootDir/.git-hooks")) + into(file("$rootDir/.git/hooks")) +} + +// add git hooks installation to build by adding it as a dependency for some common task +run { + tasks.findByName("build")?.dependsOn(installGitHooksTask) +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/kotlin-jvm-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/kotlin-jvm-configuration.gradle.kts new file mode 100644 index 0000000000..e844ca9b75 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/kotlin-jvm-configuration.gradle.kts @@ -0,0 +1,32 @@ +package org.cqfn.diktat.buildutils + +import org.gradle.api.tasks.testing.Test +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = freeCompilerArgs + + "-opt-in=kotlin.RequiresOptIn" + "-Werror" + } +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(Versions.jdk)) + } +} + +kotlin { + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of(Versions.jdk)) + } +} + +configureJacoco() +tasks.withType { + useJUnitPlatform() +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-configuration.gradle.kts new file mode 100644 index 0000000000..50ca4ce47c --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-configuration.gradle.kts @@ -0,0 +1,37 @@ +package org.cqfn.diktat.buildutils + +import io.github.gradlenexus.publishplugin.NexusPublishPlugin +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.extra + +plugins { + `maven-publish` + signing +} + +run { + // If present, set properties from env variables. If any are absent, release will fail. + System.getenv("OSSRH_USERNAME")?.let { + extra.set("sonatypeUsername", it) + } + System.getenv("OSSRH_PASSWORD")?.let { + extra.set("sonatypePassword", it) + } + System.getenv("GPG_SEC")?.let { + extra.set("signingKey", it) + } + System.getenv("GPG_PASSWORD")?.let { + extra.set("signingPassword", it) + } + + if (project.path == rootProject.path) { + apply() + if (hasProperty("sonatypeUsername")) { + configureNexusPublishing() + } + } +} + +run { + configurePublications() +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-signing-default-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-signing-default-configuration.gradle.kts new file mode 100644 index 0000000000..d53e3a5ad6 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/publishing-signing-default-configuration.gradle.kts @@ -0,0 +1,21 @@ +package org.cqfn.diktat.buildutils + +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.get + +plugins { + id("org.cqfn.diktat.buildutils.publishing-configuration") +} + +run { + publishing { + publications { + create("maven") { + from(components["java"]) + } + } + } + + configureSigning() +} diff --git a/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/versioning-configuration.gradle.kts b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/versioning-configuration.gradle.kts new file mode 100644 index 0000000000..0fa18c6248 --- /dev/null +++ b/gradle/plugins/src/main/kotlin/org/cqfn/diktat/buildutils/versioning-configuration.gradle.kts @@ -0,0 +1,3 @@ +package org.cqfn.diktat.buildutils + +configureVersioning() diff --git a/diktat-gradle-plugin/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar similarity index 67% rename from diktat-gradle-plugin/gradle/wrapper/gradle-wrapper.jar rename to gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..ccebba7710deaf9f98673a68957ea02138b60d0a 100644 GIT binary patch delta 5094 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 delta 5107 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 I6Xdi10eY*&F8}}l diff --git a/diktat-gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from diktat-gradle-plugin/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties diff --git a/diktat-gradle-plugin/gradlew b/gradlew similarity index 99% rename from diktat-gradle-plugin/gradlew rename to gradlew index 65dcd68d65..79a61d421c 100755 --- a/diktat-gradle-plugin/gradlew +++ b/gradlew @@ -144,7 +144,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=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,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=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/diktat-gradle-plugin/gradlew.bat b/gradlew.bat similarity index 100% rename from diktat-gradle-plugin/gradlew.bat rename to gradlew.bat diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 7516a2a9f0..0000000000 --- a/pom.xml +++ /dev/null @@ -1,625 +0,0 @@ - - - 4.0.0 - - org.cqfn.diktat - diktat-parent - 1.2.6-SNAPSHOT - pom - - diktat - diKTat kotlin formatter and fixer - https://www.cqfn.org/diKTat/ - - - - MIT License - http://www.opensource.org/licenses/mit-license.php - - - - - scm:git:git://github.com/saveourtool/diktat.git - scm:git:ssh://github.com:saveourtool/diktat.git - http://github.com/saveourtool/diktat/tree/master - - - - - Andrey Kuleshov - andrewkuleshov7@gmail.com - https://github.com/akuleshov7 - - - Peter Trifanov - peter.trifanov@mail.ru - https://github.com/petertrr - - - - - 1.8 - 1.8 - UTF-8 - 1.8.10 - true - official - 1.5.0 - 0.46.1 - 5.9.2 - 1.9.2 - 1.1.0 - 31.1-jre - 1.5.0 - 1.2.5 - 1.12.0 - 1.22.0 - 1.8.10 - 0.8.8 - - 3.6.4 - 1.24 - - 2.1.23 - - - - diktat-common - diktat-rules - diktat-test-framework - diktat-ruleset - diktat-maven-plugin - diktat-gradle-plugin - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - - - - - com.squareup - kotlinpoet - ${kotlinpoet.version} - - - org.jetbrains.kotlin - kotlin-stdlib - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-stdlib-jdk7 - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-stdlib-common - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-compiler-embeddable - ${kotlin.version} - - - org.jetbrains.kotlinx - kotlinx-serialization-core - ${kotlinx.serialization.version} - - - org.jetbrains.kotlinx - kotlinx-serialization-core-jvm - ${kotlinx.serialization.version} - - - org.jetbrains.kotlinx - kotlinx-serialization-json - ${kotlinx.serialization.version} - - - org.jetbrains.kotlinx - kotlinx-serialization-json-jvm - ${kotlinx.serialization.version} - - - com.pinterest.ktlint - ktlint-core - ${ktlint.version} - - - ch.qos.logback - logback-classic - - - - - com.pinterest.ktlint - ktlint-reporter-plain - ${ktlint.version} - - - com.pinterest.ktlint - ktlint-reporter-sarif - ${ktlint.version} - - - com.pinterest.ktlint - ktlint-reporter-json - ${ktlint.version} - - - com.pinterest.ktlint - ktlint-reporter-html - ${ktlint.version} - - - com.pinterest.ktlint - ktlint-reporter-baseline - ${ktlint.version} - - - com.charleskorn.kaml - kaml-jvm - 0.47.0 - - - com.google.guava - guava - ${guava.version} - - - commons-cli - commons-cli - ${commons-cli.version} - - - commons-io - commons-io - 2.11.0 - - - commons-configuration - commons-configuration - 1.10 - - - io.github.microutils - kotlin-logging-jvm - ${mu-logging.version} - - - io.github.petertrr - kotlin-multiplatform-diff-jvm - 0.4.0 - - - org.junit.jupiter - junit-jupiter - ${junit.version} - - - org.junit.platform - junit-platform-suite-engine - ${junit.platform.version} - - - org.assertj - assertj-core - 3.24.2 - - - org.mockito - mockito-all - 1.10.19 - test - - - - com.bpodgursky - jbool_expressions - ${jbool.version} - - - - - - - - - - org.apache.maven.plugins - maven-clean-plugin - 3.2.0 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - - org.apache.maven.plugins - maven-deploy-plugin - 3.1.0 - - - org.apache.maven.plugins - maven-jar-plugin - 3.3.0 - - - org.apache.maven.plugins - maven-assembly-plugin - 3.5.0 - - - - true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0 - - - me.fabriciorby - maven-surefire-junit5-tree-reporter - ${surefire.junit5.tree-reporter.version} - - - - - - true - true - true - true - - - plain - - true - - - - true - true - - false - - - - - org.apache.maven.plugins - maven-plugin-plugin - ${maven-plugin-tools.version} - - - org.apache.maven.plugins - maven-failsafe-plugin - 3.0.0 - - - me.fabriciorby - maven-surefire-junit5-tree-reporter - ${surefire.junit5.tree-reporter.version} - - - - - - true - true - true - true - - - plain - - - false - - - - true - true - - false - - - - - org.codehaus.mojo - versions-maven-plugin - 2.15.0 - - false - - - - org.codehaus.mojo - build-helper-maven-plugin - 3.3.0 - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - 1.8 - - src/main/kotlin - src/main/resources - - - -Werror - -opt-in=kotlin.RequiresOptIn - - - true - - - org.codehaus.mojo - exec-maven-plugin - 3.1.0 - - - org.cqfn.diktat - diktat-maven-plugin - ${diktat-check.version} - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - ${project.basedir}/src/main/kotlin/generated - - diktat-analysis.yml - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - - - - org.codehaus.mojo - versions-maven-plugin - - - com.rudikershaw.gitbuildhook - git-build-hook-maven-plugin - 3.4.1 - - - - .git-hooks/pre-commit.sh - .git-hooks/commit-msg.sh - - - false - - - install-git-hooks - initialize - - - install - - - - - - - - - maven-dependency-plugin - 3.5.0 - - - detekt - none - - build-classpath - - - maven.compile.classpath - ${path.separator} - - - - - - com.github.ozsie - detekt-maven-plugin - ${detekt.version} - - - detekt - none - - check - - - detekt-config.yml - true - ${maven.compile.classpath} - 1.8 - **/resources/**/*.kt,**/resources/**/*.kts - - - - - - - org.cqfn.diktat - diktat-maven-plugin - - - diktat - none - - check - fix - - - - - - - org.jacoco - jacoco-maven-plugin - - - **/generation/** - - - - - - prepare-agent - - - - report - test - - report - - - - - - - - - - release - - - - org.codehaus.mojo - build-helper-maven-plugin - - - - generate-sources - - add-source - - - - src/main/kotlin - - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.1 - - - attach-sources - - jar - - - - - - org.jetbrains.dokka - dokka-maven-plugin - ${dokka.version} - - - package - - javadocJar - - - - - - ${project.basedir}/src/main/kotlin - - - - org.jetbrains.dokka - kotlin-as-java-plugin - ${dokka.version} - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 3.0.1 - - - sign-artifacts - verify - - sign - - - - - - - --pinentry-mode - loopback - - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.8 - true - - ossrh - https://oss.sonatype.org/ - true - - - - - - - jdk11 - - [11, - - - 8 - - - - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000000..706f7906d4 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,54 @@ +rootProject.name = "diktat" + +dependencyResolutionManagement { + repositories { + file("$rootDir/build/diktat-snapshot") + .takeIf { it.exists() } + ?.run { + maven { + url = this@run.toURI() + } + } + mavenCentral() + } +} + +pluginManagement { + repositories { + file("$rootDir/build/diktat-snapshot") + .takeIf { it.exists() } + ?.run { + maven { + url = this@run.toURI() + } + } + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("com.gradle.enterprise") version "3.12.4" +} + +includeBuild("gradle/plugins") +include("diktat-common") +include("diktat-gradle-plugin") +include("diktat-maven-plugin") +include("diktat-rules") +include("diktat-ruleset") +include("diktat-test-framework") +include("diktat-dev-ksp") + +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +gradleEnterprise { + @Suppress("AVOID_NULL_CHECKS") + if (System.getenv("CI") != null) { + buildScan { + publishAlways() + termsOfServiceUrl = "https://gradle.com/terms-of-service" + termsOfServiceAgree = "yes" + } + } +}