-
Bug
-
Resolution: Unresolved
-
Major
-
None
Consider the following pipeline code:
void deleteOthers(List<String> pathList) { def prefixes = [] for(path in pathList) { def currentPrefix = path; while(true) { def prefixEnd = currentPrefix.lastIndexOf("/") if(prefixEnd > 0) { currentPrefix = currentPrefix.substring(0, prefixEnd); prefixes.add(currentPrefix) } else { break; } } } prefixes.unique() def patterns = [] for(path in prefixes) { patterns.add([ pattern: '/' + path, type: 'EXCLUDE' ]) } for(path in pathList) { patterns.add([ pattern: '/' + path, type: 'EXCLUDE' ]) patterns.add([ pattern: '/' + path + '/**', type: 'EXCLUDE' ]) } patterns.add([ pattern: '/**/*', type: 'INCLUDE' ]) cleanWs deleteDirs: true, patterns: patterns return } def keep = [ 'foo', 'foo2', 'bar/foo', 'bar/foo2', 'bar/foo3/bla' ] for(path in keep) { dir(path) { writeFile file:'expected', text:'' } } writeFile file:'unexpected', text:'' writeFile file:'bar/unexpected', text:'' writeFile file:'bar/foo3/unexpected', text:'' deleteOthers(keep)
Expected behavior:
All the listed directories listed in "keep" are preserved (as both the directories themselves, as well as all parents are explicitly excluded!) and the included files are preserved.
Only the files created outside of directories listed in "keep" are expected to be removed.
Actual behavior:
Only the directories + paths "foo/expected" and "foo2/expected" are preserved.
All the directories with a nested paths, relative to include pattern, are impossible to preserve.
It appears as if excludes fail to apply to any directory, if the directory was matched using a non-empty
**
part of the INCLUDE wildcard. Directories only matched by a single star, or an empty double-star have their EXCLUDE rules evaluated correctly.
For files, excludes are properly evaluated even if the INCLUDE was matching with a non-empty double-star.
E.g. with "deleteDirs: false", all expected files are protected correctly.