]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4245 Don't allow to convert a Sonar Maven project into a Sonar Maven module
authorJulien HENRY <julien.henry@sonarsource.com>
Fri, 12 Jul 2013 14:03:17 +0000 (16:03 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Fri, 12 Jul 2013 14:03:51 +0000 (16:03 +0200)
sonar-batch/src/main/java/org/sonar/batch/index/DefaultResourcePersister.java
sonar-batch/src/test/java/org/sonar/batch/index/DefaultResourcePersisterTest.java
sonar-batch/src/test/resources/org/sonar/batch/index/DefaultResourcePersisterTest/shared.xml

index 625d6480aa20dcc2b77ce432f3e6c049cb35ec80..0d754d215d6598ac8197d552a84fbaf58abe17b0 100644 (file)
@@ -287,6 +287,15 @@ public final class DefaultResourcePersister implements ResourcePersister {
       model.setDescription(resource.getDescription());
     }
     if (!ResourceUtils.isLibrary(resource)) {
+      // SONAR-4245
+      if (Scopes.PROJECT.equals(resource.getScope()) &&
+        Qualifiers.MODULE.equals(resource.getQualifier())
+        && Qualifiers.PROJECT.equals(model.getQualifier())) {
+        throw new SonarException(
+            String.format("The project '%s' is already defined in SonarQube but not as a module of project '%s'. "
+              + "If you really want to stop directly analysing project '%s', please first delete it from SonarQube and then relaunch the analysis of project '%s'.",
+                resource.getKey(), resource.getParent().getKey(), resource.getKey(), resource.getParent().getKey()));
+      }
       model.setScope(resource.getScope());
       model.setQualifier(resource.getQualifier());
     }
index a7a0273e756d54a0cf170694f510a2de84281159..68cba62d50b395ddd7d56da6fe24a5b05394dc68 100644 (file)
@@ -21,13 +21,16 @@ package org.sonar.batch.index;
 
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.sonar.api.database.model.ResourceModel;
 import org.sonar.api.resources.JavaFile;
 import org.sonar.api.resources.JavaPackage;
 import org.sonar.api.resources.Library;
 import org.sonar.api.resources.Project;
 import org.sonar.api.security.ResourcePermissions;
+import org.sonar.api.utils.SonarException;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
 
 import java.text.ParseException;
@@ -44,7 +47,10 @@ import static org.mockito.Mockito.when;
 
 public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase {
 
-  Project singleProject, singleCopyProject, multiModuleProject, moduleA, moduleB, moduleB1;
+  @Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  Project singleProject, singleCopyProject, multiModuleProject, moduleA, moduleB, moduleB1, existingProject;
   SnapshotCache snapshotCache = mock(SnapshotCache.class);
   ResourceCache resourceCache = mock(ResourceCache.class);
 
@@ -54,6 +60,9 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase {
     singleProject = newProject("foo", "java");
     singleProject.setName("Foo").setDescription("some description").setAnalysisDate(format.parse("25/12/2010"));
 
+    existingProject = newProject("my:key", "java");
+    existingProject.setName("Other project").setDescription("some description").setAnalysisDate(format.parse("25/12/2010"));
+
     singleCopyProject = newCopyProject("foo", "java", 10);
     singleCopyProject.setName("Foo").setDescription("some description").setAnalysisDate(format.parse("25/12/2010"));
 
@@ -110,6 +119,22 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase {
     checkTables("shouldSaveNewMultiModulesProject", new String[] {"build_date", "created_at"}, "projects", "snapshots");
   }
 
+  // SONAR-4245
+  @Test
+  public void shouldFailWhenTryingToConvertProjectIntoModule() {
+    setupData("shared");
+
+    ResourcePersister persister = new DefaultResourcePersister(getSession(), mock(ResourcePermissions.class), snapshotCache, resourceCache);
+    existingProject.setParent(multiModuleProject);
+    persister.saveProject(multiModuleProject, null);
+
+    thrown.expect(SonarException.class);
+    thrown.expectMessage("The project 'my:key' is already defined in SonarQube but not as a module of project 'root'. "
+      + "If you really want to stop directly analysing project 'my:key', please first delete it from SonarQube and then relaunch the analysis of project 'root'.");
+
+    persister.saveProject(existingProject, multiModuleProject);
+  }
+
   @Test
   public void shouldSaveNewDirectory() {
     setupData("shared");
index 4eaddace0e19407baf2a2b72e8a3d3c4bb906890..813a604bf6e78377504e6334b0c8617937820bb0 100644 (file)
@@ -9,4 +9,4 @@
              scope="PRJ" qualifier="TRK" created_at="2008-11-01 13:58:00.00" build_date="2008-11-01 13:58:00.00" version="[null]" path=""
              status="P" islast="false" depth="0" />
 
-</dataset>
\ No newline at end of file
+</dataset>