@@ -20,6 +20,7 @@ | |||
package org.sonar.ce.task.projectanalysis.analysis; | |||
import java.util.Map; | |||
import java.util.Optional; | |||
import javax.annotation.CheckForNull; | |||
import org.sonar.server.project.Project; | |||
import org.sonar.server.qualityprofile.QualityProfile; | |||
@@ -136,4 +137,9 @@ public interface AnalysisMetadataHolder { | |||
* Plugins used during the analysis on scanner side | |||
*/ | |||
Map<String, ScannerPlugin> getScannerPluginsByKey(); | |||
/** | |||
* Scm Revision id of the analysed code | |||
*/ | |||
Optional<String> getScmRevisionId(); | |||
} |
@@ -21,6 +21,7 @@ package org.sonar.ce.task.projectanalysis.analysis; | |||
import com.google.common.collect.ImmutableMap; | |||
import java.util.Map; | |||
import java.util.Optional; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import org.sonar.ce.task.util.InitializedProperty; | |||
@@ -45,6 +46,7 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder | |||
private final InitializedProperty<Integer> rootComponentRef = new InitializedProperty<>(); | |||
private final InitializedProperty<Map<String, QualityProfile>> qProfilesPerLanguage = new InitializedProperty<>(); | |||
private final InitializedProperty<Map<String, ScannerPlugin>> pluginsByKey = new InitializedProperty<>(); | |||
private final InitializedProperty<String> scmRevisionId = new InitializedProperty<>(); | |||
@Override | |||
public MutableAnalysisMetadataHolder setOrganizationsEnabled(boolean isOrganizationsEnabled) { | |||
@@ -216,6 +218,21 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder | |||
return pluginsByKey.getProperty(); | |||
} | |||
@Override | |||
public MutableAnalysisMetadataHolder setScmRevisionId(String scmRevisionId) { | |||
checkState(!this.scmRevisionId.isInitialized(), "ScmRevisionId has already been set"); | |||
this.scmRevisionId.setProperty(scmRevisionId); | |||
return this; | |||
} | |||
@Override | |||
public Optional<String> getScmRevisionId() { | |||
if (!scmRevisionId.isInitialized()) { | |||
return Optional.empty(); | |||
} | |||
return Optional.of(scmRevisionId.getProperty()); | |||
} | |||
@Override | |||
public boolean isShortLivingBranch() { | |||
checkState(this.branch.isInitialized(), BRANCH_NOT_SET); |
@@ -85,4 +85,9 @@ public interface MutableAnalysisMetadataHolder extends AnalysisMetadataHolder { | |||
* @throws IllegalStateException if Plugins by key has already been set | |||
*/ | |||
MutableAnalysisMetadataHolder setScannerPluginsByKey(Map<String, ScannerPlugin> pluginsByKey); | |||
/** | |||
* @throws IllegalStateException if scm revision id has already been set | |||
*/ | |||
MutableAnalysisMetadataHolder setScmRevisionId(String scmRevisionId); | |||
} |
@@ -97,6 +97,7 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep { | |||
analysisMetadata.setAnalysisDate(reportMetadata.getAnalysisDate()); | |||
analysisMetadata.setRootComponentRef(reportMetadata.getRootComponentRef()); | |||
analysisMetadata.setCrossProjectDuplicationEnabled(reportMetadata.getCrossProjectDuplicationActivated()); | |||
analysisMetadata.setScmRevisionId(reportMetadata.getScmRevisionId()); | |||
} | |||
/** |
@@ -38,6 +38,7 @@ import static org.sonar.core.config.CorePropertyDefinitions.SONAR_ANALYSIS; | |||
public class PersistAnalysisPropertiesStep implements ComputationStep { | |||
private static final String SONAR_PULL_REQUEST = "sonar.pullrequest."; | |||
private static final String SCM_REVISION_ID = "sonar.analysis.scm_revision_id"; | |||
private final DbClient dbClient; | |||
private final AnalysisMetadataHolder analysisMetadataHolder; | |||
@@ -67,6 +68,12 @@ public class PersistAnalysisPropertiesStep implements ComputationStep { | |||
} | |||
}); | |||
analysisMetadataHolder.getScmRevisionId().ifPresent(scmRevisionId -> analysisPropertyDtos.add(new AnalysisPropertyDto() | |||
.setUuid(uuidFactory.create()) | |||
.setKey(SCM_REVISION_ID) | |||
.setValue(scmRevisionId) | |||
.setSnapshotUuid(analysisMetadataHolder.getUuid()))); | |||
if (analysisPropertyDtos.isEmpty()) { | |||
return; | |||
} |
@@ -21,6 +21,7 @@ package org.sonar.ce.task.projectanalysis.analysis; | |||
import java.util.Date; | |||
import java.util.Map; | |||
import java.util.Optional; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import org.junit.rules.ExternalResource; | |||
@@ -60,6 +61,8 @@ public class AnalysisMetadataHolderRule extends ExternalResource implements Muta | |||
private final InitializedProperty<Map<String, ScannerPlugin>> pluginsByKey = new InitializedProperty<>(); | |||
private final InitializedProperty<String> scmRevisionId = new InitializedProperty<>(); | |||
@Override | |||
public AnalysisMetadataHolderRule setOrganizationsEnabled(boolean isOrganizationsEnabled) { | |||
this.organizationsEnabled.setProperty(isOrganizationsEnabled); | |||
@@ -231,6 +234,21 @@ public class AnalysisMetadataHolderRule extends ExternalResource implements Muta | |||
return pluginsByKey.getProperty(); | |||
} | |||
@Override | |||
public MutableAnalysisMetadataHolder setScmRevisionId(String scmRevisionId) { | |||
checkState(!this.scmRevisionId.isInitialized(), "ScmRevisionId has already been set"); | |||
this.scmRevisionId.setProperty(scmRevisionId); | |||
return this; | |||
} | |||
@Override | |||
public Optional<String> getScmRevisionId() { | |||
if (!scmRevisionId.isInitialized()) { | |||
return Optional.empty(); | |||
} | |||
return Optional.of(scmRevisionId.getProperty()); | |||
} | |||
@Override | |||
public boolean isShortLivingBranch() { | |||
Branch property = this.branch.getProperty(); |
@@ -20,6 +20,7 @@ | |||
package org.sonar.ce.task.projectanalysis.analysis; | |||
import java.util.Map; | |||
import java.util.Optional; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import org.junit.rules.ExternalResource; | |||
@@ -176,6 +177,19 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen | |||
return delegate.getScannerPluginsByKey(); | |||
} | |||
@Override | |||
public MutableAnalysisMetadataHolder setScmRevisionId(String scmRevisionId) { | |||
delegate.setScmRevisionId(scmRevisionId); | |||
return this; | |||
} | |||
@Override | |||
public Optional<String> getScmRevisionId() { | |||
return delegate.getScmRevisionId(); | |||
} | |||
@Override | |||
public boolean isShortLivingBranch() { | |||
return delegate.isShortLivingBranch(); |
@@ -22,6 +22,7 @@ package org.sonar.ce.task.projectanalysis.step; | |||
import com.google.common.collect.ImmutableList; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
import java.util.Optional; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.utils.System2; | |||
@@ -60,6 +61,7 @@ public class PersistAnalysisPropertiesStepTest { | |||
newContextProperty("sonar.pullrequest.empty_string", ""), | |||
newContextProperty("sonar.pullrequest.big_value", VALUE_PREFIX_FOR_PR_PROPERTIES + BIG_VALUE), | |||
newContextProperty("sonar.pullrequest.", VALUE_PREFIX_FOR_PR_PROPERTIES + SMALL_VALUE3)); | |||
private static final String SCM_REV_ID = "sha1"; | |||
@Rule | |||
public DbTester dbTester = DbTester.create(System2.INSTANCE); | |||
@@ -73,6 +75,33 @@ public class PersistAnalysisPropertiesStepTest { | |||
public void persist_should_stores_sonarDotAnalysisDot_and_sonarDotPullRequestDot_properties() { | |||
when(batchReportReader.readContextProperties()).thenReturn(CloseableIterator.from(PROPERTIES.iterator())); | |||
when(analysisMetadataHolder.getUuid()).thenReturn(SNAPSHOT_UUID); | |||
when(analysisMetadataHolder.getScmRevisionId()).thenReturn(Optional.of(SCM_REV_ID)); | |||
underTest.execute(new TestComputationStepContext()); | |||
assertThat(dbTester.countRowsOfTable("analysis_properties")).isEqualTo(9); | |||
List<AnalysisPropertyDto> propertyDtos = dbTester.getDbClient() | |||
.analysisPropertiesDao().selectBySnapshotUuid(dbTester.getSession(), SNAPSHOT_UUID); | |||
assertThat(propertyDtos) | |||
.extracting(AnalysisPropertyDto::getSnapshotUuid, AnalysisPropertyDto::getKey, AnalysisPropertyDto::getValue) | |||
.containsExactlyInAnyOrder( | |||
tuple(SNAPSHOT_UUID, "sonar.analysis.branch", SMALL_VALUE2), | |||
tuple(SNAPSHOT_UUID, "sonar.analysis.empty_string", ""), | |||
tuple(SNAPSHOT_UUID, "sonar.analysis.big_value", BIG_VALUE), | |||
tuple(SNAPSHOT_UUID, "sonar.analysis.", SMALL_VALUE3), | |||
tuple(SNAPSHOT_UUID, "sonar.analysis.scm_revision_id", SCM_REV_ID), | |||
tuple(SNAPSHOT_UUID, "sonar.pullrequest.branch", VALUE_PREFIX_FOR_PR_PROPERTIES + SMALL_VALUE2), | |||
tuple(SNAPSHOT_UUID, "sonar.pullrequest.empty_string", ""), | |||
tuple(SNAPSHOT_UUID, "sonar.pullrequest.big_value", VALUE_PREFIX_FOR_PR_PROPERTIES + BIG_VALUE), | |||
tuple(SNAPSHOT_UUID, "sonar.pullrequest.", VALUE_PREFIX_FOR_PR_PROPERTIES + SMALL_VALUE3)); | |||
} | |||
@Test | |||
public void persist_should_not_stores_sonarDotAnalysisDotscm_revision_id_properties_when_its_not_available_in_report_metada() { | |||
when(batchReportReader.readContextProperties()).thenReturn(CloseableIterator.from(PROPERTIES.iterator())); | |||
when(analysisMetadataHolder.getUuid()).thenReturn(SNAPSHOT_UUID); | |||
when(analysisMetadataHolder.getScmRevisionId()).thenReturn(Optional.empty()); | |||
underTest.execute(new TestComputationStepContext()); | |||
@@ -95,6 +124,7 @@ public class PersistAnalysisPropertiesStepTest { | |||
@Test | |||
public void persist_filtering_of_properties_is_case_sensitive() { | |||
when(analysisMetadataHolder.getScmRevisionId()).thenReturn(Optional.of(SCM_REV_ID)); | |||
when(batchReportReader.readContextProperties()).thenReturn(CloseableIterator.from(ImmutableList.of( | |||
newContextProperty("sonar.ANALYSIS.foo", "foo"), | |||
newContextProperty("sonar.anaLysis.bar", "bar"), | |||
@@ -106,17 +136,24 @@ public class PersistAnalysisPropertiesStepTest { | |||
underTest.execute(new TestComputationStepContext()); | |||
assertThat(dbTester.countRowsOfTable("analysis_properties")).isEqualTo(0); | |||
assertThat(dbTester.countRowsOfTable("analysis_properties")).isEqualTo(1); | |||
} | |||
@Test | |||
public void persist_should_not_store_anything_if_there_is_no_context_properties() { | |||
public void persist_should_only_store_scmRevisionId_if_there_is_no_context_properties() { | |||
when(analysisMetadataHolder.getScmRevisionId()).thenReturn(Optional.of(SCM_REV_ID)); | |||
when(batchReportReader.readContextProperties()).thenReturn(CloseableIterator.emptyCloseableIterator()); | |||
when(analysisMetadataHolder.getUuid()).thenReturn(SNAPSHOT_UUID); | |||
underTest.execute(new TestComputationStepContext()); | |||
assertThat(dbTester.countRowsOfTable("analysis_properties")).isEqualTo(0); | |||
assertThat(dbTester.countRowsOfTable("analysis_properties")).isEqualTo(1); | |||
List<AnalysisPropertyDto> propertyDtos = dbTester.getDbClient() | |||
.analysisPropertiesDao().selectBySnapshotUuid(dbTester.getSession(), SNAPSHOT_UUID); | |||
assertThat(propertyDtos) | |||
.extracting(AnalysisPropertyDto::getSnapshotUuid, AnalysisPropertyDto::getKey, AnalysisPropertyDto::getValue) | |||
.containsExactlyInAnyOrder(tuple(SNAPSHOT_UUID, "sonar.analysis.scm_revision_id", SCM_REV_ID)); | |||
} | |||
@Test |