diff --git a/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java b/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java index b512c5b84b..7294b2ecd6 100644 --- a/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java +++ b/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java @@ -26,6 +26,7 @@ import com.electronwill.nightconfig.core.io.ParsingException; import com.electronwill.nightconfig.core.io.WritingMode; import net.minecraftforge.fml.loading.FMLConfig; import net.minecraftforge.fml.loading.FMLPaths; +import org.apache.commons.io.FilenameUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -91,6 +92,38 @@ public class ConfigFileTypeHandler { return true; } + public static void backUpConfig(final CommentedFileConfig commentedFileConfig) + { + backUpConfig(commentedFileConfig, 5); //TODO: Think of a way for mods to set their own preference (include a sanity check as well, no disk stuffing) + } + + public static void backUpConfig(final CommentedFileConfig commentedFileConfig, final int maxBackups) + { + Path bakFileLocation = commentedFileConfig.getNioPath().getParent(); + String bakFileName = FilenameUtils.removeExtension(commentedFileConfig.getFile().getName()); + String bakFileExtension = FilenameUtils.getExtension(commentedFileConfig.getFile().getName()) + ".bak"; + Path bakFile = bakFileLocation.resolve(bakFileName + "-1" + "." + bakFileExtension); + try + { + for(int i = maxBackups; i > 0; i--) + { + Path oldBak = bakFileLocation.resolve(bakFileName + "-" + i + "." + bakFileExtension); + if(Files.exists(oldBak)) + { + if(i >= maxBackups) + Files.delete(oldBak); + else + Files.move(oldBak, bakFileLocation.resolve(bakFileName + "-" + (i + 1) + "." + bakFileExtension)); + } + } + Files.copy(commentedFileConfig.getNioPath(), bakFile); + } + catch (IOException exception) + { + LOGGER.warn(CONFIG, "Failed to back up config file {}", commentedFileConfig.getNioPath(), exception); + } + } + private static class ConfigWatcher implements Runnable { private final ModConfig modConfig; private final CommentedFileConfig commentedFileConfig; @@ -110,6 +143,13 @@ public class ConfigFileTypeHandler { try { this.commentedFileConfig.load(); + if(!this.modConfig.getSpec().isCorrect(commentedFileConfig)) + { + LOGGER.warn(CONFIG, "Configuration file {} is not correct. Correcting", commentedFileConfig.getFile().getAbsolutePath()); + ConfigFileTypeHandler.backUpConfig(commentedFileConfig); + this.modConfig.getSpec().correct(commentedFileConfig); + commentedFileConfig.save(); + } } catch (ParsingException ex) {