aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJacek <jacek.poreda@sonarsource.com>2022-03-07 12:54:18 +0100
committersonartech <sonartech@sonarsource.com>2022-03-11 10:30:55 +0000
commit9e044bfd2a1a70ccdbf2b09c0e1252a21d93b51c (patch)
treee0e8966b27206f03d0d19890c012e57a6152ae82 /server
parent274eab2c00b33c4f94d36a9dfb10087634e7b07f (diff)
downloadsonarqube-9e044bfd2a1a70ccdbf2b09c0e1252a21d93b51c.tar.gz
sonarqube-9e044bfd2a1a70ccdbf2b09c0e1252a21d93b51c.zip
SONAR-16100 When reference branch strategy used and file is not under SCM, use component from referenced branch when computing changeset
Diffstat (limited to 'server')
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoader.java24
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryImpl.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoaderTest.java41
3 files changed, 60 insertions, 7 deletions
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoader.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoader.java
index 9ab36aa83ea..254cffdcc97 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoader.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoader.java
@@ -27,8 +27,11 @@ import org.sonar.ce.task.projectanalysis.analysis.Branch;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.ReferenceBranchComponentUuids;
import org.sonar.ce.task.projectanalysis.filemove.MovedFilesRepository;
+import org.sonar.ce.task.projectanalysis.period.NewCodeReferenceBranchComponentUuids;
+import org.sonar.ce.task.projectanalysis.period.PeriodHolder;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
+import org.sonar.db.newcodeperiod.NewCodePeriodType;
import org.sonar.db.source.FileSourceDto;
public class ScmInfoDbLoader {
@@ -38,13 +41,20 @@ public class ScmInfoDbLoader {
private final MovedFilesRepository movedFilesRepository;
private final DbClient dbClient;
private final ReferenceBranchComponentUuids referenceBranchComponentUuid;
+ private final NewCodeReferenceBranchComponentUuids newCodeReferenceBranchComponentUuids;
+ private final PeriodHolder periodHolder;
- public ScmInfoDbLoader(AnalysisMetadataHolder analysisMetadataHolder, MovedFilesRepository movedFilesRepository, DbClient dbClient,
- ReferenceBranchComponentUuids referenceBranchComponentUuid) {
+ public ScmInfoDbLoader(AnalysisMetadataHolder analysisMetadataHolder, MovedFilesRepository movedFilesRepository,
+ DbClient dbClient,
+ ReferenceBranchComponentUuids referenceBranchComponentUuid,
+ NewCodeReferenceBranchComponentUuids newCodeReferenceBranchComponentUuids,
+ PeriodHolder periodHolder) {
this.analysisMetadataHolder = analysisMetadataHolder;
this.movedFilesRepository = movedFilesRepository;
this.dbClient = dbClient;
this.referenceBranchComponentUuid = referenceBranchComponentUuid;
+ this.newCodeReferenceBranchComponentUuids = newCodeReferenceBranchComponentUuids;
+ this.periodHolder = periodHolder;
}
public Optional<DbScmInfo> getScmInfo(Component file) {
@@ -64,7 +74,7 @@ public class ScmInfoDbLoader {
}
private Optional<String> getFileUUid(Component file) {
- if (!analysisMetadataHolder.isFirstAnalysis() && !analysisMetadataHolder.isPullRequest()) {
+ if (!analysisMetadataHolder.isFirstAnalysis() && !analysisMetadataHolder.isPullRequest() && !isReferenceBranch()) {
Optional<MovedFilesRepository.OriginalFile> originalFile = movedFilesRepository.getOriginalFile(file);
if (originalFile.isPresent()) {
return originalFile.map(MovedFilesRepository.OriginalFile::getUuid);
@@ -72,6 +82,10 @@ public class ScmInfoDbLoader {
return Optional.of(file.getUuid());
}
+ if (isReferenceBranch()) {
+ return Optional.ofNullable(newCodeReferenceBranchComponentUuids.getComponentUuid(file.getDbKey()));
+ }
+
// at this point, it's the first analysis of a branch with copyFromPrevious flag true or any analysis of a PR
Branch branch = analysisMetadataHolder.getBranch();
if (!branch.isMain()) {
@@ -81,4 +95,8 @@ public class ScmInfoDbLoader {
return Optional.empty();
}
+ private boolean isReferenceBranch() {
+ return periodHolder.hasPeriod() && periodHolder.getPeriod().getMode().equals(NewCodePeriodType.REFERENCE_BRANCH.name());
+ }
+
}
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryImpl.java
index 19b0111940b..679fea498d4 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryImpl.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoRepositoryImpl.java
@@ -113,7 +113,7 @@ public class ScmInfoRepositoryImpl implements ScmInfoRepository {
*/
private Optional<ScmInfo> generateAndMergeDb(Component file, boolean keepAuthorAndRevision) {
Optional<DbScmInfo> dbInfoOpt = scmInfoDbLoader.getScmInfo(file);
- if (!dbInfoOpt.isPresent()) {
+ if (dbInfoOpt.isEmpty()) {
return generateScmInfoForAllFile(file);
}
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoaderTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoaderTest.java
index 04437354c97..fdd502b82fb 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoaderTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/scm/ScmInfoDbLoaderTest.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nullable;
+import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
@@ -36,10 +37,14 @@ import org.sonar.ce.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.ReferenceBranchComponentUuids;
import org.sonar.ce.task.projectanalysis.filemove.MutableMovedFilesRepositoryRule;
+import org.sonar.ce.task.projectanalysis.period.NewCodeReferenceBranchComponentUuids;
+import org.sonar.ce.task.projectanalysis.period.Period;
+import org.sonar.ce.task.projectanalysis.period.PeriodHolderRule;
import org.sonar.core.hash.SourceHashComputer;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchType;
+import org.sonar.db.newcodeperiod.NewCodePeriodType;
import org.sonar.db.protobuf.DbFileSources;
import org.sonar.db.source.FileSourceDto;
@@ -69,11 +74,20 @@ public class ScmInfoDbLoaderTest {
public BatchReportReaderRule reportReader = new BatchReportReaderRule();
@Rule
public MutableMovedFilesRepositoryRule movedFiles = new MutableMovedFilesRepositoryRule();
+ @Rule
+ public PeriodHolderRule periodHolder = new PeriodHolderRule();
+
+ private final Branch branch = mock(Branch.class);
+ private final ReferenceBranchComponentUuids referenceBranchComponentUuids = mock(ReferenceBranchComponentUuids.class);
+ private final NewCodeReferenceBranchComponentUuids newCodeReferenceBranchComponentUuids = mock(NewCodeReferenceBranchComponentUuids.class);
- private Branch branch = mock(Branch.class);
- private ReferenceBranchComponentUuids referenceBranchComponentUuids = mock(ReferenceBranchComponentUuids.class);
+ private final ScmInfoDbLoader underTest = new ScmInfoDbLoader(analysisMetadataHolder, movedFiles, dbTester.getDbClient(), referenceBranchComponentUuids,
+ newCodeReferenceBranchComponentUuids, periodHolder);
- private ScmInfoDbLoader underTest = new ScmInfoDbLoader(analysisMetadataHolder, movedFiles, dbTester.getDbClient(), referenceBranchComponentUuids);
+ @Before
+ public void before() {
+ periodHolder.setPeriod(new Period(NewCodePeriodType.PREVIOUS_VERSION.name(), null, null));
+ }
@Test
public void returns_ScmInfo_from_DB() {
@@ -127,6 +141,27 @@ public class ScmInfoDbLoaderTest {
}
@Test
+ public void read_from_target_if_reference_branch() {
+ periodHolder.setPeriod(new Period(NewCodePeriodType.REFERENCE_BRANCH.name(), null, null));
+
+ Branch branch = mock(Branch.class);
+ when(branch.getType()).thenReturn(BranchType.BRANCH);
+ analysisMetadataHolder.setBaseAnalysis(null);
+ analysisMetadataHolder.setBranch(branch);
+
+ String targetBranchFileUuid = "targetBranchFileUuid";
+ String hash = computeSourceHash(1);
+
+ when(newCodeReferenceBranchComponentUuids.getComponentUuid(FILE.getDbKey())).thenReturn(targetBranchFileUuid);
+ addFileSourceInDb("henry", DATE_1, "rev-1", hash, targetBranchFileUuid);
+
+ DbScmInfo scmInfo = underTest.getScmInfo(FILE).get();
+ assertThat(scmInfo.getAllChangesets()).hasSize(1);
+ assertThat(scmInfo.fileHash()).isEqualTo(hash);
+ assertThat(logTester.logs(TRACE)).containsOnly("Reading SCM info from DB for file 'targetBranchFileUuid'");
+ }
+
+ @Test
public void return_empty_if_no_dto_available() {
analysisMetadataHolder.setBaseAnalysis(baseProjectAnalysis);
analysisMetadataHolder.setBranch(null);