aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2017-07-24 16:09:49 +0200
committerJulien HENRY <julien.henry@sonarsource.com>2017-08-07 11:44:06 +0200
commitce007ea402d4a0aac78c5d6e3d1ec19864067e77 (patch)
tree47d34171a277d95e44fa0e524abe9d60a9199e2e
parenteacbf52a96ed3dca7652dd4f34dd604d8f9c14a2 (diff)
downloadsonarqube-ce007ea402d4a0aac78c5d6e3d1ec19864067e77.tar.gz
sonarqube-ce007ea402d4a0aac78c5d6e3d1ec19864067e77.zip
SONAR-9601 Read analysis incremental flag and file status from report
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java5
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java14
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java5
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java6
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java17
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java17
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java1
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java8
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java48
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java11
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java23
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ReportComponent.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ViewsComponent.java5
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/BuildComponentTreeStepTest.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java25
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java26
17 files changed, 239 insertions, 2 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java
index 2338a6bd55f..16840e230f1 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java
@@ -53,6 +53,11 @@ public interface AnalysisMetadataHolder {
* @throws IllegalStateException if baseProjectSnapshot has not been set
*/
boolean isFirstAnalysis();
+
+ /**
+ * Whether this is an incremental analysis or a full analysis.
+ */
+ boolean isIncrementalAnalysis();
/**
* Return the last analysis of the project.
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java
index 0ddc18542f1..a5b3128a0aa 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java
@@ -34,6 +34,7 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
private final InitializedProperty<Organization> organization = new InitializedProperty<>();
private final InitializedProperty<String> uuid = new InitializedProperty<>();
private final InitializedProperty<Long> analysisDate = new InitializedProperty<>();
+ private final InitializedProperty<Boolean> incrementalAnalysis = new InitializedProperty<>();
private final InitializedProperty<Analysis> baseProjectSnapshot = new InitializedProperty<>();
private final InitializedProperty<Boolean> crossProjectDuplicationEnabled = new InitializedProperty<>();
private final InitializedProperty<String> branch = new InitializedProperty<>();
@@ -92,6 +93,19 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
}
@Override
+ public MutableAnalysisMetadataHolder setIncrementalAnalysis(boolean isIncrementalAnalysis) {
+ checkState(!incrementalAnalysis.isInitialized(), "Incremental analysis flag has already been set");
+ this.incrementalAnalysis.setProperty(isIncrementalAnalysis);
+ return this;
+ }
+
+ @Override
+ public boolean isIncrementalAnalysis() {
+ checkState(incrementalAnalysis.isInitialized(), "Incremental analysis flag has not been set");
+ return this.incrementalAnalysis.getProperty();
+ }
+
+ @Override
public MutableAnalysisMetadataHolder setBaseAnalysis(@Nullable Analysis baseAnalysis) {
checkState(!this.baseProjectSnapshot.isInitialized(), "Base project snapshot has already been set");
this.baseProjectSnapshot.setProperty(baseAnalysis);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java
index 3032d536b2e..b72db656916 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java
@@ -41,6 +41,11 @@ public interface MutableAnalysisMetadataHolder extends AnalysisMetadataHolder {
MutableAnalysisMetadataHolder setAnalysisDate(long date);
/**
+ * @throws IllegalStateException if it has already been set
+ */
+ MutableAnalysisMetadataHolder setIncrementalAnalysis(boolean isIncrementalAnalysis);
+
+ /**
* @throws IllegalStateException if baseAnalysis has already been set
*/
MutableAnalysisMetadataHolder setBaseAnalysis(@Nullable Analysis baseAnalysis);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java
index 89481723f5f..0d2b65169d0 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java
@@ -58,8 +58,14 @@ public interface Component {
}
}
+ enum Status {
+ UNAVAILABLE, SAME, CHANGED, ADDED;
+ }
+
Type getType();
+ Status getStatus();
+
/**
* Returns the component uuid
*/
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java
index 490ed4e5345..e7686fa9d2f 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImpl.java
@@ -35,6 +35,7 @@ import static org.apache.commons.lang.StringUtils.trimToNull;
@Immutable
public class ComponentImpl implements Component {
private final Type type;
+ private final Status status;
private final String name;
private final String key;
private final String uuid;
@@ -49,6 +50,7 @@ public class ComponentImpl implements Component {
private ComponentImpl(Builder builder) {
this.type = builder.type;
+ this.status = builder.status;
this.key = builder.key;
this.name = builder.name;
this.description = builder.description;
@@ -62,6 +64,11 @@ public class ComponentImpl implements Component {
public Type getType() {
return type;
}
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
@Override
public String getUuid() {
@@ -125,8 +132,10 @@ public class ComponentImpl implements Component {
private static final String UUID_CANNOT_BE_NULL = "uuid can't be null";
private static final String REPORT_ATTRIBUTES_CANNOT_BE_NULL = "reportAttributes can't be null";
private static final String NAME_CANNOT_BE_NULL = "name can't be null";
-
+ private static final String STATUS_CANNOT_BE_NULL = "status can't be null";
+
private final Type type;
+ private Status status;
private ReportAttributes reportAttributes;
private String uuid;
private String key;
@@ -153,6 +162,11 @@ public class ComponentImpl implements Component {
public String getUuid() {
return uuid;
}
+
+ public Builder setStatus(Status status) {
+ this.status = requireNonNull(status, STATUS_CANNOT_BE_NULL);
+ return this;
+ }
public Builder setKey(String s) {
this.key = requireNonNull(s, KEY_CANNOT_BE_NULL);
@@ -187,6 +201,7 @@ public class ComponentImpl implements Component {
requireNonNull(uuid, UUID_CANNOT_BE_NULL);
requireNonNull(key, KEY_CANNOT_BE_NULL);
requireNonNull(name, NAME_CANNOT_BE_NULL);
+ requireNonNull(status, STATUS_CANNOT_BE_NULL);
return new ComponentImpl(this);
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java
index ab731524c02..75a964a0e40 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java
@@ -125,6 +125,7 @@ public class ComponentRootBuilder {
return ComponentImpl.builder(convertType(reportComponent.getType()))
.setUuid(uuidSupplier.apply(componentKey))
.setKey(componentKey)
+ .setStatus(convertStatus(reportComponent.getStatus()))
.setDescription(trimToNull(reportComponent.getDescription()))
.setFileAttributes(createFileAttributes(reportComponent))
.addChildren(toArray(buildChildren(reportComponent, latestModuleKey), Component.class));
@@ -197,6 +198,22 @@ public class ComponentRootBuilder {
component.getLines());
}
+ static Component.Status convertStatus(ScannerReport.Component.FileStatus status) {
+ switch(status) {
+ case ADDED:
+ return Component.Status.ADDED;
+ case SAME:
+ return Component.Status.SAME;
+ case CHANGED:
+ return Component.Status.CHANGED;
+ case UNAVAILABLE:
+ return Component.Status.UNAVAILABLE;
+ case UNRECOGNIZED:
+ default:
+ throw new IllegalArgumentException("Unsupported ComponentType value " + status);
+ }
+ }
+
@VisibleForTesting
static Component.Type convertType(ScannerReport.Component.ComponentType type) {
switch (type) {
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java
index 5898ef8b095..f4cff3f6738 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java
@@ -95,6 +95,7 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {
mutableAnalysisMetadataHolder.setRootComponentRef(reportMetadata.getRootComponentRef());
mutableAnalysisMetadataHolder.setBranch(isNotEmpty(reportMetadata.getBranch()) ? reportMetadata.getBranch() : null);
mutableAnalysisMetadataHolder.setCrossProjectDuplicationEnabled(reportMetadata.getCrossProjectDuplicationActivated());
+ mutableAnalysisMetadataHolder.setIncrementalAnalysis(reportMetadata.getIncremental());
mutableAnalysisMetadataHolder.setQProfilesByLanguage(transformValues(reportMetadata.getQprofilesPerLanguage(), TO_COMPUTE_QPROFILE));
mutableAnalysisMetadataHolder.setOrganization(organization);
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java
index 6c7ff308160..0eb52d2aa9b 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java
@@ -115,6 +115,7 @@ public class ValidateProjectStep implements ComputationStep {
this.rawProject = rawProject;
String rawProjectKey = rawProject.getKey();
validateBranch();
+ validateNotIncrementalAndFirstAnalysis(rawProjectKey);
validateBatchKey(rawProject);
Optional<ComponentDto> baseProject = loadBaseComponent(rawProjectKey);
@@ -132,6 +133,13 @@ public class ValidateProjectStep implements ComputationStep {
}
}
+ private void validateNotIncrementalAndFirstAnalysis(String rawProjectKey) {
+ if (analysisMetadataHolder.isIncrementalAnalysis() && analysisMetadataHolder.isFirstAnalysis()) {
+ validationMessages.add(format("The project \"%s\" hasn't been analysed before and the first analysis can't be incremental."
+ + " Please launch a full analysis of the project.", rawProjectKey));
+ }
+ }
+
private void validateProjectKey(Optional<ComponentDto> baseProject, String rawProjectKey) {
if (baseProject.isPresent() && !baseProject.get().projectUuid().equals(baseProject.get().uuid())) {
// Project key is already used as a module of another project
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java
index 4cb9539c18f..707acbeaffb 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java
@@ -199,7 +199,7 @@ public class AnalysisMetadataHolderImplTest {
new AnalysisMetadataHolderImpl().isCrossProjectDuplicationEnabled();
}
-
+
@Test
public void setIsCrossProjectDuplicationEnabled_throws_ISE_when_called_twice() {
AnalysisMetadataHolderImpl underTest = new AnalysisMetadataHolderImpl();
@@ -211,6 +211,52 @@ public class AnalysisMetadataHolderImplTest {
}
@Test
+ public void setIsIncrementalAnalysis_throws_ISE_when_called_twice() {
+ AnalysisMetadataHolderImpl underTest = new AnalysisMetadataHolderImpl();
+ underTest.setIncrementalAnalysis(true);
+
+ expectedException.expect(IllegalStateException.class);
+ expectedException.expectMessage("Incremental analysis flag has already been set");
+ underTest.setIncrementalAnalysis(false);
+ }
+
+ @Test
+ public void isIncrementalAnalysis_return_true() {
+ AnalysisMetadataHolderImpl underTest = new AnalysisMetadataHolderImpl();
+
+ underTest.setIncrementalAnalysis(true);
+
+ assertThat(underTest.isIncrementalAnalysis()).isEqualTo(true);
+ }
+
+ @Test
+ public void isIncrementalAnalysis_return_false() {
+ AnalysisMetadataHolderImpl underTest = new AnalysisMetadataHolderImpl();
+
+ underTest.setIncrementalAnalysis(false);
+
+ assertThat(underTest.isIncrementalAnalysis()).isEqualTo(false);
+ }
+
+ @Test
+ public void isIncrementalAnalysisEnabled_throws_ISE_when_holder_is_not_initialized() {
+ expectedException.expect(IllegalStateException.class);
+ expectedException.expectMessage("Incremental analysis flag has not been set");
+
+ new AnalysisMetadataHolderImpl().isIncrementalAnalysis();
+ }
+
+ @Test
+ public void setIsIncrementalAnalys_throws_ISE_when_called_twice() {
+ AnalysisMetadataHolderImpl underTest = new AnalysisMetadataHolderImpl();
+ underTest.setIncrementalAnalysis(true);
+
+ expectedException.expect(IllegalStateException.class);
+ expectedException.expectMessage("Incremental analysis flag has already been set");
+ underTest.setIncrementalAnalysis(false);
+ }
+
+ @Test
public void set_branch() {
AnalysisMetadataHolderImpl underTest = new AnalysisMetadataHolderImpl();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java
index dc6e1da9fa6..41a06d3f9ee 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java
@@ -40,6 +40,8 @@ public class AnalysisMetadataHolderRule extends ExternalResource implements Muta
private final InitializedProperty<Long> analysisDate = new InitializedProperty<>();
+ private final InitializedProperty<Boolean> incremental = new InitializedProperty<>();
+
private final InitializedProperty<Analysis> baseAnalysis = new InitializedProperty<>();
private final InitializedProperty<Boolean> crossProjectDuplicationEnabled = new InitializedProperty<>();
@@ -171,4 +173,16 @@ public class AnalysisMetadataHolderRule extends ExternalResource implements Muta
checkState(qProfilesPerLanguage.isInitialized(), "QProfile per language has not been set");
return qProfilesPerLanguage.getProperty();
}
+
+ @Override
+ public boolean isIncrementalAnalysis() {
+ checkState(incremental.isInitialized(), "Incremental mode flag has not been set");
+ return incremental.getProperty();
+ }
+
+ @Override
+ public AnalysisMetadataHolderRule setIncrementalAnalysis(boolean isIncrementalAnalysis) {
+ this.incremental.setProperty(isIncrementalAnalysis);
+ return this;
+ }
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java
index 473fc706e01..39bdf31b1f8 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java
@@ -129,4 +129,15 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
public Map<String, QualityProfile> getQProfilesByLanguage() {
return delegate.getQProfilesByLanguage();
}
+
+ @Override
+ public boolean isIncrementalAnalysis() {
+ return delegate.isIncrementalAnalysis();
+ }
+
+ @Override
+ public MutableAnalysisMetadataHolder setIncrementalAnalysis(boolean isIncrementalAnalysis) {
+ delegate.setIncrementalAnalysis(isIncrementalAnalysis);
+ return this;
+ }
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java
index 1ef919a3185..df3d2148023 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ComponentImplTest.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
@@ -54,6 +55,25 @@ public class ComponentImplTest {
}
@Test
+ public void builder_throws_NPE_if_status_arg_is_Null() {
+ thrown.expect(NullPointerException.class);
+
+ builder(FILE).setStatus(null);
+ }
+
+ @Test
+ public void builder_throws_NPE_if_status_is_Null() {
+ thrown.expect(NullPointerException.class);
+
+ builder(Component.Type.DIRECTORY)
+ .setName("DIR")
+ .setKey(KEY)
+ .setUuid(UUID)
+ .setReportAttributes(ReportAttributes.newBuilder(1).build())
+ .build();
+ }
+
+ @Test
public void set_key_throws_NPE_if_component_arg_is_Null() {
thrown.expect(NullPointerException.class);
@@ -154,12 +174,14 @@ public class ComponentImplTest {
.setName("CHILD_NAME")
.setKey("CHILD_KEY")
.setUuid("CHILD_UUID")
+ .setStatus(Status.UNAVAILABLE)
.setReportAttributes(ReportAttributes.newBuilder(2).build())
.build();
ComponentImpl componentImpl = builder(Component.Type.DIRECTORY)
.setName("DIR")
.setKey(KEY)
.setUuid(UUID)
+ .setStatus(Status.UNAVAILABLE)
.setReportAttributes(ReportAttributes.newBuilder(1).build())
.addChildren(child)
.build();
@@ -193,6 +215,7 @@ public class ComponentImplTest {
return builder(type)
.setName("name_" + key)
.setKey(key)
+ .setStatus(Status.UNAVAILABLE)
.setUuid("uuid_" + key)
.setReportAttributes(ReportAttributes.newBuilder(key.hashCode())
.build());
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ReportComponent.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ReportComponent.java
index 7c90e551f5b..f4f27679803 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ReportComponent.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ReportComponent.java
@@ -40,6 +40,7 @@ public class ReportComponent implements Component {
public static final Component DUMB_PROJECT = builder(Type.PROJECT, 1).setKey("PROJECT_KEY").setUuid("PROJECT_UUID").setName("Project Name").setVersion("1.0-SNAPSHOT").build();
private final Type type;
+ private final Status status;
private final String name;
@CheckForNull
private final String description;
@@ -51,6 +52,7 @@ public class ReportComponent implements Component {
private ReportComponent(Builder builder) {
this.type = builder.type;
+ this.status = builder.status;
this.key = builder.key;
this.name = builder.name == null ? String.valueOf(builder.key) : builder.name;
this.description = builder.description;
@@ -67,6 +69,11 @@ public class ReportComponent implements Component {
public Type getType() {
return type;
}
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
@Override
public String getUuid() {
@@ -159,6 +166,7 @@ public class ReportComponent implements Component {
public static final class Builder {
private final Type type;
private final int ref;
+ private Status status;
private String uuid;
private String key;
private String name;
@@ -174,6 +182,11 @@ public class ReportComponent implements Component {
this.ref = ref;
}
+ public Builder setStatus(Status s) {
+ this.status = Objects.requireNonNull(s);
+ return this;
+ }
+
public Builder setUuid(String s) {
this.uuid = Objects.requireNonNull(s);
return this;
@@ -222,4 +235,5 @@ public class ReportComponent implements Component {
return new ReportComponent(this);
}
}
+
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ViewsComponent.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ViewsComponent.java
index 9f9824dce02..b9fbf989025 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ViewsComponent.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/ViewsComponent.java
@@ -136,6 +136,11 @@ public class ViewsComponent implements Component {
public Type getType() {
return type;
}
+
+ @Override
+ public Status getStatus() {
+ return Status.UNAVAILABLE;
+ }
@Override
public String getUuid() {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/BuildComponentTreeStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/BuildComponentTreeStepTest.java
index 06bce8981c1..b949295806c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/BuildComponentTreeStepTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/BuildComponentTreeStepTest.java
@@ -36,6 +36,7 @@ import org.sonar.db.component.SnapshotDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType;
+import org.sonar.scanner.protocol.output.ScannerReport.Component.FileStatus;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderImpl;
import org.sonar.server.computation.task.projectanalysis.analysis.MutableAnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.analysis.MutableAnalysisMetadataHolderRule;
@@ -339,6 +340,7 @@ public class BuildComponentTreeStepTest {
ScannerReport.Component.Builder builder = ScannerReport.Component.newBuilder()
.setType(componentType)
.setRef(componentRef)
+ .setStatus(FileStatus.UNAVAILABLE)
.setLines(1);
if (key != null) {
builder.setKey(key);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java
index 1e0b1e246d5..3169ada19ed 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java
@@ -147,6 +147,31 @@ public class LoadReportAnalysisMetadataHolderStepTest {
assertThat(analysisMetadataHolder.isCrossProjectDuplicationEnabled()).isEqualTo(false);
}
+
+ @Test
+ public void set_incremental_analysis_to_true() {
+ reportReader.setMetadata(
+ newBatchReportBuilder()
+ .setIncremental(true)
+ .build());
+
+ underTest.execute();
+
+ assertThat(analysisMetadataHolder.isIncrementalAnalysis()).isTrue();
+ }
+
+ @Test
+ public void set_incremental_analysis_to_false() {
+ reportReader.setMetadata(
+ newBatchReportBuilder()
+ .setIncremental(false)
+ .build());
+
+ underTest.execute();
+
+ assertThat(analysisMetadataHolder.isIncrementalAnalysis()).isFalse();
+ }
+
@Test
public void set_cross_project_duplication_to_false_when_nothing_in_the_report() {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java
index f1c0120b291..499699b183e 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java
@@ -62,6 +62,7 @@ public class ValidateProjectStepTest {
@Rule
public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule()
.setAnalysisDate(new Date(DEFAULT_ANALYSIS_TIME))
+ .setIncrementalAnalysis(false)
.setBranch(DEFAULT_BRANCH);
DbClient dbClient = dbTester.getDbClient();
@@ -290,4 +291,29 @@ public class ValidateProjectStepTest {
underTest.execute();
}
+
+ @Test
+ public void fail_if_incremental_and_first_analysis() {
+ analysisMetadataHolder.setBaseAnalysis(null);
+ //setAnalysisDate(DateUtils.parseDate("2015-01-01"));
+
+ reportReader.putComponent(ScannerReport.Component.newBuilder()
+ .setRef(1)
+ .setType(ComponentType.PROJECT)
+ .setKey(PROJECT_KEY)
+ .addChildRef(2)
+ .build());
+
+ analysisMetadataHolder.setIncrementalAnalysis(true);
+
+ //dbTester.getSession().commit();
+
+ treeRootHolder.setRoot(ReportComponent.builder(Component.Type.PROJECT, 1).setUuid("ABCD").setKey(PROJECT_KEY).build());
+
+ thrown.expect(MessageException.class);
+ thrown.expectMessage("Validation of project failed:");
+ thrown.expectMessage("hasn't been analysed before and the first analysis can't be incremental. Please launch a full analysis of the project.");
+
+ underTest.execute();
+ }
}