Fix : merge auto de config.properties ne copiait pas les commentaires

L'ancien merge lisait les defauts via Properties.load(), qui jette
tous les commentaires : les nouvelles cles ajoutees automatiquement
(ex: pending-votes.scope) arrivaient nues, sans explication, sous un
header generique confus.

Le merge copie desormais le bloc texte entier (commentaires inclus)
du config.properties par defaut, verbatim, pour chaque cle manquante.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
SarTron-NorthBlue
2026-07-12 14:37:57 +04:00
co-authored by Claude Sonnet 5
parent 261e220d1a
commit 62d4d30530
@@ -79,18 +79,18 @@ public class VoteConfig {
} }
/** /**
* Ajoute a la fin de config.properties les cles presentes dans le fichier par defaut du jar * Ajoute a la fin de config.properties les blocs (commentaires + cle=valeur) du fichier par
* mais absentes du fichier existant (nouvelles options apportees par une mise a jour du * defaut du jar dont la cle est absente du fichier existant (nouvelles options apportees par
* plugin), sans jamais toucher aux lignes/valeurs deja presentes. Preserve donc aussi les * une mise a jour du plugin), sans jamais toucher aux lignes/valeurs deja presentes. Copie le
* commentaires existants (simple ajout de lignes, pas de reecriture complete). * bloc entier tel quel (donc avec son explication en commentaire), pas juste "cle=valeur".
*/ */
private void mergeMissingConfigKeys(Path configFile) throws IOException { private void mergeMissingConfigKeys(Path configFile) throws IOException {
Properties defaults = new Properties(); String defaultsText;
try (InputStream in = getClass().getClassLoader().getResourceAsStream("config.properties")) { try (InputStream in = getClass().getClassLoader().getResourceAsStream("config.properties")) {
if (in == null) { if (in == null) {
return; return;
} }
defaults.load(in); defaultsText = new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8);
} }
Properties existing = new Properties(); Properties existing = new Properties();
@@ -98,16 +98,31 @@ public class VoteConfig {
existing.load(in); existing.load(in);
} }
String[] blocks = defaultsText.split("\\r?\\n\\s*\\r?\\n");
StringBuilder toAppend = new StringBuilder(); StringBuilder toAppend = new StringBuilder();
for (String key : defaults.stringPropertyNames()) {
if (!existing.containsKey(key)) { for (String block : blocks) {
toAppend.append(key).append('=').append(defaults.getProperty(key)).append(System.lineSeparator()); java.util.List<String> keysInBlock = new java.util.ArrayList<>();
for (String line : block.split("\\r?\\n")) {
String trimmed = line.trim();
if (trimmed.isEmpty() || trimmed.startsWith("#")) {
continue;
}
int eq = trimmed.indexOf('=');
if (eq > 0) {
keysInBlock.add(trimmed.substring(0, eq).trim());
}
}
if (!keysInBlock.isEmpty() && keysInBlock.stream().noneMatch(existing::containsKey)) {
toAppend.append(block.stripTrailing()).append(System.lineSeparator()).append(System.lineSeparator());
} }
} }
if (toAppend.length() > 0) { if (toAppend.length() > 0) {
String addition = System.lineSeparator() String addition = System.lineSeparator()
+ "# --- options ajoutees automatiquement par une mise a jour du plugin ---" + System.lineSeparator() + "# --- nouvelles options ajoutees par une mise a jour du plugin (voir description ci-dessous) ---"
+ System.lineSeparator() + System.lineSeparator()
+ toAppend; + toAppend;
Files.writeString(configFile, addition, java.nio.file.StandardOpenOption.APPEND); Files.writeString(configFile, addition, java.nio.file.StandardOpenOption.APPEND);
logger.info("config.properties mis a jour avec les nouvelles options manquantes (valeurs existantes conservees)."); logger.info("config.properties mis a jour avec les nouvelles options manquantes (valeurs existantes conservees).");