Ajout de la détection des timestamps futurs dans le système de build et mise à jour des messages d'avertissement

This commit is contained in:
stiti
2025-03-02 14:31:44 +01:00
parent 2edb7a3ad3
commit ef5fff565a
6 changed files with 75 additions and 37 deletions

View File

@@ -7,6 +7,7 @@ public class CommandExecutor {
private boolean debug;
private boolean needsUpdate = false; // Pour tracker si quelque chose doit être mis à jour
private boolean isCircular = false; // Pour tracker si un cycle a été détecté
private boolean futureTimestampDetected = false; // Pour détecter les timestamps dans le futur
public CommandExecutor(boolean debug, boolean isCircular) {
this.debug = debug;
@@ -18,6 +19,18 @@ public class CommandExecutor {
boolean ruleNeedsUpdate = rule.needsUpdate();
if (ruleNeedsUpdate) {
needsUpdate = true; // Au moins une règle doit être mise à jour
// Vérifier les timestamps des dépendances pour détecter ceux dans le futur
for (String dependency : rule.getDependencies()) {
if (dependency.startsWith("~")) {
continue;
}
File depFile = new File(dependency);
if (depFile.exists() && TimestampManager.getTimestamp(depFile) > System.currentTimeMillis()) {
futureTimestampDetected = true;
}
}
}
// Si la règle a besoin d'être mise à jour et qu'il n'y a pas de commandes
@@ -56,6 +69,11 @@ public class CommandExecutor {
}
}
// Si on a détecté des timestamps dans le futur, afficher un avertissement à la fin (comme make)
if (futureTimestampDetected && !isCircular) {
System.out.println("bake: warning: Clock skew detected. Your build may be incomplete.");
}
// Vérifier si cette règle est une cible directement demandée par l'utilisateur
boolean isRequestedTarget = BakeCLI.getTargets().contains(rule.getName()) ||
(BakeCLI.getTargets().isEmpty() && rule.getName().equals(BakefileParser.getFirstTarget()));

View File

@@ -2,6 +2,7 @@ package fr.monlouyan.bakefile;
import java.io.File;
import java.util.List;
import java.util.Date;
public class Rule {
private String name;
@@ -97,6 +98,8 @@ public class Rule {
System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp));
}
long currentTime = System.currentTimeMillis();
for (String dependency : dependencies) {
// Skip dependencies with tilde in path
if (dependency.startsWith("~")) {
@@ -104,7 +107,22 @@ public class Rule {
}
File depFile = new File(dependency);
long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0;
if (!depFile.exists()) {
continue;
}
long depTimestamp = TimestampManager.getTimestamp(depFile);
// Vérifier si le timestamp de la dépendance est dans le futur
if (depTimestamp > currentTime) {
// Avertissement similaire à make
System.out.println("bake: Warning: File '" + dependency + "' has modification time "
+ ((depTimestamp - currentTime) / 1000) + " s in the future");
if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency " + dependency + " has a timestamp in the future, needs update");
}
return true;
}
if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp));
@@ -120,13 +138,14 @@ public class Rule {
}
// Vérifier les timestamps seulement si le fichier existe
if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) {
if (depTimestamp > targetTimestamp) {
if (BakeCLI.isDebug()) {
System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update");
}
return true;
}
}
return false;
}
}