]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10126 Add relative path of project basedir to scanner report
authorJanos Gyerik <janos.gyerik@sonarsource.com>
Thu, 30 Nov 2017 15:25:41 +0000 (16:25 +0100)
committerJanos Gyerik <janos.gyerik@sonarsource.com>
Tue, 5 Dec 2017 09:47:46 +0000 (10:47 +0100)
sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
sonar-scanner-protocol/src/main/protobuf/scanner_report.proto

index 0a1caea08215422ab3611f48a4c7d8f286d6454e..86ed6c122c4ea6ce3b39dc48532364dfa02578ef 100644 (file)
  */
 package org.sonar.scanner.report;
 
+import java.io.File;
+import java.nio.file.Path;
 import java.util.Map.Entry;
 import java.util.Optional;
+import java.util.regex.Pattern;
+import javax.annotation.Nullable;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
+import org.sonar.api.batch.scm.ScmProvider;
 import org.sonar.api.config.Configuration;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.scanner.ProjectAnalysisInfo;
 import org.sonar.scanner.bootstrap.ScannerPlugin;
 import org.sonar.scanner.bootstrap.ScannerPluginRepository;
@@ -34,11 +41,14 @@ import org.sonar.scanner.protocol.output.ScannerReportWriter;
 import org.sonar.scanner.rule.ModuleQProfiles;
 import org.sonar.scanner.rule.QProfile;
 import org.sonar.scanner.scan.branch.BranchConfiguration;
+import org.sonar.scanner.scm.ScmConfiguration;
 
 import static org.sonar.core.config.ScannerProperties.ORGANIZATION;
 
 public class MetadataPublisher implements ReportPublisherStep {
 
+  private static final Logger LOG = Loggers.get(MetadataPublisher.class);
+
   private final Configuration settings;
   private final ModuleQProfiles qProfiles;
   private final ProjectAnalysisInfo projectAnalysisInfo;
@@ -47,8 +57,12 @@ public class MetadataPublisher implements ReportPublisherStep {
   private final ScannerPluginRepository pluginRepository;
   private final BranchConfiguration branchConfiguration;
 
+  @Nullable
+  private final ScmConfiguration scmConfiguration;
+
   public MetadataPublisher(ProjectAnalysisInfo projectAnalysisInfo, InputModuleHierarchy moduleHierarchy, Configuration settings,
-    ModuleQProfiles qProfiles, CpdSettings cpdSettings, ScannerPluginRepository pluginRepository, BranchConfiguration branchConfiguration) {
+    ModuleQProfiles qProfiles, CpdSettings cpdSettings, ScannerPluginRepository pluginRepository, BranchConfiguration branchConfiguration,
+    @Nullable ScmConfiguration scmConfiguration) {
     this.projectAnalysisInfo = projectAnalysisInfo;
     this.moduleHierarchy = moduleHierarchy;
     this.settings = settings;
@@ -56,6 +70,12 @@ public class MetadataPublisher implements ReportPublisherStep {
     this.cpdSettings = cpdSettings;
     this.pluginRepository = pluginRepository;
     this.branchConfiguration = branchConfiguration;
+    this.scmConfiguration = scmConfiguration;
+  }
+
+  public MetadataPublisher(ProjectAnalysisInfo projectAnalysisInfo, InputModuleHierarchy moduleHierarchy, Configuration settings,
+    ModuleQProfiles qProfiles, CpdSettings cpdSettings, ScannerPluginRepository pluginRepository, BranchConfiguration branchConfiguration) {
+    this(projectAnalysisInfo, moduleHierarchy, settings, qProfiles, cpdSettings, pluginRepository, branchConfiguration, null);
   }
 
   @Override
@@ -80,6 +100,23 @@ public class MetadataPublisher implements ReportPublisherStep {
     }
     Optional.ofNullable(rootProject.getBranch()).ifPresent(builder::setDeprecatedBranch);
 
+    if (scmConfiguration != null) {
+      ScmProvider scmProvider = scmConfiguration.provider();
+      if (scmProvider != null) {
+        Path projectBasedir = moduleHierarchy.root().getBaseDir();
+        try {
+          builder.setRelativePathFromScmRoot(toSonarQubePath(scmProvider.relativePathFromScmRoot(projectBasedir)));
+        } catch (UnsupportedOperationException e) {
+          LOG.debug(e.getMessage());
+        }
+        try {
+          builder.setScmRevisionId(scmProvider.revisionId(projectBasedir));
+        } catch (UnsupportedOperationException e) {
+          LOG.debug(e.getMessage());
+        }
+      }
+    }
+
     for (QProfile qp : qProfiles.findAll()) {
       builder.getMutableQprofilesPerLanguage().put(qp.getLanguage(), ScannerReport.Metadata.QProfile.newBuilder()
         .setKey(qp.getKey())
@@ -101,4 +138,14 @@ public class MetadataPublisher implements ReportPublisherStep {
     }
     return BranchType.SHORT;
   }
+
+  private static String toSonarQubePath(Path path) {
+    String pathAsString = path.toString();
+    char sonarQubeSeparatorChar = '/';
+    if (File.separatorChar != sonarQubeSeparatorChar) {
+      return pathAsString.replaceAll(Pattern.quote(File.separator), String.valueOf(sonarQubeSeparatorChar));
+    }
+    return pathAsString;
+  }
+
 }
index 618ce7fdf58894627a1b4ce19950f59e187a2e3a..62011472da8034ded3b01cf89282a3db3c41aac0 100644 (file)
@@ -504,5 +504,4 @@ public class ScannerMediumTester extends ExternalResource {
       }
     }
   }
-
 }
index 5662ed6cfb282bbdb3c731145799df4eac3f497a..e939fa8855ec6dac8ef7691c80a9e7a8db5d1de0 100644 (file)
@@ -43,6 +43,9 @@ message Metadata {
   BranchType branch_type = 10;
   string merge_branch_name = 11;
 
+  string relative_path_from_scm_root = 12;
+  string scm_revision_id = 13;
+
   message QProfile {
     string key = 1;
     string name = 2;