Skip to content

Commit

Permalink
SONARGRADL-128 Put all Gradle Build scripts in root sonar.sources only (
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardo-pilastri-sonarsource committed Sep 22, 2023
1 parent 5dda863 commit c935bcd
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 33 deletions.
71 changes: 40 additions & 31 deletions src/main/java/org/sonarqube/gradle/SonarPropertyComputer.java
Expand Up @@ -19,6 +19,24 @@
*/
package org.sonarqube.gradle;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.gradle.api.NamedDomainObjectContainer;
import org.gradle.api.Project;
import org.gradle.api.Task;
Expand All @@ -44,26 +62,12 @@
import org.gradle.util.GradleVersion;
import org.sonarsource.scanner.api.Utils;

import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static org.sonarqube.gradle.SonarUtils.*;
import static org.sonarqube.gradle.SonarUtils.appendProp;
import static org.sonarqube.gradle.SonarUtils.exists;
import static org.sonarqube.gradle.SonarUtils.isAndroidProject;
import static org.sonarqube.gradle.SonarUtils.nonEmptyOrNull;
import static org.sonarqube.gradle.SonarUtils.setMainClasspathProps;
import static org.sonarqube.gradle.SonarUtils.setTestClasspathProps;

public class SonarPropertyComputer {
private static final Logger LOGGER = Logging.getLogger(SonarPropertyComputer.class);
Expand All @@ -88,14 +92,16 @@ public Map<String, Object> computeSonarProperties() {
if (properties.containsKey("sonar.projectBaseDir")) {
properties.put("sonar.projectBaseDir", SonarUtils.findProjectBaseDir(properties));
}
if(SonarQubePlugin.notSkipped(targetProject)){
properties.put("sonar.kotlin.gradleProjectRoot", targetProject.getRootProject().getProjectDir().getAbsolutePath());
}
return properties;
}

private void computeSonarProperties(Project project, Map<String, Object> properties, String prefix) {
if (!SonarQubePlugin.notSkipped(project)) {
return;
}

Map<String, Object> rawProperties = new LinkedHashMap<>();
addGradleDefaults(project, rawProperties);
if (isAndroidProject(project)) {
Expand All @@ -109,6 +115,7 @@ private void computeSonarProperties(Project project, Map<String, Object> propert
if (project.equals(targetProject)) {
addEnvironmentProperties(rawProperties);
addSystemProperties(rawProperties);
addKotlinBuildScriptsToSources(project, rawProperties);
}

rawProperties.putIfAbsent(SONAR_SOURCES_PROP, "");
Expand Down Expand Up @@ -149,6 +156,7 @@ private void computeSonarProperties(Project project, Map<String, Object> propert
properties.put(convertKey("sonar.modules", prefix), String.join(",", moduleIds));
}


private static void evaluateSonarPropertiesBlocks(ActionBroadcast<? super SonarProperties> propertiesActions, Map<String, Object> properties) {
SonarProperties sqProperties = new SonarProperties(properties);
propertiesActions.execute(sqProperties);
Expand Down Expand Up @@ -450,9 +458,6 @@ private void addGradleDefaults(final Project project, final Map<String, Object>
properties.put("sonar.projectDescription", project.getDescription());
properties.put("sonar.projectVersion", project.getVersion());
properties.put("sonar.projectBaseDir", project.getProjectDir());
properties.put("sonar.kotlin.gradleProjectRoot", project.getRootProject().getProjectDir().getAbsolutePath());

addKotlinBuildScriptsToSources(project, properties);

if (project.equals(targetProject)) {
// Root project of the analysis
Expand All @@ -471,15 +476,19 @@ private void addGradleDefaults(final Project project, final Map<String, Object>
}

private static void addKotlinBuildScriptsToSources(Project project, Map<String, Object> properties) {
List<File> buildScripts = new ArrayList<>();

File buildFile = project.getBuildFile();
if (buildFile.getAbsolutePath().endsWith(".kts")) buildScripts.add(buildFile);
List<File> buildScripts = project.getAllprojects().stream()
.filter(SonarQubePlugin::notSkipped)
.map(Project::getBuildFile)
.filter(file -> file.getAbsolutePath().endsWith("kts"))
.collect(Collectors.toList());

var settingsFile = Path.of(project.getProjectDir().getAbsolutePath(), "settings.gradle.kts").toFile();
if (settingsFile.exists()) buildScripts.add(settingsFile);

if (!buildScripts.isEmpty()) SonarUtils.appendProps(properties, SONAR_SOURCES_PROP, buildScripts);
if (settingsFile.exists()) {
buildScripts.add(settingsFile);
}
if (!buildScripts.isEmpty()) {
SonarUtils.appendProps(properties, SONAR_SOURCES_PROP, buildScripts);
}
}

private String computeProjectKey() {
Expand Down
9 changes: 7 additions & 2 deletions src/test/groovy/org/sonarqube/gradle/GradleKtsTests.groovy
Expand Up @@ -186,11 +186,16 @@ class GradleKtsTests extends Specification {
props.load(outFile.newDataInputStream())

then:
props[":subproject.sonar.sources"] == subProjectBuildFile.toRealPath().toString()
def subProjectSonarSources = props[":subproject.sonar.sources"]
Assertions.assertThat(subProjectSonarSources).isEmpty()

def sonarSources = props["sonar.sources"].split(",")
Assertions.assertThat(sonarSources)
.containsExactlyInAnyOrder(settingsFile.toRealPath().toString(), buildFile.toRealPath().toString())
.containsExactlyInAnyOrder(
settingsFile.toRealPath().toString(),
buildFile.toRealPath().toString(),
subProjectBuildFile.toRealPath().toString()
)

}

Expand Down
28 changes: 28 additions & 0 deletions src/test/groovy/org/sonarqube/gradle/SonarQubePluginTest.groovy
Expand Up @@ -850,6 +850,34 @@ class SonarQubePluginTest extends Specification {
}
}
def "multi module project build files should be inside root sonar.sources"() {
def parent = ProjectBuilder.builder().withName("java-multi-module")
.withProjectDir(new File("src/test/projects/java-multi-module")).build()
def module1 = ProjectBuilder.builder().withName("module1")
.withProjectDir(new File("src/test/projects/java-multi-module/module1"))
.withParent(parent)
.build()
def module2 = ProjectBuilder.builder().withName("module2")
.withProjectDir(new File("src/test/projects/java-multi-module/module2"))
.withParent(parent)
.build()
parent.pluginManager.apply(JavaPlugin)
parent.pluginManager.apply(SonarQubePlugin)
def props = parent.tasks.sonar.properties.get()
when:
def parentSources = props["sonar.sources"].split(",")
def module1Sources = props[":module1.sonar.sources"]
def module2Sources = props[":module2.sonar.sources"]
then:
assert parentSources.size() == 4
assert normalizePathArray(parentSources).contains(normalizePathString("src/test/projects/java-multi-module/build.gradle.kts"))
assert normalizePathArray(parentSources).contains(normalizePathString("src/test/projects/java-multi-module/settings.gradle.kts"))
assert normalizePathArray(parentSources).contains(normalizePathString("src/test/projects/java-multi-module/module1/build.gradle.kts"))
assert normalizePathArray(parentSources).contains(normalizePathString("src/test/projects/java-multi-module/module2/build.gradle.kts"))
assert module1Sources.length() == 0
assert module2Sources.length() == 0
}
private List<String> normalizePathArray(String[] pathStrings) {
return Arrays.stream(pathStrings)
.map(this::normalizePathString)
Expand Down
11 changes: 11 additions & 0 deletions src/test/projects/java-multi-module/build.gradle.kts
@@ -0,0 +1,11 @@
plugins {
id("java")
id("org.sonarqube") version "4.3.1.3277"
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
}
10 changes: 10 additions & 0 deletions src/test/projects/java-multi-module/module1/build.gradle.kts
@@ -0,0 +1,10 @@
plugins {
id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
}
10 changes: 10 additions & 0 deletions src/test/projects/java-multi-module/module2/build.gradle.kts
@@ -0,0 +1,10 @@
plugins {
id("java")
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
}
3 changes: 3 additions & 0 deletions src/test/projects/java-multi-module/settings.gradle.kts
@@ -0,0 +1,3 @@
rootProject.name = "java-multi-module"
include("module1")
include("module2")

0 comments on commit c935bcd

Please sign in to comment.