Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"permissions": {
"allow": [
"WebFetch(domain:raw.githubusercontent.com)",
"WebFetch(domain:github.com)",
"Bash(gh api:*)",
"WebSearch",
"Bash(git checkout:*)",
"Bash(gh run list:*)",
"Bash(gh run view:*)",
"Bash(findstr:*)",
"Bash(Select-String -Pattern \"develocity|build scan|Publishing|Set Develocity|error|Error\" -SimpleMatch)",
"Bash(Select-Object -First 50)",
"Bash(.gradlew.bat wrapper --gradle-version 9.3.1)",
"Bash(cmd /c \"gradlew.bat wrapper --gradle-version 9.3.1\")",
"Bash(cmd /c \"gradlew.bat generateLicenseResources --write-verification-metadata sha256 2>&1\")",
"Bash(./gradlew generateLicenseResources:*)"
]
}
}
5 changes: 3 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,10 @@ dependencies {
testImplementation("org.assertj:assertj-core:3.26.0")
testImplementation("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
testImplementation("org.junit.jupiter:junit-jupiter-params:$junitVersion")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testImplementation("org.hamcrest:hamcrest-all:1.3")
testImplementation("org.mockito:mockito-core:5.12.0")
testImplementation("org.spockframework:spock-core:2.3-groovy-3.0") {
testImplementation("org.spockframework:spock-core:2.3-groovy-4.0") {
exclude(module = "groovy-all")
}
testImplementation("com.tngtech.archunit:archunit-junit5:$archunitVersion")
Expand Down Expand Up @@ -118,7 +119,7 @@ license {
}

jacoco {
toolVersion = "0.8.7"
toolVersion = "0.8.13"
}

tasks.jacocoTestReport {
Expand Down
58 changes: 58 additions & 0 deletions gradle/verification-metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1756,6 +1756,11 @@
<sha256 value="48f965e8242dbf01786d0a92d0ad63e20a201d4a536e0321d03b10d2e0c98153" origin="Verified"/>
</artifact>
</component>
<component group="org.apache.groovy" name="groovy" version="4.0.4">
<artifact name="groovy-4.0.4.jar">
<sha256 value="1429a3d4cd6f5d7858e4941e553e0bb4b7bc451c003050b9694213eda0614d04" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.apache.httpcomponents" name="httpclient" version="4.5.13">
<artifact name="httpclient-4.5.13.jar">
<sha256 value="6fe9026a566c6a5001608cf3fc32196641f6c1e5e1986d1037ccdbd5f31ef743" origin="Verified"/>
Expand Down Expand Up @@ -2319,6 +2324,14 @@
<sha256 value="6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b" origin="Verified"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.agent" version="0.8.13">
<artifact name="org.jacoco.agent-0.8.13-runtime.jar">
<sha256 value="47e700ccb0fdb9e27c5241353f8161938f4e53c3561dd35e063c5fe88dc3349b" origin="Generated by Gradle"/>
</artifact>
<artifact name="org.jacoco.agent-0.8.13.jar">
<sha256 value="9db3c9d5d74fa870b261b64a3082412e1bd6e22e9fa98f4737b1bff8af9cc64d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.agent" version="0.8.7">
<artifact name="org.jacoco.agent-0.8.7-runtime.jar">
<sha256 value="d931125fc3f9c8e5ee36b94269134a03b3b88f94d93e775f2d57ac608b766145" origin="Verified"/>
Expand All @@ -2330,6 +2343,11 @@
<sha256 value="e7b2cdd2df3a6bc239a231b1775be09e50b748e9c388579fb3ea4f990357722f" origin="Verified"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.ant" version="0.8.13">
<artifact name="org.jacoco.ant-0.8.13.jar">
<sha256 value="6434b8552ff3d0e4a2fbbd13a6efb124e0c9ca453817c62c03de8390d87ffd11" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.ant" version="0.8.7">
<artifact name="org.jacoco.ant-0.8.7.jar">
<sha256 value="97ca96a382c3f23a44d8eb4c4e6c3742a30cb8005774a76ced0fc4806ce49605" origin="Verified"/>
Expand All @@ -2343,6 +2361,11 @@
<sha256 value="83408107930e1683a9b7647da7ab75eb83d80fa470c1641b79b5aecbbef1b783" origin="Verified"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.core" version="0.8.13">
<artifact name="org.jacoco.core-0.8.13.jar">
<sha256 value="514c23df6cfd015d7d83c10a792e35ab68a7b7e82f3d6a3a4481762c132e33a9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.core" version="0.8.7">
<artifact name="org.jacoco.core-0.8.7.jar">
<sha256 value="ad7739b5fb5969aa1a8aead3d74ed54dc82ed012f1f10f336bd1b96e71c1a13c" origin="Verified"/>
Expand All @@ -2351,6 +2374,11 @@
<sha256 value="6832c751d8cd6071af646fde63baa13bdd183693fd60f7757f68536e5f867825" origin="Verified"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.report" version="0.8.13">
<artifact name="org.jacoco.report-0.8.13.jar">
<sha256 value="8133280a0aa44358be9d136b52370342f455ccb944aae07438220a77662578a2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jacoco" name="org.jacoco.report" version="0.8.7">
<artifact name="org.jacoco.report-0.8.7.jar">
<sha256 value="cc89258623700a6c932592153cb528785876b6da183d5431f97efbba6f020e5b" origin="Verified"/>
Expand Down Expand Up @@ -2631,6 +2659,11 @@
<sha256 value="8836ccffd3585fadda9901244b20d42901d2f3cd581058d8434e2ffabcf3a3e7" origin="Verified"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.2.21">
<artifact name="kotlin-stdlib-2.2.21.jar">
<sha256 value="6558a3d233da56a20934b32159f9db5f86ed5816ef098f78a2c223dc6abb79dd" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="1.7.10">
<artifact name="kotlin-stdlib-common-1.7.10.jar">
<sha256 value="19f102efe9629f8eabc63853ad15c533e47c47f91fca09285c5bde86e59f91d4" origin="Verified"/>
Expand Down Expand Up @@ -2867,6 +2900,11 @@
<sha256 value="12aa86ca1c0d648a225d4e7c696054c1fc76e88782c5c39fb7df379ae23bef6f" origin="Verified"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-launcher" version="1.10.2">
<artifact name="junit-platform-launcher-1.10.2.jar">
<sha256 value="aed4f42fb90ada9b347c231f13656fc09121ba20dab6dc646a6bd9d4da31e4aa" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jvnet.staxex" name="stax-ex" version="1.8.1">
<artifact name="stax-ex-1.8.1.jar">
<sha256 value="20522549056e9e50aa35ef0b445a2e47a53d06be0b0a9467d704e2483ffb049a" origin="Verified"/>
Expand Down Expand Up @@ -2925,6 +2963,11 @@
<sha256 value="dfb12a1b224bf01be1fd604020466f894241bcb645dcce395edd8cd6f8a50df4" origin="Verified"/>
</artifact>
</component>
<component group="org.ow2.asm" name="asm" version="9.8">
<artifact name="asm-9.8.jar">
<sha256 value="876eab6a83daecad5ca67eb9fcabb063c97b5aeb8cf1fca7a989ecde17522051" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.ow2.asm" name="asm-analysis" version="9.1">
<artifact name="asm-analysis-9.1.jar">
<sha256 value="81a88041b1b8beda5a8a99646098046c48709538270c49def68abff25ac3be34" origin="Verified"/>
Expand Down Expand Up @@ -2957,6 +3000,11 @@
<sha256 value="02824e839f2a2f0e72959fdd30b4897240f05afc43de42d7ba0b18437601c070" origin="Verified"/>
</artifact>
</component>
<component group="org.ow2.asm" name="asm-commons" version="9.8">
<artifact name="asm-commons-9.8.jar">
<sha256 value="3301a1c1cb4c59fcc5292648dac1d7c5aed4c0f067dfbe88873b8cdfe77404f4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.ow2.asm" name="asm-tree" version="9.1">
<artifact name="asm-tree-9.1.jar">
<sha256 value="fd00afa49e9595d7646205b09cecb4a776a8ff0ba06f2d59b8f7bf9c704b4a73" origin="Verified"/>
Expand All @@ -2973,6 +3021,11 @@
<sha256 value="f61f3ebea5520ddf19f452b03c426c7231bdd8a81d7ac28765cb5271225ac378" origin="Verified"/>
</artifact>
</component>
<component group="org.ow2.asm" name="asm-tree" version="9.8">
<artifact name="asm-tree-9.8.jar">
<sha256 value="14b7880cb7c85eed101e2710432fc3ffb83275532a6a894dc4c4095d49ad59f1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.ow2.asm" name="asm-util" version="9.2">
<artifact name="asm-util-9.2.jar">
<sha256 value="ff5b3cd331ae8a9a804768280da98f50f424fef23dd3c788bb320e08c94ee598" origin="Verified"/>
Expand Down Expand Up @@ -3297,6 +3350,11 @@
<sha256 value="ff948be6ade88290032151f791cbb7bf04359a0c906a44e72bf22582d26dc510" origin="Verified"/>
</artifact>
</component>
<component group="org.spockframework" name="spock-core" version="2.3-groovy-4.0">
<artifact name="spock-core-2.3-groovy-4.0.jar">
<sha256 value="60a614a7640c4fc9dfd432929a426bd0448f299915924556ae372105a118ff14" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.springframework" name="spring-asm" version="3.1.3.RELEASE">
<artifact name="spring-asm-3.1.3.RELEASE.jar">
<sha256 value="cdaf1d07040e751133a24f997aca7d98eacbfe67e1b2875dce8ca73825278130" origin="Verified"/>
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 1 addition & 1 deletion mise.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[tools]
java = ["17", "11"]
maven = "3.9"
gradle = "9"
gradle = "9.3.1"

[alias.java.versions]
"11" = "corretto-11"
Expand Down
19 changes: 12 additions & 7 deletions src/main/java/org/sonarqube/gradle/SonarUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@
import java.util.stream.StreamSupport;
import javax.annotation.Nullable;
import org.gradle.api.Project;
import org.gradle.api.internal.plugins.DslObject;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.util.GradleVersion;
Expand Down Expand Up @@ -106,21 +104,28 @@ static SourceSetContainer getSourceSets(Project project) {

@Nullable
private static SourceSetContainer getSourceSetsGradle7orGreater(Project project) {
JavaPluginExtension javaPluginExtension = new DslObject(project).getExtensions().findByType(JavaPluginExtension.class);
JavaPluginExtension javaPluginExtension = project.getExtensions().findByType(JavaPluginExtension.class);
if (javaPluginExtension == null) {
return null;
}
return javaPluginExtension.getSourceSets();
}

@Nullable
@SuppressWarnings("java:S1874")
private static SourceSetContainer getSourceSetsGradleLegacy(Project project) {
JavaPluginConvention javaPluginConvention = new DslObject(project).getConvention().findPlugin(JavaPluginConvention.class);
if (javaPluginConvention == null) {
try {
Object convention = project.getClass().getMethod("getConvention").invoke(project);
Class<?> javaPluginConventionClass = Class.forName("org.gradle.api.plugins.JavaPluginConvention");
Object javaPluginConvention = convention.getClass()
.getMethod("findPlugin", Class.class)
.invoke(convention, javaPluginConventionClass);
if (javaPluginConvention == null) {
return null;
}
return (SourceSetContainer) javaPluginConventionClass.getMethod("getSourceSets").invoke(javaPluginConvention);
} catch (ReflectiveOperationException e) {
return null;
}
return javaPluginConvention.getSourceSets();
}

static boolean isCompatibleWithJavaPluginExtension(GradleVersion version) {
Expand Down
1 change: 0 additions & 1 deletion src/test/groovy/org/sonarqube/gradle/AndroidUtilsIT.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package org.sonarqube.gradle

import groovy.json.JsonSlurper
import org.gradle.internal.impldep.org.junit.Assume
import org.gradle.testkit.runner.GradleRunner
import org.gradle.testkit.runner.TaskOutcome
import org.junit.jupiter.params.ParameterizedTest
Expand Down
23 changes: 10 additions & 13 deletions src/test/groovy/org/sonarqube/gradle/SonarQubePluginTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,15 @@ package org.sonarqube.gradle
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.JavaVersion
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.logging.LogLevel
import org.gradle.api.plugins.GroovyPlugin
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.initialization.GradlePropertiesController
import org.gradle.internal.impldep.org.apache.commons.lang.SystemUtils
import org.gradle.testfixtures.ProjectBuilder
import org.gradle.testing.jacoco.plugins.JacocoPlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
Expand Down Expand Up @@ -62,7 +60,6 @@ class SonarQubePluginTest extends Specification {
parentProject.repositories {
mavenCentral()
}
(parentProject as ProjectInternal).services.get(GradlePropertiesController.class).loadGradlePropertiesFrom(parentProject.rootDir, false)

rootProject.allprojects {
group = "group"
Expand Down Expand Up @@ -225,10 +222,10 @@ class SonarQubePluginTest extends Specification {
def "compute source and target properties for 'java' projects"() {
parentProject.pluginManager.apply(JavaPlugin)
childProject.pluginManager.apply(JavaPlugin)
parentProject.sourceCompatibility = 1.5
parentProject.targetCompatibility = 1.6
childProject.sourceCompatibility = 1.6
childProject.targetCompatibility = 1.8
parentProject.extensions.getByType(JavaPluginExtension).sourceCompatibility = JavaVersion.VERSION_1_5
parentProject.extensions.getByType(JavaPluginExtension).targetCompatibility = JavaVersion.VERSION_1_6
childProject.extensions.getByType(JavaPluginExtension).sourceCompatibility = JavaVersion.VERSION_1_6
childProject.extensions.getByType(JavaPluginExtension).targetCompatibility = JavaVersion.VERSION_1_8

when:
def properties = parentSonarTask().properties.get()
Expand Down Expand Up @@ -280,10 +277,10 @@ class SonarQubePluginTest extends Specification {
def "compute source and target properties for 'groovy' projects"() {
parentProject.pluginManager.apply(GroovyPlugin)
childProject.pluginManager.apply(GroovyPlugin)
parentProject.sourceCompatibility = 1.5
parentProject.targetCompatibility = 1.6
childProject.sourceCompatibility = 1.6
childProject.targetCompatibility = 1.8
parentProject.extensions.getByType(JavaPluginExtension).sourceCompatibility = JavaVersion.VERSION_1_5
parentProject.extensions.getByType(JavaPluginExtension).targetCompatibility = JavaVersion.VERSION_1_6
childProject.extensions.getByType(JavaPluginExtension).sourceCompatibility = JavaVersion.VERSION_1_6
childProject.extensions.getByType(JavaPluginExtension).targetCompatibility = JavaVersion.VERSION_1_8

when:
def properties = parentSonarTask().properties.get()
Expand Down Expand Up @@ -399,7 +396,7 @@ class SonarQubePluginTest extends Specification {
}

def "properties with list of file path should be escaped correctly"() {
Assumptions.assumeFalse(SystemUtils.IS_OS_WINDOWS)
Assumptions.assumeFalse(System.getProperty("os.name", "").toLowerCase().contains("win"))
def rootProject = ProjectBuilder.builder().withName("root").build()
def project = ProjectBuilder.builder().withName("parent").withParent(rootProject).withProjectDir(new File("src/test/projects/java-escaped-project")).build()

Expand Down
15 changes: 7 additions & 8 deletions src/test/groovy/org/sonarqube/gradle/SonarUtilsGroovyTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.gradle.internal.impldep.com.google.common.collect.ImmutableMap;
import org.gradle.internal.impldep.org.apache.commons.lang.SystemUtils;
import org.gradle.util.GradleVersion;
import org.junit.jupiter.api.Test;
import org.sonarqube.gradle.SonarUtils.InputFileType;
Expand All @@ -39,31 +37,32 @@
import static org.sonarqube.gradle.SonarUtils.isCompatibleWithJavaPluginExtension;

class SonarUtilsGroovyTest {
private static final boolean IS_WINDOWS = System.getProperty("os.name", "").toLowerCase().contains("win");

@Test
void get_project_base_dir() {
Map<String, Object> properties = ImmutableMap.of(
Map<String, Object> properties = Map.of(
"sonar.projectBaseDir", "/project/build",
"m1.sonar.projectBaseDir", "/project/m1",
"m1.m2.sonar.projectBaseDir", "/project/m1/m2"
);
assertEquals(Paths.get("/project").toAbsolutePath().toString(), SonarUtils.findProjectBaseDir(properties));

properties = ImmutableMap.of(
properties = Map.of(
"sonar.projectBaseDir", "/build",
"m1.sonar.projectBaseDir", "/m1",
"m1.m2.sonar.projectBaseDir", "/m1/m2"
);
assertEquals(Paths.get("/").toAbsolutePath().toString(), SonarUtils.findProjectBaseDir(properties));

properties = ImmutableMap.of(
properties = Map.of(
"sonar.projectBaseDir", "/project/",
"m1.sonar.projectBaseDir", "/project/m1",
"m1.m2.sonar.projectBaseDir", "/project/m1/m2"
);
assertEquals(Paths.get("/project").toAbsolutePath().toString(), SonarUtils.findProjectBaseDir(properties));

properties = ImmutableMap.of(
properties = Map.of(
"sonar.projectBaseDir", "/project/build",
"m1.sonar.projectBaseDir", "/m1",
"m1.m2.sonar.projectBaseDir", "/m2"
Expand All @@ -74,9 +73,9 @@ void get_project_base_dir() {

@Test
void get_project_base_dir_with_different_roots() {
assumeTrue(SystemUtils.IS_OS_WINDOWS);
assumeTrue(IS_WINDOWS);

Map<String, Object> properties = ImmutableMap.of(
Map<String, Object> properties = Map.of(
"sonar.projectBaseDir", "C:\\project\\build",
"m1.sonar.projectBaseDir", "E:\\project\\m1"
);
Expand Down
Loading