Do not compile bundles without src directory
[cc0/argeo-build.git] / src / org / argeo / build / Make.java
index 33291b20ba05289043ba7aab26ede874ba6391a3..af624060d66eb9d95d1f26cd518e44442584843d 100644 (file)
@@ -3,6 +3,7 @@ package org.argeo.build;
 import static java.lang.System.Logger.Level.DEBUG;
 import static java.lang.System.Logger.Level.ERROR;
 import static java.lang.System.Logger.Level.INFO;
+import static java.lang.System.Logger.Level.TRACE;
 import static java.lang.System.Logger.Level.WARNING;
 
 import java.io.File;
@@ -20,6 +21,7 @@ import java.nio.file.Path;
 import java.nio.file.PathMatcher;
 import java.nio.file.Paths;
 import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -225,7 +227,8 @@ public class Make {
                }
 
                // sources
-               for (String bundle : bundles) {
+               boolean atLeastOneBundleToCompile = false;
+               bundles: for (String bundle : bundles) {
                        StringBuilder sb = new StringBuilder();
                        Path bundlePath = execDirectory.resolve(bundle);
                        if (!Files.exists(bundlePath)) {
@@ -236,15 +239,24 @@ public class Make {
                                } else
                                        throw new IllegalArgumentException("Bundle " + bundle + " not found in " + execDirectory);
                        }
-                       sb.append(bundlePath.resolve("src"));
+                       Path bundleSrc = bundlePath.resolve("src");
+                       if (!Files.exists(bundleSrc)) {
+                               logger.log(TRACE, bundleSrc + " does not exist, skipping it, as this is not a Java bundle");
+                               continue bundles;
+                       }
+                       sb.append(bundleSrc);
                        sb.append("[-d");
                        compilerArgs.add(sb.toString());
                        sb = new StringBuilder();
                        sb.append(buildBase.resolve(bundle).resolve("bin"));
                        sb.append("]");
                        compilerArgs.add(sb.toString());
+                       atLeastOneBundleToCompile = true;
                }
 
+               if (!atLeastOneBundleToCompile)
+                       return;
+
                if (logger.isLoggable(INFO))
                        compilerArgs.add("-time");
 
@@ -354,16 +366,15 @@ public class Make {
                        if (uninstall) { // uninstall
                                if (Files.exists(targetJarP)) {
                                        Files.delete(targetJarP);
-                                       Path targetParent = targetJarP.getParent();
-                                       if (!Files.list(targetParent).iterator().hasNext())
-                                               Files.delete(targetParent);
                                        logger.log(DEBUG, "Removed " + targetJarP);
                                        count++;
                                }
+                               Path targetParent = targetJarP.getParent();
+                               deleteEmptyParents(targetA2, targetParent);
                        } else { // install
                                Files.createDirectories(targetJarP.getParent());
                                boolean update = Files.exists(targetJarP);
-                               Files.copy(jarP, targetJarP);
+                               Files.copy(jarP, targetJarP, StandardCopyOption.REPLACE_EXISTING);
                                logger.log(DEBUG, (update ? "Updated " : "Installed ") + targetJarP);
                                count++;
                        }
@@ -371,6 +382,19 @@ public class Make {
                logger.log(INFO, uninstall ? count + " bundles removed" : count + " bundles installed or updated");
        }
 
+       /** Delete empty parent directory up to the A2 target (included). */
+       void deleteEmptyParents(Path targetA2, Path targetParent) throws IOException {
+               if (!Files.isDirectory(targetParent))
+                       throw new IllegalArgumentException(targetParent + " must be a directory");
+               boolean isA2target = Files.isSameFile(targetA2, targetParent);
+               if (!Files.list(targetParent).iterator().hasNext()) {
+                       Files.delete(targetParent);
+                       if (isA2target)
+                               return;// stop after deleting A2 base
+                       deleteEmptyParents(targetA2, targetParent.getParent());
+               }
+       }
+
        /** Package a single bundle. */
        void createBundle(String branch, String bundle, String category) throws IOException {
                final Path source;
@@ -495,6 +519,15 @@ public class Make {
 
                        // Add all resources from src/
                        Files.walkFileTree(srcP, new SimpleFileVisitor<Path>() {
+                               @Override
+                               public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+                                       // skip directories ending with .js
+                                       // TODO find something more robust?
+                                       if (dir.getFileName().toString().endsWith(".js"))
+                                               return FileVisitResult.SKIP_SUBTREE;
+                                       return super.preVisitDirectory(dir, attrs);
+                               }
+
                                @Override
                                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                                        if (file.getFileName().toString().endsWith(".java")