À VÉRIFIER : Correction des messages d'erreur pour utiliser des backticks autour des dépendances et réorganisation de la logique de vérification des mises à jour dans la classe Rule + Ajout du test 13

This commit is contained in:
Louay DARDOURI 2025-02-09 17:48:18 +01:00
parent ffc20ae7f3
commit 1bafee8e5c
2 changed files with 76 additions and 79 deletions
src/fr/monlouyan/bakefile

@ -68,7 +68,7 @@ public class CommandExecutor {
// 2. Aucune règle n'avait besoin d'être mise à jour // 2. Aucune règle n'avait besoin d'être mise à jour
// 3. On n'a PAS de commandes à exécuter // 3. On n'a PAS de commandes à exécuter
else if (rule.getName().equals(BakefileParser.getFirstTarget()) && !needsUpdate && rule.getCommands().isEmpty()) { else if (rule.getName().equals(BakefileParser.getFirstTarget()) && !needsUpdate && rule.getCommands().isEmpty()) {
System.out.println("bake: Nothing to be done for '" + rule.getName() + "'."); System.out.println("bake: Nothing to be done for `" + rule.getName() + "'.");
} }
} }
} }

@ -23,82 +23,79 @@ public class Rule {
public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); } public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); }
public boolean needsUpdate() { public boolean needsUpdate() {
if (BakeCLI.isDebug()){ if (BakeCLI.isDebug()){
System.out.println("Debug : Checking if rule " + name + " needs update"); System.out.println("Debug : Checking if rule " + name + " needs update");
} }
// Les règles phony sont toujours mises à jour // Les règles phony sont toujours mises à jour
if (isPhony) { if (isPhony) {
if (BakeCLI.isDebug()) { if (BakeCLI.isDebug()) {
System.out.println("Debug : Rule " + name + " is phony, always needs update"); System.out.println("Debug : Rule " + name + " is phony, always needs update");
} }
return true; return true;
} }
// Si la règle n'a pas de commandes, on vérifie seulement si une dépendance doit être mise à jour // Vérifier d'abord toutes les dépendances avant d'exécuter quoi que ce soit
if (commands.isEmpty()) { for (String dependency : dependencies) {
for (String dependency : dependencies) { File depFile = new File(dependency);
File depFile = new File(dependency); boolean hasRule = BakeEngine.hasRule(dependency);
if (!depFile.exists() && !dependency.isEmpty() && !BakeEngine.hasRule(dependency)) { if (!depFile.exists() && !dependency.isEmpty() && !hasRule) {
System.out.println("bake: *** No rule to make target `" + dependency + "', needed by '" + name + "'. Stop."); System.out.println("bake: *** No rule to make target `" + dependency + "', needed by `" + name + "'. Stop.");
System.exit(1); System.exit(1);
} }
Rule depRule = BakeEngine.getRule(dependency); }
if (depRule != null && depRule.needsUpdate()) {
if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency rule " + dependency + " needs update");
}
return true;
}
}
return false;
}
// Pour les règles avec des commandes, on vérifie aussi les timestamps // Si la règle n'a pas de commandes, on vérifie seulement si une dépendance doit être mise à jour
File targetFile = new File(name); if (commands.isEmpty()) {
if (BakeCLI.isDebug()){ for (String dependency : dependencies) {
System.out.println("Debug : Checking if target file " + name + " exist and is up to date"); Rule depRule = BakeEngine.getRule(dependency);
} if (depRule != null && depRule.needsUpdate()) {
if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency rule " + dependency + " needs update");
}
return true;
}
}
return false;
}
long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0; // Pour les règles avec des commandes, on vérifie aussi les timestamps
File targetFile = new File(name);
if (BakeCLI.isDebug()){
System.out.println("Debug : Checking if target file " + name + " exist and is up to date");
}
if (BakeCLI.isDebug()) { long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0;
System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp));
}
for (String dependency : dependencies) { if (BakeCLI.isDebug()) {
File depFile = new File(dependency); System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp));
long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0; }
if (BakeCLI.isDebug()) { for (String dependency : dependencies) {
System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp)); File depFile = new File(dependency);
} long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0;
// Vérifier si une règle existe pour cette dépendance if (BakeCLI.isDebug()) {
boolean hasRule = BakeEngine.hasRule(dependency); System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp));
}
if (!depFile.exists() && !dependency.isEmpty() && !hasRule) { // Si la dépendance est une règle et qu'elle a besoin d'être mise à jour
System.out.println("bake: *** No rule to make target `" + dependency + "', needed by '" + name + "'. Stop."); Rule depRule = BakeEngine.getRule(dependency);
System.exit(1); if (depRule != null && depRule.needsUpdate()) {
} if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency rule " + dependency + " needs update");
}
return true;
}
// Si la dépendance est une règle et qu'elle a besoin d'être mise à jour // Vérifier les timestamps seulement si le fichier existe
Rule depRule = BakeEngine.getRule(dependency); if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) {
if (depRule != null && depRule.needsUpdate()) { if (BakeCLI.isDebug()) {
if (BakeCLI.isDebug()) { System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update");
System.out.println("Debug : Dependency rule " + dependency + " needs update"); }
} return true;
return true; }
} }
return false;
// Vérifier les timestamps seulement si le fichier existe }
if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) {
if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update");
}
return true;
}
}
return false;
}
} }