|
1 | 1 | package io.gitlab.arturbosch.detekt.sonar.sensor
|
2 | 2 |
|
3 |
| -import io.gitlab.arturbosch.detekt.api.Config |
4 |
| -import io.gitlab.arturbosch.detekt.cli.CliArgs |
5 |
| -import io.gitlab.arturbosch.detekt.cli.createFilters |
6 |
| -import io.gitlab.arturbosch.detekt.cli.loadConfiguration |
7 |
| -import io.gitlab.arturbosch.detekt.core.ProcessingSettings |
| 3 | +import io.github.detekt.tooling.api.spec.ProcessingSpec |
| 4 | +import io.github.detekt.tooling.api.spec.RulesSpec |
| 5 | +import io.gitlab.arturbosch.detekt.sonar.foundation.BASELINE_KEY |
8 | 6 | import io.gitlab.arturbosch.detekt.sonar.foundation.CONFIG_PATH_KEY
|
9 | 7 | import io.gitlab.arturbosch.detekt.sonar.foundation.PATH_FILTERS_DEFAULTS
|
10 | 8 | import io.gitlab.arturbosch.detekt.sonar.foundation.PATH_FILTERS_KEY
|
11 | 9 | import io.gitlab.arturbosch.detekt.sonar.foundation.logger
|
12 | 10 | import org.sonar.api.batch.sensor.SensorContext
|
13 | 11 | import org.sonar.api.config.Configuration
|
14 |
| -import java.io.File |
| 12 | +import java.nio.file.Files |
| 13 | +import java.nio.file.Path |
| 14 | +import java.nio.file.Paths |
15 | 15 |
|
16 |
| -fun createProcessingSettings(context: SensorContext): ProcessingSettings { |
17 |
| - val baseDir = context.fileSystem().baseDir() |
| 16 | +internal fun createSpec(context: SensorContext): ProcessingSpec { |
| 17 | + val baseDir = context.fileSystem().baseDir().toPath() |
18 | 18 | val settings = context.config()
|
19 |
| - val filters = CliArgs { |
20 |
| - excludes = settings.get(PATH_FILTERS_KEY).orElse(PATH_FILTERS_DEFAULTS) |
21 |
| - }.createFilters() |
22 |
| - val config = chooseConfig(baseDir, settings) |
23 |
| - return ProcessingSettings( |
24 |
| - inputPaths = listOf(baseDir.toPath()), |
25 |
| - config = config, |
26 |
| - pathFilters = filters, |
27 |
| - outPrinter = System.out, |
28 |
| - errPrinter = System.err |
29 |
| - ) |
| 19 | + return createSpec(baseDir, settings) |
30 | 20 | }
|
31 | 21 |
|
32 |
| -internal fun chooseConfig(baseDir: File, configuration: Configuration): Config { |
33 |
| - val externalConfigPath = tryFindDetektConfigurationFile(configuration, baseDir) |
| 22 | +internal fun createSpec(baseDir: Path, configuration: Configuration): ProcessingSpec { |
| 23 | + val configPath = tryFindDetektConfigurationFile(baseDir, configuration) |
| 24 | + val baselineFile = tryFindBaselineFile(baseDir, configuration) |
34 | 25 |
|
35 |
| - val possibleParseArguments = CliArgs().apply { |
36 |
| - config = externalConfigPath?.path |
37 |
| - failFast = true // always use FailFast config to activate all detekt rules |
38 |
| - autoCorrect = false // never change user files and conflict with sonar's reporting |
| 26 | + return ProcessingSpec { |
| 27 | + project { |
| 28 | + basePath = baseDir |
| 29 | + inputPaths = listOf(baseDir) |
| 30 | + excludes = getProjectExcludeFilters(configuration) |
| 31 | + } |
| 32 | + rules { |
| 33 | + activateExperimentalRules = true // publish all; quality profiles will filter |
| 34 | + maxIssuePolicy = RulesSpec.MaxIssuePolicy.AllowAny |
| 35 | + autoCorrect = false // never change user files and conflict with sonar's reporting |
| 36 | + } |
| 37 | + config { |
| 38 | + useDefaultConfig = true |
| 39 | + configPaths = listOfNotNull(configPath) |
| 40 | + } |
| 41 | + baseline { |
| 42 | + path = baselineFile |
| 43 | + } |
39 | 44 | }
|
| 45 | +} |
| 46 | + |
| 47 | +internal fun getProjectExcludeFilters(configuration: Configuration): List<String> = |
| 48 | + configuration.get(PATH_FILTERS_KEY) |
| 49 | + .orElse(PATH_FILTERS_DEFAULTS) |
| 50 | + .splitToSequence(",", ";") |
| 51 | + .map { it.trim() } |
| 52 | + .filter { it.isNotEmpty() } |
| 53 | + .toList() |
| 54 | + |
| 55 | +internal fun tryFindBaselineFile(baseDir: Path, config: Configuration): Path? { |
| 56 | + fun createBaselineFacade(path: Path): Path? { |
| 57 | + logger.info("Registered baseline path: $path") |
| 58 | + var baselinePath = path |
| 59 | + |
| 60 | + if (Files.notExists(baselinePath)) { |
| 61 | + baselinePath = baseDir.resolve(path) |
| 62 | + } |
40 | 63 |
|
41 |
| - return possibleParseArguments.loadConfiguration() |
| 64 | + if (Files.notExists(baselinePath)) { |
| 65 | + val parentFile = baseDir.parent |
| 66 | + if (parentFile != null) { |
| 67 | + baselinePath = parentFile.resolve(path) |
| 68 | + } else { |
| 69 | + return null |
| 70 | + } |
| 71 | + } |
| 72 | + return baselinePath |
| 73 | + } |
| 74 | + return config.get(BASELINE_KEY) |
| 75 | + .map { Paths.get(it) } |
| 76 | + .map(::createBaselineFacade) |
| 77 | + .orElse(null) |
42 | 78 | }
|
43 | 79 |
|
44 |
| -private fun tryFindDetektConfigurationFile(configuration: Configuration, baseDir: File): File? { |
45 |
| - return configuration.get(CONFIG_PATH_KEY).map { path -> |
| 80 | +private val supportedYamlEndings = setOf(".yaml", ".yml") |
| 81 | + |
| 82 | +internal fun tryFindDetektConfigurationFile(baseDir: Path, configuration: Configuration): Path? = |
| 83 | + configuration.get(CONFIG_PATH_KEY).map { path -> |
46 | 84 | logger.info("Registered config path: $path")
|
47 |
| - var configFile = File(path) |
| 85 | + var configFile = Paths.get(path) |
48 | 86 |
|
49 |
| - if (!configFile.exists() || configFile.endsWith(".yaml")) { |
50 |
| - configFile = File(baseDir.path, path) |
| 87 | + if (Files.notExists(configFile) || supportedYamlEndings.any { path.toString().endsWith(it) }) { |
| 88 | + configFile = baseDir.resolve(path) |
51 | 89 | }
|
52 |
| - if (!configFile.exists() || configFile.endsWith(".yaml")) { |
53 |
| - val parentFile = baseDir.parentFile |
| 90 | + if (Files.notExists(configFile) || supportedYamlEndings.any { path.toString().endsWith(it) }) { |
| 91 | + val parentFile = baseDir.parent |
54 | 92 | if (parentFile != null) {
|
55 |
| - configFile = File(parentFile.path, path) |
| 93 | + configFile = parentFile.resolve(path) |
56 | 94 | } else {
|
57 | 95 | return@map null
|
58 | 96 | }
|
59 | 97 | }
|
60 | 98 | configFile
|
61 | 99 | }.orElse(null)
|
62 |
| -} |
|
0 commit comments