Browse Source

SONAR-9575 Revert all changes made to support incremental mode

tags/6.6-RC1
Julien HENRY 6 years ago
parent
commit
e7868aa03d
91 changed files with 142 additions and 1497 deletions
  1. 1
    2
      server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl
  2. 0
    1
      server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeTaskCharacteristicDto.java
  3. 0
    10
      server/sonar-db-dao/src/main/java/org/sonar/db/component/SnapshotDto.java
  4. 3
    6
      server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml
  5. 1
    7
      server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDaoTest.java
  6. 0
    2
      server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDtoTest.java
  7. 0
    2
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis-result.xml
  8. 0
    2
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis.xml
  9. 0
    1
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components-result.xml
  10. 0
    1
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components.xml
  11. 0
    2
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAbortedBuilds-result.xml
  12. 0
    3
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAbortedBuilds.xml
  13. 0
    2
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses-result.xml
  14. 0
    3
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses.xml
  15. 0
    2
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles-result.xml
  16. 0
    2
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles.xml
  17. 0
    3
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldPurgeProject-result.xml
  18. 0
    3
      server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldPurgeProject.xml
  19. 0
    45
      server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v66/AddIncrementalColumnToSnapshotsTable.java
  20. 1
    3
      server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v66/DbVersion66.java
  21. 0
    58
      server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v66/AddIncrementalColumnToSnapshotsTableTest.java
  22. 3
    3
      server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v66/DbVersion66Test.java
  23. 1
    2
      server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
  24. 1
    2
      server/sonar-server/src/main/java/org/sonar/server/ce/ws/ComponentAction.java
  25. 3
    4
      server/sonar-server/src/main/java/org/sonar/server/ce/ws/SubmitAction.java
  26. 0
    1
      server/sonar-server/src/main/java/org/sonar/server/ce/ws/TaskAction.java
  27. 0
    13
      server/sonar-server/src/main/java/org/sonar/server/ce/ws/TaskFormatter.java
  28. 0
    5
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java
  29. 0
    15
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java
  30. 0
    5
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java
  31. 0
    24
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/duplication/IncrementalDuplicationMeasures.java
  32. 8
    34
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitor.java
  33. 0
    1
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueLifecycle.java
  34. 0
    27
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/IncrementalMeasureTransition.java
  35. 2
    22
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/DuplicationMeasuresStep.java
  36. 0
    50
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/IncrementalMeasureTransitionStep.java
  37. 12
    18
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadDuplicationsFromReportStep.java
  38. 1
    8
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java
  39. 3
    4
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistAnalysisStep.java
  40. 3
    25
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistCrossProjectDuplicationIndexStep.java
  41. 2
    10
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java
  42. 0
    3
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationSteps.java
  43. 6
    38
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java
  44. 0
    24
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/validation/ValidateIncremental.java
  45. 0
    23
      server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/validation/package-info.java
  46. 0
    75
      server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java
  47. 4
    47
      server/sonar-server/src/test/java/org/sonar/server/ce/ws/ComponentActionTest.java
  48. 11
    12
      server/sonar-server/src/test/java/org/sonar/server/ce/ws/SubmitActionTest.java
  49. 0
    32
      server/sonar-server/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java
  50. 0
    46
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java
  51. 0
    14
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java
  52. 0
    11
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java
  53. 10
    35
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java
  54. 0
    20
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/scm/ScmInfoDbLoaderTest.java
  55. 3
    21
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/DuplicationMeasuresStepTest.java
  56. 0
    58
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/IncrementalMeasureTransitionStepTest.java
  57. 10
    47
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadDuplicationsFromReportStepTest.java
  58. 0
    24
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java
  59. 0
    32
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistCrossProjectDuplicationIndexStepTest.java
  60. 6
    72
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java
  61. 0
    5
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ReportPersistAnalysisStepTest.java
  62. 3
    79
      server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java
  63. 1
    2
      sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java
  64. 0
    5
      sonar-plugin-api/src/main/java/org/sonar/api/batch/AnalysisMode.java
  65. 0
    10
      sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/MockAnalysisMode.java
  66. 2
    54
      sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/DefaultAnalysisMode.java
  67. 0
    24
      sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/IncrementalScannerHandler.java
  68. 2
    6
      sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java
  69. 1
    8
      sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java
  70. 4
    7
      sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectReactorValidator.java
  71. 1
    1
      sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/branch/BranchParamsValidator.java
  72. 1
    1
      sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/branch/DefaultBranchParamsValidator.java
  73. 2
    5
      sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java
  74. 2
    3
      sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStoreProvider.java
  75. 1
    12
      sonar-scanner-engine/src/main/java/org/sonar/scanner/source/ZeroCoverageSensor.java
  76. 1
    58
      sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/DefaultAnalysisModeTest.java
  77. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java
  78. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java
  79. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/report/CoveragePublisherTest.java
  80. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MeasuresPublisherTest.java
  81. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java
  82. 9
    44
      sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java
  83. 1
    29
      sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java
  84. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java
  85. 1
    4
      sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectReactorValidatorTest.java
  86. 2
    3
      sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java
  87. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java
  88. 1
    2
      sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/report/JSONReportTest.java
  89. 0
    46
      sonar-scanner-engine/src/test/java/org/sonar/scanner/source/ZeroCoverageSensorTest.java
  90. 3
    5
      sonar-scanner-protocol/src/main/protobuf/scanner_report.proto
  91. 2
    3
      sonar-ws/src/main/protobuf/ws-ce.proto

+ 1
- 2
server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl View File

@@ -124,8 +124,7 @@ CREATE TABLE "SNAPSHOTS" (
"PERIOD4_DATE" BIGINT,
"PERIOD5_MODE" VARCHAR(100),
"PERIOD5_PARAM" VARCHAR(100),
"PERIOD5_DATE" BIGINT,
"INCREMENTAL" BOOLEAN DEFAULT FALSE
"PERIOD5_DATE" BIGINT
);
CREATE INDEX "SNAPSHOT_COMPONENT" ON "SNAPSHOTS" ("COMPONENT_UUID");
CREATE UNIQUE INDEX "ANALYSES_UUID" ON "SNAPSHOTS" ("UUID");

+ 0
- 1
server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeTaskCharacteristicDto.java View File

@@ -21,7 +21,6 @@ package org.sonar.db.ce;

public class CeTaskCharacteristicDto {

public static final String INCREMENTAL_KEY = "incremental";
public static final String BRANCH_KEY = "branch";
public static final String BRANCH_TYPE_KEY = "branchType";


+ 0
- 10
server/sonar-db-dao/src/main/java/org/sonar/db/component/SnapshotDto.java View File

@@ -42,7 +42,6 @@ public final class SnapshotDto {
private String periodMode;
private String periodParam;
private Long periodDate;
private boolean incremental = false;

public Long getId() {
return id;
@@ -156,15 +155,6 @@ public final class SnapshotDto {
return this;
}

public boolean getIncremental() {
return incremental;
}

public SnapshotDto setIncremental(boolean incremental) {
this.incremental = incremental;
return this;
}

/**
* @return analysis date
*/

+ 3
- 6
server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml View File

@@ -14,8 +14,7 @@
s.version as version,
s.period1_mode as periodMode,
s.period1_param as periodParam,
s.period1_date as periodDate,
s.incremental as incremental
s.period1_date as periodDate
</sql>

<sql id="viewsSnapshotColumns">
@@ -181,8 +180,7 @@
version,
period1_mode,
period1_param,
period1_date,
incremental)
period1_date)
values (
#{uuid, jdbcType=VARCHAR},
#{componentUuid, jdbcType=VARCHAR},
@@ -194,8 +192,7 @@
#{version, jdbcType=VARCHAR},
#{periodMode, jdbcType=VARCHAR},
#{periodParam, jdbcType=VARCHAR},
#{periodDate, jdbcType=BIGINT},
#{incremental, jdbcType=BOOLEAN})
#{periodDate, jdbcType=BIGINT})
</insert>
</mapper>


+ 1
- 7
server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDaoTest.java View File

@@ -73,7 +73,6 @@ public class SnapshotDaoTest {
.setPeriodParam("30")
.setPeriodDate(1500000000001L)
.setVersion("2.1-SNAPSHOT")
.setIncremental(false)
.setBuildDate(1500000000006L)
.setCreatedAt(1403042400000L));

@@ -91,8 +90,6 @@ public class SnapshotDaoTest {
assertThat(result.getBuildDate()).isEqualTo(1500000000006L);
assertThat(result.getCreatedAt()).isEqualTo(1403042400000L);
assertThat(result.getVersion()).isEqualTo("2.1-SNAPSHOT");
assertThat(result.getIncremental()).isFalse();


assertThat(underTest.selectByUuid(db.getSession(), "DOES_NOT_EXIST").isPresent()).isFalse();
}
@@ -269,7 +266,6 @@ public class SnapshotDaoTest {
.setPeriodDate(1500000000001L)
.setVersion("2.1-SNAPSHOT")
.setBuildDate(1500000000006L)
.setIncremental(true)
.setCreatedAt(1403042400000L));

assertThat(dto.getId()).isNotNull();
@@ -284,7 +280,6 @@ public class SnapshotDaoTest {
assertThat(dto.getBuildDate()).isEqualTo(1500000000006L);
assertThat(dto.getCreatedAt()).isEqualTo(1403042400000L);
assertThat(dto.getVersion()).isEqualTo("2.1-SNAPSHOT");
assertThat(dto.getIncremental()).isTrue();

}

@@ -393,8 +388,7 @@ public class SnapshotDaoTest {
.setPeriodMode("days1")
.setPeriodParam("30")
.setPeriodDate(1_500_000_000_001L)
.setBuildDate(1_500_000_000_006L)
.setIncremental(false);
.setBuildDate(1_500_000_000_006L);
}

private CeActivityDto insertActivity(SnapshotDto analysis, CeActivityDto.Status status) {

+ 0
- 2
server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDtoTest.java View File

@@ -36,7 +36,6 @@ public class SnapshotDtoTest {
.setVersion("1.0")
.setPeriodMode("mode1")
.setPeriodParam("param1")
.setIncremental(true)
.setPeriodDate(parseDate("2014-06-01").getTime());

assertThat(snapshotDto.getId()).isEqualTo(10L);
@@ -46,7 +45,6 @@ public class SnapshotDtoTest {
assertThat(snapshotDto.getVersion()).isEqualTo("1.0");
assertThat(snapshotDto.getPeriodMode()).isEqualTo("mode1");
assertThat(snapshotDto.getPeriodModeParameter()).isEqualTo("param1");
assertThat(snapshotDto.getIncremental()).isTrue();
assertThat(snapshotDto.getPeriodDate()).isEqualTo(parseDate("2014-06-01").getTime());
}


+ 0
- 2
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis-result.xml View File

@@ -32,7 +32,6 @@ Note that measures, events and reviews are not deleted.
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!--switched_off="[null]" permanent_id="[null]" FAILURE_LEVEL="2"-->
@@ -97,7 +96,6 @@ Note that measures, events and reviews are not deleted.
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>



+ 0
- 2
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis.xml View File

@@ -24,7 +24,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<project_measures ID="1"
@@ -89,7 +88,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<project_measures ID="2"

+ 0
- 1
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components-result.xml View File

@@ -149,7 +149,6 @@ What has been changed :
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- Open issue on file -->

+ 0
- 1
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/close_issues_clean_index_and_files_sources_of_specified_components.xml View File

@@ -138,7 +138,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- Open issue on file -->

+ 0
- 2
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAbortedBuilds-result.xml View File

@@ -50,7 +50,6 @@ Snapshot 2 has been deleted
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshot with status "processed" and flagged as "last" -> do not purge and do not delete -->
@@ -78,7 +77,6 @@ Snapshot 2 has been deleted
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 3
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAbortedBuilds.xml View File

@@ -45,7 +45,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshot with status "unprocessed" -> to be deleted -->
@@ -73,7 +72,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshot with status "processed" and flagged as "last" -> do not purge and do not delete -->
@@ -101,7 +99,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 2
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses-result.xml View File

@@ -25,7 +25,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- delete only resource 1 -->
@@ -53,7 +52,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 3
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses.xml View File

@@ -25,7 +25,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- delete only resource 1 -->
@@ -53,7 +52,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- to be deleted -->
@@ -81,7 +79,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 2
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles-result.xml View File

@@ -151,7 +151,6 @@ What has been changed : purge_status=1 on snapshot 4 (PRJ) and snapshots 5 and 6
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshots to be purged -->
@@ -179,7 +178,6 @@ What has been changed : purge_status=1 on snapshot 4 (PRJ) and snapshots 5 and 6
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 2
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles.xml View File

@@ -139,7 +139,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshots to be purged -->
@@ -167,7 +166,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 3
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldPurgeProject-result.xml View File

@@ -66,7 +66,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>


@@ -95,7 +94,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshot to be purged -->
@@ -123,7 +121,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 3
server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldPurgeProject.xml View File

@@ -65,7 +65,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>


@@ -94,7 +93,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

<!-- snapshot to be purged -->
@@ -122,7 +120,6 @@
created_at="1228222680000"
build_date="1228222680000"
version="[null]"
incremental="[false]"
/>

</dataset>

+ 0
- 45
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v66/AddIncrementalColumnToSnapshotsTable.java View File

@@ -1,45 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.platform.db.migration.version.v66;

import java.sql.SQLException;

import org.sonar.db.Database;
import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
import org.sonar.server.platform.db.migration.step.DdlChange;

public class AddIncrementalColumnToSnapshotsTable extends DdlChange {

public AddIncrementalColumnToSnapshotsTable(Database db) {
super(db);
}

@Override
public void execute(Context context) throws SQLException {
context.execute(new AddColumnsBuilder(getDialect(), "snapshots")
.addColumn(BooleanColumnDef.newBooleanColumnDefBuilder()
.setColumnName("incremental")
.setDefaultValue(false)
.build())
.build());
}

}

+ 1
- 3
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v66/DbVersion66.java View File

@@ -27,7 +27,6 @@ public class DbVersion66 implements DbVersion {
@Override
public void addSteps(MigrationStepRegistry registry) {
registry
.add(1800, "Add incremental column to snapshots table", AddIncrementalColumnToSnapshotsTable.class)
.add(1801, "Create table CE task characteristics", CreateTableCeTaskCharacteristics.class)
.add(1802, "Delete leak settings on views", DeleteLeakSettingsOnViews.class)
.add(1803, "Fix empty USERS.EXTERNAL_IDENTITY and USERS.EXTERNAL_IDENTITY_PROVIDER", FixEmptyIdentityProviderInUsers.class)
@@ -36,7 +35,6 @@ public class DbVersion66 implements DbVersion {
.add(1806, "Create table project_branches", CreateTableProjectBranches.class)
.add(1807, "Add on project_branches key", AddIndexOnProjectBranchesKey.class)
.add(1808, "Add branch column to projects table", AddBranchColumnToProjectsTable.class)
.add(1809, "Populate project_branches with existing main branches", PopulateMainProjectBranches.class)
;
.add(1809, "Populate project_branches with existing main branches", PopulateMainProjectBranches.class);
}
}

+ 0
- 58
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v66/AddIncrementalColumnToSnapshotsTableTest.java View File

@@ -1,58 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package org.sonar.server.platform.db.migration.version.v66;

import java.sql.SQLException;
import java.sql.Types;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.db.CoreDbTester;

public class AddIncrementalColumnToSnapshotsTableTest {
@Rule
public CoreDbTester db = CoreDbTester.createForSchema(AddIncrementalColumnToSnapshotsTableTest.class, "old_snapshots.sql");
@Rule
public ExpectedException expectedException = ExpectedException.none();

private AddIncrementalColumnToSnapshotsTable underTest = new AddIncrementalColumnToSnapshotsTable(db.database());

@Test
public void migration_adds_column_to_empty_table() throws SQLException {
underTest.execute();

verifyAddedColumns();
}

@Test
public void migration_is_not_reentrant() throws SQLException {
underTest.execute();

expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("Fail to execute ");
underTest.execute();
}

private void verifyAddedColumns() {
db.assertColumnDefinition("snapshots", "incremental", Types.BOOLEAN, null, true);
}

}

+ 3
- 3
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v66/DbVersion66Test.java View File

@@ -30,13 +30,13 @@ public class DbVersion66Test {
private DbVersion66 underTest = new DbVersion66();

@Test
public void migrationNumber_starts_at_1800() {
verifyMinimumMigrationNumber(underTest, 1800);
public void migrationNumber_starts_at_1801() {
verifyMinimumMigrationNumber(underTest, 1801);
}

@Test
public void verify_migration_count() {
verifyMigrationCount(underTest, 10);
verifyMigrationCount(underTest, 9);
}

}

+ 1
- 2
server/sonar-server/src/main/java/org/sonar/server/ce/ws/ActivityAction.java View File

@@ -99,9 +99,8 @@ public class ActivityAction implements CeWsAction {
.setResponseExample(getClass().getResource("activity-example.json"))
.setHandler(this)
.setChangelog(
new Change("5.5", "it's no more possible to specify the page parameter.<"),
new Change("5.5", "it's no more possible to specify the page parameter."),
new Change("6.1", "field \"logs\" is deprecated and its value is always false"),
new Change("6.6", "field \"incremental\" is added"),
new Change("6.6", "fields \"branch\" and \"branchType\" added"))
.setSince("5.2");


+ 1
- 2
server/sonar-server/src/main/java/org/sonar/server/ce/ws/ComponentAction.java View File

@@ -35,11 +35,11 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.user.UserSession;
import org.sonar.server.ws.KeyExamples;
import org.sonarqube.ws.WsCe.ProjectResponse;

import static org.sonar.db.Pagination.forPage;
import static org.sonar.server.component.ComponentFinder.ParamNames.COMPONENT_ID_AND_COMPONENT;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
import static org.sonarqube.ws.WsCe.ProjectResponse;
import static org.sonarqube.ws.client.ce.CeWsParameters.DEPRECATED_PARAM_COMPONENT_KEY;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_ID;
@@ -69,7 +69,6 @@ public class ComponentAction implements CeWsAction {
.setResponseExample(getClass().getResource("component-example.json"))
.setChangelog(
new Change("6.1", "field \"logs\" is deprecated and its value is always false"),
new Change("6.6", "field \"incremental\" is added"),
new Change("6.6", "fields \"branch\" and \"branchType\" added"))
.setHandler(this);


+ 3
- 4
server/sonar-server/src/main/java/org/sonar/server/ce/ws/SubmitAction.java View File

@@ -19,13 +19,10 @@
*/
package org.sonar.server.ce.ws;

import static org.sonar.server.ws.WsUtils.checkRequest;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
@@ -36,6 +33,8 @@ import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.ws.WsUtils;
import org.sonarqube.ws.WsCe;

import static org.sonar.server.ws.WsUtils.checkRequest;

public class SubmitAction implements CeWsAction {

private static final String PARAM_ORGANIZATION_KEY = "organization";
@@ -96,7 +95,7 @@ public class SubmitAction implements CeWsAction {
.createParam(PARAM_ANALYSIS_CHARACTERISTIC)
.setRequired(false)
.setDescription("Optional characteristic of the analysis. Can be repeated to define multiple characteristics.")
.setExampleValue("incremental=true")
.setExampleValue("branchType=long")
.setSince("6.6");
}


+ 0
- 1
server/sonar-server/src/main/java/org/sonar/server/ce/ws/TaskAction.java View File

@@ -74,7 +74,6 @@ public class TaskAction implements CeWsAction {
.setResponseExample(getClass().getResource("task-example.json"))
.setSince("5.2")
.setChangelog(
new Change("6.6", "field \"incremental\" is added"),
new Change("6.6", "fields \"branch\" and \"branchType\" added"))
.setHandler(this);


+ 0
- 13
server/sonar-server/src/main/java/org/sonar/server/ce/ws/TaskFormatter.java View File

@@ -89,7 +89,6 @@ public class TaskFormatter {
builder.setSubmittedAt(formatDateTime(new Date(dto.getCreatedAt())));
setNullable(dto.getStartedAt(), builder::setStartedAt, DateUtils::formatDateTime);
setNullable(computeExecutionTimeMs(dto), builder::setExecutionTimeMs);
setIncremental(builder, dto.getUuid(), componentDtoCache);
setBranch(builder, dto.getUuid(), componentDtoCache);
return builder.build();
}
@@ -119,7 +118,6 @@ public class TaskFormatter {
if (analysisUuid != null) {
builder.setAnalysisId(analysisUuid);
}
setIncremental(builder, dto.getUuid(), componentDtoCache);
setBranch(builder, dto.getUuid(), componentDtoCache);
setNullable(analysisUuid, builder::setAnalysisId);
setNullable(dto.getSubmitterLogin(), builder::setSubmitterLogin);
@@ -145,11 +143,6 @@ public class TaskFormatter {
return builder;
}

private static WsCe.Task.Builder setIncremental(WsCe.Task.Builder builder, String taskUuid, DtoCache componentDtoCache) {
builder.setIncremental(componentDtoCache.hasIncrementalCharacteristic(taskUuid));
return builder;
}

private static WsCe.Task.Builder setBranch(WsCe.Task.Builder builder, String taskUuid, DtoCache componentDtoCache) {
componentDtoCache.getBranchName(taskUuid).ifPresent(
b -> {
@@ -243,12 +236,6 @@ public class TaskFormatter {
return organizationDto.getKey();
}

boolean hasIncrementalCharacteristic(String taskUuid) {
return characteristicsByTaskUuid.get(taskUuid).stream()
.filter(c -> c.getKey().equals(CeTaskCharacteristicDto.INCREMENTAL_KEY))
.anyMatch(c -> c.getValue().equals("true"));
}

Optional<String> getBranchName(String taskUuid) {
return characteristicsByTaskUuid.get(taskUuid).stream()
.filter(c -> c.getKey().equals(CeTaskCharacteristicDto.BRANCH_KEY))

+ 0
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolder.java View File

@@ -55,11 +55,6 @@ public interface AnalysisMetadataHolder {
*/
boolean isFirstAnalysis();

/**
* Whether this is an incremental analysis or a full analysis.
*/
boolean isIncrementalAnalysis();

/**
* Return the last analysis of the project.
* If it's the first analysis, it will return null.

+ 0
- 15
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImpl.java View File

@@ -24,7 +24,6 @@ import java.util.Map;
import java.util.Optional;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;

import org.sonar.db.component.BranchType;
import org.sonar.server.computation.util.InitializedProperty;
import org.sonar.server.qualityprofile.QualityProfile;
@@ -37,7 +36,6 @@ 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<Branch> branch = new InitializedProperty<>();
@@ -97,19 +95,6 @@ public class AnalysisMetadataHolderImpl implements MutableAnalysisMetadataHolder
return getBaseAnalysis() == null;
}

@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");

+ 0
- 5
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolder.java View File

@@ -40,11 +40,6 @@ 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
*/

+ 0
- 24
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/duplication/IncrementalDuplicationMeasures.java View File

@@ -1,24 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.computation.task.projectanalysis.duplication;

public interface IncrementalDuplicationMeasures {
void execute();
}

+ 8
- 34
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitor.java View File

@@ -19,37 +19,27 @@
*/
package org.sonar.server.computation.task.projectanalysis.issue;

import static org.sonar.server.computation.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.server.computation.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.server.util.cache.DiskCache;

import static org.sonar.server.computation.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;

public class IntegrateIssuesVisitor extends TypeAwareVisitorAdapter {

private final IssueCache issueCache;
private final IssueLifecycle issueLifecycle;
private final IssueVisitors issueVisitors;
private final ComponentIssuesLoader issuesLoader;
private final AnalysisMetadataHolder analysisMetadataHolder;
private final IssueTrackingDelegator issueTracking;

public IntegrateIssuesVisitor(IssueCache issueCache, IssueLifecycle issueLifecycle, IssueVisitors issueVisitors, ComponentIssuesLoader issuesLoader,
AnalysisMetadataHolder analysisMetadataHolder, IssueTrackingDelegator issueTracking) {
public IntegrateIssuesVisitor(IssueCache issueCache, IssueLifecycle issueLifecycle, IssueVisitors issueVisitors, IssueTrackingDelegator issueTracking) {
super(CrawlerDepthLimit.FILE, POST_ORDER);
this.issueCache = issueCache;
this.issueLifecycle = issueLifecycle;
this.issueVisitors = issueVisitors;
this.issuesLoader = issuesLoader;
this.analysisMetadataHolder = analysisMetadataHolder;
this.issueTracking = issueTracking;
}

@@ -58,27 +48,17 @@ public class IntegrateIssuesVisitor extends TypeAwareVisitorAdapter {
try (DiskCache<DefaultIssue>.DiskAppender cacheAppender = issueCache.newAppender()) {
issueVisitors.beforeComponent(component);

if (isIncremental(component)) {
// no tracking needed, simply re-use existing issues
List<DefaultIssue> issues = issuesLoader.loadForComponentUuid(component.getUuid());
reuseOpenIssues(component, issues, cacheAppender);
} else {
TrackingResult tracking = issueTracking.track(component);
fillNewOpenIssues(component, tracking.newIssues(), cacheAppender);
fillExistingOpenIssues(component, tracking.issuesToMerge(), cacheAppender);
closeIssues(component, tracking.issuesToClose(), cacheAppender);
copyIssues(component, tracking.issuesToCopy(), cacheAppender);
}
TrackingResult tracking = issueTracking.track(component);
fillNewOpenIssues(component, tracking.newIssues(), cacheAppender);
fillExistingOpenIssues(component, tracking.issuesToMerge(), cacheAppender);
closeIssues(component, tracking.issuesToClose(), cacheAppender);
copyIssues(component, tracking.issuesToCopy(), cacheAppender);
issueVisitors.afterComponent(component);
} catch (Exception e) {
throw new IllegalStateException(String.format("Fail to process issues of component '%s'", component.getKey()), e);
}
}

private boolean isIncremental(Component component) {
return analysisMetadataHolder.isIncrementalAnalysis() && component.getStatus() == Status.SAME;
}

private void fillNewOpenIssues(Component component, Iterable<DefaultIssue> issues, DiskCache<DefaultIssue>.DiskAppender cacheAppender) {
for (DefaultIssue issue : issues) {
issueLifecycle.initNewOpenIssue(issue);
@@ -95,12 +75,6 @@ public class IntegrateIssuesVisitor extends TypeAwareVisitorAdapter {
}
}

private void reuseOpenIssues(Component component, Collection<DefaultIssue> issues, DiskCache<DefaultIssue>.DiskAppender cacheAppender) {
for (DefaultIssue issue : issues) {
process(component, issue, cacheAppender);
}
}

private void fillExistingOpenIssues(Component component, Map<DefaultIssue, DefaultIssue> matched, DiskCache<DefaultIssue>.DiskAppender cacheAppender) {
for (Map.Entry<DefaultIssue, DefaultIssue> entry : matched.entrySet()) {
DefaultIssue raw = entry.getKey();

+ 0
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueLifecycle.java View File

@@ -33,7 +33,6 @@ import org.sonar.server.issue.workflow.IssueWorkflow;
* Sets the appropriate fields when an issue is :
* <ul>
* <li>newly created</li>
* <li>reused in incremental analysis</li>
* <li>merged the related base issue</li>
* <li>relocated (only manual issues)</li>
* </ul>

+ 0
- 27
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/measure/IncrementalMeasureTransition.java View File

@@ -1,27 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.computation.task.projectanalysis.measure;

/**
* Provided by the incremental plugin
*/
public interface IncrementalMeasureTransition extends Runnable {

}

+ 2
- 22
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/DuplicationMeasuresStep.java View File

@@ -19,12 +19,8 @@
*/
package org.sonar.server.computation.task.projectanalysis.step;

import javax.annotation.Nullable;

import org.sonar.api.measures.CoreMetrics;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.duplication.DuplicationMeasures;
import org.sonar.server.computation.task.projectanalysis.duplication.IncrementalDuplicationMeasures;
import org.sonar.server.computation.task.step.ComputationStep;

/**
@@ -33,22 +29,10 @@ import org.sonar.server.computation.task.step.ComputationStep;
* This step must be executed after {@link CommentMeasuresStep} as it depends on {@link CoreMetrics#COMMENT_LINES}
*/
public class DuplicationMeasuresStep implements ComputationStep {
private final AnalysisMetadataHolder analysisMetadataHolder;
private final DuplicationMeasures defaultDuplicationMeasures;
private final IncrementalDuplicationMeasures incrementalDuplicationsMeasures;

public DuplicationMeasuresStep(AnalysisMetadataHolder analysisMetadataHolder, DuplicationMeasures defaultDuplicationMeasures,
@Nullable IncrementalDuplicationMeasures incrementalDuplicationMeasures) {
this.analysisMetadataHolder = analysisMetadataHolder;
public DuplicationMeasuresStep(DuplicationMeasures defaultDuplicationMeasures) {
this.defaultDuplicationMeasures = defaultDuplicationMeasures;
this.incrementalDuplicationsMeasures = incrementalDuplicationMeasures;
}

/**
* Constructor used by Pico in Views where no IncrementalDuplicationMeasures is available.
*/
public DuplicationMeasuresStep(AnalysisMetadataHolder analysisMetadataHolder, DuplicationMeasures defaultDuplicationMeasures) {
this(analysisMetadataHolder, defaultDuplicationMeasures, null);
}

@Override
@@ -58,10 +42,6 @@ public class DuplicationMeasuresStep implements ComputationStep {

@Override
public void execute() {
if (analysisMetadataHolder.isIncrementalAnalysis()) {
incrementalDuplicationsMeasures.execute();
} else {
defaultDuplicationMeasures.execute();
}
defaultDuplicationMeasures.execute();
}
}

+ 0
- 50
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/IncrementalMeasureTransitionStep.java View File

@@ -1,50 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.computation.task.projectanalysis.step;

import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.measure.IncrementalMeasureTransition;
import org.sonar.server.computation.task.step.ComputationStep;

public class IncrementalMeasureTransitionStep implements ComputationStep {
private final AnalysisMetadataHolder analysisMetadataHolder;
private final IncrementalMeasureTransition runnable;

public IncrementalMeasureTransitionStep(AnalysisMetadataHolder analysisMetadataHolder) {
this(analysisMetadataHolder, null);
}

public IncrementalMeasureTransitionStep(AnalysisMetadataHolder analysisMetadataHolder, IncrementalMeasureTransition runnable) {
this.analysisMetadataHolder = analysisMetadataHolder;
this.runnable = runnable;
}

@Override
public void execute() {
if (analysisMetadataHolder.isIncrementalAnalysis()) {
runnable.run();
}
}

@Override
public String getDescription() {
return "Incremental measure transition";
}
}

+ 12
- 18
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadDuplicationsFromReportStep.java View File

@@ -23,7 +23,6 @@ import com.google.common.base.Function;
import javax.annotation.Nonnull;
import org.sonar.core.util.CloseableIterator;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReader;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
@@ -50,14 +49,11 @@ public class LoadDuplicationsFromReportStep implements ComputationStep {
private final TreeRootHolder treeRootHolder;
private final BatchReportReader batchReportReader;
private final DuplicationRepository duplicationRepository;
private final AnalysisMetadataHolder analysisMetadataHolder;

public LoadDuplicationsFromReportStep(TreeRootHolder treeRootHolder, BatchReportReader batchReportReader,
DuplicationRepository duplicationRepository, AnalysisMetadataHolder analysisMetadataHolder) {
public LoadDuplicationsFromReportStep(TreeRootHolder treeRootHolder, BatchReportReader batchReportReader, DuplicationRepository duplicationRepository) {
this.treeRootHolder = treeRootHolder;
this.batchReportReader = batchReportReader;
this.duplicationRepository = duplicationRepository;
this.analysisMetadataHolder = analysisMetadataHolder;
}

@Override
@@ -67,21 +63,19 @@ public class LoadDuplicationsFromReportStep implements ComputationStep {

@Override
public void execute() {
if (!analysisMetadataHolder.isIncrementalAnalysis()) {
new DepthTraversalTypeAwareCrawler(
new TypeAwareVisitorAdapter(CrawlerDepthLimit.FILE, POST_ORDER) {
@Override
public void visitFile(Component file) {
try (CloseableIterator<ScannerReport.Duplication> duplications = batchReportReader.readComponentDuplications(file.getReportAttributes().getRef())) {
int idGenerator = 1;
while (duplications.hasNext()) {
loadDuplications(file, duplications.next(), idGenerator);
idGenerator++;
}
new DepthTraversalTypeAwareCrawler(
new TypeAwareVisitorAdapter(CrawlerDepthLimit.FILE, POST_ORDER) {
@Override
public void visitFile(Component file) {
try (CloseableIterator<ScannerReport.Duplication> duplications = batchReportReader.readComponentDuplications(file.getReportAttributes().getRef())) {
int idGenerator = 1;
while (duplications.hasNext()) {
loadDuplications(file, duplications.next(), idGenerator);
idGenerator++;
}
}
}).visit(treeRootHolder.getRoot());
}
}
}).visit(treeRootHolder.getRoot());
}

private void loadDuplications(Component file, ScannerReport.Duplication duplication, int id) {

+ 1
- 8
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java View File

@@ -50,11 +50,9 @@ import org.sonar.server.computation.task.step.ComputationStep;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.qualityprofile.QualityProfile;

import static java.util.stream.Collectors.toMap;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.Maps.transformValues;
import static java.lang.String.format;
import static org.apache.commons.lang.StringUtils.isNotEmpty;
import static java.util.stream.Collectors.toMap;
import static org.sonar.core.util.stream.MoreCollectors.toList;

/**
@@ -87,7 +85,6 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {
loadMetadata(reportMetadata);
Organization organization = loadOrganization(reportMetadata);
loadProject(reportMetadata, organization);
loadIncrementalMode(reportMetadata);
loadQualityProfiles(reportMetadata, organization);
branchLoader.load(reportMetadata);
}
@@ -141,10 +138,6 @@ public class LoadReportAnalysisMetadataHolderStep implements ComputationStep {
return pluginInfo.getBasePlugin();
}

private void loadIncrementalMode(ScannerReport.Metadata reportMetadata) {
analysisMetadata.setIncrementalAnalysis(reportMetadata.getIncremental());
}

/**
* Check that the Quality profiles sent by scanner correctly relate to the project organization.
*/

+ 3
- 4
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistAnalysisStep.java View File

@@ -76,14 +76,14 @@ public class PersistAnalysisStep implements ComputationStep {

@Override
public void visitProject(Component project) {
SnapshotDto snapshot = createAnalysis(analysisMetadataHolder.getUuid(), project, true, analysisMetadataHolder.isIncrementalAnalysis());
SnapshotDto snapshot = createAnalysis(analysisMetadataHolder.getUuid(), project, true);
updateSnapshotPeriods(snapshot);
persist(snapshot, dbSession);
}

@Override
public void visitView(Component view) {
SnapshotDto snapshot = createAnalysis(analysisMetadataHolder.getUuid(), view, false, false);
SnapshotDto snapshot = createAnalysis(analysisMetadataHolder.getUuid(), view, false);
updateSnapshotPeriods(snapshot);
persist(snapshot, dbSession);
}
@@ -98,13 +98,12 @@ public class PersistAnalysisStep implements ComputationStep {
snapshotDto.setPeriodDate(period.getSnapshotDate());
}

private SnapshotDto createAnalysis(String snapshotUuid, Component component, boolean setVersion, boolean incremental) {
private SnapshotDto createAnalysis(String snapshotUuid, Component component, boolean setVersion) {
String componentUuid = component.getUuid();
return new SnapshotDto()
.setUuid(snapshotUuid)
.setVersion(setVersion ? component.getReportAttributes().getVersion() : null)
.setComponentUuid(componentUuid)
.setIncremental(incremental)
.setLast(false)
.setStatus(SnapshotDto.STATUS_UNPROCESSED)
.setCreatedAt(analysisDate)

+ 3
- 25
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistCrossProjectDuplicationIndexStep.java View File

@@ -19,18 +19,14 @@
*/
package org.sonar.server.computation.task.projectanalysis.step;

import java.util.List;
import javax.annotation.Nullable;
import org.sonar.core.util.CloseableIterator;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.duplication.DuplicationUnitDto;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.Analysis;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReader;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.server.computation.task.projectanalysis.component.DepthTraversalTypeAwareCrawler;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
@@ -69,9 +65,7 @@ public class PersistCrossProjectDuplicationIndexStep implements ComputationStep

try (DbSession dbSession = dbClient.openSession(true)) {
Component project = treeRootHolder.getRoot();
Analysis baseAnalysis = analysisMetadataHolder.getBaseAnalysis();
String lastAnalysysUuid = (baseAnalysis != null) ? baseAnalysis.getUuid() : null;
new DepthTraversalTypeAwareCrawler(new DuplicationVisitor(dbSession, analysisMetadataHolder.getUuid(), lastAnalysysUuid)).visit(project);
new DepthTraversalTypeAwareCrawler(new DuplicationVisitor(dbSession, analysisMetadataHolder.getUuid())).visit(project);
dbSession.commit();
}
}
@@ -80,13 +74,11 @@ public class PersistCrossProjectDuplicationIndexStep implements ComputationStep

private final DbSession session;
private final String analysisUuid;
private final String lastAnalysisUuid;

private DuplicationVisitor(DbSession session, String analysisUuid, @Nullable String lastAnalysisUuid) {
private DuplicationVisitor(DbSession session, String analysisUuid) {
super(CrawlerDepthLimit.FILE, PRE_ORDER);
this.session = session;
this.analysisUuid = analysisUuid;
this.lastAnalysisUuid = lastAnalysisUuid;
}

@Override
@@ -95,11 +87,7 @@ public class PersistCrossProjectDuplicationIndexStep implements ComputationStep
}

private void visitComponent(Component component) {
if (analysisMetadataHolder.isIncrementalAnalysis() && component.getStatus() == Status.SAME) {
readFromDb(component);
} else {
readFromReport(component);
}
readFromReport(component);
}

private void readFromReport(Component component) {
@@ -121,16 +109,6 @@ public class PersistCrossProjectDuplicationIndexStep implements ComputationStep
}
}

private void readFromDb(Component component) {
int indexInFile = 0;
List<DuplicationUnitDto> units = dbClient.duplicationDao().selectComponent(session, component.getUuid(), lastAnalysisUuid);
for (DuplicationUnitDto unit : units) {
unit.setAnalysisUuid(analysisUuid);
unit.setIndexInFile(indexInFile);
dbClient.duplicationDao().insert(session, unit);
indexInFile++;
}
}
}

@Override

+ 2
- 10
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java View File

@@ -37,10 +37,8 @@ import org.sonar.db.protobuf.DbFileSources;
import org.sonar.db.source.FileSourceDto;
import org.sonar.db.source.FileSourceDto.Type;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReader;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.server.computation.task.projectanalysis.component.DepthTraversalTypeAwareCrawler;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
@@ -71,10 +69,9 @@ public class PersistFileSourcesStep implements ComputationStep {
private final SourceLinesRepository sourceLinesRepository;
private final ScmInfoRepository scmInfoRepository;
private final DuplicationRepository duplicationRepository;
private final AnalysisMetadataHolder analysisMetadataHolder;

public PersistFileSourcesStep(DbClient dbClient, System2 system2, TreeRootHolder treeRootHolder, BatchReportReader reportReader, SourceLinesRepository sourceLinesRepository,
ScmInfoRepository scmInfoRepository, DuplicationRepository duplicationRepository, AnalysisMetadataHolder analysisMetadataHolder) {
ScmInfoRepository scmInfoRepository, DuplicationRepository duplicationRepository) {
this.dbClient = dbClient;
this.system2 = system2;
this.treeRootHolder = treeRootHolder;
@@ -82,7 +79,6 @@ public class PersistFileSourcesStep implements ComputationStep {
this.sourceLinesRepository = sourceLinesRepository;
this.scmInfoRepository = scmInfoRepository;
this.duplicationRepository = duplicationRepository;
this.analysisMetadataHolder = analysisMetadataHolder;
}

@Override
@@ -118,12 +114,8 @@ public class PersistFileSourcesStep implements ComputationStep {

@Override
public void visitFile(Component file) {
if (analysisMetadataHolder.isIncrementalAnalysis() && file.getStatus() == Status.SAME) {
return;
}

try (CloseableIterator<String> linesIterator = sourceLinesRepository.readLines(file);
LineReaders lineReaders = new LineReaders(reportReader, scmInfoRepository, duplicationRepository, file)) {
LineReaders lineReaders = new LineReaders(reportReader, scmInfoRepository, duplicationRepository, file)) {
ComputeFileSourceData computeFileSourceData = new ComputeFileSourceData(linesIterator, lineReaders.readers(), file.getFileAttributes().getLines());
ComputeFileSourceData.Data fileSourceData = computeFileSourceData.compute();
persistSource(fileSourceData, file.getUuid(), lineReaders.getLatestChange());

+ 0
- 3
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ReportComputationSteps.java View File

@@ -42,9 +42,6 @@ public class ReportComputationSteps extends AbstractComputationSteps {
ValidateProjectStep.class,

LoadQualityProfilesStep.class,
// copy data in the incremental mode
IncrementalMeasureTransitionStep.class,

// load project related stuffs
LoadQualityGateStep.class,

+ 6
- 38
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java View File

@@ -19,17 +19,12 @@
*/
package org.sonar.server.computation.task.projectanalysis.step;

import static com.google.common.collect.FluentIterable.from;
import static java.lang.String.format;
import static org.sonar.api.utils.DateUtils.formatDateTime;

import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.Nullable;

import org.sonar.api.resources.Qualifiers;
import org.sonar.api.resources.Scopes;
import org.sonar.api.utils.MessageException;
@@ -47,11 +42,11 @@ import org.sonar.server.computation.task.projectanalysis.component.CrawlerDepthL
import org.sonar.server.computation.task.projectanalysis.component.DepthTraversalTypeAwareCrawler;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
import org.sonar.server.computation.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.server.computation.task.projectanalysis.validation.ValidateIncremental;
import org.sonar.server.computation.task.step.ComputationStep;

import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import static com.google.common.collect.FluentIterable.from;
import static java.lang.String.format;
import static org.sonar.api.utils.DateUtils.formatDateTime;

/**
* Validate project and modules. It will fail in the following cases :
@@ -71,19 +66,13 @@ public class ValidateProjectStep implements ComputationStep {
private final BatchReportReader reportReader;
private final TreeRootHolder treeRootHolder;
private final AnalysisMetadataHolder analysisMetadataHolder;
private final ValidateIncremental validateIncremental;

public ValidateProjectStep(DbClient dbClient, BatchReportReader reportReader, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder) {
this(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, null);
}

public ValidateProjectStep(DbClient dbClient, BatchReportReader reportReader, TreeRootHolder treeRootHolder,
AnalysisMetadataHolder analysisMetadataHolder, @Nullable ValidateIncremental validateIncremental) {
AnalysisMetadataHolder analysisMetadataHolder) {
this.dbClient = dbClient;
this.reportReader = reportReader;
this.treeRootHolder = treeRootHolder;
this.analysisMetadataHolder = analysisMetadataHolder;
this.validateIncremental = validateIncremental;
}

@Override
@@ -126,8 +115,6 @@ public class ValidateProjectStep implements ComputationStep {
public void visitProject(Component rawProject) {
this.rawProject = rawProject;
String rawProjectKey = rawProject.getKey();
validateIncremental(rawProjectKey);
validateNotIncrementalAndFirstAnalysis(rawProjectKey);
validateBatchKey(rawProject);

Optional<ComponentDto> baseProject = loadBaseComponent(rawProjectKey);
@@ -146,25 +133,6 @@ public class ValidateProjectStep implements ComputationStep {
}
}

private void validateIncremental(String rawProjectKey) {
if (analysisMetadataHolder.isIncrementalAnalysis()) {
if (validateIncremental == null) {
validationMessages.add(format("Can't process an incremental analysis of the project \"%s\" because the incremental plugin is not loaded."
+ " Please install the plugin or launch a full analysis of the project.", rawProjectKey));
} else if (!validateIncremental.execute()) {
validationMessages.add(format("The installation of the incremental plugin is invalid. Can't process the incremental analysis "
+ "of the project \"%s\".", rawProjectKey));
}
}
}

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

+ 0
- 24
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/validation/ValidateIncremental.java View File

@@ -1,24 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.computation.task.projectanalysis.validation;

public interface ValidateIncremental {
boolean execute();
}

+ 0
- 23
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/validation/package-info.java View File

@@ -1,23 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
@ParametersAreNonnullByDefault
package org.sonar.server.computation.task.projectanalysis.validation;

import javax.annotation.ParametersAreNonnullByDefault;

+ 0
- 75
server/sonar-server/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java View File

@@ -68,7 +68,6 @@ import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS;
import static org.sonar.db.ce.CeQueueDto.Status.PENDING;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.INCREMENTAL_KEY;
import static org.sonar.db.component.BranchType.LONG;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_ID;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_QUERY;
@@ -116,7 +115,6 @@ public class ActivityActionTest {
assertThat(task.hasAnalysisId()).isFalse();
assertThat(task.getExecutionTimeMs()).isEqualTo(500L);
assertThat(task.getLogs()).isFalse();
assertThat(task.getIncremental()).isFalse();

task = activityResponse.getTasks(1);
assertThat(task.getId()).isEqualTo("T1");
@@ -124,7 +122,6 @@ public class ActivityActionTest {
assertThat(task.getComponentId()).isEqualTo(project1.uuid());
assertThat(task.getLogs()).isFalse();
assertThat(task.getOrganization()).isEqualTo(org1.getKey());
assertThat(task.getIncremental()).isFalse();
}

@Test
@@ -343,78 +340,6 @@ public class ActivityActionTest {
assertThat(result.getTasksCount()).isEqualTo(2);
}

@Test
public void incremental_analysis_on_single_project() {
ComponentDto project = db.components().insertPrivateProject();
SnapshotDto incrementalAnalysis = db.components().insertSnapshot(project, s -> s.setIncremental(true));
CeActivityDto activity = insertActivity("T1", project, SUCCESS, incrementalAnalysis);
insertCharacteristic(activity, INCREMENTAL_KEY, "true");
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);

ActivityResponse activityResponse = call(ws.newRequest()
.setParam(PARAM_COMPONENT_ID, project.uuid()));

assertThat(activityResponse.getTasksList())
.extracting(Task::getId, Task::getIncremental)
.containsExactlyInAnyOrder(tuple("T1", true));
}

@Test
public void incremental_analysis_on_search_text() {
ComponentDto project = db.components().insertPrivateProject();
SnapshotDto incrementalAnalysis = db.components().insertSnapshot(project, s -> s.setIncremental(true));
SnapshotDto standardAnalysis = db.components().insertSnapshot(project, s -> s.setIncremental(false));
CeActivityDto incrementalTask = insertActivity("T1", project, SUCCESS, incrementalAnalysis);
insertCharacteristic(incrementalTask, INCREMENTAL_KEY, "true");
insertActivity("T2", project, SUCCESS, standardAnalysis);
logInAsSystemAdministrator();

ActivityResponse activityResponse = call(ws.newRequest()
.setParam(PARAM_COMPONENT_QUERY, project.name()));

assertThat(activityResponse.getTasksList())
.extracting(Task::getId, Task::getIncremental)
.containsExactlyInAnyOrder(
tuple("T1", true),
tuple("T2", false));
}

@Test
public void incremental_analysis_on_search_uuid() {
ComponentDto project = db.components().insertPrivateProject();
SnapshotDto incrementalAnalysis = db.components().insertSnapshot(project, s -> s.setIncremental(true));
CeActivityDto activity = insertActivity("T1", project, SUCCESS, incrementalAnalysis);
insertCharacteristic(activity, INCREMENTAL_KEY, "true");
logInAsSystemAdministrator();

ActivityResponse activityResponse = call(ws.newRequest()
.setParam(PARAM_COMPONENT_QUERY, "T1"));

assertThat(activityResponse.getTasksList())
.extracting(Task::getId, Task::getIncremental)
.containsExactlyInAnyOrder(tuple("T1", true));
}

@Test
public void incremental_on_in_queue_analysis() {
ComponentDto project = db.components().insertPrivateProject();
CeQueueDto queue1 = insertQueue("T1", project, PENDING);
insertCharacteristic(queue1, INCREMENTAL_KEY, "true");
CeQueueDto queue2 = insertQueue("T2", project, IN_PROGRESS);
insertCharacteristic(queue2, INCREMENTAL_KEY, "true");
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);

ActivityResponse activityResponse = call(ws.newRequest()
.setParam(PARAM_COMPONENT_ID, project.uuid())
.setParam("status", "PENDING,FAILED,IN_PROGRESS"));

assertThat(activityResponse.getTasksList())
.extracting(Task::getId, Task::getIncremental)
.containsExactlyInAnyOrder(
tuple("T1", true),
tuple("T2", true));
}

@Test
public void long_living_branch_in_past_activity() {
logInAsSystemAdministrator();

+ 4
- 47
server/sonar-server/src/test/java/org/sonar/server/ce/ws/ComponentActionTest.java View File

@@ -51,7 +51,6 @@ import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS;
import static org.sonar.db.ce.CeQueueDto.Status.PENDING;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.INCREMENTAL_KEY;
import static org.sonar.db.component.BranchType.LONG;
import static org.sonar.db.component.BranchType.SHORT;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT;
@@ -110,7 +109,6 @@ public class ComponentActionTest {
.extracting(WsCe.Task::getOrganization)
.containsOnly(organization.getKey());
assertThat(response.getCurrent().getOrganization()).isEqualTo(organization.getKey());
assertThat(response.getCurrent().getIncremental()).isFalse();
}

@Test
@@ -162,44 +160,6 @@ public class ComponentActionTest {
assertThat(response.getCurrent().getId()).isEqualTo("T3");
}

@Test
public void incremental_analysis_by_component_key() {
ComponentDto project = db.components().insertPrivateProject();
userSession.logIn().addProjectPermission(UserRole.USER, project);
SnapshotDto incrementalAnalysis = db.components().insertSnapshot(project, s -> s.setIncremental(true));
CeActivityDto activity = insertActivity("T1", project, SUCCESS, incrementalAnalysis);
insertCharacteristic(activity, INCREMENTAL_KEY, "true");

WsCe.ProjectResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
.executeProtobuf(WsCe.ProjectResponse.class);

assertThat(response.getCurrent())
.extracting(WsCe.Task::getId, WsCe.Task::getIncremental)
.containsExactlyInAnyOrder("T1", true);
}

@Test
public void incremental_on_in_queue_analysis() {
OrganizationDto organization = db.organizations().insert();
ComponentDto project = db.components().insertPrivateProject(organization);
userSession.addProjectPermission(UserRole.USER, project);
CeQueueDto queue1 = insertQueue("T1", project, IN_PROGRESS);
insertCharacteristic(queue1, INCREMENTAL_KEY, "true");
CeQueueDto queue2 = insertQueue("T2", project, PENDING);
insertCharacteristic(queue2, INCREMENTAL_KEY, "true");

WsCe.ProjectResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
.executeProtobuf(WsCe.ProjectResponse.class);

assertThat(response.getQueueList())
.extracting(WsCe.Task::getId, WsCe.Task::getIncremental)
.containsOnly(
tuple("T1", true),
tuple("T2", true));
}

@Test
public void long_living_branch_in_activity() {
ComponentDto project = db.components().insertMainBranch();
@@ -256,20 +216,17 @@ public class ComponentActionTest {
CeQueueDto shortLivingBranchQueue = insertQueue("Short", project, PENDING);
insertCharacteristic(shortLivingBranchQueue, BRANCH_KEY, shortLivingBranch.getBranch());
insertCharacteristic(shortLivingBranchQueue, BRANCH_TYPE_KEY, SHORT.name());
CeQueueDto incrementalQueue = insertQueue("Incremental", project, PENDING);
insertCharacteristic(incrementalQueue, INCREMENTAL_KEY, "true");

WsCe.ProjectResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, longLivingBranch.getKey())
.executeProtobuf(WsCe.ProjectResponse.class);

assertThat(response.getQueueList())
.extracting(WsCe.Task::getId, WsCe.Task::getComponentKey, WsCe.Task::getBranch, WsCe.Task::getBranchType, WsCe.Task::getIncremental)
.extracting(WsCe.Task::getId, WsCe.Task::getComponentKey, WsCe.Task::getBranch, WsCe.Task::getBranchType)
.containsOnly(
tuple("Main", project.getKey(), "", Common.BranchType.UNKNOWN_BRANCH_TYPE, false),
tuple("Long", longLivingBranch.getKey(), longLivingBranch.getBranch(), Common.BranchType.LONG, false),
tuple("Short", shortLivingBranch.getKey(), shortLivingBranch.getBranch(), Common.BranchType.SHORT, false),
tuple("Incremental", project.getKey(), "", Common.BranchType.UNKNOWN_BRANCH_TYPE, true));
tuple("Main", project.getKey(), "", Common.BranchType.UNKNOWN_BRANCH_TYPE),
tuple("Long", longLivingBranch.getKey(), longLivingBranch.getBranch(), Common.BranchType.LONG),
tuple("Short", shortLivingBranch.getKey(), shortLivingBranch.getBranch(), Common.BranchType.SHORT));
}

@Test

+ 11
- 12
server/sonar-server/src/test/java/org/sonar/server/ce/ws/SubmitActionTest.java View File

@@ -19,20 +19,10 @@
*/
package org.sonar.server.ce.ws;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -50,6 +40,15 @@ import org.sonar.test.JsonAssert;
import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.WsCe;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class SubmitActionTest {

private static final CeTask A_CE_TASK = new CeTask.Builder()
@@ -97,7 +96,7 @@ public class SubmitActionTest {
when(reportSubmitter.submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("My Project"),
anyMapOf(String.class, String.class), any(InputStream.class))).thenReturn(A_CE_TASK);

String[] characteristics = {"branch=branch1", "incremental=true", "key=value1=value2"};
String[] characteristics = {"branch=branch1", "key=value1=value2"};
WsCe.SubmitResponse submitResponse = tester.newRequest()
.setParam("projectKey", "my_project")
.setParam("projectName", "My Project")
@@ -110,7 +109,7 @@ public class SubmitActionTest {
verify(reportSubmitter).submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("My Project"),
map.capture(), any(InputStream.class));

assertThat(map.getValue()).containsOnly(entry("incremental", "true"), entry("branch", "branch1"), entry("key", "value1=value2"));
assertThat(map.getValue()).containsOnly(entry("branch", "branch1"), entry("key", "value1=value2"));
}

@Test

+ 0
- 32
server/sonar-server/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java View File

@@ -100,7 +100,6 @@ public class TaskActionTest {
assertThat(taskResponse.getTask().getComponentName()).isEqualTo(project.name());
assertThat(taskResponse.getTask().hasExecutionTimeMs()).isFalse();
assertThat(taskResponse.getTask().getLogs()).isFalse();
assertThat(taskResponse.getTask().getIncremental()).isFalse();
}

@Test
@@ -125,37 +124,6 @@ public class TaskActionTest {
assertThat(task.getLogs()).isFalse();
}

@Test
public void incremental_on_queued_task() {
logInAsRoot();

ComponentDto project = db.components().insertPrivateProject();
CeQueueDto queueDto = createAndPersistQueueTask(project);
insertCharacteristic(queueDto, "incremental", "true");

WsCe.TaskResponse taskResponse = ws.newRequest()
.setParam("id", SOME_TASK_UUID)
.executeProtobuf(WsCe.TaskResponse.class);

assertThat(taskResponse.getTask().getIncremental()).isTrue();
}

@Test
public void incremental_on_archived_task() {
logInAsRoot();

ComponentDto project = db.components().insertPrivateProject();
db.components().insertSnapshot(project, s -> s.setIncremental(true));
CeActivityDto activity = createAndPersistArchivedTask(project);
insertCharacteristic(activity, "incremental", "true");

WsCe.TaskResponse taskResponse = ws.newRequest()
.setParam("id", SOME_TASK_UUID)
.executeProtobuf(WsCe.TaskResponse.class);

assertThat(taskResponse.getTask().getIncremental()).isTrue();
}

@Test
public void long_living_branch_in_past_activity() {
logInAsRoot();

+ 0
- 46
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderImplTest.java View File

@@ -214,52 +214,6 @@ public class AnalysisMetadataHolderImplTest {
underTest.setCrossProjectDuplicationEnabled(false);
}

@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();

+ 0
- 14
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/AnalysisMetadataHolderRule.java View File

@@ -42,8 +42,6 @@ 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<>();
@@ -204,18 +202,6 @@ public class AnalysisMetadataHolderRule extends ExternalResource implements Muta
return pluginsByKey.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;
}

@Override
public boolean isShortLivingBranch() {
Branch property = this.branch.getProperty();

+ 0
- 11
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/analysis/MutableAnalysisMetadataHolderRule.java View File

@@ -154,17 +154,6 @@ public class MutableAnalysisMetadataHolderRule extends ExternalResource implemen
return delegate.getScannerPluginsByKey();
}

@Override
public boolean isIncrementalAnalysis() {
return delegate.isIncrementalAnalysis();
}

@Override
public MutableAnalysisMetadataHolder setIncrementalAnalysis(boolean isIncrementalAnalysis) {
delegate.setIncrementalAnalysis(isIncrementalAnalysis);
return this;
}

@Override
public boolean isShortLivingBranch() {
return delegate.isShortLivingBranch();

+ 10
- 35
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitorTest.java View File

@@ -19,17 +19,8 @@
*/
package org.sonar.server.computation.task.projectanalysis.issue;

import static com.google.common.collect.Lists.newArrayList;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.server.computation.task.projectanalysis.component.ReportComponent.builder;

import com.google.common.base.Optional;
import java.util.List;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -55,7 +46,6 @@ import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import org.sonar.server.computation.task.projectanalysis.component.DefaultBranchImpl;
import org.sonar.server.computation.task.projectanalysis.component.MergeBranchComponentUuids;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;
@@ -66,7 +56,14 @@ import org.sonar.server.computation.task.projectanalysis.issue.filter.IssueFilte
import org.sonar.server.computation.task.projectanalysis.qualityprofile.ActiveRulesHolderRule;
import org.sonar.server.computation.task.projectanalysis.source.SourceLinesRepositoryRule;

import com.google.common.base.Optional;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.server.computation.task.projectanalysis.component.ReportComponent.builder;

public class IntegrateIssuesVisitorTest {

@@ -144,30 +141,8 @@ public class IntegrateIssuesVisitorTest {
trackingDelegator = new IssueTrackingDelegator(shortBranchTracker, mergeBranchTracker, tracker, analysisMetadataHolder);
treeRootHolder.setRoot(PROJECT);
issueCache = new IssueCache(temp.newFile(), System2.INSTANCE);
when(analysisMetadataHolder.isIncrementalAnalysis()).thenReturn(false);
when(analysisMetadataHolder.getBranch()).thenReturn(java.util.Optional.of(new DefaultBranchImpl()));
when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(true);
underTest = new IntegrateIssuesVisitor(issueCache, issueLifecycle, issueVisitors, issuesLoader, analysisMetadataHolder, trackingDelegator);
}

@Test
public void process_issues_on_incremental_mode() {
when(analysisMetadataHolder.isIncrementalAnalysis()).thenReturn(true);

Component file = builder(Component.Type.FILE, FILE_REF)
.setKey(FILE_KEY)
.setUuid(FILE_UUID)
.setStatus(Status.SAME)
.build();

addBaseIssue(RuleTesting.XOO_X1);

underTest.visitAny(file);

verify(issueLifecycle).doAutomaticTransition(defaultIssueCaptor.capture());
assertThat(defaultIssueCaptor.getValue().ruleKey().rule()).isEqualTo("x1");

assertThat(newArrayList(issueCache.traverse())).hasSize(1);
underTest = new IntegrateIssuesVisitor(issueCache, issueLifecycle, issueVisitors, trackingDelegator);
}

@Test

+ 0
- 20
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/scm/ScmInfoDbLoaderTest.java View File

@@ -37,7 +37,6 @@ import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetada
import org.sonar.server.computation.task.projectanalysis.analysis.Branch;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import org.sonar.server.computation.task.projectanalysis.component.MergeBranchComponentUuids;
import org.sonar.server.computation.task.projectanalysis.scm.ScmInfoRepositoryImpl.NoScmInfo;
import org.sonar.server.computation.task.projectanalysis.source.SourceHashRepositoryImpl;
@@ -76,26 +75,10 @@ public class ScmInfoDbLoaderTest {

private ScmInfoDbLoader underTest = new ScmInfoDbLoader(analysisMetadataHolder, dbTester.getDbClient(), sourceHashRepository, mergeBranchComponentUuids);

@Test
public void dont_check_hash_for_unmodified_files_incremental_analysis() {
analysisMetadataHolder.setIncrementalAnalysis(true);
analysisMetadataHolder.setBranch(null);
analysisMetadataHolder.setBaseAnalysis(baseProjectAnalysis);

addFileSourceInDb("henry", DATE_1, "rev-1", computeSourceHash(1));

Component file = builder(Component.Type.FILE, FILE_REF).setKey("FILE_KEY").setUuid("FILE_UUID").setStatus(Status.SAME).build();
ScmInfo scmInfo = underTest.getScmInfoFromDb(file);
assertThat(scmInfo.getAllChangesets()).hasSize(1);

assertThat(logTester.logs(TRACE)).containsOnly("Reading SCM info from db for file 'FILE_UUID'");
}

@Test
public void returns_ScmInfo_from_DB_if_hashes_are_the_same() throws Exception {
analysisMetadataHolder.setBaseAnalysis(baseProjectAnalysis);
analysisMetadataHolder.setBranch(null);
analysisMetadataHolder.setIncrementalAnalysis(false);

addFileSourceInDb("henry", DATE_1, "rev-1", computeSourceHash(1));
addFileSourceInReport(1);
@@ -110,7 +93,6 @@ public class ScmInfoDbLoaderTest {
public void read_from_merge_branch_if_no_base() {
analysisMetadataHolder.setBaseAnalysis(null);
analysisMetadataHolder.setBranch(branch);
analysisMetadataHolder.setIncrementalAnalysis(false);
String mergeFileUuid = "mergeFileUuid";

when(mergeBranchComponentUuids.getUuid(FILE.getKey())).thenReturn(mergeFileUuid);
@@ -126,7 +108,6 @@ public class ScmInfoDbLoaderTest {
public void returns_absent_when_branch_and_source_is_different() {
analysisMetadataHolder.setBaseAnalysis(null);
analysisMetadataHolder.setBranch(branch);
analysisMetadataHolder.setIncrementalAnalysis(false);
String mergeFileUuid = "mergeFileUuid";

when(mergeBranchComponentUuids.getUuid(FILE.getKey())).thenReturn(mergeFileUuid);
@@ -141,7 +122,6 @@ public class ScmInfoDbLoaderTest {
public void returns_absent_when__hashes_are_not_the_same() throws Exception {
analysisMetadataHolder.setBaseAnalysis(baseProjectAnalysis);
analysisMetadataHolder.setBranch(null);
analysisMetadataHolder.setIncrementalAnalysis(false);

addFileSourceInReport(1);
addFileSourceInDb("henry", DATE_1, "rev-1", computeSourceHash(1) + "_different");

+ 3
- 21
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/DuplicationMeasuresStepTest.java View File

@@ -19,49 +19,31 @@
*/
package org.sonar.server.computation.task.projectanalysis.step;

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.server.computation.task.projectanalysis.duplication.DuplicationMeasures;
import org.sonar.server.computation.task.projectanalysis.duplication.IncrementalDuplicationMeasures;
import org.sonar.server.computation.task.step.ComputationStep;

import static org.mockito.Mockito.verify;

public class DuplicationMeasuresStepTest extends BaseStepTest {
@Mock
private DuplicationMeasures defaultDuplicationMeasures;
@Mock
private IncrementalDuplicationMeasures incrementalDuplicationMeasures;
@Rule
public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule();

private DuplicationMeasuresStep underTest;

@Before
public void before() {
MockitoAnnotations.initMocks(this);
underTest = new DuplicationMeasuresStep(analysisMetadataHolder, defaultDuplicationMeasures, incrementalDuplicationMeasures);
}

@Test
public void incremental_analysis_mode() {
analysisMetadataHolder.setIncrementalAnalysis(true);
underTest.execute();
verify(incrementalDuplicationMeasures).execute();
verifyZeroInteractions(defaultDuplicationMeasures);
underTest = new DuplicationMeasuresStep(defaultDuplicationMeasures);
}

@Test
public void full_analysis_mode() {
analysisMetadataHolder.setIncrementalAnalysis(false);
underTest.execute();
verify(defaultDuplicationMeasures).execute();
verifyZeroInteractions(incrementalDuplicationMeasures);
}

@Override

+ 0
- 58
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/IncrementalMeasureTransitionStepTest.java View File

@@ -1,58 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.computation.task.projectanalysis.step;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import org.junit.Rule;
import org.junit.Test;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.server.computation.task.projectanalysis.measure.IncrementalMeasureTransition;
import org.sonar.server.computation.task.step.ComputationStep;

public class IncrementalMeasureTransitionStepTest extends BaseStepTest {
@Rule
public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule();

IncrementalMeasureTransitionStep underTest = new IncrementalMeasureTransitionStep(analysisMetadataHolder);

@Override
protected ComputationStep step() {
return underTest;
}

@Test
public void skip_if_not_incremental() {
analysisMetadataHolder.setIncrementalAnalysis(false);
underTest.execute();
}

@Test
public void execute_if_incremental() {
IncrementalMeasureTransition runnable = mock(IncrementalMeasureTransition.class);
IncrementalMeasureTransitionStep underTest = new IncrementalMeasureTransitionStep(analysisMetadataHolder, runnable);
analysisMetadataHolder.setIncrementalAnalysis(true);

underTest.execute();
verify(runnable).run();
}

}

+ 10
- 47
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadDuplicationsFromReportStepTest.java View File

@@ -24,10 +24,9 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;
import org.sonar.server.computation.task.projectanalysis.component.VisitException;
import org.sonar.server.computation.task.projectanalysis.duplication.DetailedTextBlock;
import org.sonar.server.computation.task.projectanalysis.duplication.Duplicate;
@@ -55,47 +54,24 @@ public class LoadDuplicationsFromReportStepTest {
builder(PROJECT, ROOT_REF)
.addChildren(
builder(FILE, FILE_1_REF).build(),
builder(FILE, FILE_2_REF).build()
)
.build()
);
builder(FILE, FILE_2_REF).build())
.build());
@Rule
public BatchReportReaderRule reportReader = new BatchReportReaderRule();
@Rule
public DuplicationRepositoryRule duplicationRepository = DuplicationRepositoryRule.create(treeRootHolder);
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Rule
public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule();

private LoadDuplicationsFromReportStep underTest = new LoadDuplicationsFromReportStep(treeRootHolder, reportReader, duplicationRepository, analysisMetadataHolder);
private LoadDuplicationsFromReportStep underTest = new LoadDuplicationsFromReportStep(treeRootHolder, reportReader, duplicationRepository);

@Test
public void verify_description() {
assertThat(underTest.getDescription()).isEqualTo("Load inner file and in project duplications");
}
@Test
public void skip_if_incremental_analysis() {
analysisMetadataHolder.setIncrementalAnalysis(true);
reportReader.putDuplications(FILE_2_REF, createDuplication(singleLineTextRange(LINE), createInnerDuplicate(LINE + 1)));

underTest.execute();

assertNoDuplication(FILE_2_REF);
}

@Test
public void loads_no_duplications_if_reader_has_no_duplication() {
analysisMetadataHolder.setIncrementalAnalysis(false);
underTest.execute();

assertNoDuplication(FILE_1_REF);
}

@Test
public void loads_duplication_without_otherFileRef_as_inner_duplication() {
analysisMetadataHolder.setIncrementalAnalysis(false);
reportReader.putDuplications(FILE_2_REF, createDuplication(singleLineTextRange(LINE), createInnerDuplicate(LINE + 1)));

underTest.execute();
@@ -106,7 +82,6 @@ public class LoadDuplicationsFromReportStepTest {

@Test
public void loads_duplication_with_otherFileRef_as_inProject_duplication() {
analysisMetadataHolder.setIncrementalAnalysis(false);
reportReader.putDuplications(FILE_1_REF, createDuplication(singleLineTextRange(LINE), createInProjectDuplicate(FILE_2_REF, LINE + 1)));

underTest.execute();
@@ -117,7 +92,6 @@ public class LoadDuplicationsFromReportStepTest {

@Test
public void loads_multiple_duplications_with_multiple_duplicates() {
analysisMetadataHolder.setIncrementalAnalysis(false);
reportReader.putDuplications(
FILE_2_REF,
createDuplication(
@@ -128,8 +102,7 @@ public class LoadDuplicationsFromReportStepTest {
createInProjectDuplicate(FILE_1_REF, OTHER_LINE)),
createDuplication(
singleLineTextRange(OTHER_LINE + 80),
createInnerDuplicate(LINE), createInnerDuplicate(LINE + 10))
);
createInnerDuplicate(LINE), createInnerDuplicate(LINE + 10)));

underTest.execute();

@@ -141,18 +114,14 @@ public class LoadDuplicationsFromReportStepTest {
new InProjectDuplicate(file1Component, singleLineTextBlock(LINE + 10))),
duplication(
singleLineDetailedTextBlock(2, OTHER_LINE),
new InProjectDuplicate(file1Component, singleLineTextBlock(OTHER_LINE))
),
new InProjectDuplicate(file1Component, singleLineTextBlock(OTHER_LINE))),
duplication(
singleLineDetailedTextBlock(3, OTHER_LINE + 80),
new InnerDuplicate(singleLineTextBlock(LINE)), new InnerDuplicate(singleLineTextBlock(LINE + 10))
)
);
new InnerDuplicate(singleLineTextBlock(LINE)), new InnerDuplicate(singleLineTextBlock(LINE + 10))));
}

@Test
public void loads_never_consider_originals_from_batch_on_same_lines_as_the_equals() {
analysisMetadataHolder.setIncrementalAnalysis(false);
reportReader.putDuplications(
FILE_2_REF,
createDuplication(
@@ -160,8 +129,7 @@ public class LoadDuplicationsFromReportStepTest {
createInnerDuplicate(LINE + 1), createInnerDuplicate(LINE + 2), createInProjectDuplicate(FILE_1_REF, LINE + 2)),
createDuplication(
singleLineTextRange(LINE),
createInnerDuplicate(LINE + 2), createInnerDuplicate(LINE + 3), createInProjectDuplicate(FILE_1_REF, LINE + 2))
);
createInnerDuplicate(LINE + 2), createInnerDuplicate(LINE + 3), createInProjectDuplicate(FILE_1_REF, LINE + 2)));

underTest.execute();

@@ -170,19 +138,15 @@ public class LoadDuplicationsFromReportStepTest {
duplication(
singleLineDetailedTextBlock(1, LINE),
new InnerDuplicate(singleLineTextBlock(LINE + 1)), new InnerDuplicate(singleLineTextBlock(LINE + 2)),
new InProjectDuplicate(file1Component, singleLineTextBlock(LINE + 2))
),
new InProjectDuplicate(file1Component, singleLineTextBlock(LINE + 2))),
duplication(
singleLineDetailedTextBlock(2, LINE),
new InnerDuplicate(singleLineTextBlock(LINE + 2)), new InnerDuplicate(singleLineTextBlock(LINE + 3)),
new InProjectDuplicate(file1Component, singleLineTextBlock(LINE + 2))
)
);
new InProjectDuplicate(file1Component, singleLineTextBlock(LINE + 2))));
}

@Test
public void loads_duplication_with_otherFileRef_throws_IAE_if_component_does_not_exist() {
analysisMetadataHolder.setIncrementalAnalysis(false);
int line = 2;
reportReader.putDuplications(FILE_1_REF, createDuplication(singleLineTextRange(line), createInProjectDuplicate(666, line + 1)));

@@ -194,7 +158,6 @@ public class LoadDuplicationsFromReportStepTest {

@Test
public void loads_duplication_with_otherFileRef_throws_IAE_if_references_itself() {
analysisMetadataHolder.setIncrementalAnalysis(false);
int line = 2;
reportReader.putDuplications(FILE_1_REF, createDuplication(singleLineTextRange(line), createInProjectDuplicate(FILE_1_REF, line + 1)));


+ 0
- 24
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStepTest.java View File

@@ -121,30 +121,6 @@ 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() {
reportReader.setMetadata(

+ 0
- 32
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistCrossProjectDuplicationIndexStepTest.java View File

@@ -30,9 +30,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.duplication.DuplicationUnitDto;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.Analysis;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
@@ -95,39 +93,9 @@ public class PersistCrossProjectDuplicationIndexStepTest {
when(baseAnalysis.getUuid()).thenReturn(BASE_ANALYSIS_UUID);
analysisMetadataHolder.setUuid(ANALYSIS_UUID);
analysisMetadataHolder.setBaseAnalysis(baseAnalysis);
analysisMetadataHolder.setIncrementalAnalysis(false);
underTest = new PersistCrossProjectDuplicationIndexStep(crossProjectDuplicationStatusHolder, dbClient, treeRootHolder, analysisMetadataHolder, reportReader);
}

@Test
public void copy_base_analysis_in_incremental_mode() {
when(crossProjectDuplicationStatusHolder.isEnabled()).thenReturn(true);
analysisMetadataHolder.setIncrementalAnalysis(true);
DuplicationUnitDto dup = new DuplicationUnitDto();
dup.setAnalysisUuid(BASE_ANALYSIS_UUID);
dup.setComponentUuid(FILE_2_UUID);
dup.setEndLine(0);
dup.setHash("asd");
dup.setStartLine(0);
dup.setId(1);
dup.setIndexInFile(1);
try (DbSession session = dbTester.getSession()) {
dbClient.duplicationDao().insert(session, dup);
session.commit();
}
assertThat(dbTester.countRowsOfTable("duplications_index")).isEqualTo(1);
underTest.execute();

Map<String, Object> dto = dbTester.selectFirst("select HASH, START_LINE, END_LINE, INDEX_IN_FILE, COMPONENT_UUID, ANALYSIS_UUID "
+ "from duplications_index where analysis_uuid = '" + ANALYSIS_UUID + "'");
assertThat(dto.get("HASH")).isEqualTo("asd");
assertThat(dto.get("START_LINE")).isEqualTo(0L);
assertThat(dto.get("END_LINE")).isEqualTo(0L);
assertThat(dto.get("INDEX_IN_FILE")).isEqualTo(0L);
assertThat(dto.get("COMPONENT_UUID")).isEqualTo(FILE_2.getUuid());
assertThat(dto.get("ANALYSIS_UUID")).isEqualTo(ANALYSIS_UUID);
}

@Test
public void persist_cpd_text_block() throws Exception {
when(crossProjectDuplicationStatusHolder.isEnabled()).thenReturn(true);

+ 6
- 72
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java View File

@@ -19,13 +19,7 @@
*/
package org.sonar.server.computation.task.projectanalysis.step;

import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Arrays;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -40,10 +34,8 @@ import org.sonar.db.source.FileSourceDto.Type;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType;
import org.sonar.scanner.protocol.output.ScannerReport.SyntaxHighlightingRule.HighlightingType;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.Component.Status;
import org.sonar.server.computation.task.projectanalysis.component.FileAttributes;
import org.sonar.server.computation.task.projectanalysis.component.ReportComponent;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;
@@ -57,6 +49,11 @@ import org.sonar.server.computation.task.projectanalysis.scm.ScmInfoRepositoryRu
import org.sonar.server.computation.task.projectanalysis.source.SourceLinesRepositoryRule;
import org.sonar.server.computation.task.step.ComputationStep;

import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class PersistFileSourcesStepTest extends BaseStepTest {

private static final int FILE1_REF = 3;
@@ -84,8 +81,6 @@ public class PersistFileSourcesStepTest extends BaseStepTest {
public SourceLinesRepositoryRule fileSourceRepository = new SourceLinesRepositoryRule();
@Rule
public DuplicationRepositoryRule duplicationRepository = DuplicationRepositoryRule.create(treeRootHolder);
@Rule
public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule().setIncrementalAnalysis(false);

private DbClient dbClient = dbTester.getDbClient();
private DbSession session = dbTester.getSession();
@@ -96,7 +91,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest {
public void setup() {
when(system2.now()).thenReturn(NOW);
underTest = new PersistFileSourcesStep(dbClient, system2, treeRootHolder, reportReader, fileSourceRepository, scmInfoRepository,
duplicationRepository, analysisMetadataHolder);
duplicationRepository);
}

@Override
@@ -128,15 +123,6 @@ public class PersistFileSourcesStepTest extends BaseStepTest {
assertThat(data.getLines(1).getSource()).isEqualTo("line2");
}

@Test
public void dont_persist_unchanged_sources_if_incremental() {
analysisMetadataHolder.setIncrementalAnalysis(true);
initIncrementalReport(2);

underTest.execute();
assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1);
}

@Test
public void persist_source_hashes() {
initBasicReport(2);
@@ -473,58 +459,6 @@ public class PersistFileSourcesStepTest extends BaseStepTest {
assertThat(fileSourceDto.getRevision()).isNull();
}

private void initIncrementalReport(int numberOfLines) {
treeRootHolder.setRoot(ReportComponent
.builder(Component.Type.PROJECT, 1)
.setUuid(PROJECT_UUID)
.setKey(PROJECT_KEY)
.addChildren(
ReportComponent
.builder(Component.Type.MODULE, 2)
.setUuid("MODULE")
.setKey("MODULE_KEY")
.addChildren(
ReportComponent
.builder(Component.Type.FILE, FILE1_REF)
.setUuid(FILE1_UUID)
.setKey("MODULE_KEY:src/Foo.java")
.setFileAttributes(new FileAttributes(false, null, numberOfLines))
.setStatus(Status.CHANGED)
.build())
.build(),
ReportComponent
.builder(Component.Type.FILE, FILE2_REF)
.setUuid(FILE2_UUID)
.setKey("MODULE_KEY:src/Foo2.java")
.setStatus(Status.SAME).build())
.build());

reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(1)
.setType(ComponentType.PROJECT)
.addChildRef(2)
.build());
reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(2)
.setType(ComponentType.MODULE)
.addChildRef(FILE1_REF)
.build());
reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(FILE1_REF)
.setType(ComponentType.FILE)
.setLines(numberOfLines)
.build());
reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(FILE2_REF)
.setType(ComponentType.FILE)
.setLines(numberOfLines)
.build());

for (int i = 1; i <= numberOfLines; i++) {
fileSourceRepository.addLine(FILE1_REF, "line" + i);
}
}

private void initBasicReport(int numberOfLines) {
treeRootHolder.setRoot(ReportComponent.builder(Component.Type.PROJECT, 1).setUuid(PROJECT_UUID).setKey(PROJECT_KEY).addChildren(
ReportComponent.builder(Component.Type.MODULE, 2).setUuid("MODULE").setKey("MODULE_KEY").addChildren(

+ 0
- 5
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ReportPersistAnalysisStepTest.java View File

@@ -98,7 +98,6 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest {

@Test
public void persist_analysis() {
analysisMetadataHolder.setIncrementalAnalysis(false);
OrganizationDto organizationDto = dbTester.organizations().insert();
ComponentDto projectDto = ComponentTesting.newPrivateProjectDto(organizationDto, "ABCD").setDbKey(PROJECT_KEY).setName("Project");
dbClient.componentDao().insert(dbTester.getSession(), projectDto);
@@ -133,7 +132,6 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest {
assertThat(projectSnapshot.getStatus()).isEqualTo("U");
assertThat(projectSnapshot.getCreatedAt()).isEqualTo(analysisDate);
assertThat(projectSnapshot.getBuildDate()).isEqualTo(now);
assertThat(projectSnapshot.getIncremental()).isFalse();

assertThat(dbIdsRepository.getComponentId(module)).isEqualTo(moduleDto.getId());
assertThat(dbIdsRepository.getComponentId(directory)).isEqualTo(directoryDto.getId());
@@ -142,7 +140,6 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest {

@Test
public void persist_snapshots_with_leak_period() {
analysisMetadataHolder.setIncrementalAnalysis(false);
OrganizationDto organizationDto = dbTester.organizations().insert();
ComponentDto projectDto = ComponentTesting.newPrivateProjectDto(organizationDto, "ABCD").setDbKey(PROJECT_KEY).setName("Project");
dbClient.componentDao().insert(dbTester.getSession(), projectDto);
@@ -165,7 +162,6 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest {

@Test
public void only_persist_snapshots_with_leak_period_on_project_and_module() {
analysisMetadataHolder.setIncrementalAnalysis(false);
periodsHolder.setPeriod(new Period(LEAK_PERIOD_MODE_PREVIOUS_ANALYSIS, null, analysisDate, "u1"));

OrganizationDto organizationDto = dbTester.organizations().insert();
@@ -204,7 +200,6 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest {

@Test
public void set_no_period_on_snapshots_when_no_period() {
analysisMetadataHolder.setIncrementalAnalysis(false);
ComponentDto projectDto = ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert(), "ABCD").setDbKey(PROJECT_KEY).setName("Project");
dbClient.componentDao().insert(dbTester.getSession(), projectDto);
SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(projectDto);

+ 3
- 79
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStepTest.java View File

@@ -19,11 +19,7 @@
*/
package org.sonar.server.computation.task.projectanalysis.step;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Date;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -38,15 +34,13 @@ import org.sonar.db.component.SnapshotTesting;
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.server.computation.task.projectanalysis.analysis.Analysis;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.server.computation.task.projectanalysis.analysis.Branch;
import org.sonar.server.computation.task.projectanalysis.component.DefaultBranchImpl;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.DefaultBranchImpl;
import org.sonar.server.computation.task.projectanalysis.component.ReportComponent;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolderRule;
import org.sonar.server.computation.task.projectanalysis.validation.ValidateIncremental;

public class ValidateProjectStepTest {

@@ -70,14 +64,11 @@ public class ValidateProjectStepTest {
@Rule
public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule()
.setAnalysisDate(new Date(DEFAULT_ANALYSIS_TIME))
.setIncrementalAnalysis(false)
.setBranch(DEFAULT_BRANCH);

public ValidateIncremental validateIncremental = mock(ValidateIncremental.class);

DbClient dbClient = dbTester.getDbClient();

ValidateProjectStep underTest = new ValidateProjectStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, validateIncremental);
ValidateProjectStep underTest = new ValidateProjectStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder);

@Test
public void fail_if_root_component_is_not_a_project_in_db() {
@@ -272,71 +263,4 @@ public class ValidateProjectStepTest {
underTest.execute();
}

@Test
public void fail_if_incremental_plugin_not_found() {
ValidateProjectStep underTest = new ValidateProjectStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, null);

when(validateIncremental.execute()).thenReturn(false);
analysisMetadataHolder.setBaseAnalysis(new Analysis.Builder().setId(1).setUuid("base").setCreatedAt(DEFAULT_ANALYSIS_TIME).build());
analysisMetadataHolder.setIncrementalAnalysis(true);

reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(1)
.setType(ComponentType.PROJECT)
.setKey(PROJECT_KEY)
.addChildRef(2)
.build());

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("Can't process an incremental analysis of the project \"PROJECT_KEY\" because the incremental plugin is not loaded");

underTest.execute();
}

@Test
public void fail_if_incremental_validation_fails() {
when(validateIncremental.execute()).thenReturn(false);
analysisMetadataHolder.setBaseAnalysis(new Analysis.Builder().setId(1).setUuid("base").setCreatedAt(DEFAULT_ANALYSIS_TIME).build());
analysisMetadataHolder.setIncrementalAnalysis(true);

reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(1)
.setType(ComponentType.PROJECT)
.setKey(PROJECT_KEY)
.addChildRef(2)
.build());

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("The installation of the incremental plugin is invalid");

underTest.execute();
}

@Test
public void fail_if_incremental_and_first_analysis() {
when(validateIncremental.execute()).thenReturn(true);
analysisMetadataHolder.setBaseAnalysis(null);
analysisMetadataHolder.setIncrementalAnalysis(true);

reportReader.putComponent(ScannerReport.Component.newBuilder()
.setRef(1)
.setType(ComponentType.PROJECT)
.setKey(PROJECT_KEY)
.addChildRef(2)
.build());

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();
}
}
}

+ 1
- 2
sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java View File

@@ -56,8 +56,7 @@ public class PluginLoader {
* Defines the base keys (defined by {@link #basePluginKey(PluginInfo, Map)}) of the plugins which are allowed to
* run a full server extensions.
*/
private static final Set<String> PRIVILEGED_PLUGINS_BASE_KEYS = unmodifiableSet(new HashSet<>(
asList("billing", "branch", "developer", "governance", "incremental", "license")));
private static final Set<String> PRIVILEGED_PLUGINS_BASE_KEYS = unmodifiableSet(new HashSet<>(asList("billing", "branch", "developer", "governance", "license")));

public static final Version COMPATIBILITY_MODE_MAX_VERSION = Version.create("5.2");


+ 0
- 5
sonar-plugin-api/src/main/java/org/sonar/api/batch/AnalysisMode.java View File

@@ -37,9 +37,4 @@ public interface AnalysisMode {

boolean isPublish();

/**
* When incremental analysis is enabled (means not all files of a project are analyzed)
* @since 6.6
*/
boolean isIncremental();
}

+ 0
- 10
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/MockAnalysisMode.java View File

@@ -23,7 +23,6 @@ import org.sonar.api.batch.AnalysisMode;

public class MockAnalysisMode implements AnalysisMode {
private boolean previewOrIssue = false;
private boolean incremental = false;

@Override
public boolean isPreview() {
@@ -43,13 +42,4 @@ public class MockAnalysisMode implements AnalysisMode {
public boolean isPublish() {
return !previewOrIssue;
}

@Override
public boolean isIncremental() {
return incremental;
}

public void setIncremental(boolean incremental) {
this.incremental = incremental;
}
}

+ 2
- 54
sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/DefaultAnalysisMode.java View File

@@ -20,60 +20,37 @@
package org.sonar.scanner.analysis;

import java.util.Map;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import org.sonar.api.batch.AnalysisMode;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
import org.sonar.scanner.repository.ProjectRepositories;
import org.sonar.scanner.scan.branch.BranchConfiguration;

@Immutable
public class DefaultAnalysisMode implements AnalysisMode {
private static final Logger LOG = Loggers.get(DefaultAnalysisMode.class);
private static final String KEY_SCAN_ALL = "sonar.scanAllFiles";
private static final String KEY_INCREMENTAL = "sonar.incremental";

private final Map<String, String> analysisProps;
private final GlobalAnalysisMode analysisMode;
private final BranchConfiguration branchConfig;
private final ProjectRepositories projectRepos;
private final IncrementalScannerHandler incrementalScannerHandler;

private boolean scanAllFiles;
private boolean incremental;

public DefaultAnalysisMode(AnalysisProperties props, BranchConfiguration branchConfig, GlobalAnalysisMode analysisMode, ProjectRepositories projectRepos) {
this(props, branchConfig, analysisMode, projectRepos, null);
}

public DefaultAnalysisMode(AnalysisProperties props, BranchConfiguration branchConfig,
GlobalAnalysisMode analysisMode, ProjectRepositories projectRepos, @Nullable IncrementalScannerHandler incrementalScannerHandler) {
public DefaultAnalysisMode(AnalysisProperties props, BranchConfiguration branchConfig, GlobalAnalysisMode analysisMode) {
this.branchConfig = branchConfig;
this.analysisMode = analysisMode;
this.projectRepos = projectRepos;
this.incrementalScannerHandler = incrementalScannerHandler;
this.analysisProps = props.properties();
load();
printFlags();
}

@Override
public boolean isIncremental() {
return incremental;
}

public boolean scanAllFiles() {
return scanAllFiles;
}

private void printFlags() {
if (incremental) {
LOG.info("Incremental mode");
}
if (!scanAllFiles) {
LOG.info("Scanning only changed files");
}
@@ -81,36 +58,7 @@ public class DefaultAnalysisMode implements AnalysisMode {

private void load() {
String scanAllStr = analysisProps.get(KEY_SCAN_ALL);
incremental = incremental();
scanAllFiles = !incremental && !branchConfig.isShortLivingBranch() && (!analysisMode.isIssues() || "true".equals(scanAllStr));
}

private boolean incremental() {
String inc = analysisProps.get(KEY_INCREMENTAL);
if ("true".equals(inc)) {
if (incrementalScannerHandler == null || !incrementalScannerHandler.execute()) {
throw MessageException.of("Incremental mode is not available. Please contact your administrator.");
}

if (!analysisMode.isPublish()) {
throw MessageException.of("Incremental analysis is only available in publish mode");
}

if (branchConfig.branchName() != null) {
LOG.warn("Incremental analysis mode has been activated but it's not compatible with branches so a full analysis will be done.");
return false;
}

if (!projectRepos.exists() || projectRepos.lastAnalysisDate() == null) {
LOG.warn("Incremental analysis mode has been activated but the project was never analyzed before so a full analysis is about to be done.");
return false;
}

LOG.debug("Reference analysis is {}", DateUtils.formatDateTime(projectRepos.lastAnalysisDate()));
return true;
}

return false;
scanAllFiles = !branchConfig.isShortLivingBranch() && (!analysisMode.isIssues() || "true".equals(scanAllStr));
}

@Override

+ 0
- 24
sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/IncrementalScannerHandler.java View File

@@ -1,24 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.scanner.analysis;

public interface IncrementalScannerHandler {
boolean execute();
}

+ 2
- 6
sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java View File

@@ -26,7 +26,6 @@ import org.sonar.api.batch.fs.internal.DefaultInputModule;
import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
import org.sonar.api.config.Configuration;
import org.sonar.scanner.ProjectAnalysisInfo;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.bootstrap.ScannerPlugin;
import org.sonar.scanner.bootstrap.ScannerPluginRepository;
import org.sonar.scanner.cpd.CpdSettings;
@@ -46,18 +45,16 @@ public class MetadataPublisher implements ReportPublisherStep {
private final ProjectAnalysisInfo projectAnalysisInfo;
private final InputModuleHierarchy moduleHierarchy;
private final CpdSettings cpdSettings;
private final DefaultAnalysisMode mode;
private final ScannerPluginRepository pluginRepository;
private final BranchConfiguration branchConfiguration;

public MetadataPublisher(ProjectAnalysisInfo projectAnalysisInfo, InputModuleHierarchy moduleHierarchy, Configuration settings,
ModuleQProfiles qProfiles, CpdSettings cpdSettings, DefaultAnalysisMode mode, ScannerPluginRepository pluginRepository, BranchConfiguration branchConfiguration) {
ModuleQProfiles qProfiles, CpdSettings cpdSettings, ScannerPluginRepository pluginRepository, BranchConfiguration branchConfiguration) {
this.projectAnalysisInfo = projectAnalysisInfo;
this.moduleHierarchy = moduleHierarchy;
this.settings = settings;
this.qProfiles = qProfiles;
this.cpdSettings = cpdSettings;
this.mode = mode;
this.pluginRepository = pluginRepository;
this.branchConfiguration = branchConfiguration;
}
@@ -71,8 +68,7 @@ public class MetadataPublisher implements ReportPublisherStep {
// Here we want key without branch
.setProjectKey(rootDef.getKey())
.setCrossProjectDuplicationActivated(cpdSettings.isCrossProjectDuplicationEnabled())
.setRootComponentRef(rootProject.batchId())
.setIncremental(mode.isIncremental());
.setRootComponentRef(rootProject.batchId());

settings.get(ORGANIZATION).ifPresent(builder::setOrganizationKey);


+ 1
- 8
sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java View File

@@ -44,7 +44,6 @@ import org.sonar.api.utils.TempFolder;
import org.sonar.api.utils.ZipUtils;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
import org.sonar.scanner.bootstrap.ScannerWsClient;
import org.sonar.scanner.protocol.output.ScannerReportWriter;
@@ -78,18 +77,16 @@ public class ReportPublisher implements Startable {
private final ReportPublisherStep[] publishers;
private final Server server;
private final BranchConfiguration branchConfiguration;
private final DefaultAnalysisMode analysisFlags;

private Path reportDir;
private ScannerReportWriter writer;

public ReportPublisher(Configuration settings, ScannerWsClient wsClient, Server server, AnalysisContextReportPublisher contextPublisher, DefaultAnalysisMode analysisFlags,
public ReportPublisher(Configuration settings, ScannerWsClient wsClient, Server server, AnalysisContextReportPublisher contextPublisher,
InputModuleHierarchy moduleHierarchy, GlobalAnalysisMode analysisMode, TempFolder temp, ReportPublisherStep[] publishers, BranchConfiguration branchConfiguration) {
this.settings = settings;
this.wsClient = wsClient;
this.server = server;
this.contextPublisher = contextPublisher;
this.analysisFlags = analysisFlags;
this.moduleHierarchy = moduleHierarchy;
this.analysisMode = analysisMode;
this.temp = temp;
@@ -181,10 +178,6 @@ public class ReportPublisher implements Startable {
.setParam("projectBranch", moduleHierarchy.root().getBranch())
.setPart("report", filePart);

if (analysisFlags.isIncremental()) {
post.setParam(CHARACTERISTIC, "incremental=true");
}

String branchName = branchConfiguration.branchName();
if (branchName != null) {
post.setParam(CHARACTERISTIC, "branch=" + branchName);

+ 4
- 7
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectReactorValidator.java View File

@@ -29,7 +29,6 @@ import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.bootstrap.ProjectReactor;
import org.sonar.api.utils.MessageException;
import org.sonar.core.component.ComponentKeys;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.branch.BranchParamsValidator;
import org.sonar.scanner.scan.branch.DefaultBranchParamsValidator;

@@ -40,16 +39,14 @@ import org.sonar.scanner.scan.branch.DefaultBranchParamsValidator;
public class ProjectReactorValidator {
private final AnalysisMode mode;
private final BranchParamsValidator branchParamsValidator;
private final DefaultAnalysisMode analysisFlags;

public ProjectReactorValidator(AnalysisMode mode, DefaultAnalysisMode analysisFlags, BranchParamsValidator branchParamsValidator) {
public ProjectReactorValidator(AnalysisMode mode, BranchParamsValidator branchParamsValidator) {
this.mode = mode;
this.analysisFlags = analysisFlags;
this.branchParamsValidator = branchParamsValidator;
}

public ProjectReactorValidator(AnalysisMode mode, DefaultAnalysisMode analysisFlags) {
this(mode, analysisFlags, new DefaultBranchParamsValidator());
public ProjectReactorValidator(AnalysisMode mode) {
this(mode, new DefaultBranchParamsValidator());
}

public void validate(ProjectReactor reactor) {
@@ -65,7 +62,7 @@ public class ProjectReactorValidator {

String deprecatedBranchName = reactor.getRoot().getBranch();

branchParamsValidator.validate(validationMessages, deprecatedBranchName, analysisFlags.isIncremental());
branchParamsValidator.validate(validationMessages, deprecatedBranchName);
validateBranch(validationMessages, deprecatedBranchName);

if (!validationMessages.isEmpty()) {

+ 1
- 1
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/branch/BranchParamsValidator.java View File

@@ -27,5 +27,5 @@ import org.sonar.api.batch.ScannerSide;
@ScannerSide
@InstantiationStrategy(InstantiationStrategy.PER_BATCH)
public interface BranchParamsValidator {
void validate(List<String> validationMessages, @Nullable String deprecatedBranchName, boolean incrementalMode);
void validate(List<String> validationMessages, @Nullable String deprecatedBranchName);
}

+ 1
- 1
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/branch/DefaultBranchParamsValidator.java View File

@@ -24,7 +24,7 @@ import javax.annotation.Nullable;

public class DefaultBranchParamsValidator implements BranchParamsValidator {
@Override
public void validate(List<String> validationMessages, @Nullable String deprecatedBranchName, boolean incrementalMode) {
public void validate(List<String> validationMessages, @Nullable String deprecatedBranchName) {
// no-op
}
}

+ 2
- 5
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java View File

@@ -43,7 +43,6 @@ import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.DefaultInputModule;
import org.sonar.api.batch.fs.internal.FileExtensionPredicate;
import org.sonar.api.scan.filesystem.PathResolver;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.branch.BranchConfiguration;

/**
@@ -65,12 +64,10 @@ public class InputComponentStore {
private final SetMultimap<String, InputFile> filesByNameCache = LinkedHashMultimap.create();
private final SetMultimap<String, InputFile> filesByExtensionCache = LinkedHashMultimap.create();
private final InputModule root;
private final DefaultAnalysisMode analysisFlags;
private final BranchConfiguration branchConfiguration;

public InputComponentStore(DefaultInputModule root, DefaultAnalysisMode analysisFlags, BranchConfiguration branchConfiguration) {
public InputComponentStore(DefaultInputModule root, BranchConfiguration branchConfiguration) {
this.root = root;
this.analysisFlags = analysisFlags;
this.branchConfiguration = branchConfiguration;
this.put(root);
}
@@ -83,7 +80,7 @@ public class InputComponentStore {
return inputFileCache.values().stream()
.map(f -> (DefaultInputFile) f)
.filter(DefaultInputFile::isPublished)
.filter(f -> (!analysisFlags.isIncremental() && !branchConfiguration.isShortLivingBranch()) || f.status() != Status.SAME)::iterator;
.filter(f -> (!branchConfiguration.isShortLivingBranch()) || f.status() != Status.SAME)::iterator;
}

public Iterable<InputFile> allFiles() {

+ 2
- 3
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStoreProvider.java View File

@@ -21,15 +21,14 @@ package org.sonar.scanner.scan.filesystem;

import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.branch.BranchConfiguration;

public class InputComponentStoreProvider extends ProviderAdapter {
private InputComponentStore store;

public InputComponentStore provide(InputModuleHierarchy hierarchy, DefaultAnalysisMode analysisFlags, BranchConfiguration branchConfiguration) {
public InputComponentStore provide(InputModuleHierarchy hierarchy, BranchConfiguration branchConfiguration) {
if (store == null) {
store = new InputComponentStore(hierarchy.root(), analysisFlags, branchConfiguration);
store = new InputComponentStore(hierarchy.root(), branchConfiguration);
}
return store;
}

+ 1
- 12
sonar-scanner-engine/src/main/java/org/sonar/scanner/source/ZeroCoverageSensor.java View File

@@ -37,9 +37,6 @@ import org.sonar.api.batch.sensor.coverage.NewCoverage;
import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.utils.KeyValueFormat;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.measure.MeasureCache;

import static org.sonar.core.util.stream.MoreCollectors.toSet;
@@ -47,14 +44,10 @@ import static org.sonar.core.util.stream.MoreCollectors.toSet;
@Phase(name = Phase.Name.POST)
public final class ZeroCoverageSensor implements Sensor {

private static final Logger LOG = Loggers.get(ZeroCoverageSensor.class);

private final MeasureCache measureCache;
private final DefaultAnalysisMode analysisFlags;

public ZeroCoverageSensor(MeasureCache measureCache, DefaultAnalysisMode analysisFlags) {
public ZeroCoverageSensor(MeasureCache measureCache) {
this.measureCache = measureCache;
this.analysisFlags = analysisFlags;
}

@Override
@@ -65,10 +58,6 @@ public final class ZeroCoverageSensor implements Sensor {

@Override
public void execute(final SensorContext context) {
if (analysisFlags.isIncremental()) {
LOG.debug("Incremental mode: not forcing coverage to zero");
return;
}
FileSystem fs = context.fileSystem();
for (InputFile f : fs.inputFiles(fs.predicates().hasType(Type.MAIN))) {
if (((DefaultInputFile) f).isExcludedForCoverage()) {

+ 1
- 58
sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/DefaultAnalysisModeTest.java View File

@@ -20,14 +20,11 @@
package org.sonar.scanner.analysis;

import java.util.Collections;
import java.util.Date;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.utils.MessageException;
import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
import org.sonar.scanner.repository.ProjectRepositories;
import org.sonar.scanner.scan.branch.BranchConfiguration;

import static org.assertj.core.api.Assertions.assertThat;
@@ -36,16 +33,12 @@ import static org.mockito.Mockito.when;

public class DefaultAnalysisModeTest {
private BranchConfiguration branchConfig;
private ProjectRepositories projectRepos;
private GlobalAnalysisMode globalMode;
private IncrementalScannerHandler incrementalScannerHandler;

@Before
public void setUp() {
branchConfig = mock(BranchConfiguration.class);
projectRepos = mock(ProjectRepositories.class);
globalMode = mock(GlobalAnalysisMode.class);
incrementalScannerHandler = mock(IncrementalScannerHandler.class);
}

@Rule
@@ -72,56 +65,6 @@ public class DefaultAnalysisModeTest {
assertThat(mode.isPreview()).isTrue();
}

@Test
public void incremental_not_found() {
AnalysisProperties analysisProps = new AnalysisProperties(Collections.singletonMap("sonar.incremental", "true"));
thrown.expect(MessageException.class);
thrown.expectMessage("Incremental mode is not available. Please contact your administrator.");
createmode(analysisProps);
}

@Test
public void no_incremental_if_not_publish() {
when(incrementalScannerHandler.execute()).thenReturn(true);
AnalysisProperties analysisProps = new AnalysisProperties(Collections.singletonMap("sonar.incremental", "true"));
thrown.expect(MessageException.class);
thrown.expectMessage("Incremental analysis is only available in publish mode");
createmode(analysisProps);
}

@Test
public void no_incremental_mode_if_branches() {
when(globalMode.isPublish()).thenReturn(true);
when(incrementalScannerHandler.execute()).thenReturn(true);
when(branchConfig.branchName()).thenReturn("branch1");
AnalysisProperties analysisProps = new AnalysisProperties(Collections.singletonMap("sonar.incremental", "true"));
DefaultAnalysisMode analysisMode = createmode(analysisProps);
assertThat(analysisMode.isIncremental()).isFalse();
assertThat(analysisMode.scanAllFiles()).isTrue();
}

@Test
public void no_incremental_mode_if_no_previous_analysis() {
when(incrementalScannerHandler.execute()).thenReturn(true);
when(globalMode.isPublish()).thenReturn(true);
AnalysisProperties analysisProps = new AnalysisProperties(Collections.singletonMap("sonar.incremental", "true"));
DefaultAnalysisMode analysisMode = createmode(analysisProps);
assertThat(analysisMode.isIncremental()).isFalse();
assertThat(analysisMode.scanAllFiles()).isTrue();
}

@Test
public void incremental_mode() {
when(incrementalScannerHandler.execute()).thenReturn(true);
when(globalMode.isPublish()).thenReturn(true);
when(projectRepos.lastAnalysisDate()).thenReturn(new Date());
when(projectRepos.exists()).thenReturn(true);
AnalysisProperties analysisProps = new AnalysisProperties(Collections.singletonMap("sonar.incremental", "true"));
DefaultAnalysisMode analysisMode = createmode(analysisProps);
assertThat(analysisMode.isIncremental()).isTrue();
assertThat(analysisMode.scanAllFiles()).isFalse();
}

@Test
public void scan_all_if_publish() {
when(globalMode.isIssues()).thenReturn(false);
@@ -147,7 +90,7 @@ public class DefaultAnalysisModeTest {
}

private DefaultAnalysisMode createmode(AnalysisProperties analysisProps) {
return new DefaultAnalysisMode(analysisProps, branchConfig, globalMode, projectRepos, incrementalScannerHandler);
return new DefaultAnalysisMode(analysisProps, branchConfig, globalMode);
}

}

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java View File

@@ -41,7 +41,6 @@ import org.sonar.duplications.block.Block;
import org.sonar.duplications.block.ByteArray;
import org.sonar.duplications.index.CloneGroup;
import org.sonar.duplications.index.ClonePart;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.cpd.index.SonarCpdBlockIndex;
import org.sonar.scanner.protocol.output.ScannerReport.Duplicate;
import org.sonar.scanner.protocol.output.ScannerReport.Duplication;
@@ -90,7 +89,7 @@ public class CpdExecutorTest {

index = new SonarCpdBlockIndex(publisher, settings);
DefaultInputModule inputModule = TestInputFileBuilder.newDefaultInputModule("foo", baseDir);
componentStore = new InputComponentStore(inputModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
componentStore = new InputComponentStore(inputModule, mock(BranchConfiguration.class));
executor = new CpdExecutor(settings, index, publisher, componentStore, branchConfig);
reader = new ScannerReportReader(outputDir);


+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java View File

@@ -31,7 +31,6 @@ import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.api.batch.postjob.issue.PostJobIssue;
import org.sonar.api.batch.rule.Severity;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.issue.IssueCache;
import org.sonar.scanner.issue.tracking.TrackedIssue;
import org.sonar.scanner.scan.branch.BranchConfiguration;
@@ -56,7 +55,7 @@ public class DefaultPostJobContextTest {
public void setUp() throws IOException {
issueCache = mock(IssueCache.class);
DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule("foo", temp.newFolder());
componentStore = new InputComponentStore(rootModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
componentStore = new InputComponentStore(rootModule, mock(BranchConfiguration.class));
settings = new MapSettings();
analysisMode = mock(AnalysisMode.class);
context = new DefaultPostJobContext(settings.asConfig(), settings, issueCache, componentStore, analysisMode);

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/CoveragePublisherTest.java View File

@@ -31,7 +31,6 @@ import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.core.util.CloseableIterator;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.protocol.output.ScannerReport.LineCoverage;
import org.sonar.scanner.protocol.output.ScannerReportReader;
import org.sonar.scanner.protocol.output.ScannerReportWriter;
@@ -59,7 +58,7 @@ public class CoveragePublisherTest {
String moduleKey = "foo";
inputFile = new TestInputFileBuilder(moduleKey, "src/Foo.php").setLines(5).build();
DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(moduleKey, temp.newFolder());
InputComponentStore componentCache = new InputComponentStore(rootModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
InputComponentStore componentCache = new InputComponentStore(rootModule, mock(BranchConfiguration.class));
componentCache.put(inputFile);

measureCache = mock(MeasureCache.class);

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MeasuresPublisherTest.java View File

@@ -34,7 +34,6 @@ import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.core.util.CloseableIterator;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.deprecated.test.TestPlanBuilder;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.scanner.protocol.output.ScannerReportReader;
@@ -70,7 +69,7 @@ public class MeasuresPublisherTest {
String moduleKey = "foo";
inputModule = TestInputFileBuilder.newDefaultInputModule(moduleKey, temp.newFolder());
inputFile = new TestInputFileBuilder(moduleKey, "src/Foo.php").setPublish(true).build();
InputComponentStore componentCache = new InputComponentStore(inputModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
InputComponentStore componentCache = new InputComponentStore(inputModule, mock(BranchConfiguration.class));
componentCache.put(inputFile);
measureCache = mock(MeasureCache.class);
when(measureCache.byComponentKey(anyString())).thenReturn(Collections.<DefaultMeasure<?>>emptyList());

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java View File

@@ -88,7 +88,7 @@ public class MetadataPublisherTest {
when(inputModuleHierarchy.root()).thenReturn(rootModule);
analysisMode = mock(DefaultAnalysisMode.class);
branches = mock(BranchConfiguration.class);
underTest = new MetadataPublisher(projectAnalysisInfo, inputModuleHierarchy, settings.asConfig(), qProfiles, cpdSettings, analysisMode,
underTest = new MetadataPublisher(projectAnalysisInfo, inputModuleHierarchy, settings.asConfig(), qProfiles, cpdSettings,
pluginRepository, branches);
}

@@ -110,7 +110,6 @@ public class MetadataPublisherTest {
assertThat(metadata.getAnalysisDate()).isEqualTo(1234567L);
assertThat(metadata.getProjectKey()).isEqualTo("foo");
assertThat(metadata.getProjectKey()).isEqualTo("foo");
assertThat(metadata.getIncremental()).isFalse();
assertThat(metadata.getQprofilesPerLanguage()).containsOnly(entry("java", org.sonar.scanner.protocol.output.ScannerReport.Metadata.QProfile.newBuilder()
.setKey("q1")
.setName("Q1")

+ 9
- 44
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java View File

@@ -44,7 +44,6 @@ import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.config.ScannerProperties;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
import org.sonar.scanner.bootstrap.ScannerWsClient;
import org.sonar.scanner.scan.branch.BranchConfiguration;
@@ -73,7 +72,6 @@ public class ReportPublisherTest {
@Rule
public ExpectedException exception = ExpectedException.none();

DefaultAnalysisMode analysisFlags = mock(DefaultAnalysisMode.class);
GlobalAnalysisMode mode = mock(GlobalAnalysisMode.class);
MapSettings settings = new MapSettings(new PropertyDefinitions(CorePropertyDefinitions.all()));
ScannerWsClient wsClient;
@@ -94,7 +92,7 @@ public class ReportPublisherTest {

@Test
public void log_and_dump_information_about_report_uploading() throws IOException {
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode,
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode,
mock(TempFolder.class), new ReportPublisherStep[0], branchConfiguration);
settings.setProperty(ScannerProperties.ORGANIZATION, "MyOrg");

@@ -118,7 +116,7 @@ public class ReportPublisherTest {

@Test
public void parse_upload_error_message() throws IOException {
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode,
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode,
mock(TempFolder.class), new ReportPublisherStep[0], branchConfiguration);
HttpException ex = new HttpException("url", 404, "{\"errors\":[{\"msg\":\"Organization with key 'MyOrg' does not exist\"}]}");
WsResponse response = mock(WsResponse.class);
@@ -133,7 +131,7 @@ public class ReportPublisherTest {
@Test
public void log_public_url_if_defined() throws IOException {
when(server.getPublicRootUrl()).thenReturn("https://publicserver/sonarqube");
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

underTest.logSuccess("TASK-123");
@@ -155,7 +153,7 @@ public class ReportPublisherTest {
@Test
public void fail_if_public_url_malformed() throws IOException {
when(server.getPublicRootUrl()).thenReturn("invalid");
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

exception.expect(MessageException.class);
@@ -165,7 +163,7 @@ public class ReportPublisherTest {

@Test
public void log_but_not_dump_information_when_report_is_not_uploaded() {
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

underTest.logSuccess(/* report not uploaded, no server task */null);
@@ -183,7 +181,7 @@ public class ReportPublisherTest {
settings.setProperty("sonar.scanner.keepReport", true);
Path reportDir = temp.getRoot().toPath().resolve("scanner-report");
Files.createDirectory(reportDir);
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

underTest.start();
@@ -195,7 +193,7 @@ public class ReportPublisherTest {
public void should_delete_report_by_default() throws IOException {
Path reportDir = temp.getRoot().toPath().resolve("scanner-report");
Files.createDirectory(reportDir);
ReportPublisher job = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher job = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0],
branchConfiguration);

@@ -206,7 +204,7 @@ public class ReportPublisherTest {

@Test
public void test_ws_parameters() throws Exception {
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

settings.setProperty(ScannerProperties.ORGANIZATION, "MyOrg");
@@ -233,42 +231,9 @@ public class ReportPublisherTest {
entry("projectKey", "struts"));
}

@Test
public void test_send_incremental_characteristic() throws Exception {
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

when(analysisFlags.isIncremental()).thenReturn(true);
String orgName = "MyOrg";
settings.setProperty(ScannerProperties.ORGANIZATION, orgName);

WsResponse response = mock(WsResponse.class);

PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);
WsCe.SubmitResponse.newBuilder().build().writeTo(out);
out.close();

when(response.failIfNotSuccessful()).thenReturn(response);
when(response.contentStream()).thenReturn(in);

when(wsClient.call(any(WsRequest.class))).thenReturn(response);
underTest.upload(temp.newFile());

ArgumentCaptor<WsRequest> capture = ArgumentCaptor.forClass(WsRequest.class);
verify(wsClient).call(capture.capture());

WsRequest wsRequest = capture.getValue();
assertThat(wsRequest.getParameters().getKeys()).hasSize(3);
assertThat(wsRequest.getParameters().getValues("organization")).containsExactly(orgName);
assertThat(wsRequest.getParameters().getValues("projectKey")).containsExactly("struts");
assertThat(wsRequest.getParameters().getValues("characteristic"))
.containsExactly("incremental=true");
}

@Test
public void test_send_branches_characteristics() throws Exception {
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, analysisFlags, moduleHierarchy, mode, mock(TempFolder.class),
ReportPublisher underTest = new ReportPublisher(settings.asConfig(), wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration);

String orgName = "MyOrg";

+ 1
- 29
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java View File

@@ -27,18 +27,15 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.batch.fs.InputFile.Status;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.DefaultInputModule;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.protocol.output.ScannerReportWriter;
import org.sonar.scanner.scan.branch.BranchConfiguration;
import org.sonar.scanner.scan.filesystem.InputComponentStore;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class SourcePublisherTest {

@@ -48,7 +45,6 @@ public class SourcePublisherTest {
private File sourceFile;
private ScannerReportWriter writer;
private DefaultInputFile inputFile;
private DefaultAnalysisMode analysisFlags;

@Before
public void prepare() throws IOException {
@@ -62,8 +58,7 @@ public class SourcePublisherTest {
.build();

DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(moduleKey, baseDir);
analysisFlags = mock(DefaultAnalysisMode.class);
InputComponentStore componentStore = new InputComponentStore(rootModule, analysisFlags, mock(BranchConfiguration.class));
InputComponentStore componentStore = new InputComponentStore(rootModule, mock(BranchConfiguration.class));
componentStore.put(inputFile);

publisher = new SourcePublisher(componentStore);
@@ -122,27 +117,4 @@ public class SourcePublisherTest {
assertThat(FileUtils.readFileToString(out, StandardCharsets.UTF_8)).isEqualTo("\n2\n3\n4\n5");
}

@Test
public void publishChangedSourceInIncrementalMode() throws Exception {
when(analysisFlags.isIncremental()).thenReturn(true);
FileUtils.write(sourceFile, "1\n2\n3\n4\n5", StandardCharsets.ISO_8859_1);
inputFile.setStatus(Status.CHANGED);

publisher.publish(writer);

File out = writer.getSourceFile(inputFile.batchId());
assertThat(FileUtils.readFileToString(out, StandardCharsets.UTF_8)).isEqualTo("1\n2\n3\n4\n5");
}

@Test
public void dontPublishUnchangedSourceInIncrementalMode() throws Exception {
when(analysisFlags.isIncremental()).thenReturn(true);
FileUtils.write(sourceFile, "foo", StandardCharsets.ISO_8859_1);
inputFile.setStatus(Status.SAME);

publisher.publish(writer);

File out = writer.getSourceFile(inputFile.batchId());
assertThat(out).doesNotExist();
}
}

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java View File

@@ -24,7 +24,6 @@ import org.junit.Test;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.fs.InputModule;
import org.sonar.api.batch.fs.internal.DefaultInputModule;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.branch.BranchConfiguration;
import org.sonar.scanner.scan.filesystem.InputComponentStore;

@@ -39,7 +38,7 @@ public class ModuleIndexerTest {
private InputComponentStore componentStore;

public void createIndexer(DefaultInputModule rootModule) {
componentStore = new InputComponentStore(rootModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
componentStore = new InputComponentStore(rootModule, mock(BranchConfiguration.class));
tree = new DefaultComponentTree();
moduleHierarchy = mock(DefaultInputModuleHierarchy.class);
indexer = new ModuleIndexer(tree, componentStore, moduleHierarchy);

+ 1
- 4
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectReactorValidatorTest.java View File

@@ -28,7 +28,6 @@ import org.sonar.api.batch.AnalysisMode;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.bootstrap.ProjectReactor;
import org.sonar.api.utils.MessageException;
import org.sonar.scanner.analysis.DefaultAnalysisMode;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -39,14 +38,12 @@ public class ProjectReactorValidatorTest {
public ExpectedException thrown = ExpectedException.none();

private AnalysisMode mode;
private DefaultAnalysisMode analysisFlags;
private ProjectReactorValidator validator;

@Before
public void prepare() {
mode = mock(AnalysisMode.class);
analysisFlags = mock(DefaultAnalysisMode.class);
validator = new ProjectReactorValidator(mode, analysisFlags);
validator = new ProjectReactorValidator(mode);
}

@Test

+ 2
- 3
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java View File

@@ -35,7 +35,6 @@ import org.sonar.api.batch.fs.InputPath;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.DefaultInputModule;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.branch.BranchConfiguration;

import static org.assertj.core.api.Assertions.assertThat;
@@ -60,7 +59,7 @@ public class InputComponentStoreTest {
DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(rootDef);
DefaultInputModule subModule = TestInputFileBuilder.newDefaultInputModule(moduleDef);

InputComponentStore cache = new InputComponentStore(rootModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
InputComponentStore cache = new InputComponentStore(rootModule, mock(BranchConfiguration.class));
cache.put(subModule);

DefaultInputFile fooFile = new TestInputFileBuilder(rootModuleKey, "src/main/java/Foo.java")
@@ -104,7 +103,7 @@ public class InputComponentStoreTest {

static class InputComponentStoreTester extends InputComponentStore {
InputComponentStoreTester() throws IOException {
super(TestInputFileBuilder.newDefaultInputModule("root", temp.newFolder()), mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
super(TestInputFileBuilder.newDefaultInputModule("root", temp.newFolder()), mock(BranchConfiguration.class));
}

InputFile addFile(String moduleKey, String relpath, String language) {

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java View File

@@ -29,7 +29,6 @@ import org.sonar.api.batch.fs.InputModule;
import org.sonar.api.batch.fs.internal.DefaultInputModule;
import org.sonar.api.batch.fs.internal.SensorStrategy;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.scan.branch.BranchConfiguration;

import static org.assertj.core.api.Assertions.assertThat;
@@ -49,7 +48,7 @@ public class ModuleInputComponentStoreTest {
@Before
public void setUp() throws IOException {
DefaultInputModule root = TestInputFileBuilder.newDefaultInputModule(moduleKey, temp.newFolder());
componentStore = new InputComponentStore(root, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
componentStore = new InputComponentStore(root, mock(BranchConfiguration.class));
}

@Test

+ 1
- 2
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/report/JSONReportTest.java View File

@@ -45,7 +45,6 @@ import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.issue.Issue;
import org.sonar.api.platform.Server;
import org.sonar.api.rule.RuleKey;
import org.sonar.scanner.analysis.DefaultAnalysisMode;
import org.sonar.scanner.issue.IssueCache;
import org.sonar.scanner.issue.tracking.TrackedIssue;
import org.sonar.scanner.scan.DefaultComponentTree;
@@ -84,7 +83,7 @@ public class JSONReportTest {
DefaultComponentTree inputComponentTree = new DefaultComponentTree();
ProjectDefinition def = ProjectDefinition.create().setBaseDir(projectBaseDir).setWorkDir(temp.newFolder()).setKey("struts");
DefaultInputModule rootModule = new DefaultInputModule(def, 1);
InputComponentStore inputComponentStore = new InputComponentStore(rootModule, mock(DefaultAnalysisMode.class), mock(BranchConfiguration.class));
InputComponentStore inputComponentStore = new InputComponentStore(rootModule, mock(BranchConfiguration.class));

DefaultInputModule moduleA = new DefaultInputModule(ProjectDefinition.create().setKey("struts-core").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
inputComponentTree.index(moduleA, rootModule);

+ 0
- 46
sonar-scanner-engine/src/test/java/org/sonar/scanner/source/ZeroCoverageSensorTest.java View File

@@ -1,46 +0,0 @@
/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.scanner.source;

import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.scanner.analysis.DefaultAnalysisMode;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class ZeroCoverageSensorTest {

@Rule
public LogTester logTester = new LogTester();

@Test
public void dontForceCoverageInIncrementalMode() {
DefaultAnalysisMode analysisFlags = mock(DefaultAnalysisMode.class);
when(analysisFlags.isIncremental()).thenReturn(true);
ZeroCoverageSensor zeroCoverageSensor = new ZeroCoverageSensor(null, analysisFlags);
zeroCoverageSensor.execute(null);
assertThat(logTester.logs(LoggerLevel.DEBUG)).contains("Incremental mode: not forcing coverage to zero");
}

}

+ 3
- 5
sonar-scanner-protocol/src/main/protobuf/scanner_report.proto View File

@@ -39,10 +39,9 @@ message Metadata {
bool cross_project_duplication_activated = 6;
map<string, QProfile> qprofiles_per_language = 7;
map<string, Plugin> plugins_by_key = 8;
bool incremental = 9;
string branch_name = 10;
BranchType branch_type = 11;
string merge_branch_name = 12;
string branch_name = 9;
BranchType branch_type = 10;
string merge_branch_name = 11;

message QProfile {
string key = 1;
@@ -118,7 +117,6 @@ message Component {
FILE = 4;
}
// For incremental mode
enum FileStatus {
UNAVAILABLE = 0;
SAME = 1;

+ 2
- 3
sonar-ws/src/main/protobuf/ws-ce.proto View File

@@ -89,9 +89,8 @@ message Task {
optional string scannerContext = 18;
optional bool hasScannerContext = 19;
optional string organization = 20;
optional bool incremental = 21;
optional string branch = 22;
optional sonarqube.ws.commons.BranchType branchType = 23;
optional string branch = 21;
optional sonarqube.ws.commons.BranchType branchType = 22;
}

enum TaskStatus {

Loading…
Cancel
Save