siblings
This commit is contained in:
@@ -131,7 +131,7 @@ public class SiblingDependencyResolver {
|
|||||||
if (artifactId != null && targetArtifacts.contains(artifactId)) {
|
if (artifactId != null && targetArtifacts.contains(artifactId)) {
|
||||||
Path siblingDir = p.getParent();
|
Path siblingDir = p.getParent();
|
||||||
if (!siblingDir.equals(projectDir)) {
|
if (!siblingDir.equals(projectDir)) {
|
||||||
log.info("Discovered local Maven sibling dependency: {}", siblingDir);
|
log.info("Discovered local Maven sibling dependency via artifact match: {}", siblingDir);
|
||||||
siblings.add(siblingDir);
|
siblings.add(siblingDir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,6 +142,24 @@ public class SiblingDependencyResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Also directly add aggregator <module> directories declared in this pom
|
||||||
|
Matcher moduleMatcher = Pattern.compile("<module>(.*?)</module>").matcher(content);
|
||||||
|
while (moduleMatcher.find()) {
|
||||||
|
String moduleName = moduleMatcher.group(1).trim();
|
||||||
|
Path moduleDir = projectDir.resolve(moduleName).normalize();
|
||||||
|
if (Files.exists(moduleDir) && Files.exists(moduleDir.resolve("pom.xml")) && !moduleDir.equals(projectDir)) {
|
||||||
|
log.info("Discovered local Maven sibling dependency via <module>: {}", moduleDir);
|
||||||
|
siblings.add(moduleDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also add parent dir if it has a pom.xml
|
||||||
|
Path parentDir = projectDir.getParent();
|
||||||
|
if (parentDir != null && Files.exists(parentDir.resolve("pom.xml")) && !parentDir.equals(projectDir)) {
|
||||||
|
log.info("Discovered local Maven parent sibling: {}", parentDir);
|
||||||
|
siblings.add(parentDir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return siblings;
|
return siblings;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
package click.kamil.springstatemachineexporter.analysis.resolver;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class SiblingDependencyResolverTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldResolveGradleSiblingsTransitively(@TempDir Path tempDir) throws IOException {
|
||||||
|
// Create root project
|
||||||
|
Path rootDir = tempDir.resolve("my-root-project");
|
||||||
|
Files.createDirectories(rootDir);
|
||||||
|
Files.writeString(rootDir.resolve("settings.gradle"), "include 'module-a', 'module-b', 'module-c'");
|
||||||
|
|
||||||
|
// Create module A (depends on B)
|
||||||
|
Path moduleA = rootDir.resolve("module-a");
|
||||||
|
Files.createDirectories(moduleA);
|
||||||
|
Files.writeString(moduleA.resolve("build.gradle"), "dependencies { implementation project(':module-b') }");
|
||||||
|
|
||||||
|
// Create module B (depends on C)
|
||||||
|
Path moduleB = rootDir.resolve("module-b");
|
||||||
|
Files.createDirectories(moduleB);
|
||||||
|
Files.writeString(moduleB.resolve("build.gradle"), "dependencies { implementation project(':module-c') }");
|
||||||
|
|
||||||
|
// Create module C (no deps)
|
||||||
|
Path moduleC = rootDir.resolve("module-c");
|
||||||
|
Files.createDirectories(moduleC);
|
||||||
|
Files.writeString(moduleC.resolve("build.gradle"), "");
|
||||||
|
|
||||||
|
SiblingDependencyResolver resolver = new SiblingDependencyResolver();
|
||||||
|
|
||||||
|
// When we resolve from A, it should transitively find B and C
|
||||||
|
Set<Path> siblings = resolver.resolveSiblings(moduleA);
|
||||||
|
|
||||||
|
assertThat(siblings).containsExactlyInAnyOrder(moduleB.normalize(), moduleC.normalize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldResolveMavenSiblingsTransitively(@TempDir Path tempDir) throws IOException {
|
||||||
|
// Create root project
|
||||||
|
Path rootDir = tempDir.resolve("my-maven-root");
|
||||||
|
Files.createDirectories(rootDir);
|
||||||
|
Files.writeString(rootDir.resolve("pom.xml"), "<project><groupId>com.acme</groupId><artifactId>root</artifactId></project>");
|
||||||
|
// Create a dummy .git so findMavenRoot knows where to stop
|
||||||
|
Files.createDirectories(rootDir.resolve(".git"));
|
||||||
|
|
||||||
|
// Create module A (depends on B)
|
||||||
|
Path moduleA = rootDir.resolve("module-a");
|
||||||
|
Files.createDirectories(moduleA);
|
||||||
|
Files.writeString(moduleA.resolve("pom.xml"), "<project><groupId>com.acme</groupId><artifactId>module-a</artifactId><dependencies><dependency><groupId>com.acme</groupId><artifactId>module-b</artifactId><version>1.0</version></dependency></dependencies></project>");
|
||||||
|
|
||||||
|
// Create module B (depends on C)
|
||||||
|
Path moduleB = rootDir.resolve("module-b");
|
||||||
|
Files.createDirectories(moduleB);
|
||||||
|
Files.writeString(moduleB.resolve("pom.xml"), "<project><groupId>com.acme</groupId><artifactId>module-b</artifactId><dependencies><dependency><groupId>com.acme</groupId><artifactId>module-c</artifactId><version>1.0</version></dependency></dependencies></project>");
|
||||||
|
|
||||||
|
// Create module C (no deps)
|
||||||
|
Path moduleC = rootDir.resolve("module-c");
|
||||||
|
Files.createDirectories(moduleC);
|
||||||
|
Files.writeString(moduleC.resolve("pom.xml"), "<project><groupId>com.acme</groupId><artifactId>module-c</artifactId></project>");
|
||||||
|
|
||||||
|
SiblingDependencyResolver resolver = new SiblingDependencyResolver();
|
||||||
|
|
||||||
|
// When we resolve from A, it should transitively find B and C and the parent rootDir
|
||||||
|
Set<Path> siblings = resolver.resolveSiblings(moduleA);
|
||||||
|
|
||||||
|
assertThat(siblings).containsExactlyInAnyOrder(moduleB.normalize(), moduleC.normalize(), rootDir.normalize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldResolveMavenModulesFromAggregator(@TempDir Path tempDir) throws IOException {
|
||||||
|
// Create root project
|
||||||
|
Path rootDir = tempDir.resolve("my-aggregator-root");
|
||||||
|
Files.createDirectories(rootDir);
|
||||||
|
Files.writeString(rootDir.resolve("pom.xml"), "<project><groupId>com.acme</groupId><artifactId>root</artifactId><modules><module>service-x</module><module>service-y</module></modules></project>");
|
||||||
|
Files.createDirectories(rootDir.resolve(".git"));
|
||||||
|
|
||||||
|
// Create service X
|
||||||
|
Path serviceX = rootDir.resolve("service-x");
|
||||||
|
Files.createDirectories(serviceX);
|
||||||
|
Files.writeString(serviceX.resolve("pom.xml"), "<project><artifactId>service-x</artifactId></project>");
|
||||||
|
|
||||||
|
// Create service Y
|
||||||
|
Path serviceY = rootDir.resolve("service-y");
|
||||||
|
Files.createDirectories(serviceY);
|
||||||
|
Files.writeString(serviceY.resolve("pom.xml"), "<project><artifactId>service-y</artifactId></project>");
|
||||||
|
|
||||||
|
SiblingDependencyResolver resolver = new SiblingDependencyResolver();
|
||||||
|
|
||||||
|
// Resolving from rootDir should pick up the <module> tags and resolve service-x and service-y
|
||||||
|
Set<Path> siblings = resolver.resolveSiblings(rootDir);
|
||||||
|
|
||||||
|
assertThat(siblings).containsExactlyInAnyOrder(serviceX.normalize(), serviceY.normalize());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user