From 05bdd5b1f0dd9ae91dfb59c1e31954e5de6115b0 Mon Sep 17 00:00:00 2001 From: Avatcher Date: Mon, 1 Apr 2024 05:47:19 +0200 Subject: [PATCH] Ignore file changes in hidden folders --- .../avatar/local/LocalAvatarLoader.java | 7 ++-- .../org/figuramc/figura/utils/IOUtils.java | 34 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarLoader.java b/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarLoader.java index b768e52fe..2026efe4c 100644 --- a/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarLoader.java +++ b/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarLoader.java @@ -15,7 +15,10 @@ import org.figuramc.figura.utils.FiguraText; import org.figuramc.figura.utils.IOUtils; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.nio.file.*; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -310,7 +313,7 @@ public static void tick() { Path path = entry.getKey().resolve((Path) event.context()); String name = IOUtils.getFileNameOrEmpty(path); - if (IOUtils.isHidden(path) || !(Files.isDirectory(path) || name.matches("(.*(\\.lua|\\.bbmodel|\\.ogg|\\.png)$|avatar\\.json)"))) + if (IOUtils.isHiddenAvatarResource(path) || !(Files.isDirectory(path) || name.matches("(.*(\\.lua|\\.bbmodel|\\.ogg|\\.png)$|avatar\\.json)"))) continue; if (kind == StandardWatchEventKinds.ENTRY_CREATE && !IS_WINDOWS) diff --git a/common/src/main/java/org/figuramc/figura/utils/IOUtils.java b/common/src/main/java/org/figuramc/figura/utils/IOUtils.java index b3fce4dbf..c3c7d4a98 100644 --- a/common/src/main/java/org/figuramc/figura/utils/IOUtils.java +++ b/common/src/main/java/org/figuramc/figura/utils/IOUtils.java @@ -3,6 +3,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import org.figuramc.figura.FiguraMod; +import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.InputStream; @@ -166,6 +167,39 @@ public static boolean isHidden(Path path) { return hidden || getFileNameOrEmpty(path).startsWith("."); } + /** + * Checks, if given file is a hidden avatar resource. + * Avatar resource is hidden, if it is contained within + * a hidden folder. Folder is considered "hidden" if either + * it is marked as "hidden" by the OS or folder's name starts + * with a `{@code .}` (dot), or if it is contained within + * another hidden folder. + * + * @param path Path of the file to check + * @return {@code true} if given file is hidden + */ + public static boolean isHiddenAvatarResource(@NotNull Path path) { + final Path avatarsDirectory = FiguraMod.getFiguraDirectory().resolve("avatars/"); + if (!path.toAbsolutePath().startsWith(avatarsDirectory.toAbsolutePath())) { + throw new IllegalArgumentException("A path to a file within avatars folder was expected"); + } + try { + // Iterate through all parent folders of the avatars + // resource to find a hidden one (if any) + for (Path parent = path; + !Files.isSameFile(parent, avatarsDirectory); + parent = parent.resolve("..").normalize()) { + if (Files.isHidden(parent) || parent.getFileName().toString().startsWith(".")) { + return true; + } + } + return false; + } catch (IOException e) { + FiguraMod.LOGGER.error("Failed to get if \"" + path + "\" is hidden", e); + return false; + } + } + public static class DirWrapper { private final Path path;