mirror of
https://github.com/RatzzFatzz/MKVAudioSubtitleChanger.git
synced 2026-02-11 02:05:56 +01:00
Improve file exclusion
This commit is contained in:
@@ -70,9 +70,18 @@ public class FileFilter {
|
|||||||
private boolean isExcluded(File pathName, Set<String> excludedDirs) {
|
private boolean isExcluded(File pathName, Set<String> excludedDirs) {
|
||||||
if (excludedDirs.contains(pathName.getPath())) return true;
|
if (excludedDirs.contains(pathName.getPath())) return true;
|
||||||
|
|
||||||
// TODO improve partial matches and wildcard?
|
String[] pathSplit = pathName.getPath().split("/");
|
||||||
for (String excludedDir : excludedDirs) {
|
for (String excludedDir : excludedDirs) {
|
||||||
if (pathName.getPath().startsWith(excludedDir)) return true;
|
String[] excludeSplit = excludedDir.split("/");
|
||||||
|
if (excludeSplit.length > pathSplit.length) continue;
|
||||||
|
boolean matchingPaths = true;
|
||||||
|
for (int i = 0; i < excludeSplit.length; i++) {
|
||||||
|
if (!excludeSplit[i].equals(pathSplit[i])) {
|
||||||
|
matchingPaths = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matchingPaths) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class InputConfig implements CommandLine.IVersionProvider {
|
|||||||
@Option(names = {"-i", "--include-pattern"}, defaultValue = ".*", description = "include files matching pattern (default: \".*\")")
|
@Option(names = {"-i", "--include-pattern"}, defaultValue = ".*", description = "include files matching pattern (default: \".*\")")
|
||||||
private Pattern includePattern;
|
private Pattern includePattern;
|
||||||
@Option(names = {"-e", "--excluded"}, arity = "1..*",
|
@Option(names = {"-e", "--excluded"}, arity = "1..*",
|
||||||
description = "Directories and files to be excluded (no wildcard)")
|
description = "relative directories and files to be excluded (no wildcard)")
|
||||||
private Set<String> excluded = new HashSet<>();
|
private Set<String> excluded = new HashSet<>();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -42,14 +42,19 @@ class FileFilterTest {
|
|||||||
|
|
||||||
private static Stream<Arguments> accept() {
|
private static Stream<Arguments> accept() {
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
Arguments.of("~/video.mkv", Set.of(".mkv"), -1, ".*", true, 1, 0),
|
Arguments.of("~/video.mkv", Set.of(".mkv"), Set.of(), -1, ".*", true, false),
|
||||||
Arguments.of("~/video.mp4", Set.of(".mkv"), -1, ".*", false, 0, 0),
|
Arguments.of("~/video.mp4", Set.of(".mkv"), Set.of(), -1, ".*", false, false),
|
||||||
|
|
||||||
Arguments.of("~/video.mkv", Set.of(".mkv"), -1, "v.*", true, 1, 0),
|
Arguments.of("~/video.mkv", Set.of(".mkv"), Set.of(), -1, "v.*", true, false),
|
||||||
Arguments.of("~/video.mkv", Set.of(".mkv"), -1, "a.*", false, 1, 1),
|
Arguments.of("~/video.mkv", Set.of(".mkv"), Set.of(), -1, "a.*", false, true),
|
||||||
|
|
||||||
Arguments.of("~/video.mkv", Set.of(".mkv"), -1000, ".*", true, 1, 0),
|
Arguments.of("~/video.mkv", Set.of(".mkv"), Set.of(), -1000, ".*", true, false),
|
||||||
Arguments.of("~/video.mkv", Set.of(".mkv"), 1000, ".*", false, 1, 1)
|
Arguments.of("~/video.mkv", Set.of(".mkv"), Set.of(), 1000, ".*", false, true),
|
||||||
|
|
||||||
|
Arguments.of("dir/video.mkv", Set.of(".mkv"), Set.of("dir"), -1, ".*", false, true),
|
||||||
|
Arguments.of("dir/dir2/video.mkv", Set.of(".mkv"), Set.of("dir/dir2"), -1, ".*", false, true),
|
||||||
|
Arguments.of("dir/video.mkv", Set.of(".mkv"), Set.of("dir/dir2"), -1, ".*", true, false),
|
||||||
|
Arguments.of("dirr/video.mkv", Set.of(".mkv"), Set.of("dir"), -1, ".*", true, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,22 +63,23 @@ class FileFilterTest {
|
|||||||
*/
|
*/
|
||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@MethodSource
|
@MethodSource
|
||||||
void accept(String path, Set<String> args, int filterDateOffset, String pattern, boolean expectedHit, int total, int excluded) {
|
void accept(String path, Set<String> extensions, Set<String> excludedDirs, int filterDateOffset, String pattern, boolean acceptanceExpected, boolean excluded) {
|
||||||
when(file.getAbsolutePath()).thenReturn(path);
|
when(file.getAbsolutePath()).thenReturn(path);
|
||||||
when(file.getName()).thenReturn(List.of(path.split("/")).get(1));
|
when(file.getPath()).thenReturn(path);
|
||||||
|
String[] split = path.split("/");
|
||||||
|
when(file.getName()).thenReturn(split[split.length - 1]);
|
||||||
when(file.toPath()).thenReturn(Path.of(TEST_FILE));
|
when(file.toPath()).thenReturn(Path.of(TEST_FILE));
|
||||||
|
|
||||||
long currentTime = System.currentTimeMillis();
|
long currentTime = System.currentTimeMillis();
|
||||||
FileFilter fileFilter = new FileFilter(Set.of(), Pattern.compile(pattern), new Date(currentTime + filterDateOffset));
|
FileFilter fileFilter = new FileFilter(excludedDirs, Pattern.compile(pattern), new Date(currentTime + filterDateOffset));
|
||||||
|
|
||||||
try (MockedStatic<DateUtils> mockedFiles = Mockito.mockStatic(DateUtils.class)) {
|
try (MockedStatic<DateUtils> mockedFiles = Mockito.mockStatic(DateUtils.class)) {
|
||||||
mockedFiles
|
mockedFiles
|
||||||
.when(() -> DateUtils.convert(anyLong()))
|
.when(() -> DateUtils.convert(anyLong()))
|
||||||
.thenReturn(new Date(currentTime));
|
.thenReturn(new Date(currentTime));
|
||||||
|
|
||||||
assertEquals(expectedHit, fileFilter.accept(file, new HashSet<>(extensions)), "File is accepted");
|
assertEquals(acceptanceExpected, fileFilter.accept(file, new HashSet<>(extensions)), "File is accepted");
|
||||||
assertEquals(total, ResultStatistic.getInstance().total(), "Total files");
|
assertEquals(excluded, ResultStatistic.getInstance().getExcluded() > 0, "Is counted in excluded statistic");
|
||||||
assertEquals(excluded, ResultStatistic.getInstance().getExcluded(), "Excluded files");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user