diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-02 18:25:17 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-02 21:25:33 +0200 |
commit | 91b39b5b5350f038738f422b05ea642b52493b8e (patch) | |
tree | 22b5c1764b7a28875c971cbb7f9fce44060ed751 | |
parent | 7d1f081b5a3948c71597a1a7455806f3ffd92745 (diff) | |
download | sonarqube-91b39b5b5350f038738f422b05ea642b52493b8e.tar.gz sonarqube-91b39b5b5350f038738f422b05ea642b52493b8e.zip |
SONAR-5620 Improve user experience
4 files changed, 145 insertions, 53 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scm/ScmConfiguration.java b/sonar-batch/src/main/java/org/sonar/batch/scm/ScmConfiguration.java index 8ccfa2f4678..ef95169f8be 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scm/ScmConfiguration.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scm/ScmConfiguration.java @@ -29,10 +29,12 @@ import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.batch.bootstrap.ProjectReactor; import org.sonar.api.batch.scm.ScmProvider; import org.sonar.api.config.Settings; +import org.sonar.core.DryRunIncompatible; import java.util.LinkedHashMap; import java.util.Map; +@DryRunIncompatible @InstantiationStrategy(InstantiationStrategy.PER_BATCH) public final class ScmConfiguration implements BatchComponent, Startable { private static final Logger LOG = LoggerFactory.getLogger(ScmConfiguration.class); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java b/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java index 2de113798e1..4485407e9e3 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java @@ -21,6 +21,7 @@ package org.sonar.batch.scm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonar.api.CoreProperties; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; @@ -33,11 +34,12 @@ import org.sonar.api.measures.CoreMetrics; import org.sonar.api.utils.TimeProfiler; import org.sonar.batch.protocol.input.FileData; import org.sonar.batch.protocol.input.ProjectReferentials; +import org.sonar.core.DryRunIncompatible; -import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; +@DryRunIncompatible public final class ScmSensor implements Sensor { private static final Logger LOG = LoggerFactory.getLogger(ScmSensor.class); @@ -71,12 +73,10 @@ public final class ScmSensor implements Sensor { return; } if (configuration.provider() == null) { - LOG.info("No SCM provider for this project"); + LOG.info("No SCM system was detected. You can use the '" + CoreProperties.SCM_PROVIDER_KEY + "' property to explicitly specify it."); return; } - TimeProfiler profiler = new TimeProfiler().start("Retrieve SCM blame information with encoding " + Charset.defaultCharset()); - List<InputFile> filesToBlame = new LinkedList<InputFile>(); for (InputFile f : fs.inputFiles(fs.predicates().all())) { FileData fileData = projectReferentials.fileData(projectDefinition.getKeyWithBranch(), f.relativePath()); @@ -91,9 +91,11 @@ public final class ScmSensor implements Sensor { } } if (!filesToBlame.isEmpty()) { + LOG.info("SCM provider for this project is: " + configuration.provider().key()); + TimeProfiler profiler = new TimeProfiler().start("Retrieve SCM blame information"); configuration.provider().blameCommand().blame(fs, filesToBlame, new DefaultBlameResult(context)); + profiler.stop(); } - profiler.stop(); } /** diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java index d0f60bb4858..a255f04eb7d 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/measures/MeasuresMediumTest.java @@ -102,52 +102,4 @@ public class MeasuresMediumTest { } - @Test - public void testScmMeasure() throws IOException { - - File baseDir = temp.newFolder(); - File srcDir = new File(baseDir, "src"); - srcDir.mkdir(); - - File xooFile = new File(srcDir, "sample.xoo"); - File xooMeasureFile = new File(srcDir, "sample.xoo.measures"); - File xooScmFile = new File(srcDir, "sample.xoo.scm"); - FileUtils.write(xooFile, "Sample xoo\ncontent"); - FileUtils.write(xooMeasureFile, "lines:5"); - FileUtils.write(xooScmFile, - // revision,author,dateTime - "1,julien,2013-01-04\n" + - "1,julien,2013-01-04\n" + - "2,julien,2013-02-03\n" + - "2,julien,2013-02-03\n" + - "3,simon,2013-03-04\n" - ); - - TaskResult result = tester.newTask() - .properties(ImmutableMap.<String, String>builder() - .put("sonar.task", "scan") - .put("sonar.projectBaseDir", baseDir.getAbsolutePath()) - .put("sonar.projectKey", "com.foo.project") - .put("sonar.projectName", "Foo Project") - .put("sonar.projectVersion", "1.0-SNAPSHOT") - .put("sonar.projectDescription", "Description of Foo Project") - .put("sonar.sources", "src") - .put("sonar.scm.enabled", "true") - .put("sonar.scm.provider", "xoo") - .build()) - .start(); - - assertThat(result.measures()).hasSize(4); - - assertThat(result.measures()).contains(new DefaultMeasure<Integer>() - .forMetric(CoreMetrics.LINES) - .onFile(new DefaultInputFile("com.foo.project", "src/sample.xoo")) - .withValue(5)); - - assertThat(result.measures()).contains(new DefaultMeasure<String>() - .forMetric(CoreMetrics.SCM_AUTHORS_BY_LINE) - .onFile(new DefaultInputFile("com.foo.project", "src/sample.xoo")) - .withValue("1=julien;2=julien;3=julien;4=julien;5=simon")); - } - } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/scm/ScmMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/scm/ScmMediumTest.java new file mode 100644 index 00000000000..e23cdd2296f --- /dev/null +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/scm/ScmMediumTest.java @@ -0,0 +1,136 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.mediumtest.scm; + +import com.google.common.collect.ImmutableMap; +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.sonar.api.batch.fs.internal.DefaultInputFile; +import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; +import org.sonar.api.measures.CoreMetrics; +import org.sonar.batch.mediumtest.BatchMediumTester; +import org.sonar.batch.mediumtest.BatchMediumTester.TaskResult; +import org.sonar.xoo.XooPlugin; + +import java.io.File; +import java.io.IOException; + +import static org.fest.assertions.Assertions.assertThat; + +public class ScmMediumTest { + + @org.junit.Rule + public TemporaryFolder temp = new TemporaryFolder(); + + public BatchMediumTester tester = BatchMediumTester.builder() + .registerPlugin("xoo", new XooPlugin()) + .addDefaultQProfile("xoo", "Sonar Way") + .bootstrapProperties(ImmutableMap.of("sonar.analysis.mode", "sensor")) + .build(); + + @Before + public void prepare() { + tester.start(); + } + + @After + public void stop() { + tester.stop(); + } + + @Test + public void testScmMeasure() throws IOException { + + File baseDir = prepareProject(); + + TaskResult result = tester.newTask() + .properties(ImmutableMap.<String, String>builder() + .put("sonar.task", "scan") + .put("sonar.projectBaseDir", baseDir.getAbsolutePath()) + .put("sonar.projectKey", "com.foo.project") + .put("sonar.projectName", "Foo Project") + .put("sonar.projectVersion", "1.0-SNAPSHOT") + .put("sonar.projectDescription", "Description of Foo Project") + .put("sonar.sources", "src") + .put("sonar.scm.enabled", "true") + .put("sonar.scm.provider", "xoo") + .build()) + .start(); + + assertThat(result.measures()).hasSize(4); + + assertThat(result.measures()).contains(new DefaultMeasure<Integer>() + .forMetric(CoreMetrics.LINES) + .onFile(new DefaultInputFile("com.foo.project", "src/sample.xoo")) + .withValue(5)); + + assertThat(result.measures()).contains(new DefaultMeasure<String>() + .forMetric(CoreMetrics.SCM_AUTHORS_BY_LINE) + .onFile(new DefaultInputFile("com.foo.project", "src/sample.xoo")) + .withValue("1=julien;2=julien;3=julien;4=julien;5=simon")); + } + + private File prepareProject() throws IOException { + File baseDir = temp.newFolder(); + File srcDir = new File(baseDir, "src"); + srcDir.mkdir(); + + File xooFile = new File(srcDir, "sample.xoo"); + File xooMeasureFile = new File(srcDir, "sample.xoo.measures"); + File xooScmFile = new File(srcDir, "sample.xoo.scm"); + FileUtils.write(xooFile, "Sample xoo\ncontent"); + FileUtils.write(xooMeasureFile, "lines:5"); + FileUtils.write(xooScmFile, + // revision,author,dateTime + "1,julien,2013-01-04\n" + + "1,julien,2013-01-04\n" + + "2,julien,2013-02-03\n" + + "2,julien,2013-02-03\n" + + "3,simon,2013-03-04\n" + ); + return baseDir; + } + + @Test + public void testDisableScmSensor() throws IOException { + + File baseDir = prepareProject(); + + TaskResult result = tester.newTask() + .properties(ImmutableMap.<String, String>builder() + .put("sonar.task", "scan") + .put("sonar.projectBaseDir", baseDir.getAbsolutePath()) + .put("sonar.projectKey", "com.foo.project") + .put("sonar.projectName", "Foo Project") + .put("sonar.projectVersion", "1.0-SNAPSHOT") + .put("sonar.projectDescription", "Description of Foo Project") + .put("sonar.sources", "src") + .put("sonar.scm.enabled", "false") + .put("sonar.scm.provider", "xoo") + .build()) + .start(); + + assertThat(result.measures()).hasSize(1); + } + +} |