From 238a02796b8e067e7f588d30b200dda63ea57da7 Mon Sep 17 00:00:00 2001
From: Yanis HAMOUDI <yanis.hamoudi@etu.u-pec.fr>
Date: Tue, 4 Feb 2025 16:27:07 +0100
Subject: [PATCH] =?UTF-8?q?Am=C3=A9liorations=20du=20code=20en=20ajoutant?=
 =?UTF-8?q?=20des=20patterns/regex=20+=20Am=C3=A9lioration=20du=20mode=20d?=
 =?UTF-8?q?ebug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Makefile                                      |  15 +++--
 src/fr/monlouyan/bakefile/BakeEngine.java     |   2 +-
 src/fr/monlouyan/bakefile/BakefileParser.java |  60 ++++++++++++++----
 .../monlouyan/bakefile/CommandExecutor.java   |   7 +-
 .../bakefile/DependencyResolver.java          |   9 +++
 src/fr/monlouyan/bakefile/Main.java           |   1 -
 tests/test-02-existe-deja/Bakefile            |   2 +-
 tests/test-02-existe-deja/main                | Bin 33432 -> 33432 bytes
 tests/test-02-existe-deja/main.c              |   1 +
 9 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/Makefile b/Makefile
index 26000dc..c667e80 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ JARNAME = bakefile.jar
 CLASSP = ./build
 MANIFESTPATH = Manifest.MF
 SOURCEDIR = ./src/
+TESTDIR = ./tests/
 
 SOURCES := $(shell find $(SOURCEDIR) -name '*.java')
 
@@ -14,21 +15,17 @@ all:
 	@make clean
 	@make compile
 	@make jar
-	@make run
 
 compile:
 	@echo "Compiling..."
 	javac -cp $(CLASSP) -d $(BUILDDIR) $(SOURCES) -Xlint:unchecked -Xlint:deprecation
 	@echo "Done."
 
-run:
-	@echo "Running..."
-	java -cp $(CLASSP):$(JARNAME) fr.monlouyan.bakefile.Main
-	@echo "Done."
-
 clean:
 	@echo "Cleaning up..."
 	@rm -rf $(BUILDDIR)* $(DOCDIR)*
+	@rm -f $(JARNAME)
+	@find $(TESTDIR) -name "$(JARNAME)" -delete
 	@echo "Done."
 
 javadoc:
@@ -39,4 +36,10 @@ javadoc:
 jar:
 	@echo "Creating jar..."
 	@jar cfm $(JARNAME) $(MANIFESTPATH) -C $(BUILDDIR) fr/monlouyan/bakefile
+	@echo "Done."
+	@make deploy-tests
+
+deploy-tests:
+	@echo "Deploying JAR to test directories..."
+	@find $(TESTDIR) -type d -exec cp $(JARNAME) {} \;
 	@echo "Done."
\ No newline at end of file
diff --git a/src/fr/monlouyan/bakefile/BakeEngine.java b/src/fr/monlouyan/bakefile/BakeEngine.java
index dc3b1ca..7751a62 100644
--- a/src/fr/monlouyan/bakefile/BakeEngine.java
+++ b/src/fr/monlouyan/bakefile/BakeEngine.java
@@ -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());
     }
     
diff --git a/src/fr/monlouyan/bakefile/BakefileParser.java b/src/fr/monlouyan/bakefile/BakefileParser.java
index ab8a228..07cae52 100644
--- a/src/fr/monlouyan/bakefile/BakefileParser.java
+++ b/src/fr/monlouyan/bakefile/BakefileParser.java
@@ -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;
-    }    
-    
-}
\ No newline at end of file
+    }
+}
diff --git a/src/fr/monlouyan/bakefile/CommandExecutor.java b/src/fr/monlouyan/bakefile/CommandExecutor.java
index 5341282..dd37dfc 100644
--- a/src/fr/monlouyan/bakefile/CommandExecutor.java
+++ b/src/fr/monlouyan/bakefile/CommandExecutor.java
@@ -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();
diff --git a/src/fr/monlouyan/bakefile/DependencyResolver.java b/src/fr/monlouyan/bakefile/DependencyResolver.java
index 2dfd0ab..133d492 100644
--- a/src/fr/monlouyan/bakefile/DependencyResolver.java
+++ b/src/fr/monlouyan/bakefile/DependencyResolver.java
@@ -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);
             }
         }
diff --git a/src/fr/monlouyan/bakefile/Main.java b/src/fr/monlouyan/bakefile/Main.java
index 8e571f7..9bc4c09 100755
--- a/src/fr/monlouyan/bakefile/Main.java
+++ b/src/fr/monlouyan/bakefile/Main.java
@@ -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();
diff --git a/tests/test-02-existe-deja/Bakefile b/tests/test-02-existe-deja/Bakefile
index 4e0e544..d698de6 100644
--- a/tests/test-02-existe-deja/Bakefile
+++ b/tests/test-02-existe-deja/Bakefile
@@ -1,2 +1,2 @@
 main: main.c
-    gcc -o main main.c
\ No newline at end of file
+	gcc -o main main.c
diff --git a/tests/test-02-existe-deja/main b/tests/test-02-existe-deja/main
index 47ca4d583d8dfcc47038f905b5b989ae6b8a1b88..a65d3dd9b959ca4f10f3c1016eb97ce7e8accec9 100755
GIT binary patch
delta 300
zcmbQy$~2>uX~G3T4SNO#Mg|532L=exnE23MFas*c0}*4$m~6;sFIWN<HHM0oY;I)y
z&nOU+JtK7eT;uA!i|#C2T6SUi<O$3cj2fFyGRIp_wy>AwyI?z!gMncR0|UbZh8DZY
z;r4#4C8@<FT$7jC%khG&2U!im8JjQKFLPjAF}b2afpNv;nGN!c8k2W6tkMHXg6w3>
zP0Y+==&I<mUhCR)!h!#z)1gD<+5gOvKK@fXX?kw!Y7U+nLF>sA8yytnLl!LbuK%#P
z-AqvR(FuctGCC%SU!ESh$?BLrU)AfM$>fiX4eGi1&m!5vb+(>7yE>re@yesDn<K4V
VEUsQvWm?a&IV)BlWG4dy0{~FiVdDS*

delta 288
zcmbQy$~2>uX~G3T3ws6zMg|5369x#dnE23MFb68g0}*4$nQX{tFIWK;)rE>yY;I)y
z&nPgZ-tYPKHFk2#zeEXzr>+;CJb~GQ(PHyS=6LJL0W1QOHSA@X9@tI}w)bOXn7qth
zju&L50|NsC2<L3RXur&XamVC}1_j0)lV>)_Gg?gE*|16v<{rk}#LPSfNz1oI3pUJM
z6wbXdTEIUeY4>EuizoO_NBV^}{t`?19X@$tqk}@o8}ozh@3LmKWSo96#lG^g-A5s%
z&EMEkS{j`XeO!J1?BtJ)4eHB1&Rk$&Yhc(^Ss(OPS>)k423?txi*qbrCaXPp75Kvu
G>Nfx~{$O_i

diff --git a/tests/test-02-existe-deja/main.c b/tests/test-02-existe-deja/main.c
index 145de7a..dee38e7 100644
--- a/tests/test-02-existe-deja/main.c
+++ b/tests/test-02-existe-deja/main.c
@@ -2,5 +2,6 @@
 
 int main(void) {
     printf("Ceci est un programme de test du Bakefile !\n");
+    printf("test\n");
     return 0;
 }