[
https://issues.apache.org/jira/browse/RAT-569?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Philipp Ottlinger updated RAT-569:
----------------------------------
Affects Version/s: 0.18
> inputExcludeSize has no effect in certain cases
> -----------------------------------------------
>
> Key: RAT-569
> URL: https://issues.apache.org/jira/browse/RAT-569
> Project: Apache RAT
> Issue Type: Bug
> Components: Client - ant
> Affects Versions: 0.18
> Environment: v0.18 and as used via Gradle in Apache Solr
> Reporter: David Smiley
> Priority: Major
> Fix For: 1.0.0
>
>
> The <rat:report inputExcludeSize="N"> attribute (CLI equivalent:
> --input-exclude-size) is documented to exclude files at or below a given byte
> size from license-header scanning. It silently has no effect when the
> report's input resources are supplied as an externally-resolved
> org.apache.tools.ant.types.ResourceCollection (e.g. a Gradle fileTree handed
> to the ant task via ConfigurableFileTree.addToAntBuilder(ant, 'resources',
> FileCollection.AntType.ResourceCollection)), rather than resources RAT
> discovers by walking a directory itself.
> Steps to Reproduce: _(assume newly reworked config in Solr... on PR #4569
> perhaps merged when you read this)_
> Apache Solr's build already wires RAT exactly this way and is an easy,
> ready-made repro. See rat-sources.gradle:
> [https://github.com/apache/solr/blob/main/gradle/validation/rat-sources.gradle]
> The custom RatTask there (search for "class RatTask extends DefaultTask")
> calls, per project:
> ant.taskdef(resource: 'org/apache/rat/anttasks/antlib.xml', classpath:
> ratClasspath.asPath)
> ant.report(outputStyle: 'xml', outputFile: reportFile.absolutePath) {
> inputFileTrees.get().each
> { fileTree -> fileTree.addToAntBuilder(ant, 'resources',
> FileCollection.AntType.ResourceCollection) }
> config
> { fileset(file: ratConfig.get().asFile.absolutePath) }
> }
> 1. In that repo, solr/docker/tests/cases/test_log4j/bogus-log4j2.xml is a
> 19-byte file deliberately containing invalid XML ("this is not xml < !") with
> no license header, used to test the Docker image's handling of a broken
> log4j2 config.
> 2. Temporarily add inputExcludeSize: '25' as an attribute to the
> ant.report(...) call above (in the RatTask.doRat() method), and temporarily
> remove the module's existing exclude
> "tests/cases/test_log4j/bogus-log4j2.xml" line (or the older exclude
> "tests/*{*}/{*}.xml" pattern), so the file is actually presented to RAT.
> 3. Run ./gradlew :solr:docker:rat.
> Expected Result: The 19-byte file is excluded from the report (19 < 25).
> Actual Result: The file is still flagged:
> /tests/cases/test_log4j/bogus-log4j2.xml Unknown license.
> Confirming the attribute itself is wired correctly: Setting inputExcludeSize:
> 'not-a-number' instead produces org.apache.rat.ConfigurationException:
> org.apache.commons.cli.ParseException: java.lang.NumberFormatException: For
> input string: "not-a-number" – proving the value reaches RAT's CLI parsing
> layer and is registered against the ReportConfiguration. So the option is
> accepted, but its exclusion effect is never applied to documents reached
> through this code path.
> Root Cause (from reading 0.18 source):
> - org.apache.rat.commandline.Arg#EXCLUDE_SIZE implements the size check
> generically as a DocumentNameMatcher predicate registered via
> configuration.addExcludedMatcher(...):
> DocumentNameMatcher matcher = new DocumentNameMatcher(..., documentName ->
> { File f = new File(documentName.getName()); return f.isFile() && f.length()
> < maxSize; }
> );
> - When resources come in via the ant task's add(ResourceCollection), they're
> wrapped by org.apache.rat.anttasks.ResourceCollectionContainer. Its run()
> builds one FileDocument per file, calling
> configuration.getDocumentExcluder(dirName) where dirName is a DocumentName
> built by treating the individual file itself as its own "base directory":
> DocumentName dirName =
> DocumentName.builder(fr.getFile()).setBaseName(fr.getProject().getBaseDir()).build();
> FileDocument document = new FileDocument(dirName, fr.getFile(),
> configuration.getDocumentExcluder(dirName));
> - This differs from RAT's own DirectoryWalker, which builds a real
> base-directory-rooted DocumentName hierarchy that exclusion matchers are
> meaningfully evaluated against.
> - Suspected cause: ReportConfiguration.getDocumentExcluder(baseDir) ->
> exclusionProcessor.getNameMatcher(baseDir) produces a matcher scoped to
> evaluate paths relative to baseDir. When baseDir is actually the file itself
> rather than its containing directory, the size-exclusion predicate (which
> expects documentName.getName() to resolve to a real, checkable file path)
> never gets a chance to match, so it's effectively a no-op for every document
> reached this way.
> Impact: Any RAT consumer that resolves its own file list (Gradle, or any
> build tool that hands RAT a pre-computed ResourceCollection rather than
> letting RAT walk the filesystem) cannot use inputExcludeSize to exclude small
> files. This is a common integration shape – build tools often want their own
> file-tracking/exclusion logic (e.g. respecting VCS tracking) rather than
> RAT's directory walk.
> Suggested Fix Direction: ResourceCollectionContainer should compute dirName
> from the file's actual parent directory (or otherwise ensure per-file
> documents are evaluated against the full, unscoped set of
> ReportConfiguration's excluded matchers) rather than treating each file as
> its own base directory.
> _(note: written by Claude Sonnet)_
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)