in apache-rat-core/src/main/java/org/apache/rat/config/exclusion/fileProcessors/GitIgnoreBuilder.java [67:104]
protected Optional<String> modifyEntry(final Consumer<MatcherSet> matcherSetConsumer, final DocumentName documentName, final String entry) {
// An optional prefix "!" which negates the pattern;
boolean prefix = entry.startsWith(NEGATION_PREFIX);
String pattern = prefix || entry.startsWith(ESCAPED_COMMENT) || entry.startsWith(ESCAPED_NEGATION) ?
entry.substring(1) : entry;
// If there is a separator at the beginning or middle (or both) of the pattern, then
// the pattern is relative to the directory level of the particular .gitignore file itself.
// Otherwise, the pattern may also match at any level below the .gitignore level.
int slashPos = pattern.indexOf(SLASH);
// no slash or at end already
if (slashPos == -1 || slashPos == pattern.length() - 1) {
pattern = "**/" + pattern;
}
if (slashPos == 0) {
pattern = pattern.substring(1);
}
// If there is a separator at the end of the pattern then the pattern will only match directories,
// otherwise the pattern can match both files and directories.
if (pattern.endsWith(SLASH)) {
pattern = pattern.substring(0, pattern.length() - 1);
String name = prefix ? NEGATION_PREFIX + pattern : pattern;
DocumentName matcherPattern = DocumentName.builder(documentName).setName(name.replace(SLASH, documentName.getDirectorySeparator()))
.build();
DocumentNameMatcher matcher = DocumentNameMatcher.and(new DocumentNameMatcher("isDirectory", File::isDirectory),
new DocumentNameMatcher(name, MatchPatterns.from(matcherPattern.localized(documentName.getDirectorySeparator()))));
MatcherSet.Builder builder = new MatcherSet.Builder();
if (prefix) {
builder.addIncluded(matcher);
} else {
builder.addExcluded(matcher);
}
matcherSetConsumer.accept(builder.build());
return Optional.empty();
}
return Optional.of(prefix ? NEGATION_PREFIX + pattern : pattern);
}