Améliorations du code en ajoutant des patterns/regex + Amélioration du mode debug

This commit is contained in:
2025-02-04 16:27:07 +01:00
parent d8cd0c785b
commit 238a02796b
9 changed files with 72 additions and 25 deletions

View File

@@ -12,7 +12,7 @@ public class BakeEngine {
public BakeEngine(BakeCLI cli) {
this.cli = cli;
this.parser = new BakefileParser("Bakefile");
this.resolver = new DependencyResolver();
this.resolver = new DependencyResolver(cli.isDebug());
this.executor = new CommandExecutor(cli.isDebug());
}

View File

@@ -3,39 +3,71 @@ package fr.monlouyan.bakefile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BakefileParser {
private String filename;
/**
* Regex pour détecter les targets et leurs dépendances.
* Format : "nom : dépendance1 dépendance2"
*/
private static final Pattern TARGET_PATTERN = Pattern.compile("^(\\S+)\\s*:\\s*(.*)$");
/**
* Regex pour détecter les lignes de commande associées à une target.
* Format : " gcc -o program program.c" (ligne indentée)
*/
private static final Pattern COMMAND_PATTERN = Pattern.compile("^\\s+(.+)$");
public BakefileParser(String filename) {
this.filename = filename;
}
public List<Target> parse() {
List<Target> targets = new ArrayList<>();
if (!Files.exists(Paths.get(filename))) {
System.out.println("*** No targets specified and no makefile found. Stop.");
System.exit(1);
}
try {
List<String> lines = Files.readAllLines(Paths.get(filename));
String currentTarget = null;
List<String> dependencies = new ArrayList<>();
List<String> commands = new ArrayList<>();
for (String line : lines) {
if (line.contains(":")) {
String[] parts = line.split(":");
String name = parts[0].trim();
String[] deps = parts[1].trim().split(" ");
System.out.println("Target found: " + name + " with dependencies " + Arrays.toString(deps));
targets.add(new Target(name, Arrays.asList(deps), "gcc -o " + name + " " + name + ".c"));
Matcher targetMatcher = TARGET_PATTERN.matcher(line);
Matcher commandMatcher = COMMAND_PATTERN.matcher(line);
if (targetMatcher.matches()) {
// Sauvegarde de la précédente target si elle existe
if (currentTarget != null) {
targets.add(new Target(currentTarget, dependencies, String.join(" && ", commands)));
}
// Nouvelle target détectée
currentTarget = targetMatcher.group(1);
dependencies = new ArrayList<>(Arrays.asList(targetMatcher.group(2).trim().split("\\s+")));
commands = new ArrayList<>();
} else if (commandMatcher.matches()) {
// Ligne de commande associée à la dernière target trouvée
commands.add(commandMatcher.group(1));
}
}
// Ajout de la dernière target après la boucle
if (currentTarget != null) {
targets.add(new Target(currentTarget, dependencies, String.join(" && ", commands)));
}
} catch (IOException e) {
e.printStackTrace();
}
return targets;
}
}
}
}

View File

@@ -10,9 +10,12 @@ public class CommandExecutor {
}
public void execute(Target target) {
if (!target.needsUpdate()) return;
if (!target.needsUpdate()){
System.out.println("bake: '" + target.getName() + "' is up to date.");
return;
};
try {
System.out.println("Executing: " + target.getCommand());
System.out.println(target.getCommand());
ProcessBuilder pb = new ProcessBuilder("sh", "-c", target.getCommand());
Process process = pb.start();
int exitCode = process.waitFor();

View File

@@ -4,10 +4,19 @@ import java.util.ArrayList;
import java.util.List;
public class DependencyResolver {
private boolean debug;
public DependencyResolver(boolean debug) {
this.debug = debug;
}
public List<Target> resolve(List<Target> allTargets, List<String> requestedTargets) {
List<Target> targetsToBuild = new ArrayList<>();
for (Target target : allTargets) {
if (requestedTargets.isEmpty() || requestedTargets.contains(target.getName())) {
if (debug){
System.out.println("Target " + target.getName() + " is requested");
}
targetsToBuild.add(target);
}
}

View File

@@ -16,7 +16,6 @@ public class Main{
* @return void
*/
public static void main(String[] args){
System.out.println("Bakefile v1.0");
BakeCLI cli = new BakeCLI(args);
BakeEngine engine = new BakeEngine(cli);
engine.run();