diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java index 83f8249f54..a11ec58c0c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java @@ -598,14 +598,14 @@ abstract class AbstractGenerator implements Generator { * If file is a file, delete it. */ protected void empty(File file, String suffix) { - empty(file, suffix, Collections.emptySet()); + empty(file, suffix, Collections.emptySet(), Collections.emptySet()); } /** * If file is a directory, recursively empty its children. * If file is a file, delete it, except if it is in the list of files to keep. */ - protected void empty(File file, String suffix, Set keep) { + protected void empty(File file, String suffix, Set keep, Set ignore) { if (file != null) { // Just a Murphy's Law safeguard in case a user misconfigures their config... @@ -614,12 +614,17 @@ abstract class AbstractGenerator implements Generator { return; } + // [#5614] Don't go into these directories + for (File i : ignore) + if (file.getAbsolutePath().startsWith(i.getAbsolutePath())) + return; + if (file.isDirectory()) { File[] children = file.listFiles(); if (children != null) for (File child : children) - empty(child, suffix, keep); + empty(child, suffix, keep, ignore); File[] childrenAfterDeletion = file.listFiles(); diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 17ca720905..49f4ecdb09 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -176,10 +176,17 @@ public class JavaGenerator extends AbstractGenerator { private Map catalogVersions; /** - * All files modified by this generator + * All files modified by this generator. */ private Set files = new LinkedHashSet(); + /** + * These directories were not modified by this generator, but flagged as not + * for removal (e.g. because of {@link #schemaVersions} or + * {@link #catalogVersions}). + */ + private Set directoriesNotForRemoval = new LinkedHashSet(); + private final boolean scala; private final String tokenVoid; @@ -271,7 +278,8 @@ public class JavaGenerator extends AbstractGenerator { // [#5556] Clean up common parent directory log.info("Removing excess files"); - empty(getStrategy().getFileRoot(), (scala ? ".scala" : ".java"), files); + empty(getStrategy().getFileRoot(), (scala ? ".scala" : ".java"), files, directoriesNotForRemoval); + directoriesNotForRemoval.clear(); files.clear(); } @@ -323,6 +331,10 @@ public class JavaGenerator extends AbstractGenerator { } else { log.info("Existing version " + oldVersion + " is up to date with " + newVersion + " for catalog " + catalog.getInputName() + ". Ignoring catalog."); + + // [#5614] If a catalog is not regenerated, we must flag it as "not for removal", because its contents + // will not be listed in the files directory. + directoriesNotForRemoval.add(getStrategy().getFile(catalog).getParentFile()); return; } } @@ -361,6 +373,10 @@ public class JavaGenerator extends AbstractGenerator { } else { log.info("Existing version " + oldVersion + " is up to date with " + newVersion + " for schema " + schema.getInputName() + ". Ignoring schema."); + + // [#5614] If a schema is not regenerated, we must flag it as "not for removal", because its contents + // will not be listed in the files directory. + directoriesNotForRemoval.add(getStrategy().getFile(schema).getParentFile()); return; } }