Correction de bug - À vérifier

This commit is contained in:
Moncef STITI 2025-03-15 16:37:25 +01:00
parent b74fbf3477
commit 7d392117e9
2 changed files with 176 additions and 130 deletions
src/fr/monlouyan/bakefile

@ -3,6 +3,7 @@ package fr.monlouyan.bakefile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Moteur principal de l'application Bake.
@ -85,4 +86,12 @@ public class BakeEngine {
executor.execute(rule);
}
}
/**
* Récupère les noms de toutes les règles.
* @return Un ensemble contenant les noms de toutes les règles
*/
public static Set<String> getAllRuleNames() {
return ruleMap.keySet();
}
}

@ -1,6 +1,7 @@
package fr.monlouyan.bakefile;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
@ -94,27 +95,6 @@ public class Rule {
return false;
}
// Vérifier d'abord toutes les dépendances avant d'exécuter quoi que ce soit
for (String dependency : dependencies) {
// Skip dependencies with tilde in path
if (dependency.startsWith("~")) {
continue;
}
File depFile = new File(dependency);
boolean hasRule = BakeEngine.hasRule(dependency);
// Ignorer les options de compilation qui pourraient avoir un ':' dedans
if (dependency.startsWith("-") || dependency.contains(":")) {
continue;
}
if (!depFile.exists() && !dependency.isEmpty() && !hasRule) {
System.out.println("bake: *** No rule to make target `" + dependency + "', needed by `" + name + "'. Stop.");
System.exit(2);
}
}
// Si le fichier cible n'existe pas et qu'il y a des commandes, il doit être mis à jour
File targetFile = new File(name);
if (!targetFile.exists() && !commands.isEmpty()) {
@ -124,6 +104,48 @@ public class Rule {
return true;
}
// Vérifier d'abord toutes les dépendances avant d'exécuter quoi que ce soit
for (String dependency : dependencies) {
// Skip dependencies with tilde in path
if (dependency.startsWith("~")) {
continue;
}
// Ignorer les options de compilation qui pourraient avoir un ':' dedans
if (dependency.startsWith("-") || dependency.contains(":")) {
continue;
}
File depFile = new File(dependency);
boolean hasRule = BakeEngine.hasRule(dependency);
if (!depFile.exists() && !dependency.isEmpty() && !hasRule) {
// Vérifier si on est en situation de dépendance circulaire déjà traitée
boolean isPartOfCircularDependency = false;
// Vérifier si cette dépendance est impliquée dans une relation circulaire
for (Rule rule : getAllRules()) {
if (rule.getName().equals(dependency) && rule.getDependencies().contains(name)) {
if (BakeCLI.isDebug()) {
System.out.println("Debug: Found circular dependency between " + name + " and " + dependency);
}
isPartOfCircularDependency = true;
break;
}
}
if (isPartOfCircularDependency) {
if (BakeCLI.isDebug()) {
System.out.println("Debug: Ignoring circular dependency: " + dependency);
}
continue;
}
System.out.println("bake: *** No rule to make target `" + dependency + "', needed by `" + name + "'. Stop.");
System.exit(2);
}
}
// Si la règle n'a pas de commandes, on vérifie seulement si une dépendance doit être mise à jour
if (commands.isEmpty()) {
for (String dependency : dependencies) {
@ -204,4 +226,19 @@ public class Rule {
return false;
}
/**
* Permet de récupérer la liste de toutes les règles
* @return La liste de toutes les règles
*/
private List<Rule> getAllRules() {
List<Rule> allRules = new ArrayList<>();
for (String ruleName : BakeEngine.getAllRuleNames()) {
Rule rule = BakeEngine.getRule(ruleName);
if (rule != null) {
allRules.add(rule);
}
}
return allRules;
}
}