package fr.monlouyan.bakefile; import java.io.File; import java.util.List; public class Rule { private String name; private List dependencies; private List commands; private boolean isPhony; public Rule(String name, List dependencies, List commands, boolean isPhony) { this.name = name; this.dependencies = dependencies; this.commands = commands; this.isPhony = isPhony; } public String getName() { return name; } public List getDependencies() { return dependencies; } public List getCommands() { return commands; } public boolean isPhony() { return isPhony; } public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); } public boolean needsUpdate() { if (BakeCLI.isDebug()){ System.out.println("Debug : Checking if rule " + name + " needs update"); } // Les règles phony sont toujours mises à jour if (isPhony) { if (BakeCLI.isDebug()) { System.out.println("Debug : Rule " + name + " is phony, always needs update"); } return true; } // Vérifier d'abord toutes les dépendances avant d'exécuter quoi que ce soit for (String dependency : dependencies) { File depFile = new File(dependency); boolean hasRule = BakeEngine.hasRule(dependency); if (!depFile.exists() && !dependency.isEmpty() && !hasRule) { System.out.println("bake: *** No rule to make target `" + dependency + "', needed by `" + name + "'. Stop."); System.exit(1); } } // 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()) { if (BakeCLI.isDebug()) { System.out.println("Debug : Target file " + name + " does not exist and has commands, needs update"); } return true; } // 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) { 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 if (BakeCLI.isDebug()){ System.out.println("Debug : Checking if target file " + name + " exist and is up to date"); } long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0; if (BakeCLI.isDebug()) { System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp)); } for (String dependency : dependencies) { File depFile = new File(dependency); long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0; if (BakeCLI.isDebug()) { System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp)); } // Si la dépendance est une règle et qu'elle a besoin d'être mise à jour Rule depRule = BakeEngine.getRule(dependency); if (depRule != null && depRule.needsUpdate()) { if (BakeCLI.isDebug()) { System.out.println("Debug : Dependency rule " + dependency + " needs update"); } return true; } // 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; } }