-
Bug
-
Resolution: Not A Defect
-
Minor
-
None
-
Windows 10 VM, Jenkins 2.156, warnings-ng 1.0.0
Since migrating to warnings-ng 1.0.0, open task scanner throws "java.nio.charset.UnmappableCharacterException" on a handful of files that the old open tasks plugin could read in without complaint.
Some of the files in question are UTF-8 with BOM, some without. The Delphi IDE saves them as UTF-8 with BOM automatically when the file contains unicode characters.
The attached files (with and without BOM) display fine in the Delphi IDE, VS Code and Notepad++.
{{[Open Tasks Scanner] [ERROR] Exception while reading the source code file 'F:\Jenkins\workspace_Test - Migration - Warnings NG\McdLib\RAC.CharacterConsts.pas':
[Open Tasks Scanner] [ERROR] java.nio.charset.UnmappableCharacterException: Input length = 1
[Open Tasks Scanner] [ERROR] at java.nio.charset.CoderResult.throwException(Unknown Source)
[Open Tasks Scanner] [ERROR] at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
[Open Tasks Scanner] [ERROR] at sun.nio.cs.StreamDecoder.read(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.io.InputStreamReader.read(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.io.BufferedReader.fill(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.io.BufferedReader.readLine(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.io.BufferedReader.readLine(Unknown Source)
[Open Tasks Scanner] [ERROR] [wrapped] java.io.UncheckedIOException: java.nio.charset.UnmappableCharacterException: Input length = 1
[Open Tasks Scanner] [ERROR] at java.io.BufferedReader$1.hasNext(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.util.Spliterators$IteratorSpliterator.tryAdvance(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.util.Spliterators$1Adapter.hasNext(Unknown Source)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.warnings.tasks.TaskScanner.scanTasks(TaskScanner.java:231)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.warnings.tasks.TaskScanner.scan(TaskScanner.java:197)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.warnings.tasks.AgentScanner.invoke(AgentScanner.java:91)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.warnings.tasks.AgentScanner.invoke(AgentScanner.java:28)
[Open Tasks Scanner] [ERROR] at hudson.FilePath.act(FilePath.java:1078)
[Open Tasks Scanner] [ERROR] at hudson.FilePath.act(FilePath.java:1061)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.warnings.tasks.OpenTasks.scan(OpenTasks.java:159)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.core.steps.IssuesScanner.scan(IssuesScanner.java:64)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.core.steps.IssuesRecorder.scanWithTool(IssuesRecorder.java:654)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.core.steps.IssuesRecorder.record(IssuesRecorder.java:622)
[Open Tasks Scanner] [ERROR] at io.jenkins.plugins.analysis.core.steps.IssuesRecorder.perform(IssuesRecorder.java:597)
[Open Tasks Scanner] [ERROR] at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:80)
[Open Tasks Scanner] [ERROR] at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:67)
[Open Tasks Scanner] [ERROR] at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1$1.call(SynchronousNonBlockingStepExecution.java:51)
[Open Tasks Scanner] [ERROR] at hudson.security.ACL.impersonate(ACL.java:290)
[Open Tasks Scanner] [ERROR] at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1.run(SynchronousNonBlockingStepExecution.java:48)
[Open Tasks Scanner] [ERROR] at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.util.concurrent.FutureTask.run(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[Open Tasks Scanner] [ERROR] at java.lang.Thread.run(Unknown Source)
}}
Interesting. The exceptions are no longer thrown. Now the errors read: Can't read source file 'xxx.pas', defined encoding 'windows-1252' seems to be wrong. If I open the file in Notepad++, it says the encoding is UTF-8 with BOM. Also sourceCodeEncoding UTF-8 is defined in the recordIssues task.
The previous version of open task scanner was less strict. It read in the files and returned the open tasks. Maybe an umlaut in a task description was wrong, but that's a minor issue for me.
Is it really critical that the character encoding of the file matches 100%? If a byte sequence isn't proper UTF-8 or whatever encoding was defined, the regex run against the file won't be thrown off track for the rest of the file.
Maybe you can extend your test case by adding a line like:
{{ // TODO: This Message should be shown 'äöüß'}}
to the two files that I attached to this ticket and see if your test finds them with the following regex:
(?i)^.(?://|{|(*)\s(TODO)(?:\s|:|-)+(.*)$
The files have been saved in Notepad++ under Windows.