diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e9d48eda..af0f3a41 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ variables: - CURRENT_CI_IMAGE: "18" + CURRENT_CI_IMAGE: "19" CI_IMAGE_DOCKER: 486234852809.dkr.ecr.us-east-1.amazonaws.com/ci/dd-sdk-android-gradle-plugin:$CURRENT_CI_IMAGE GIT_DEPTH: 5 @@ -13,6 +13,7 @@ variables: EMULATOR_NAME: "android_emulator" ANDROID_ARCH: "arm64-v8a" ANDROID_API: "36" + ANDROID_SDK_TOOLS: "13114758" ANDROID_EMULATOR_IMAGE: "system-images;android-$ANDROID_API;google_apis;${ANDROID_ARCH}" ANDROID_PLATFORM: "platforms;android-$ANDROID_API" ANDROID_BUILD_TOOLS: "build-tools;$ANDROID_API.0.0" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d9e8229..0c36d096 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,8 +27,11 @@ The whole project is covered by a set of static analysis tools, linters and test # launches the unit tests ./gradlew :dd-sdk-android-gradle-plugin:test -# launches the ktlint check and formatter for all Kotlin files (the ktlint client needs to be installed on your machine) -ktlint -F "**/*.kt" "**/*.kts" '!**/build/generated/**' '!**/build/kspCaches/**' +# launches the ktlint check for all Kotlin files +./gradlew ktlintCheck :build-config:ktlintCheck + +# launches the detekt checks +./gradlew detekt # launches all the tests described above @@ -159,11 +162,11 @@ class Foo :Observable(), Runnable { } ``` -There is also a command that you can use to automatically format the code following the -required styling rules (require ktlint installed on your machine): +There is also a Gradle command that you can use to automatically format the code following the +required styling rules: ```console -ktlint -F "**/*.kt" "**/*.kts" '!**/build/generated/**' '!**/build/kspCaches/**' +./gradlew ktlintFormat :build-config:ktlintFormat ``` ### #TestMatters @@ -252,4 +255,3 @@ Because we sometimes need to reuse some setup or assertions in our tests, we ten - `fun setupSomething()`: method to set up a complex test (should only be used in the Given part of a test). - diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 40d3e110..d0863311 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -1,10 +1,14 @@ Component,Origin,License,Copyright build,com.pinterest,MIT,"Copyright 2019 Pinterest Inc, Copyright 2016-2019 Stanley Shyiko" build,com.pinterest.ktlint,MIT,"Copyright 2019 Pinterest Inc, Copyright 2016-2019 Stanley Shyiko" +build,dev.drewhamilton.poko,Apache-2.0,Copyright 2020-Present Drew Hamilton +build,io.github.detekt.sarif4k,Apache-2.0,"Copyright 2021 Artur Bosch & Contributors" +build,io.github.oshai,Apache-2.0,"Copyright oshai authors" build,io.gitlab.arturbosch.detekt,Apache-2.0,Copyright 2016-2019 the original author or authors build,org.ec4j.core,Apache-2.0,"Copyright (c) 2017 Angelo Zerr and other contributors" build,org.jetbrains.dokka,Apache-2.0,"Copyright 2014-2019 JetBrains s.r.o. and Dokka project contributors." build,org.jetbrains.intellij.deps,LGPL-2.1-only,"Copyright (c) 2001-2002, Eric D. Friedman, Jason Baldridge, Copyright (c) 1999 CERN - European Organization for Nuclear Research" +build,org.jetbrains.kotlinx,Apache-2.0,Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors import,com.android.tools.build,Apache-2.0,Copyright (C) 2013 The Android Open Source Project import,com.squareup.okhttp3,Apache-2.0,"Copyright 2019 Square, Inc" import,org.bouncycastle,BouncyCastle-License,"Copyright (c) 2000 - 2026 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org)"" @@ -19,7 +23,6 @@ import(test),dev.zacsweers.kctfork,MPL-2.0,Copyright (C) 2023 Thilo Schuchort import(test),com.github.xgouchet.Elmyr,MIT,Copyright 2017-2019 Xavier F. Gouchet import(test),net.wuerl.kotlin,Apache-2.0,Copyright 2016 Andreas Würl import(test),org.assertj,Apache-2.0,Copyright 2012-2019 the original author or authors -import(test),org.jacoco,EPL-2.0,"Copyright (c) 2009, 2019 Mountainminds GmbH & Co. KG and Contributors" import(test),org.junit.jupiter,EPL-2.0,Copyright 2015-2019 the original author or authors import(test),org.junit.platform,EPL-2.0,Copyright 2015-2019 the original author or authors import(test),org.junit.vintage,EPL-2.0,Copyright 2015-2019 the original author or authors diff --git a/build.gradle.kts b/build.gradle.kts index d53ba5fc..f7a18781 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,8 @@ * Copyright 2020-Present Datadog, Inc. */ +import io.gitlab.arturbosch.detekt.Detekt + buildscript { repositories { // Magic Mirror Depot proxy (only set in CI via `.gitlab-ci.yml`). @@ -23,7 +25,11 @@ buildscript { } plugins { + alias(libs.plugins.detektGradlePlugin) alias(libs.plugins.kotlinPlugin23) apply false + alias(libs.plugins.ktlintGradlePlugin) apply false + alias(libs.plugins.koverPlugin) apply false + id("ktlint") alias(libs.plugins.dokkaJavadocPlugin) apply false alias(libs.plugins.androidApplicationPlugin) apply false alias(libs.plugins.androidLibraryPlugin) apply false @@ -44,6 +50,28 @@ allprojects { } } +val detektSources = files(rootDir) +val detektExcludes = listOf("**/build/**", "**/.gradle/**") + +tasks.withType().configureEach { + setSource(detektSources) + include("**/*.kt", "**/*.kts") + exclude(detektExcludes) + jvmTarget = "17" + reports { + sarif.required = false + html.required = false + xml.required = false + txt.required = false + md.required = false + } +} + +tasks.named("detekt") { + description = "Runs the Detekt checks." + config.setFrom(rootProject.file("detekt.yml")) +} + tasks.register("clean") { delete(rootProject.layout.buildDirectory) } diff --git a/ci/Dockerfile.gitlab b/ci/Dockerfile.gitlab index 7ab3bf8e..34fd2940 100644 --- a/ci/Dockerfile.gitlab +++ b/ci/Dockerfile.gitlab @@ -1,56 +1,33 @@ # This base image is based on a GBI image FROM registry.ddbuild.io/images/docker:24.0.4-jammy -ENV DEBIAN_FRONTEND=noninteractive +ARG DEBIAN_FRONTEND=noninteractive +ARG TARGETARCH # Set timezone to UTC by default RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime -RUN apt-get update \ - && apt-get -y install openjdk-17-jdk \ - && rm -rf /var/lib/apt/lists/* - RUN set -x \ && apt-get update \ - && apt-get -y upgrade \ - && apt-get -y install --no-install-recommends \ + && apt-get install -y openjdk-17-jdk \ + && apt-get install -y --no-install-recommends \ curl \ git \ + python3 \ + python3-pip \ unzip \ - wget \ - openssh-client \ - expect \ - python3-distutils \ - python3-apt \ - && apt-get -y clean \ && rm -rf /var/lib/apt/lists/* -ENV GRADLE_VERSION 9.6.1 -ENV ANDROID_COMPILE_SDK 36 -ENV ANDROID_BUILD_TOOLS 36.1.0 -ENV ANDROID_SDK_TOOLS 11076708 -ENV NDK_VERSION 26.1.10909125 -ENV CMAKE_VERSION 3.22.1 - -RUN apt update && apt install -y python3 python3-distutils - -# Install pip for aws -RUN set -x \ - && curl -OL https://bootstrap.pypa.io/get-pip.py \ - && python3 get-pip.py \ - && rm get-pip.py - -RUN python3 --version - -RUN set -x \ - && pip install awscli +ENV ANDROID_COMPILE_SDK=36 \ + ANDROID_BUILD_TOOLS=36.1.0 \ + ANDROID_SDK_TOOLS=13114758 \ + CMAKE_VERSION=3.22.1 \ + NDK_VERSION=28.2.13676358 +ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-${TARGETARCH} -# Gradle -RUN \ - cd /usr/local && \ - curl -L https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip -o gradle-${GRADLE_VERSION}-bin.zip && \ - unzip gradle-${GRADLE_VERSION}-bin.zip && \ - rm gradle-${GRADLE_VERSION}-bin.zip +RUN python3 --version \ + && python3 -m pip install --no-cache-dir awscli \ + && aws --version # Workaround for # Warning: File /root/.android/repositories.cfg could not be loaded. @@ -60,39 +37,31 @@ RUN mkdir /root/.android \ # Android SDK RUN \ - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip && \ - mkdir -p android-sdk-linux/cmdline-tools && \ - unzip -d android-sdk-linux/cmdline-tools android-sdk.zip && \ - mv android-sdk-linux/cmdline-tools/cmdline-tools android-sdk-linux/cmdline-tools/latest && \ - echo y | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null && \ - echo y | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager "platform-tools" >/dev/null && \ - echo y | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null && \ - echo y | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --install "ndk;${NDK_VERSION}" >/dev/null && \ - echo y | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --install "cmake;${CMAKE_VERSION}" >/dev/null && \ - (yes || true) | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --licenses - -RUN set -x \ - && curl -OL https://s3.amazonaws.com/dd-package-public/dd-package.deb && dpkg -i dd-package.deb && rm dd-package.deb \ - && apt-get update \ - && apt-get -y clean \ - && rm -rf /var/lib/apt/lists/* - -ENV ANDROID_SDK_ROOT $PWD/android-sdk-linux -ENV ANDROID_HOME $PWD/android-sdk-linux -ENV GRADLE_HOME /usr/local/gradle-${GRADLE_VERSION} -ENV PATH $PATH:$GRADLE_HOME/bin -ENV PATH $PATH:$ANDROID_HOME/platform-tools -ENV PATH $PATH:$ANDROID_SDK_ROOT/build-tools/${ANDROID_BUILD_TOOLS}:$ANDROID_NDK - -# Woke -ENV WOKE_VERSION "0.6.0" -ENV WOKE_SHA256 "ea5605d4242b93d9586a21878264dd8abcf64ed92f0f6538ea831d9d3215b883" - -RUN curl -L https://github.com/get-woke/woke/releases/download/v${WOKE_VERSION}/woke-${WOKE_VERSION}-linux-amd64.tar.gz -o woke-linux-amd64.tar.gz \ - && echo "${WOKE_SHA256} woke-linux-amd64.tar.gz" | sha256sum -c \ - && tar -xf woke-linux-amd64.tar.gz \ - && mv woke-${WOKE_VERSION}-linux-amd64/woke /usr/bin/woke \ - && rm -Rf woke-${WOKE_VERSION}-linux-amd64 woke-${WOKE_VERSION}-linux-amd64.tar.gz + curl -fsSLo /tmp/android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip && \ + mkdir -p /android-sdk-linux/cmdline-tools && \ + unzip -q -d /android-sdk-linux/cmdline-tools /tmp/android-sdk.zip && \ + rm /tmp/android-sdk.zip && \ + mv /android-sdk-linux/cmdline-tools/cmdline-tools /android-sdk-linux/cmdline-tools/latest && \ + echo y | /android-sdk-linux/cmdline-tools/latest/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null && \ + echo y | /android-sdk-linux/cmdline-tools/latest/bin/sdkmanager "platform-tools" >/dev/null && \ + echo y | /android-sdk-linux/cmdline-tools/latest/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null && \ + echo y | /android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --install "ndk;${NDK_VERSION}" >/dev/null && \ + echo y | /android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --install "cmake;${CMAKE_VERSION}" >/dev/null && \ + (yes || true) | /android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --licenses + +ENV ANDROID_SDK_ROOT=/android-sdk-linux \ + ANDROID_HOME=/android-sdk-linux \ + ANDROID_NDK=/android-sdk-linux/ndk/${NDK_VERSION} +ENV PATH=${PATH}:${ANDROID_HOME}/platform-tools:${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS}:${ANDROID_NDK} + +# Install Datadog Java tracer +ENV DD_TRACER_VERSION=1.65.1 \ + DD_TRACER_SHA256=04fa3c1ec79d6bf112f9b115465b2f41f352474b7aeb4178961adf4b24ff351d \ + DD_TRACER_FOLDER=/opt/dd-java-agent +RUN mkdir -p "${DD_TRACER_FOLDER}" \ + && curl -fsSLo "${DD_TRACER_FOLDER}/dd-java-agent.jar" \ + "https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/${DD_TRACER_VERSION}/dd-java-agent-${DD_TRACER_VERSION}.jar" \ + && echo "${DD_TRACER_SHA256} ${DD_TRACER_FOLDER}/dd-java-agent.jar" | sha256sum -c COPY --from=registry.ddbuild.io/dd-octo-sts:v1.8.2 /usr/local/bin/dd-octo-sts /usr/local/bin/dd-octo-sts COPY --from=registry.ddbuild.io/dd-sts:v0.1.7@sha256:dea74bd68e19075b6001a02a2f6121001fbcd84b2512c7f398f7b39bf22f04a8 /usr/local/bin/dd-sts /usr/local/bin/dd-sts @@ -103,9 +72,15 @@ COPY --from=registry.ddbuild.io/ddsign:v1.11.10@sha256:55784668a612ab22129bb15a6 ARG GITHUB_RELEASES_BASE=https://depot-read-api-github-releases.us1.ddbuild.io/internal/mirror/github-releases ENV DATADOG_CI_VERSION=5.21.2 ENV DATADOG_CI_SHA256_amd64=b163d332679b677410e05389700874a7e73b8fcb4d29dbc94c904637a9665b79 +ENV DATADOG_CI_SHA256_arm64=526d92541ef6990211f9da96d828394db956a3b12bdadc68a687b114f21918f7 RUN set -x \ + && case "${TARGETARCH}" in \ + amd64) sha256="${DATADOG_CI_SHA256_amd64}"; arch=x64 ;; \ + arm64) sha256="${DATADOG_CI_SHA256_arm64}"; arch=arm64 ;; \ + *) echo "Unsupported architecture: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ && curl -fsSLo /usr/local/bin/datadog-ci \ - "${GITHUB_RELEASES_BASE}/DataDog/datadog-ci/releases/download/v${DATADOG_CI_VERSION}/datadog-ci_linux-x64" \ - && echo "${DATADOG_CI_SHA256_amd64} /usr/local/bin/datadog-ci" | sha256sum -c \ + "${GITHUB_RELEASES_BASE}/DataDog/datadog-ci/releases/download/v${DATADOG_CI_VERSION}/datadog-ci_linux-${arch}" \ + && echo "${sha256} /usr/local/bin/datadog-ci" | sha256sum -c \ && chmod +x /usr/local/bin/datadog-ci \ - && datadog-ci version \ No newline at end of file + && datadog-ci version diff --git a/ci/pipelines/default-pipeline.yml b/ci/pipelines/default-pipeline.yml index 6cd79a4b..b66658c6 100644 --- a/ci/pipelines/default-pipeline.yml +++ b/ci/pipelines/default-pipeline.yml @@ -3,11 +3,23 @@ include: # SETUP +default: + interruptible: true # default all jobs to be interruptible + +workflow: + rules: + - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH !~ /^(develop|main)$|^feature\//' + auto_cancel: + on_new_commit: interruptible # short-lived branches cancel on new commits + - when: always # develop, main, feature/*, and tags are never auto-canceled + auto_cancel: + on_new_commit: none + stages: - ci-image - security - - analysis - - test + - verify + - test-pyramid - publish - notify @@ -23,7 +35,7 @@ stages: - pkill -f adb || true - exit "$exit_code" install-android-sdk: - - curl -sSL -o commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip + - curl -fsSLo commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-mac-${ANDROID_SDK_TOOLS}_latest.zip - rm -rf ~/android_sdk - rm -rf ~/cmdline-tools - unzip -q commandlinetools -d ~/ @@ -48,13 +60,14 @@ ci-image: when: manual except: [ tags, schedules ] tags: [ "arch:amd64" ] + interruptible: false id_tokens: DDSIGN_ID_TOKEN: aud: image-integrity image: 486234852809.dkr.ecr.us-east-1.amazonaws.com/docker:24.0.4-jammy script: - METADATA_FILE=$(mktemp) - - docker buildx build --tag $CI_IMAGE_DOCKER -f ./ci/Dockerfile.gitlab --push --metadata-file ${METADATA_FILE} . + - docker buildx build --pull --tag $CI_IMAGE_DOCKER -f ./ci/Dockerfile.gitlab --push --metadata-file ${METADATA_FILE} ./ci - ddsign sign $CI_IMAGE_DOCKER --docker-metadata-file ${METADATA_FILE} # SECURITY @@ -63,6 +76,7 @@ create_key: stage: security when: manual tags: [ "arch:amd64" ] + interruptible: false variables: PROJECT_NAME: "dd-sdk-android-gradle-plugin" EXPORT_TO_KEYSERVER: "true" @@ -74,38 +88,45 @@ create_key: paths: - pubkeys -# STATIC ANALYSIS - -static-analysis: - stage: analysis - variables: - DETEKT_PUBLIC_API: "true" - trigger: - include: "https://gitlab-templates.ddbuild.io/mobile/v123745390-227cb48b/static-analysis.yml" - strategy: depend +# VERIFICATION -analysis:licenses: +.verification-job: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: analysis + stage: verify timeout: 30m + +analysis:generated-files-check: + extends: .verification-job script: - - GRADLE_OPTS="-Xmx2560m" ./gradlew :dd-sdk-android-gradle-plugin:checkThirdPartyLicences --stacktrace --no-daemon + - ./gradlew checkGeneratedFiles --stacktrace --no-daemon -analysis:woke: - tags: [ "arch:amd64" ] - image: $CI_IMAGE_DOCKER - stage: analysis - timeout: 30m +analysis:ktlint: + extends: .verification-job + script: + - ./gradlew ktlintCheck :build-config:ktlintCheck --stacktrace --no-daemon + +analysis:detekt: + extends: .verification-job + script: + - ./gradlew detekt --continue --stacktrace --no-daemon + +analysis:android-lint: + extends: .verification-job script: - - /usr/bin/woke --exit-1-on-failure + - ./gradlew lint --continue --stacktrace --no-daemon + +analysis:licenses: + extends: .verification-job + script: + - ./gradlew :dd-sdk-android-gradle-plugin:checkThirdPartyLicences --stacktrace --no-daemon # TESTS test:plugin: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h variables: # Functional test is very memory heavy due to spinning real Gradle runners, having daemons in memory @@ -116,8 +137,8 @@ test:plugin: script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin" ./gradlew :dd-sdk-android-gradle-plugin:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags plugin "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin" ./gradlew :dd-sdk-android-gradle-plugin:koverXmlReport --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG + - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags plugin "**/build/reports/kover/report.xml" || true artifacts: reports: junit: dd-sdk-android-gradle-plugin/build/test-results/test/TEST-*.xml @@ -125,7 +146,7 @@ test:plugin: test:common: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h id_tokens: DD_STS_OIDC_TOKEN: @@ -133,8 +154,8 @@ test:common: script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-common" ./gradlew :dd-sdk-android-gradle-plugin-kcp-common:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-common "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-common" ./gradlew :dd-sdk-android-gradle-plugin-kcp-common:koverXmlReport --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG + - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-common "**/build/reports/kover/report.xml" || true artifacts: reports: junit: dd-sdk-android-gradle-plugin-kcp-common/build/test-results/test/TEST-*.xml @@ -142,7 +163,7 @@ test:common: test:kotlin20: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h id_tokens: DD_STS_OIDC_TOKEN: @@ -150,8 +171,8 @@ test:kotlin20: script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin20" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin20:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin20 "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin20" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin20:koverXmlReport --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG + - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin20 "**/build/reports/kover/report.xml" || true artifacts: reports: junit: dd-sdk-android-gradle-plugin-kcp-kotlin20/build/test-results/test/TEST-*.xml @@ -159,7 +180,7 @@ test:kotlin20: test:kotlin21: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h id_tokens: DD_STS_OIDC_TOKEN: @@ -167,8 +188,8 @@ test:kotlin21: script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin21" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin21:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin21 "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin21" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin21:koverXmlReport --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG + - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin21 "**/build/reports/kover/report.xml" || true artifacts: reports: junit: dd-sdk-android-gradle-plugin-kcp-kotlin21/build/test-results/test/TEST-*.xml @@ -176,7 +197,7 @@ test:kotlin21: test:kotlin22: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h id_tokens: DD_STS_OIDC_TOKEN: @@ -184,8 +205,8 @@ test:kotlin22: script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin22" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin22:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin22 "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin22" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin22:koverXmlReport --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG + - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin22 "**/build/reports/kover/report.xml" || true artifacts: reports: junit: dd-sdk-android-gradle-plugin-kcp-kotlin22/build/test-results/test/TEST-*.xml @@ -193,7 +214,7 @@ test:kotlin22: test:kotlin24: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h id_tokens: DD_STS_OIDC_TOKEN: @@ -201,8 +222,8 @@ test:kotlin24: script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin24" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin24:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin24 "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-kcp-kotlin24" ./gradlew :dd-sdk-android-gradle-plugin-kcp-kotlin24:koverXmlReport --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG + - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags kcp-kotlin24 "**/build/reports/kover/report.xml" || true artifacts: reports: junit: dd-sdk-android-gradle-plugin-kcp-kotlin24/build/test-results/test/TEST-*.xml @@ -210,23 +231,19 @@ test:kotlin24: test:build-config: tags: [ "arch:amd64" ] image: $CI_IMAGE_DOCKER - stage: test + stage: verify timeout: 1h - id_tokens: - DD_STS_OIDC_TOKEN: - aud: dd-sts script: - rm -rf ~/.gradle/daemon/ - export DD_AGENT_HOST="$BUILDENV_HOST_IP" - - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-build-config" ./gradlew :build-config:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$(pwd)/libs/dd-java-agent-1.54.0.jar=$DD_COMMON_AGENT_CONFIG - - dd-sts exchange --policy dd-sdk-android-gradle-plugin -- datadog-ci coverage upload --flags build-config "**/build/jacoco/test/jacocoTestReport.xml" || true + - GRADLE_OPTS="-Xmx2560m" DD_TAGS="test.module:dd-sdk-android-gradle-plugin-build-config" ./gradlew :build-config:test --stacktrace --no-daemon -Dorg.gradle.jvmargs=-javaagent:$DD_TRACER_FOLDER/dd-java-agent.jar=$DD_COMMON_AGENT_CONFIG artifacts: reports: junit: tools/build-config/build/test-results/test/TEST-*.xml test:instrumented: tags: [ "macos:sonoma", "specific:true" ] - stage: test + stage: test-pyramid timeout: 1h script: - !reference [.snippets, install-android-sdk ] diff --git a/dd-sdk-android-gradle-plugin-kcp-common/build.gradle.kts b/dd-sdk-android-gradle-plugin-kcp-common/build.gradle.kts index 8ef4566f..79f41b0a 100644 --- a/dd-sdk-android-gradle-plugin-kcp-common/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin-kcp-common/build.gradle.kts @@ -17,9 +17,10 @@ plugins { id("com.vanniktech.maven.publish.base") // Tests - jacoco + id("org.jetbrains.kotlinx.kover") // Analysis tools + id("ktlint") id("com.github.ben-manes.versions") // Internal Generation @@ -57,7 +58,6 @@ datadogBuildConfig { applyJavadocConfig() applyKotlinConfig() applyJunitConfig() - applyJacocoConfig() applyDependencyUpdateConfig() applyPublishingConfig("Common module for Datadog Kotlin Compiler Plugin") } diff --git a/dd-sdk-android-gradle-plugin-kcp-kotlin20/build.gradle.kts b/dd-sdk-android-gradle-plugin-kcp-kotlin20/build.gradle.kts index 2ec937e9..86ec1abc 100644 --- a/dd-sdk-android-gradle-plugin-kcp-kotlin20/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin-kcp-kotlin20/build.gradle.kts @@ -16,10 +16,11 @@ plugins { id("com.vanniktech.maven.publish.base") // Analysis tools + id("ktlint") id("com.github.ben-manes.versions") // Tests - jacoco + id("org.jetbrains.kotlinx.kover") // Internal Generation id("thirdPartyLicences") @@ -50,7 +51,6 @@ datadogBuildConfig { applyKotlinConfig() applyJunitConfig() applyJavadocConfig() - applyJacocoConfig() applyDependencyUpdateConfig() applyPublishingConfig("Module to support Datadog Compiler Plugin with kotlin 2.0.x or below") } diff --git a/dd-sdk-android-gradle-plugin-kcp-kotlin21/build.gradle.kts b/dd-sdk-android-gradle-plugin-kcp-kotlin21/build.gradle.kts index a8621675..2b8ee1c6 100644 --- a/dd-sdk-android-gradle-plugin-kcp-kotlin21/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin-kcp-kotlin21/build.gradle.kts @@ -16,10 +16,11 @@ plugins { id("com.vanniktech.maven.publish.base") // Analysis tools + id("ktlint") id("com.github.ben-manes.versions") // Tests - jacoco + id("org.jetbrains.kotlinx.kover") // Internal Generation id("thirdPartyLicences") @@ -50,7 +51,6 @@ datadogBuildConfig { applyKotlinConfig() applyJunitConfig() applyJavadocConfig() - applyJacocoConfig() applyDependencyUpdateConfig() applyPublishingConfig("Module to support Datadog Compiler Plugin with kotlin 2.1.x") } diff --git a/dd-sdk-android-gradle-plugin-kcp-kotlin22/build.gradle.kts b/dd-sdk-android-gradle-plugin-kcp-kotlin22/build.gradle.kts index 1e58c345..3d9f8a31 100644 --- a/dd-sdk-android-gradle-plugin-kcp-kotlin22/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin-kcp-kotlin22/build.gradle.kts @@ -16,10 +16,11 @@ plugins { id("com.vanniktech.maven.publish.base") // Analysis tools + id("ktlint") id("com.github.ben-manes.versions") // Tests - jacoco + id("org.jetbrains.kotlinx.kover") // Internal Generation id("thirdPartyLicences") @@ -49,7 +50,6 @@ java { datadogBuildConfig { applyKotlinConfig() applyJunitConfig() - applyJacocoConfig() applyJavadocConfig() applyDependencyUpdateConfig() applyPublishingConfig("Module to support Datadog Compiler Plugin with kotlin 2.2.x or above") diff --git a/dd-sdk-android-gradle-plugin-kcp-kotlin24/build.gradle.kts b/dd-sdk-android-gradle-plugin-kcp-kotlin24/build.gradle.kts index 3c19a564..0d871126 100644 --- a/dd-sdk-android-gradle-plugin-kcp-kotlin24/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin-kcp-kotlin24/build.gradle.kts @@ -16,10 +16,11 @@ plugins { id("com.vanniktech.maven.publish.base") // Analysis tools + id("ktlint") id("com.github.ben-manes.versions") // Tests - jacoco + id("org.jetbrains.kotlinx.kover") // Internal Generation id("thirdPartyLicences") @@ -49,7 +50,6 @@ java { datadogBuildConfig { applyKotlinConfig() applyJunitConfig() - applyJacocoConfig() applyJavadocConfig() applyDependencyUpdateConfig() applyPublishingConfig("Module to support Datadog Compiler Plugin with kotlin 2.4.x or above") diff --git a/dd-sdk-android-gradle-plugin/build.gradle.kts b/dd-sdk-android-gradle-plugin/build.gradle.kts index 524a4fef..ef04c080 100644 --- a/dd-sdk-android-gradle-plugin/build.gradle.kts +++ b/dd-sdk-android-gradle-plugin/build.gradle.kts @@ -19,10 +19,11 @@ plugins { id("com.vanniktech.maven.publish.base") // Analysis tools + id("ktlint") id("com.github.ben-manes.versions") // Tests - jacoco + id("org.jetbrains.kotlinx.kover") // Internal Generation id("thirdPartyLicences") @@ -57,7 +58,6 @@ dependencies { datadogBuildConfig { applyKotlinConfig() applyJunitConfig() - applyJacocoConfig() applyJavadocConfig() applyDependencyUpdateConfig() applyPublishingConfig("Plugin to upload Proguard/R8 mapping files to Datadog.") diff --git a/detekt.yml b/detekt.yml new file mode 100644 index 00000000..7bf6e460 --- /dev/null +++ b/detekt.yml @@ -0,0 +1,835 @@ +build: + maxIssues: 0 + excludeCorrectable: false + +config: + validation: true + warningsAsErrors: true + checkExhaustiveness: false + # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]' + excludes: '' + +processors: + active: true + +console-reports: + active: true + exclude: + - 'ComplexityReport' + - 'FileBasedFindingsReport' + - 'BuildFailureReport' + +output-reports: + active: false + +comments: + active: true + AbsentOrWrongFileLicense: + active: true + licenseTemplateFile: 'license.template' + licenseTemplateIsRegex: false + excludes: + # Gradle build outputs and generated artifacts. + - '**/build/generated/**' + # Vendored test files ported from the upstream dd-trace-java library. + - '**/features/dd-sdk-android-trace-internal/src/test/kotlin/com/datadog/trace/**' + CommentOverPrivateFunction: + active: false + CommentOverPrivateProperty: + active: false + DeprecatedBlockTag: + active: true + EndOfSentenceFormat: + active: true + excludes: + - '**/test/**' + - '**/build/generated/**' + - '**/dd-sdk-android-gradle-plugin/tools/**' + - '**/dd-sdk-android-gradle-plugin/samples/**' + - '**/dd-sdk-android/reliability/**' + - '**/dd-sdk-android-gradle-plugin/instrumented/**' + endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)' + KDocReferencesNonPublicProperty: + active: true + excludes: + - '**/dd-sdk-android-gradle-plugin/tools/**' + - '**/dd-sdk-android-gradle-plugin/samples/**' + - '**/dd-sdk-android/reliability/**' + - '**/dd-sdk-android-gradle-plugin/instrumented/**' + OutdatedDocumentation: + active: true + matchTypeParameters: true + matchDeclarationsOrder: true + allowParamOnConstructorProperties: true + excludes: + - '**/test/**' + - '**/testFixtures/**' + - '**/androidTest/**' + - '**/build/generated/**' + UndocumentedPublicClass: + active: true + ignoreDefaultCompanionObject: true + excludes: + - '**/test/**' + - '**/testFixtures/**' + - '**/androidTest/**' + - '**/build/generated/**' + - '**/dd-sdk-android-gradle-plugin/tools/**' + - '**/dd-sdk-android-gradle-plugin/samples/**' + - '**/dd-sdk-android/reliability/**' + - '**/dd-sdk-android-gradle-plugin/instrumented/**' + searchInNestedClass: true + searchInInnerClass: true + searchInInnerObject: true + searchInInnerInterface: true + searchInProtectedClass: true + UndocumentedPublicFunction: + active: true + excludes: + - '**/test/**' + - '**/testFixtures/**' + - '**/androidTest/**' + - '**/build/generated/**' + - '**/dd-sdk-android-gradle-plugin/tools/**' + - '**/dd-sdk-android-gradle-plugin/samples/**' + - '**/dd-sdk-android/reliability/**' + - '**/dd-sdk-android-gradle-plugin/instrumented/**' + searchProtectedFunction: true + UndocumentedPublicProperty: + active: true + excludes: + - '**/test/**' + - '**/testFixtures/**' + - '**/androidTest/**' + - '**/build/generated/**' + - '**/dd-sdk-android-gradle-plugin/tools/**' + - '**/dd-sdk-android-gradle-plugin/samples/**' + - '**/dd-sdk-android/reliability/**' + - '**/dd-sdk-android-gradle-plugin/instrumented/**' + searchProtectedProperty: true + +complexity: + active: true + excludes: ['**/build/**'] + CognitiveComplexMethod: + active: false + threshold: 15 + ComplexCondition: + active: true + threshold: 4 + ComplexInterface: + active: false + threshold: 10 + includeStaticDeclarations: false + includePrivateDeclarations: false + ignoreOverloaded: false + CyclomaticComplexMethod: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + threshold: 15 + ignoreSingleWhenExpression: true + ignoreSimpleWhenEntries: true + ignoreNestingFunctions: false + nestingFunctions: + - 'also' + - 'apply' + - 'forEach' + - 'isNotNull' + - 'ifNull' + - 'let' + - 'run' + - 'use' + - 'with' + LabeledExpression: + active: false + ignoredLabels: [] + LargeClass: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + threshold: 600 + LongMethod: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + threshold: 60 + LongParameterList: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + functionThreshold: 12 + constructorThreshold: 12 + ignoreDefaultParameters: true + ignoreDataClasses: true + ignoreAnnotatedParameter: [] + ignoreAnnotated: [ 'Composable' ] + MethodOverloading: + active: true + threshold: 6 + NamedArguments: + active: false + threshold: 6 + ignoreArgumentsMatchingNames: true + NestedBlockDepth: + active: true + threshold: 4 + NestedScopeFunctions: + active: false + threshold: 1 + functions: + - 'kotlin.apply' + - 'kotlin.run' + - 'kotlin.with' + - 'kotlin.let' + - 'kotlin.also' + ReplaceSafeCallChainWithRun: + active: false + StringLiteralDuplication: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + threshold: 3 + ignoreAnnotation: true + excludeStringsWithLessThan5Characters: true + ignoreStringsRegex: '$^' + TooManyFunctions: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + thresholdInFiles: 11 + thresholdInClasses: 11 + thresholdInInterfaces: 11 + thresholdInObjects: 11 + thresholdInEnums: 11 + ignoreDeprecated: true + ignorePrivate: false + ignoreOverridden: true + +coroutines: + active: true + excludes: ['**/build/**'] + GlobalCoroutineUsage: + active: false + InjectDispatcher: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + dispatcherNames: + - 'IO' + - 'Default' + - 'Unconfined' + RedundantSuspendModifier: + active: true + SleepInsteadOfDelay: + active: true + SuspendFunSwallowedCancellation: + active: true + SuspendFunWithCoroutineScopeReceiver: + active: false + SuspendFunWithFlowReturnType: + active: true + +empty-blocks: + active: true + excludes: ['**/build/**'] + EmptyCatchBlock: + active: true + allowedExceptionNameRegex: '_|(ignore|expected).*' + EmptyClassBlock: + active: true + EmptyDefaultConstructor: + active: true + EmptyDoWhileBlock: + active: true + EmptyElseBlock: + active: true + EmptyFinallyBlock: + active: true + EmptyForBlock: + active: true + EmptyFunctionBlock: + active: true + ignoreOverridden: true + EmptyIfBlock: + active: true + EmptyInitBlock: + active: true + EmptyKtFile: + active: true + EmptySecondaryConstructor: + active: true + EmptyTryBlock: + active: true + EmptyWhenBlock: + active: true + EmptyWhileBlock: + active: true + +exceptions: + active: true + excludes: ['**/build/**'] + ExceptionRaisedInUnexpectedLocation: + active: true + methodNames: + - 'equals' + - 'finalize' + - 'hashCode' + - 'toString' + InstanceOfCheckForException: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + NotImplementedDeclaration: + active: false + ObjectExtendsThrowable: + active: true + PrintStackTrace: + active: true + RethrowCaughtException: + active: true + ReturnFromFinally: + active: true + ignoreLabeled: false + SwallowedException: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + ignoredExceptionTypes: + - 'InterruptedException' + - 'MalformedURLException' + - 'NumberFormatException' + - 'ParseException' + allowedExceptionNameRegex: '_|(ignore|expected).*' + ThrowingExceptionFromFinally: + active: true + ThrowingExceptionInMain: + active: false + ThrowingExceptionsWithoutMessageOrCause: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + exceptions: + - 'ArrayIndexOutOfBoundsException' + - 'Exception' + - 'IllegalArgumentException' + - 'IllegalMonitorStateException' + - 'IllegalStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + ThrowingNewInstanceOfSameException: + active: true + TooGenericExceptionCaught: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + exceptionNames: + - 'ArrayIndexOutOfBoundsException' + - 'Error' + - 'Exception' + - 'IllegalMonitorStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + allowedExceptionNameRegex: '_|(ignore|expected).*' + TooGenericExceptionThrown: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + exceptionNames: + - 'Error' + - 'Exception' + - 'RuntimeException' + - 'Throwable' + +naming: + active: true + excludes: ['**/build/**'] + BooleanPropertyNaming: + active: false + allowedPattern: '^(is|has|are)' + ClassNaming: + active: true + excludes: [ "**/test/**", "**/*Test/**", '**/testFixtures/**'] + classPattern: '[A-Z][a-zA-Z0-9]*' + ConstructorParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + privateParameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + EnumNaming: + active: true + excludes: [ "**/test/**", "**/*Test/**", '**/testFixtures/**'] + enumEntryPattern: '[A-Z][_a-zA-Z0-9]*' + ForbiddenClassName: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + forbiddenName: [] + FunctionMaxLength: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + maximumFunctionNameLength: 100 + FunctionMinLength: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + minimumFunctionNameLength: 2 + FunctionNaming: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + functionPattern: '[a-zA-Z][a-zA-Z0-9]*' + excludeClassPattern: '$^' + ignoreAnnotated: [ 'Composable' ] + FunctionParameterNaming: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + parameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + InvalidPackageDeclaration: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + rootPackage: '' + requireRootInDeclaration: false + LambdaParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*|_' + MatchingDeclarationName: + active: true + mustBeFirst: true + MemberNameEqualsClassName: + active: true + ignoreOverridden: true + NoNameShadowing: + active: true + NonBooleanPropertyPrefixedWithIs: + active: false + ObjectPropertyNaming: + active: true + constantPattern: '[A-Za-z][_A-Za-z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*' + PackageNaming: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + packagePattern: '^(com\.datadog|io\.shopist)(\.[a-z][A-Za-z0-9]*)+' + TopLevelPropertyNaming: + active: true + constantPattern: '[A-Z][_A-Z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*' + VariableMaxLength: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + maximumVariableNameLength: 64 + VariableMinLength: + active: true + minimumVariableNameLength: 1 + VariableNaming: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + variablePattern: '[a-z][A-Za-z0-9]*' + privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + +performance: + active: true + excludes: ['**/build/**'] + ArrayPrimitive: + active: true + CouldBeSequence: + active: true + threshold: 3 + ForEachOnRange: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + SpreadOperator: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + UnnecessaryPartOfBinaryExpression: + active: true + UnnecessaryTemporaryInstantiation: + active: true + +potential-bugs: + active: true + excludes: ['**/build/**'] + AvoidReferentialEquality: + active: true + forbiddenTypePatterns: + - 'kotlin.String' + CastNullableToNonNullableType: + active: false + CastToNullableType: + active: true + Deprecation: + active: true + DontDowncastCollectionTypes: + active: true + DoubleMutabilityForCollection: + active: true + mutableTypes: + - 'kotlin.collections.MutableList' + - 'kotlin.collections.MutableMap' + - 'kotlin.collections.MutableSet' + - 'java.util.ArrayList' + - 'java.util.LinkedHashSet' + - 'java.util.HashSet' + - 'java.util.LinkedHashMap' + - 'java.util.HashMap' + ElseCaseInsteadOfExhaustiveWhen: + active: false + ignoredSubjectTypes: [] + EqualsAlwaysReturnsTrueOrFalse: + active: true + EqualsWithHashCodeExist: + active: true + ExitOutsideMain: + active: true + ExplicitGarbageCollectionCall: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + HasPlatformType: + active: true + IgnoredReturnValue: + active: true + restrictToConfig: true + returnValueAnnotations: + - 'CheckResult' + - '*.CheckResult' + - 'CheckReturnValue' + - '*.CheckReturnValue' + ignoreReturnValueAnnotations: + - 'CanIgnoreReturnValue' + - '*.CanIgnoreReturnValue' + returnValueTypes: + - 'kotlin.sequences.Sequence' + - 'kotlinx.coroutines.flow.*Flow' + - 'java.util.stream.*Stream' + ignoreFunctionCall: [] + ImplicitDefaultLocale: + active: true + ImplicitUnitReturnType: + active: false + allowExplicitReturnType: true + InvalidRange: + active: true + IteratorHasNextCallsNextMethod: + active: true + IteratorNotThrowingNoSuchElementException: + active: true + LateinitUsage: + active: false + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + ignoreOnClassesPattern: '' + MapGetWithNotNullAssertionOperator: + active: true + MissingPackageDeclaration: + active: true + excludes: ['**/*.kts'] + NullCheckOnMutableProperty: + active: true + NullableToStringCall: + active: false + PropertyUsedBeforeDeclaration: + active: false + UnconditionalJumpStatementInLoop: + active: true + UnnecessaryNotNullCheck: + active: false + UnnecessaryNotNullOperator: + active: true + UnnecessarySafeCall: + active: true + UnreachableCatchBlock: + active: true + UnreachableCode: + active: true + UnsafeCallOnNullableType: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + UnsafeCast: + active: true + UnusedUnaryOperator: + active: true + UselessPostfixExpression: + active: true + WrongEqualsTypeParameter: + active: true + +style: + active: true + excludes: ['**/build/**'] + AlsoCouldBeApply: + active: false + BracesOnIfStatements: + active: false + singleLine: 'never' + multiLine: 'always' + BracesOnWhenStatements: + active: false + singleLine: 'necessary' + multiLine: 'consistent' + CanBeNonNullable: + active: false + CascadingCallWrapping: + active: false + includeElvis: true + ClassOrdering: + active: false + CollapsibleIfStatements: + active: false + DataClassContainsFunctions: + active: false + conversionFunctionPrefix: + - 'to' + - 'as' + allowOperators: true + DataClassShouldBeImmutable: + active: false + DestructuringDeclarationWithTooManyEntries: + active: true + maxDestructuringEntries: 3 + DoubleNegativeLambda: + active: true + negativeFunctions: + - reason: 'Use `takeIf` instead.' + value: 'takeUnless' + - reason: 'Use `all` instead.' + value: 'none' + negativeFunctionNameParts: + - 'not' + - 'non' + EqualsNullCall: + active: true + EqualsOnSignatureLine: + active: false + ExplicitCollectionElementAccessMethod: + active: false + ExplicitItLambdaParameter: + active: true + ExpressionBodySyntax: + active: false + includeLineWrapping: false + ForbiddenAnnotation: + active: true + annotations: + - reason: 'it is a java annotation. Use `Suppress` instead.' + value: 'java.lang.SuppressWarnings' + - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.' + value: 'java.lang.Deprecated' + - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.' + value: 'java.lang.annotation.Documented' + - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.' + value: 'java.lang.annotation.Target' + - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.' + value: 'java.lang.annotation.Retention' + - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.' + value: 'java.lang.annotation.Repeatable' + - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265' + value: 'java.lang.annotation.Inherited' + ForbiddenComment: + active: false + comments: + - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.' + value: 'FIXME:' + - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.' + value: 'STOPSHIP:' + - reason: 'Forbidden TODO todo marker in comment, please do the changes.' + value: 'TODO:' + allowedPatterns: '' + ForbiddenImport: + active: false + imports: [] + forbiddenPatterns: '' + ForbiddenMethodCall: + active: false + methods: + - reason: 'print does not allow you to configure the output stream. Use a logger instead.' + value: 'kotlin.io.print' + - reason: 'println does not allow you to configure the output stream. Use a logger instead.' + value: 'kotlin.io.println' + ForbiddenSuppress: + active: false + rules: [] + ForbiddenVoid: + active: true + ignoreOverridden: false + ignoreUsageInGenerics: false + FunctionOnlyReturningConstant: + active: true + ignoreOverridableFunction: true + ignoreActualFunction: true + excludedFunctions: [] + LoopWithTooManyJumpStatements: + active: true + maxJumpCount: 1 + MagicNumber: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**', '**/tools/**'] + ignoreNumbers: + - '-1' + - '0' + - '1' + - '2' + ignoreHashCodeFunction: true + ignorePropertyDeclaration: false + ignoreLocalVariableDeclaration: false + ignoreConstantDeclaration: true + ignoreCompanionObjectPropertyDeclaration: true + ignoreAnnotation: false + ignoreNamedArgument: true + ignoreEnums: false + ignoreRanges: false + ignoreExtensionFunctions: true + MandatoryBracesLoops: + active: false + MaxChainedCallsOnSameLine: + active: false + maxChainedCalls: 5 + MaxLineLength: + active: true + maxLineLength: 120 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: true + excludeRawStrings: true + MayBeConst: + active: true + ModifierOrder: + active: true + MultilineLambdaItParameter: + active: false + MultilineRawStringIndentation: + active: false + indentSize: 4 + trimmingMethods: + - 'trimIndent' + - 'trimMargin' + NestedClassesVisibility: + active: true + NewLineAtEndOfFile: + active: true + NoTabs: + active: false + NullableBooleanCheck: + active: false + ObjectLiteralToLambda: + active: true + OptionalAbstractKeyword: + active: true + OptionalUnit: + active: false + PreferToOverPairSyntax: + active: false + ProtectedMemberInFinalClass: + active: true + RedundantExplicitType: + active: false + RedundantHigherOrderMapUsage: + active: true + RedundantVisibilityModifierRule: + active: false + ReturnCount: + active: true + max: 2 + excludedFunctions: + - 'equals' + excludeLabeled: false + excludeReturnFromLambda: true + excludeGuardClauses: false + SafeCast: + active: true + SerialVersionUIDInSerializableClass: + active: true + SpacingBetweenPackageAndImports: + active: false + StringShouldBeRawString: + active: false + maxEscapedCharacterCount: 2 + ignoredCharacters: [] + ThrowsCount: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**', '**/tools/**'] + max: 2 + excludeGuardClauses: false + TrailingWhitespace: + active: false + TrimMultilineRawString: + active: false + trimmingMethods: + - 'trimIndent' + - 'trimMargin' + UnderscoresInNumericLiterals: + active: false + acceptableLength: 4 + allowNonStandardGrouping: false + UnnecessaryAbstractClass: + active: false + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**', '**/tools/**'] + UnnecessaryAnnotationUseSiteTarget: + active: false + UnnecessaryApply: + active: true + UnnecessaryBackticks: + active: false + UnnecessaryBracesAroundTrailingLambda: + active: false + UnnecessaryFilter: + active: true + UnnecessaryInheritance: + active: true + UnnecessaryInnerClass: + active: false + UnnecessaryLet: + active: false + UnnecessaryParentheses: + active: false + allowForUnclearPrecedence: false + UntilInsteadOfRangeTo: + active: false + UnusedImports: + active: true + UnusedParameter: + active: true + allowedNames: 'ignored|expected' + UnusedPrivateClass: + active: true + UnusedPrivateMember: + active: true + allowedNames: '' + ignoreAnnotated: + - 'Preview*' + UnusedPrivateProperty: + active: true + allowedNames: '_|ignored|expected|serialVersionUID' + UseAnyOrNoneInsteadOfFind: + active: true + UseArrayLiteralsInAnnotations: + active: true + UseCheckNotNull: + active: true + UseCheckOrError: + active: true + UseDataClass: + active: false + allowVars: false + UseEmptyCounterpart: + active: false + UseIfEmptyOrIfBlank: + active: false + UseIfInsteadOfWhen: + active: false + ignoreWhenContainingVariableDeclaration: false + UseIsNullOrEmpty: + active: true + UseLet: + active: false + UseOrEmpty: + active: false + UseRequire: + active: true + UseRequireNotNull: + active: true + UseSumOfInsteadOfFlatMapSize: + active: false + UselessCallOnNotNull: + active: true + UtilityClassWithPublicConstructor: + active: true + VarCouldBeVal: + active: true + excludes: ['**/test/**', '**/*Test/**', '**/testFixtures/**'] + ignoreLateinitVar: false + WildcardImport: + active: true + excludeImports: [] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 57d18709..9d433ac6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,7 +36,11 @@ elmyr = "1.3.1" mockitoKotlin = "6.3.0" # Tools +detekt = "1.23.8" dokka = "2.0.0" +ktlint = "1.5.0" +ktlintGradlePlugin = "14.2.0" +kover = "0.9.8" unmock = "0.7.5" fuzzyWuzzy = "1.4.0" @@ -71,6 +75,7 @@ kotlinGradlePlugin21 = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", v kotlinGradlePlugin22 = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin22" } kotlinGradlePlugin24 = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin24" } dokkaGradlePlugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } +ktlintGradlePlugin = { module = "org.jlleitschuh.gradle.ktlint:org.jlleitschuh.gradle.ktlint.gradle.plugin", version.ref = "ktlintGradlePlugin" } unmockGradlePlugin = { module = "de.mobilej.unmock:UnMockPlugin", version.ref = "unmock" } versionsGradlePlugin = { module = "com.github.ben-manes:gradle-versions-plugin", version.ref = "versionsPluginGradle" } @@ -150,6 +155,7 @@ androidx-material3 = { group = "androidx.compose.material3", name = "material3" androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCoreVersion" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleRuntimeKtx" } androidx-compose-navigation = { module = "androidx.navigation:navigation-compose", version.ref = "androidXComposeNavigation" } [bundles] @@ -174,12 +180,15 @@ testTools = [ ] [plugins] +detektGradlePlugin = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } dokkaJavadocPlugin = { id = "org.jetbrains.dokka-javadoc", version.ref = "dokka" } androidApplicationPlugin = { id = "com.android.application", version.ref = "androidToolsPlugin" } androidLibraryPlugin = { id = "com.android.library", version.ref = "androidToolsPlugin" } kotlinPlugin21 = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin21" } kotlinPlugin23 = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin23" } kotlinPlugin24 = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin24" } +ktlintGradlePlugin = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintGradlePlugin" } +koverPlugin = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } mavenPublishPlugin = { id = "com.vanniktech.maven.publish.base", version.ref = "mavenPublishPlugin" } versionsPluginGradle = { id = "com.github.ben-manes.versions", version.ref = "versionsPluginGradle" } kotlinComposePlugin = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlinComposePlugin" } diff --git a/instrumented/build.gradle.kts b/instrumented/build.gradle.kts index 8969fa33..7a379e7e 100644 --- a/instrumented/build.gradle.kts +++ b/instrumented/build.gradle.kts @@ -10,6 +10,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { alias(libs.plugins.androidApplicationPlugin) + // Applied before Kotlin on purpose: ktlint-gradle registers Android source-set tasks twice + // when it is applied after the Kotlin plugin. + id("ktlint") kotlin("android") alias(libs.plugins.kotlinComposePlugin) @@ -78,6 +81,7 @@ dependencies { implementation(project(":samples:lib-module")) implementation(libs.androidx.core) implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.datadogSdkComposeSnapshot) diff --git a/instrumented/src/androidTest/java/com/datadog/android/instrumented/NavigationTest.kt b/instrumented/src/androidTest/java/com/datadog/android/instrumented/NavigationTest.kt index 845a652b..e8eee746 100644 --- a/instrumented/src/androidTest/java/com/datadog/android/instrumented/NavigationTest.kt +++ b/instrumented/src/androidTest/java/com/datadog/android/instrumented/NavigationTest.kt @@ -1,8 +1,13 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.android.instrumented import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.ComposeContentTestRule import androidx.compose.ui.test.junit4.createComposeRule @@ -10,6 +15,7 @@ import androidx.compose.ui.test.onNodeWithText import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.navigation.NavController import androidx.navigation.NavHostController import androidx.test.platform.app.InstrumentationRegistry diff --git a/instrumented/src/androidTest/java/com/datadog/android/instrumented/SemanticsTest.kt b/instrumented/src/androidTest/java/com/datadog/android/instrumented/SemanticsTest.kt index c884e36f..34ba295c 100644 --- a/instrumented/src/androidTest/java/com/datadog/android/instrumented/SemanticsTest.kt +++ b/instrumented/src/androidTest/java/com/datadog/android/instrumented/SemanticsTest.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.android.instrumented import androidx.compose.ui.test.SemanticsMatcher diff --git a/instrumented/src/main/java/com/datadog/android/instrumented/NavHostTestScreen.kt b/instrumented/src/main/java/com/datadog/android/instrumented/NavHostTestScreen.kt index 5841d65e..24fc626a 100644 --- a/instrumented/src/main/java/com/datadog/android/instrumented/NavHostTestScreen.kt +++ b/instrumented/src/main/java/com/datadog/android/instrumented/NavHostTestScreen.kt @@ -11,9 +11,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -32,7 +32,7 @@ internal fun ScreenWithNavHost(onEvent: (NavHostController, Lifecycle.Event) -> } val lifecycleOwner = LocalLifecycleOwner.current DisposableEffect(lifecycleOwner) { - val observer = LifecycleEventObserver { source, event -> + val observer = LifecycleEventObserver { _, event -> onEvent(navHost, event) } lifecycleOwner.lifecycle.addObserver(observer) @@ -54,7 +54,7 @@ internal fun ScreenWithNavHostNested(onEvent: (NavHostController, Lifecycle.Even } val lifecycleOwner = LocalLifecycleOwner.current DisposableEffect(lifecycleOwner) { - val observer = LifecycleEventObserver { source, event -> + val observer = LifecycleEventObserver { _, event -> onEvent(navHost, event) } lifecycleOwner.lifecycle.addObserver(observer) diff --git a/instrumented/src/main/java/com/datadog/android/instrumented/TagTestScreen.kt b/instrumented/src/main/java/com/datadog/android/instrumented/TagTestScreen.kt index d47f0965..ccf77556 100644 --- a/instrumented/src/main/java/com/datadog/android/instrumented/TagTestScreen.kt +++ b/instrumented/src/main/java/com/datadog/android/instrumented/TagTestScreen.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.android.instrumented import androidx.compose.foundation.background diff --git a/libs/dd-java-agent-1.54.0.jar b/libs/dd-java-agent-1.54.0.jar deleted file mode 100644 index 7cda8512..00000000 Binary files a/libs/dd-java-agent-1.54.0.jar and /dev/null differ diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/Dependencies.kt b/license.template similarity index 63% rename from tools/build-config/src/main/kotlin/com/datadog/gradle/Dependencies.kt rename to license.template index 606936fa..c5bc0bfb 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/Dependencies.kt +++ b/license.template @@ -3,13 +3,3 @@ * This product includes software developed at Datadog (https://www.datadoghq.com/). * Copyright 2020-Present Datadog, Inc. */ - -package com.datadog.gradle - -object Dependencies { - - object Versions { - // Tests Tools - const val Jacoco = "0.8.15" - } -} diff --git a/samples/basic/build.gradle.kts b/samples/basic/build.gradle.kts index f2e83c3d..124755a5 100644 --- a/samples/basic/build.gradle.kts +++ b/samples/basic/build.gradle.kts @@ -1,8 +1,17 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + import com.datadog.gradle.config.AndroidConfig import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.application") + // Applied before Kotlin on purpose: ktlint-gradle registers Android source-set tasks twice + // when it is applied after the Kotlin plugin. + id("ktlint") kotlin("android") // you don't need this in your project, it is just to be able to reference AndroidConfig class id("noopBuildConfigClasspath") apply false diff --git a/samples/basic/src/main/java/com/datadog/example/basic/MainActivity.kt b/samples/basic/src/main/java/com/datadog/example/basic/MainActivity.kt index cabf0256..25c9332a 100644 --- a/samples/basic/src/main/java/com/datadog/example/basic/MainActivity.kt +++ b/samples/basic/src/main/java/com/datadog/example/basic/MainActivity.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + @file:Suppress("UnusedImports", "ktlint:standard:no-unused-imports") package com.datadog.example.basic diff --git a/samples/basic/src/main/java/com/datadog/example/basic/Toaster.kt b/samples/basic/src/main/java/com/datadog/example/basic/Toaster.kt index 5bc157e3..cfde5c97 100644 --- a/samples/basic/src/main/java/com/datadog/example/basic/Toaster.kt +++ b/samples/basic/src/main/java/com/datadog/example/basic/Toaster.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.basic import android.content.Context diff --git a/samples/lib-module/build.gradle.kts b/samples/lib-module/build.gradle.kts index f629735a..c1b64758 100644 --- a/samples/lib-module/build.gradle.kts +++ b/samples/lib-module/build.gradle.kts @@ -1,8 +1,17 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + import com.datadog.gradle.config.AndroidConfig import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") + // Applied before Kotlin on purpose: ktlint-gradle registers Android source-set tasks twice + // when it is applied after the Kotlin plugin. + id("ktlint") kotlin("android") // you don't need this in your project, it is just to be able to reference AndroidConfig class id("noopBuildConfigClasspath") apply false diff --git a/samples/lib-module/src/main/kotlin/com/datadog/android/compose/ComposeInstrumentation.kt b/samples/lib-module/src/main/kotlin/com/datadog/android/compose/ComposeInstrumentation.kt index dc4365f3..20dcfb41 100644 --- a/samples/lib-module/src/main/kotlin/com/datadog/android/compose/ComposeInstrumentation.kt +++ b/samples/lib-module/src/main/kotlin/com/datadog/android/compose/ComposeInstrumentation.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.android.compose /** diff --git a/samples/lib-module/src/main/kotlin/com/datadog/android/compose/DatadogModifier.kt b/samples/lib-module/src/main/kotlin/com/datadog/android/compose/DatadogModifier.kt index 7d3c80b8..beff0a62 100644 --- a/samples/lib-module/src/main/kotlin/com/datadog/android/compose/DatadogModifier.kt +++ b/samples/lib-module/src/main/kotlin/com/datadog/android/compose/DatadogModifier.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.android.compose import androidx.compose.ui.Modifier diff --git a/samples/lib-module/src/main/kotlin/com/datadog/example/lib/Placeholder.kt b/samples/lib-module/src/main/kotlin/com/datadog/example/lib/Placeholder.kt index 4528bf83..44b7cd66 100644 --- a/samples/lib-module/src/main/kotlin/com/datadog/example/lib/Placeholder.kt +++ b/samples/lib-module/src/main/kotlin/com/datadog/example/lib/Placeholder.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.lib /** diff --git a/samples/ndk/build.gradle.kts b/samples/ndk/build.gradle.kts index c8e95150..8f68dc10 100644 --- a/samples/ndk/build.gradle.kts +++ b/samples/ndk/build.gradle.kts @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + @file:Suppress("StringLiteralDuplication") import com.datadog.gradle.config.AndroidConfig @@ -5,6 +11,9 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.application") + // Applied before Kotlin on purpose: ktlint-gradle registers Android source-set tasks twice + // when it is applied after the Kotlin plugin. + id("ktlint") kotlin("android") // you don't need this in your project, it is just to be able to reference AndroidConfig class id("noopBuildConfigClasspath") apply false @@ -16,6 +25,7 @@ android { namespace = "com.datadog.example.ndk" compileSdk = AndroidConfig.TARGET_SDK buildToolsVersion = AndroidConfig.BUILD_TOOLS_VERSION + ndkVersion = AndroidConfig.NDK_VERSION defaultConfig { applicationId = "com.datadog.example.ndk" diff --git a/samples/ndk/src/main/java/com/datadog/example/ndk/MainActivity.kt b/samples/ndk/src/main/java/com/datadog/example/ndk/MainActivity.kt index 2c3fe4dd..5a7bd9e0 100644 --- a/samples/ndk/src/main/java/com/datadog/example/ndk/MainActivity.kt +++ b/samples/ndk/src/main/java/com/datadog/example/ndk/MainActivity.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.ndk import android.os.Bundle diff --git a/samples/ndk/src/main/java/com/datadog/example/ndk/Toaster.kt b/samples/ndk/src/main/java/com/datadog/example/ndk/Toaster.kt index f6da3682..d787112f 100644 --- a/samples/ndk/src/main/java/com/datadog/example/ndk/Toaster.kt +++ b/samples/ndk/src/main/java/com/datadog/example/ndk/Toaster.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.ndk import android.content.Context diff --git a/samples/variants-kotlin/build.gradle.kts b/samples/variants-kotlin/build.gradle.kts index fdae6827..f26ad85f 100644 --- a/samples/variants-kotlin/build.gradle.kts +++ b/samples/variants-kotlin/build.gradle.kts @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + @file:Suppress("StringLiteralDuplication") import com.datadog.gradle.config.AndroidConfig @@ -5,6 +11,9 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.application") + // Applied before Kotlin on purpose: ktlint-gradle registers Android source-set tasks twice + // when it is applied after the Kotlin plugin. + id("ktlint") kotlin("android") // you don't need this in your project, it is just to be able to reference AndroidConfig class id("noopBuildConfigClasspath") apply false diff --git a/samples/variants-kotlin/src/demo/java/com/datadog/example/variants/VaryingClass.kt b/samples/variants-kotlin/src/demo/java/com/datadog/example/variants/VaryingClass.kt index c235b8f5..15447d6a 100644 --- a/samples/variants-kotlin/src/demo/java/com/datadog/example/variants/VaryingClass.kt +++ b/samples/variants-kotlin/src/demo/java/com/datadog/example/variants/VaryingClass.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal class VaryingClass : VaryingInfo { diff --git a/samples/variants-kotlin/src/full/java/com/datadog/example/variants/VaryingClass.kt b/samples/variants-kotlin/src/full/java/com/datadog/example/variants/VaryingClass.kt index 72092414..d09a53a2 100644 --- a/samples/variants-kotlin/src/full/java/com/datadog/example/variants/VaryingClass.kt +++ b/samples/variants-kotlin/src/full/java/com/datadog/example/variants/VaryingClass.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal class VaryingClass : VaryingInfo { diff --git a/samples/variants-kotlin/src/main/java/com/datadog/example/variants/MainActivity.kt b/samples/variants-kotlin/src/main/java/com/datadog/example/variants/MainActivity.kt index c864a168..d66800c7 100644 --- a/samples/variants-kotlin/src/main/java/com/datadog/example/variants/MainActivity.kt +++ b/samples/variants-kotlin/src/main/java/com/datadog/example/variants/MainActivity.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants import android.os.Bundle diff --git a/samples/variants-kotlin/src/main/java/com/datadog/example/variants/VaryingInfo.kt b/samples/variants-kotlin/src/main/java/com/datadog/example/variants/VaryingInfo.kt index 9e8f33c6..65238be5 100644 --- a/samples/variants-kotlin/src/main/java/com/datadog/example/variants/VaryingInfo.kt +++ b/samples/variants-kotlin/src/main/java/com/datadog/example/variants/VaryingInfo.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal interface VaryingInfo { diff --git a/samples/variants-kotlin/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt b/samples/variants-kotlin/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt index 8aba8e68..dc1a48c5 100644 --- a/samples/variants-kotlin/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt +++ b/samples/variants-kotlin/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants.ext import android.app.Activity diff --git a/samples/variants-kotlin/src/pro/java/com/datadog/example/variants/VaryingClass.kt b/samples/variants-kotlin/src/pro/java/com/datadog/example/variants/VaryingClass.kt index 1e772b19..a11c40c7 100644 --- a/samples/variants-kotlin/src/pro/java/com/datadog/example/variants/VaryingClass.kt +++ b/samples/variants-kotlin/src/pro/java/com/datadog/example/variants/VaryingClass.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal class VaryingClass : VaryingInfo { diff --git a/samples/variants/build.gradle b/samples/variants/build.gradle index bcb71a00..8f598a51 100644 --- a/samples/variants/build.gradle +++ b/samples/variants/build.gradle @@ -1,7 +1,16 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + import com.datadog.gradle.config.AndroidConfig plugins { id 'com.android.application' + // Applied before Kotlin on purpose: ktlint-gradle registers Android source-set tasks twice + // when it is applied after the Kotlin plugin. + id 'ktlint' id 'kotlin-android' // you don't need this in your project, it is just to be able to reference AndroidConfig class id 'noopBuildConfigClasspath' apply false diff --git a/samples/variants/src/demo/java/com/datadog/example/variants/VaryingClass.kt b/samples/variants/src/demo/java/com/datadog/example/variants/VaryingClass.kt index c235b8f5..15447d6a 100644 --- a/samples/variants/src/demo/java/com/datadog/example/variants/VaryingClass.kt +++ b/samples/variants/src/demo/java/com/datadog/example/variants/VaryingClass.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal class VaryingClass : VaryingInfo { diff --git a/samples/variants/src/full/java/com/datadog/example/variants/VaryingClass.kt b/samples/variants/src/full/java/com/datadog/example/variants/VaryingClass.kt index 72092414..d09a53a2 100644 --- a/samples/variants/src/full/java/com/datadog/example/variants/VaryingClass.kt +++ b/samples/variants/src/full/java/com/datadog/example/variants/VaryingClass.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal class VaryingClass : VaryingInfo { diff --git a/samples/variants/src/main/java/com/datadog/example/variants/MainActivity.kt b/samples/variants/src/main/java/com/datadog/example/variants/MainActivity.kt index c864a168..d66800c7 100644 --- a/samples/variants/src/main/java/com/datadog/example/variants/MainActivity.kt +++ b/samples/variants/src/main/java/com/datadog/example/variants/MainActivity.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants import android.os.Bundle diff --git a/samples/variants/src/main/java/com/datadog/example/variants/VaryingInfo.kt b/samples/variants/src/main/java/com/datadog/example/variants/VaryingInfo.kt index 9e8f33c6..65238be5 100644 --- a/samples/variants/src/main/java/com/datadog/example/variants/VaryingInfo.kt +++ b/samples/variants/src/main/java/com/datadog/example/variants/VaryingInfo.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal interface VaryingInfo { diff --git a/samples/variants/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt b/samples/variants/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt index 8aba8e68..dc1a48c5 100644 --- a/samples/variants/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt +++ b/samples/variants/src/main/kotlin/com/datadog/example/variants/ext/ActivityExt.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants.ext import android.app.Activity diff --git a/samples/variants/src/pro/java/com/datadog/example/variants/VaryingClass.kt b/samples/variants/src/pro/java/com/datadog/example/variants/VaryingClass.kt index 1e772b19..a11c40c7 100644 --- a/samples/variants/src/pro/java/com/datadog/example/variants/VaryingClass.kt +++ b/samples/variants/src/pro/java/com/datadog/example/variants/VaryingClass.kt @@ -1,3 +1,9 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + package com.datadog.example.variants internal class VaryingClass : VaryingInfo { diff --git a/tools/build-config/build.gradle.kts b/tools/build-config/build.gradle.kts index 26b30c9e..56740785 100644 --- a/tools/build-config/build.gradle.kts +++ b/tools/build-config/build.gradle.kts @@ -6,9 +6,18 @@ plugins { `kotlin-dsl` + alias(libs.plugins.ktlintGradlePlugin) alias(libs.plugins.versionsPluginGradle) } +ktlint { + version = provider { libs.versions.ktlint.get() } + filter { + exclude { it.file.invariantSeparatorsPath.contains("/build/generated") } + exclude { it.file.invariantSeparatorsPath.contains("/build/kspCaches/") } + } +} + buildscript { repositories { // Magic Mirror Depot proxy (only set in CI via `.gitlab-ci.yml`). @@ -35,6 +44,7 @@ dependencies { // Dependencies used to configure the Gradle plugins compileOnly(libs.kotlinGradlePlugin21) + compileOnly(libs.ktlintGradlePlugin) compileOnly(libs.versionsGradlePlugin) compileOnly(libs.dokkaGradlePlugin) compileOnly(libs.mavenPublishPlugin) diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt index 2c3cdf09..2bbddd51 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/config/AndroidConfig.kt @@ -11,4 +11,5 @@ object AndroidConfig { const val TARGET_SDK = 36 const val MIN_SDK = 21 const val BUILD_TOOLS_VERSION = "36.1.0" + const val NDK_VERSION = "28.2.13676358" } diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/config/JacocoConfig.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/config/JacocoConfig.kt deleted file mode 100644 index 5ca85bb2..00000000 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/config/JacocoConfig.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. - * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2020-Present Datadog, Inc. - */ - -package com.datadog.gradle.config - -import com.datadog.gradle.Dependencies -import org.gradle.api.Project -import org.gradle.kotlin.dsl.named -import org.gradle.testing.jacoco.plugins.JacocoPluginExtension -import org.gradle.testing.jacoco.tasks.JacocoCoverageVerification -import org.gradle.testing.jacoco.tasks.JacocoReport -import java.math.BigDecimal -import java.nio.file.Paths - -internal fun Project.jacocoConfig() { - val jacocoTestReport = tasks.named("jacocoTestReport") { - reports { - csv.required.set(false) - xml.required.set(true) - html.required.set(true) - html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco/jacocoTestReport/html")) - } - } - - val jacocoTestCoverageVerification = - tasks.named("jacocoTestCoverageVerification") { - violationRules { - rule { - limit { - // TODO increase that when coverage is better? - @Suppress("MagicNumber") - minimum = BigDecimal(0.70) - } - } - } - } - - listOf(jacocoTestReport, jacocoTestCoverageVerification).forEach { - val mainSrc = "${project.projectDir}/src/main/kotlin" - - it.configure { - executionData.setFrom( - layout.buildDirectory.files( - Paths.get("jacoco", "test.exec") - ) - ) - sourceDirectories.setFrom(files(mainSrc)) - } - } - - jacocoTestReport.configure { dependsOn("test") } - jacocoTestCoverageVerification.configure { dependsOn(jacocoTestReport) } - - extensionConfig { - toolVersion = Dependencies.Versions.Jacoco - reportsDirectory.set(layout.buildDirectory.dir("jacoco")) // Jacoco's output root. - } - - tasks.named("check") { - dependsOn(jacocoTestReport) - dependsOn(jacocoTestCoverageVerification) - } - - tasks.named("test") { - finalizedBy( - jacocoTestReport, - jacocoTestCoverageVerification - ) - } -} diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/checklicenses/DependenciesLicenseProvider.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/checklicenses/DependenciesLicenseProvider.kt index d54fda5e..d06f653d 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/checklicenses/DependenciesLicenseProvider.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/checklicenses/DependenciesLicenseProvider.kt @@ -207,8 +207,8 @@ class DependenciesLicenseProvider { "debugUnitTestCompileClasspath", "debugUnitTestImplementationDependenciesMetadata", "debugUnitTestRuntimeClasspath", - "jacocoAgent", - "jacocoAnt", + "koverJvmAgent", + "koverJvmReporter", "releaseUnitTestCompileClasspath", "releaseUnitTestImplementationDependenciesMetadata", "releaseUnitTestRuntimeClasspath", diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CheckCompilerMetaTask.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CheckCompilerMetaTask.kt index 2f6ce6bf..38175276 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CheckCompilerMetaTask.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CheckCompilerMetaTask.kt @@ -1,7 +1,7 @@ /* * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2016-Present Datadog, Inc. + * Copyright 2020-Present Datadog, Inc. */ package com.datadog.gradle.plugin.compilermeta diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CompilerMetaPlugin.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CompilerMetaPlugin.kt index 0f1c16bb..f1abff0e 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CompilerMetaPlugin.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/CompilerMetaPlugin.kt @@ -1,7 +1,7 @@ /* * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2016-Present Datadog, Inc. + * Copyright 2020-Present Datadog, Inc. */ package com.datadog.gradle.plugin.compilermeta diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/GenerateCompilerMetaTask.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/GenerateCompilerMetaTask.kt index 74b6db5b..88d3db42 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/GenerateCompilerMetaTask.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/compilermeta/GenerateCompilerMetaTask.kt @@ -1,7 +1,7 @@ /* * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2016-Present Datadog, Inc. + * Copyright 2020-Present Datadog, Inc. */ package com.datadog.gradle.plugin.compilermeta diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/config/BuildConfigExtension.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/config/BuildConfigExtension.kt index 01c793e5..9732769d 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/config/BuildConfigExtension.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/config/BuildConfigExtension.kt @@ -7,7 +7,6 @@ package com.datadog.gradle.plugin.config import com.datadog.gradle.config.dependencyUpdateConfig -import com.datadog.gradle.config.jacocoConfig import com.datadog.gradle.config.javadocConfig import com.datadog.gradle.config.junitConfig import com.datadog.gradle.config.kotlinConfig @@ -27,10 +26,6 @@ abstract class BuildConfigExtension @Inject constructor( project.junitConfig() } - fun applyJacocoConfig() { - project.jacocoConfig() - } - fun applyJavadocConfig() { project.javadocConfig() } diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/CheckTransitiveDependenciesTask.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/CheckTransitiveDependenciesTask.kt index ef1063ec..0e8c1ef7 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/CheckTransitiveDependenciesTask.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/CheckTransitiveDependenciesTask.kt @@ -1,7 +1,7 @@ /* * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. * This product includes software developed at Datadog (https://www.datadoghq.com/). - * Copyright 2016-Present Datadog, Inc. + * Copyright 2020-Present Datadog, Inc. */ package com.datadog.gradle.plugin.transdeps diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesPlugin.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesPlugin.kt index 0b38d210..771dbb46 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesPlugin.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesPlugin.kt @@ -9,16 +9,29 @@ package com.datadog.gradle.plugin.transdeps import com.datadog.gradle.config.taskConfig import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.kotlin.dsl.register import org.jetbrains.kotlin.gradle.tasks.KotlinCompile class TransitiveDependenciesPlugin : Plugin { override fun apply(target: Project) { + val runtimeClasspathConfiguration = target.configurations.getByName("runtimeClasspath") + check(runtimeClasspathConfiguration.isCanBeResolved) { "$runtimeClasspathConfiguration cannot be resolved" } + + val externalRuntimeClasspath = runtimeClasspathConfiguration.incoming + .artifactView { + componentFilter { + it !is ProjectComponentIdentifier && it.displayName != "Gradle API" + } + } + .files + val listTransitiveDependenciesTask = target.tasks.register(TASK_GEN_TRANSITIVE_DEPS) { humanReadableSize.value(true) sortByName.value(true) + runtimeClasspath.from(externalRuntimeClasspath) outputFile.set(target.layout.projectDirectory.file(FILE_NAME)) } diff --git a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesTask.kt b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesTask.kt index a9cf1b46..7916a8d7 100644 --- a/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesTask.kt +++ b/tools/build-config/src/main/kotlin/com/datadog/gradle/plugin/transdeps/TransitiveDependenciesTask.kt @@ -7,10 +7,10 @@ package com.datadog.gradle.plugin.transdeps import org.gradle.api.DefaultTask -import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.component.ProjectComponentIdentifier +import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.Property +import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.Input import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction @@ -24,6 +24,9 @@ abstract class TransitiveDependenciesTask : DefaultTask() { @get:Input abstract val sortByName: Property + @get:Classpath + abstract val runtimeClasspath: ConfigurableFileCollection + @get:OutputFile abstract val outputFile: RegularFileProperty @@ -39,8 +42,7 @@ abstract class TransitiveDependenciesTask : DefaultTask() { outputFile.get().asFile.let { it.writeText("Dependencies List\n\n") - val implementation = project.configurations.getByName("runtimeClasspath") - listConfigurationDependencies(implementation, it) + listConfigurationDependencies(it) } } @@ -48,16 +50,8 @@ abstract class TransitiveDependenciesTask : DefaultTask() { // region Internal - private fun listConfigurationDependencies(configuration: Configuration, outputFile: File) { - check(configuration.isCanBeResolved) { "$configuration cannot be resolved" } - - val sortedArtifacts = configuration.incoming - .artifactView { - componentFilter { - it !is ProjectComponentIdentifier && it.displayName != "Gradle API" - } - } - .files + private fun listConfigurationDependencies(outputFile: File) { + val sortedArtifacts = runtimeClasspath.files .apply { if (sortByName.get()) sortedBy { it.absolutePath } else sortedBy { -it.length() } } diff --git a/tools/build-config/src/main/kotlin/ktlint.gradle.kts b/tools/build-config/src/main/kotlin/ktlint.gradle.kts new file mode 100644 index 00000000..1fc255a4 --- /dev/null +++ b/tools/build-config/src/main/kotlin/ktlint.gradle.kts @@ -0,0 +1,21 @@ +/* + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + +import org.gradle.api.artifacts.VersionCatalogsExtension + +plugins { + id("org.jlleitschuh.gradle.ktlint") +} + +val libs = extensions.getByType().named("libs") + +ktlint { + version = provider { libs.findVersion("ktlint").get().requiredVersion } + filter { + exclude { it.file.invariantSeparatorsPath.contains("/build/generated") } + exclude { it.file.invariantSeparatorsPath.contains("/build/kspCaches/") } + } +}