Support lint-baseline analysis

Hi
We’re using SonarCloud and Gradle Plugin v5.0.0.4638 in our Android project. We also use Android Lint in it and would like to see its report analyzed and presented in Sonar.
The problem is that we’ve setup Lint to treat all warnings as errors and put all existing warnings into a lint-baseline.xml file. It means that in our master branch we expect lint-results.xml to be always empty and lint-baseline.xml is the file, which we want to analyze with Sonar - observe that the number of issues in it is going down.

But it look like Sonar only supports lint-results.xml analysis through the sonar.androidLint.reportPaths attribute.

Is it possible to analyze lint-baseline.xml with it? Is there an alternative attribute? Could you add one? The practice we follow is actually pretty common in the Android world.

Hey there.

sonar.androidLint.reportPaths supports multiple (comma seperated) values, so nothing should prevent you from being able to pass in both files to the sonar.androidLint.reportPaths parameter.

But will it analyze a file in the baseline format? I read that Sonar doesn’t support it

The only difference in format is some metadata at the top.

Non-baseline:

<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.7.3">

Baseline:

<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.7.3" type="baseline" client="gradle" dependencies="false" name="AGP (8.7.3)" variant="all" version="8.7.3">

This does not effect parsing of the reports.

@Colin somehow it doesn’t work.

My project structure is that I have 2 apps in the src folder, for each I have separate lint-baseline.xml file - src/app/lint-baseline.xml and src/app-wear/lint-baseline.xml.

I configured sonar.androidLint.reportPaths to point at these files in sonar block within module specific build.gradle.kts, i.e. in app/build.gradle.kts and app-wear/build.gradle.kts. However, it does not work. When I run sonar task I get the following errors:

No issues information will be saved as the report file ‘/opt/atlassian/pipelines/agent/build/src/app/lint-baseline.xml’ can’t be read.

and

No issues information will be saved as the report file ‘/opt/atlassian/pipelines/agent/build/src/app-wear/lint-baseline.xml’ can’t be read.

Any ideas about what’s wrong?

Hey there.

Here’s what I get after generating a baseline file and adding this to my module’s build.gradle.kts:

build.gradle.kts:

sonar {
    properties {
        property("sonar.androidLint.reportPaths", "build/reports/lint-results-debug.xml,lint-baseline.xml")
    }
}

Output:

Sensor Import of Android Lint issues [kotlin]
Importing /Users/colinmueller/Source/architecture-samples/app/build/reports/lint-results-debug.xml
Importing /Users/colinmueller/Source/architecture-samples/app/lint-baseline.xml
Sensor Import of Android Lint issues [kotlin] (done) | time=35ms

Success :tada:

The error that you’re encountering will appear if the report file is found by the sensor, but cannot be opened or has the wrong contents.

Goign back to my example project, when I blanked out lint-baseline.xml, I received this error:

No issues information will be saved as the report file '/Users/colinmueller/Source/architecture-samples/shared-test/lint-baseline.xml' can't be read.
com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
 at [row,col {unknown-source}]: [2,0]

When I remove my permissions to the lint-baseline.xml (chmod u-rw), I get the same error (can’t be read) but a different follow-up error message.

No issues information will be saved as the report file '/Users/colinmueller/Source/architecture-samples/app/lint-baseline.xml' can't be read.
java.io.FileNotFoundException: /Users/colinmueller/Source/architecture-samples/app/lint-baseline.xml (Permission denied)

If you add --info or --debug to your pipeline, is there more to your error message?

I think this will ultimately be a case of the file not containing what’s expected, or not having the right permissions.

Open this section to find my successfully imported lint-baseline.xml
<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.7.3" type="baseline" client="gradle" dependencies="false" name="AGP (8.7.3)" variant="all" version="8.7.3">

    <issue
        id="NewApi"
        message="Call requires API level 24, or core library desugaring (current min is 21): `java.util.Collection#removeIf`"
        errorLine1="            entries.removeIf { it.value.isCompleted }"
        errorLine2="                    ~~~~~~~~">
        <location
            file="src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/local/FakeTaskDao.kt"
            line="66"
            column="21"/>
    </issue>
</issues>

@Colin I can assure you that both files have valid contents. Though they’re pretty big - 22k+ lines each.
W/o adding --debug or --info flags, I can see that both messages are followed by an NullPointerException. One of which is
java.lang.NullPointerException: null

While the other is

java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "this.path" is null
   at org.sonar.api.batch.fs.internal.predicates.AbsolutePathPredicate.apply(AbsolutePathPredicate.java:32)
   at org.sonar.api.batch.fs.internal.predicates.OrPredicate.apply(OrPredicate.java:46)
   at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
   at java.base/java.util.HashMap$ValueSpliterator.tryAdvance(HashMap.java:1800)
   at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292)
   at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
   at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
   at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298)
   at java.base/java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681)
   at org.sonar.api.batch.fs.internal.DefaultFileSystem.inputFile(DefaultFileSystem.java:96)
   at org.sonar.scanner.scan.filesystem.MutableFileSystem.inputFile(MutableFileSystem.java:39)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintSensorKt.saveIssue(AndroidLintSensor.kt:75)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintSensorKt.importReport$lambda$1$lambda$0(AndroidLintSensor.kt:57)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintXmlReportReader.onEndElement(AndroidLintXmlReportReader.kt:62)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintXmlReportReader.read(AndroidLintXmlReportReader.kt:55)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintXmlReportReader.access$read(AndroidLintXmlReportReader.kt:34)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintXmlReportReader$Companion.read(AndroidLintXmlReportReader.kt:89)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintSensorKt.importReport(AndroidLintSensor.kt:57)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintSensorKt.access$importReport(AndroidLintSensor.kt:1)
   at org.sonarsource.kotlin.externalreport.androidlint.AndroidLintSensor.reportConsumer$lambda$1(AndroidLintSensor.kt:51)
   at org.sonarsource.kotlin.api.frontend.AbstractPropertyHandlerSensor.executeOnFiles(AbstractPropertyHandlerSensor.kt:55)
   at org.sonarsource.kotlin.api.frontend.AbstractPropertyHandlerSensor.execute(AbstractPropertyHandlerSensor.kt:45)
   at org.sonar.scanner.sensor.AbstractSensorWrapper.analyse(AbstractSensorWrapper.java:63)
   at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:75)
   at org.sonar.scanner.sensor.ModuleSensorsExecutor.lambda$execute$1(ModuleSensorsExecutor.java:48)
   at org.sonar.scanner.sensor.ModuleSensorsExecutor.withModuleStrategy(ModuleSensorsExecutor.java:66)
   at org.sonar.scanner.sensor.ModuleSensorsExecutor.execute(ModuleSensorsExecutor.java:48)
   at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:64)
   at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:123)
   at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:109)
   at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:190)
   at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:186)
   at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:183)
   at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:157)
   at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:123)
   at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:109)
   at org.sonar.scanner.bootstrap.ScannerContainer.doAfterStart(ScannerContainer.java:416)
   at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:123)
   at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:109)
   at org.sonar.scanner.bootstrap.GlobalContainer.doAfterStart(GlobalContainer.java:128)
   at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:123)
   at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:109)
   at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:58)
   at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:52)
   at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.base/java.lang.reflect.Method.invoke(Method.java:568)
   at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
   at jdk.proxy7/jdk.proxy7.$Proxy188.execute(Unknown Source)
   at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189)
   at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138)
   at org.sonarqube.gradle.SonarTask.run(SonarTask.java:131)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.base/java.lang.reflect.Method.invoke(Method.java:568)
   at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
   at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
   at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
   at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
   at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
   at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229)
   at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212)
   at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195)
   at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162)
   at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
   at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
   at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
   at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
   at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
   at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
   at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
   at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
   at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
   at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
   at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
   at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
   at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
   at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
   at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
   at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
   at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
   at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
   at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
   at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
   at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
   at org.gradle.internal.Either$Right.fold(Either.java:175)
   at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
   at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
   at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
   at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
   at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
   at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
   at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
   at java.base/java.util.Optional.orElseGet(Optional.java:364)
   at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
   at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
   at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
   at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
   at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
   at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
   at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
   at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
   at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
   at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
   at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:107)
   at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:56)
   at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)
   at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)
   at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)
   at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56)
   at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)
   at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
   at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
   at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
   at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
   at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
   at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
   at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289)
   at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
   at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
   at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
   at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
   at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
   at java.base/java.util.Optional.orElseGet(Optional.java:364)
   at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
   at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
   at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
   at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
   at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48)
   at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
   at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)
   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127)
   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
   at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:40)
   at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
   at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
   at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
   at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
   at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
   at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
   at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
   at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
   at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
   at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
   at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
   at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
   at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
   at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
   at java.base/java.lang.Thread.run(Thread.java:840)

If I open a private message would you be able to share the file in full?

Unfortunately, I don’t think so :frowning: At least not immediately, as idk if I can share this info.

Then I think we might be stuck. :confused:

You could try cutting down the file to see if you can isolate the issue to a specific issue (think git bisect style) and create a minimal reproducer.

Or let’s say you took your existing file and removed everything except 1 issue – do you still face the issue? If yes, that’s an easy file to share. If not, the goal is to find the issue(s) that do cause the issue!

Could you please check out the NPE stacktrace, which I shared? It has Sonar classes in it. Also, I’ve just spotted that I didn’t capture a couple of top lines in it. Now it’s fixed.

I’ve checked the stacktrace and unfortunately it’s not telling us much! I’ve also tried to “mess up” some lint-baseline.xml reports (removing attributes, etc.) and still can’t reproduce the issue. A minimal reproducer from your side would be best to track the issue down!

@Colin I’m a but stuck ATM. I managed to come to the point, when I have a baseline, for which processing ends up with the messaged, which I mentioned above. If I cut it twice, then for any of the two resulting parts these messaged do not appear. But I also don’t see any evidence of success message in logs. Unfortunately, due to other issues, I can’t go and check that in the Sonar UI.

So, for baseline of around 350 lines length - no issue. For 700+ - the NPE.

Also, Idk if it effects anything, but our Lint setup contains custom rules and their violation is present in the baseline.

Hey @Uladzislau_Yarmolin

I really want to help you, but I need examples of XML files that reproduce the issues you’re talking about.