Ajout de la méthode getRule dans BakeEngine et amélioration de la gestion des dépendances dans la classe Rule

This commit is contained in:
2025-02-08 23:15:07 +01:00
parent 2e51ca7491
commit 79f285d020
3 changed files with 84 additions and 95 deletions

View File

@@ -3,42 +3,12 @@ package fr.monlouyan.bakefile;
import java.io.File;
import java.util.List;
/**
* Représente une règle dans un fichier Bakefile
* Dernière modification : 04/02/2025
*
* @author Moncef STITI, Yanis HAMOUDI
* @version 1.0
* @date 04/02/2025
*/
public class Rule {
/**
* Nom de la règle
*/
private String name;
/**
* Liste des dépendances de la règle
*/
private List<String> dependencies;
/**
* Liste des commandes de la règle (actions à exécuter)
*/
private List<String> commands;
/**
* Indique si la règle est une règle phony
*/
private boolean isPhony;
/**
* Constructeur de la classe Rule
* @param name Nom de la règle
* @param dependencies Liste des dépendances de la règle
* @param commands Liste des commandes de la règle à exécuter
* @param isPhony Si la règle est une règle phony ou non
*/
public Rule(String name, List<String> dependencies, List<String> commands, boolean isPhony) {
this.name = name;
this.dependencies = dependencies;
@@ -46,60 +16,50 @@ public class Rule {
this.isPhony = isPhony;
}
/**
* Permet de récupérer le nom de la règle
* @return Le nom de la règle
*/
public String getName() { return name; }
/**
* Permet de récupérer les dépendances de la règle
* @return La liste des dépendances de la règle
*/
public List<String> getDependencies() { return dependencies; }
/**
* Permet de récupérer les commandes de la règle
* @return La liste des commandes de la règle
*/
public List<String> getCommands() { return commands; }
/**
* Permet de savoir si la règle est une règle phony
* @return true si la règle est une règle phony, false sinon
*/
public boolean isPhony() { return isPhony; }
/**
* Permet de savoir si la règle est vide (sans dépendances ni commandes)
* @return true si la règle est vide, false sinon
*/
public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); }
/**
* Détermine si la règle doit être mise à jour.
* Une règle doit être mise à jour si l'un de ses fichiers de sortie est plus ancien qu'un de ses fichiers de dépendance.
* De plus, les règles phony sont toujours mises à jour.
*
* @return true si la règle doit être mise à jour, false sinon.
*/
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; // Les règles phony sont toujours mises à jour
return true;
}
File targetFile = new File(name);
// 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) {
File depFile = new File(dependency);
if (!depFile.exists() && !dependency.isEmpty() && !BakeEngine.hasRule(dependency)) {
System.out.println("bake: *** No rule to make target '" + dependency + "', needed by '" + name + "'. Stop.");
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
File targetFile = new File(name);
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()) {
@@ -114,6 +74,7 @@ public class Rule {
System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp));
}
// Vérifier si une règle existe pour cette dépendance
boolean hasRule = BakeEngine.hasRule(dependency);
if (!depFile.exists() && !dependency.isEmpty() && !hasRule) {
@@ -121,6 +82,16 @@ public class Rule {
System.exit(1);
}
// 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");
@@ -130,4 +101,4 @@ public class Rule {
}
return false;
}
}
}