diff --git a/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java b/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java index c2759378d..8424bb0fb 100644 --- a/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java +++ b/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java @@ -63,9 +63,10 @@ public boolean shouldMigrate(ApplicationModuleIdentifier identifier, Flyway flyw } private int getNumberOfMigrationFiles(Location location, ApplicationModuleIdentifier identifier) { + var asPath = identifier.toString().replace('.', '/'); try { - return resolver.getResources("%s/%s/*".formatted(location, identifier.toString())).length; + return resolver.getResources("%s/%s/*".formatted(location, asPath)).length; } catch (FileNotFoundException e) { return 0; } catch (IOException e) { diff --git a/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java b/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java index 65b1ddbdb..b90012ca6 100644 --- a/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java +++ b/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java @@ -100,6 +100,25 @@ void dropModulesWithoutMigrations() { }); } + @Test // GH-1962 + void retainsModulesWithMigrationsForDottedIdentifiers() { + + var identifiers = ApplicationModuleIdentifiers.of(List.of( + ApplicationModuleIdentifier.of("fully.qualified"))); + + var filter = new HasMigrationFiles(new PathMatchingResourcePatternResolver()); + + var result = new SpringModulithFlywayCustomizer(Flyway.configure().load(), filter) + .augment(identifiers) + .toList(); + + assertThat(result).hasSize(2); + + assertThat(result.get(1).getConfiguration().getLocations()) + .extracting(Location::toString) + .containsExactly("classpath:db/migration/fully/qualified"); + } + @Builder @ToString @RequiredArgsConstructor diff --git a/spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql b/spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql new file mode 100644 index 000000000..319ed7cd5 --- /dev/null +++ b/spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql @@ -0,0 +1 @@ +-- nested module migration