aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2015-10-29 16:37:29 +0100
committerDuarte Meneses <duarte.meneses@sonarsource.com>2015-11-03 10:14:38 +0100
commit3e5cbb0098adc6b59313fd501d395272edfe2e64 (patch)
treec4b832fd10b176b1766b30c931ff46714b30749c
parentd5d4548ee4f0c13360ca4f28ff751f927daef663 (diff)
downloadsonarqube-3e5cbb0098adc6b59313fd501d395272edfe2e64.tar.gz
sonarqube-3e5cbb0098adc6b59313fd501d395272edfe2e64.zip
SONAR-6211 Skip project key validation in issues mode
-rw-r--r--it/it-tests/src/test/java/it/analysis/IssuesModeTest.java12
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java25
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java19
-rw-r--r--sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java9
-rw-r--r--sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java10
5 files changed, 70 insertions, 5 deletions
diff --git a/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java b/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java
index f598908ca47..1c60a13c84b 100644
--- a/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java
+++ b/it/it-tests/src/test/java/it/analysis/IssuesModeTest.java
@@ -86,6 +86,18 @@ public class IssuesModeTest {
}
@Test
+ public void project_key_with_slash() throws IOException {
+ restoreProfile("one-issue-per-line.xml");
+ setDefaultQualityProfile("xoo", "one-issue-per-line");
+
+ SonarRunner runner = configureRunner("shared/xoo-sample");
+ runner.setProjectKey("sample/project");
+ runner.setProperty("sonar.analysis.mode", "issues");
+ BuildResult result = orchestrator.executeBuild(runner);
+ assertThat(ItUtils.countIssuesInJsonReport(result, true)).isEqualTo(17);
+ }
+
+ @Test
public void non_associated_mode() throws IOException {
restoreProfile("one-issue-per-line.xml");
setDefaultQualityProfile("xoo", "one-issue-per-line");
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java
index a856b44b894..e9fbe316420 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java
@@ -19,10 +19,15 @@
*/
package org.sonar.batch.scan;
+import org.sonar.batch.analysis.DefaultAnalysisMode;
+
import com.google.common.base.Joiner;
+
import java.util.ArrayList;
import java.util.List;
+
import javax.annotation.Nullable;
+
import org.apache.commons.lang.StringUtils;
import org.sonar.api.CoreProperties;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
@@ -38,20 +43,25 @@ public class ProjectReactorValidator {
private static final String SONAR_PHASE = "sonar.phase";
private final Settings settings;
+ private final DefaultAnalysisMode mode;
- public ProjectReactorValidator(Settings settings) {
+ public ProjectReactorValidator(Settings settings, DefaultAnalysisMode mode) {
this.settings = settings;
+ this.mode = mode;
}
public void validate(ProjectReactor reactor) {
String branch = settings.getString(CoreProperties.PROJECT_BRANCH_PROPERTY);
- String rootProjectKey = ComponentKeys.createKey(reactor.getRoot().getKey(), branch);
List<String> validationMessages = new ArrayList<>();
checkDeprecatedProperties(validationMessages);
for (ProjectDefinition moduleDef : reactor.getProjects()) {
- validateModule(moduleDef, validationMessages, branch, rootProjectKey);
+ if (mode.isIssues()) {
+ validateModuleIssuesMode(moduleDef, validationMessages);
+ } else {
+ validateModule(moduleDef, validationMessages);
+ }
}
validateBranch(validationMessages, branch);
@@ -61,7 +71,14 @@ public class ProjectReactorValidator {
}
}
- private static void validateModule(ProjectDefinition moduleDef, List<String> validationMessages, @Nullable String branch, String rootProjectKey) {
+ private static void validateModuleIssuesMode(ProjectDefinition moduleDef, List<String> validationMessages) {
+ if (!ComponentKeys.isValidModuleKeyIssuesMode(moduleDef.getKey())) {
+ validationMessages.add(String.format("\"%s\" is not a valid project or module key. "
+ + "Allowed characters in issues mode are alphanumeric, '-', '_', '.', '/' and ':', with at least one non-digit.", moduleDef.getKey()));
+ }
+ }
+
+ private static void validateModule(ProjectDefinition moduleDef, List<String> validationMessages) {
if (!ComponentKeys.isValidModuleKey(moduleDef.getKey())) {
validationMessages.add(String.format("\"%s\" is not a valid project or module key. "
+ "Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit.", moduleDef.getKey()));
diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java
index 1cb70ff6dcb..761c608c8cd 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectReactorValidatorTest.java
@@ -19,6 +19,8 @@
*/
package org.sonar.batch.scan;
+import static org.mockito.Mockito.when;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -27,6 +29,8 @@ import org.sonar.api.CoreProperties;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.bootstrap.ProjectReactor;
import org.sonar.api.config.Settings;
+import org.sonar.batch.analysis.DefaultAnalysisMode;
+import static org.mockito.Mockito.mock;
public class ProjectReactorValidatorTest {
@@ -35,11 +39,13 @@ public class ProjectReactorValidatorTest {
private ProjectReactorValidator validator;
private Settings settings;
+ private DefaultAnalysisMode mode;
@Before
public void prepare() {
+ mode = mock(DefaultAnalysisMode.class);
settings = new Settings();
- validator = new ProjectReactorValidator(settings);
+ validator = new ProjectReactorValidator(settings, mode);
}
@Test
@@ -54,6 +60,17 @@ public class ProjectReactorValidatorTest {
validator.validate(createProjectReactor("3-3"));
validator.validate(createProjectReactor("-:"));
}
+
+ @Test
+ public void allow_slash_issues_mode() {
+ when(mode.isIssues()).thenReturn(true);
+ validator.validate(createProjectReactor("project/key"));
+
+ when(mode.isIssues()).thenReturn(false);
+ thrown.expect(IllegalStateException.class);
+ thrown.expectMessage("is not a valid project or module key");
+ validator.validate(createProjectReactor("project/key"));
+ }
@Test
public void not_fail_with_alphanumeric_key() {
diff --git a/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java b/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java
index a427b165afb..70a40d084b1 100644
--- a/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java
+++ b/sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java
@@ -34,6 +34,8 @@ public final class ComponentKeys {
* Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit
*/
private static final String VALID_MODULE_KEY_REGEXP = "[\\p{Alnum}\\-_.:]*[\\p{Alpha}\\-_.:]+[\\p{Alnum}\\-_.:]*";
+
+ private static final String VALID_MODULE_KEY_ISSUES_MODE_REGEXP = "[\\p{Alnum}\\-_.:/]*[\\p{Alpha}\\-_.:/]+[\\p{Alnum}\\-_.:/]*";
/*
* Allowed characters are alphanumeric, '-', '_', '.' and '/'
*/
@@ -95,6 +97,13 @@ public final class ComponentKeys {
}
/**
+ * Same as {@link #isValidModuleKey(String)}, but allows additionally '/'.
+ */
+ public static boolean isValidModuleKeyIssuesMode(String keyCandidate) {
+ return keyCandidate.matches(VALID_MODULE_KEY_ISSUES_MODE_REGEXP);
+ }
+
+ /**
* <p>Test if given parameter is valid for a branch. Valid format is:</p>
* <ul>
* <li>Allowed characters:
diff --git a/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java b/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java
index 85d64836846..b2eb18a9d4d 100644
--- a/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/component/ComponentKeysTest.java
@@ -57,6 +57,16 @@ public class ComponentKeysTest {
assertThat(ComponentKeys.isValidModuleKey("ab_12")).isTrue();
assertThat(ComponentKeys.isValidModuleKey("ab/12")).isFalse();
}
+
+ @Test
+ public void isValidModuleKeyIssuesMode() {
+ assertThat(ComponentKeys.isValidModuleKeyIssuesMode("")).isFalse();
+ assertThat(ComponentKeys.isValidModuleKeyIssuesMode("abc")).isTrue();
+ assertThat(ComponentKeys.isValidModuleKeyIssuesMode("0123")).isFalse();
+ assertThat(ComponentKeys.isValidModuleKeyIssuesMode("ab 12")).isFalse();
+ assertThat(ComponentKeys.isValidModuleKeyIssuesMode("ab_12")).isTrue();
+ assertThat(ComponentKeys.isValidModuleKeyIssuesMode("ab/12")).isTrue();
+ }
@Test
public void isValidBranchKey() {