BazelModuleResolutionValue also stores the un-pruned dep graph
- `BazelModuleResolutionValue` also stores the `unprunedDepGraph` which will be used for inspection
- unit tests added to `SelectionTest` for the un-pruned dep graph
https://github.com/bazelbuild/bazel/issues/15365
PiperOrigin-RevId: 448028351
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java
index a9f816a..bcc5a71 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java
@@ -24,6 +24,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableTable;
import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileValue.RootModuleFileValue;
+import com.google.devtools.build.lib.bazel.bzlmod.Selection.SelectionResult;
import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.CheckDirectDepsMode;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.events.Event;
@@ -61,15 +62,17 @@
return null;
}
ImmutableMap<String, ModuleOverride> overrides = root.getOverrides();
- ImmutableMap<ModuleKey, Module> resolvedDepGraph;
+ SelectionResult selectionResult;
try {
- resolvedDepGraph = Selection.run(initialDepGraph, overrides);
+ selectionResult = Selection.run(initialDepGraph, overrides);
} catch (ExternalDepsException e) {
throw new BazelModuleResolutionFunctionException(e, Transience.PERSISTENT);
}
+ ImmutableMap<ModuleKey, Module> resolvedDepGraph = selectionResult.getResolvedDepGraph();
+
verifyRootModuleDirectDepsAreAccurate(
env, initialDepGraph.get(ModuleKey.ROOT), resolvedDepGraph.get(ModuleKey.ROOT));
- return createValue(resolvedDepGraph, overrides);
+ return createValue(resolvedDepGraph, selectionResult.getUnprunedDepGraph(), overrides);
}
private static void verifyRootModuleDirectDepsAreAccurate(
@@ -106,7 +109,9 @@
@VisibleForTesting
static BazelModuleResolutionValue createValue(
- ImmutableMap<ModuleKey, Module> depGraph, ImmutableMap<String, ModuleOverride> overrides)
+ ImmutableMap<ModuleKey, Module> depGraph,
+ ImmutableMap<ModuleKey, Module> unprunedDepGraph,
+ ImmutableMap<String, ModuleOverride> overrides)
throws BazelModuleResolutionFunctionException {
// Build some reverse lookups for later use.
ImmutableMap<String, ModuleKey> canonicalRepoNameLookup =
@@ -165,6 +170,7 @@
return BazelModuleResolutionValue.create(
depGraph,
+ unprunedDepGraph,
canonicalRepoNameLookup,
moduleNameLookup,
depGraph.values().stream().map(AbridgedModule::from).collect(toImmutableList()),
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java
index 23b0005..f1f348a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java
@@ -38,6 +38,7 @@
public static BazelModuleResolutionValue create(
ImmutableMap<ModuleKey, Module> depGraph,
+ ImmutableMap<ModuleKey, Module> unprunedDepGraph,
ImmutableMap<String, ModuleKey> canonicalRepoNameLookup,
ImmutableMap<String, ModuleKey> moduleNameLookup,
ImmutableList<AbridgedModule> abridgedModules,
@@ -45,6 +46,7 @@
ImmutableMap<ModuleExtensionId, String> extensionUniqueNames) {
return new AutoValue_BazelModuleResolutionValue(
depGraph,
+ unprunedDepGraph,
canonicalRepoNameLookup,
moduleNameLookup,
abridgedModules,
@@ -58,6 +60,14 @@
*/
public abstract ImmutableMap<ModuleKey, Module> getDepGraph();
+ /**
+ * The post-selection un-pruned dep graph, used for in-depth inspection. TODO(andreisolo): decide
+ * whether to store the un-pruned graph or just the removed modules? Random order (depends on
+ * SkyFrame execution order). For any KEY in the returned map, it's guaranteed that {@code
+ * depGraph[KEY].getKey() == KEY}.
+ */
+ public abstract ImmutableMap<ModuleKey, Module> getUnprunedDepGraph();
+
/** A mapping from a canonical repo name to the key of the module backing it. */
public abstract ImmutableMap<String, ModuleKey> getCanonicalRepoNameLookup();
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Selection.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Selection.java
index d0950be..615feac 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Selection.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Selection.java
@@ -35,7 +35,8 @@
/**
* Runs module selection. This step of module resolution reads the output of {@link Discovery} and
* applies the Minimal Version Selection algorithm to it, removing unselected modules from the
- * dependency graph and rewriting dependencies to point to the selected versions.
+ * dependency graph and rewriting dependencies to point to the selected versions. It also returns an
+ * un-pruned version of the dep graph for inspection purpose.
*
* <p>Essentially, what needs to happen is:
*
@@ -66,6 +67,34 @@
final class Selection {
private Selection() {}
+ /**
+ * The result of the selection process, containing both the pruned and the un-pruned dependency
+ * graphs.
+ */
+ @AutoValue
+ abstract static class SelectionResult {
+ /* TODO(andreisolo): Also load the modules overridden by {@code single_version_override} or
+ NonRegistryOverride if we need to detect changes in the dependency graph caused by them.
+ */
+
+ /** Final dep graph sorted in BFS iteration order, with unused modules removed. */
+ abstract ImmutableMap<ModuleKey, Module> getResolvedDepGraph();
+
+ /**
+ * Un-pruned dep graph, with updated dep keys, and additionally containing the unused modules
+ * which were initially discovered (and their MODULE.bazel files loaded). Does not contain
+ * modules overridden by {@code single_version_override} or {@link NonRegistryOverride}, only by
+ * {@code multiple_version_override}.
+ */
+ abstract ImmutableMap<ModuleKey, Module> getUnprunedDepGraph();
+
+ static SelectionResult create(
+ ImmutableMap<ModuleKey, Module> resolvedDepGraph,
+ ImmutableMap<ModuleKey, Module> unprunedDepGraph) {
+ return new AutoValue_Selection_SelectionResult(resolvedDepGraph, unprunedDepGraph);
+ }
+ }
+
/** During selection, a version is selected for each distinct "selection group". */
@AutoValue
abstract static class SelectionGroup {
@@ -164,11 +193,8 @@
allowedVersionSet.ceiling(module.getVersion()));
}
- /**
- * Runs module selection (aka version resolution). Returns a dep graph sorted in BFS iteration
- * order.
- */
- public static ImmutableMap<ModuleKey, Module> run(
+ /** Runs module selection (aka version resolution). Returns a {@link SelectionResult}. */
+ public static SelectionResult run(
ImmutableMap<ModuleKey, Module> depGraph, ImmutableMap<String, ModuleOverride> overrides)
throws ExternalDepsException {
// For any multiple-version overrides, build a mapping from (moduleName, compatibilityLevel) to
@@ -195,29 +221,40 @@
// Build a new dep graph where deps with unselected versions are removed.
ImmutableMap.Builder<ModuleKey, Module> newDepGraphBuilder = new ImmutableMap.Builder<>();
- for (Module module : depGraph.values()) {
- // Remove any dep whose version isn't selected.
- Version selectedVersion = selectedVersions.get(selectionGroups.get(module.getKey()));
- if (!module.getKey().getVersion().equals(selectedVersion)) {
- continue;
- }
+ // Also keep a version of the full dep graph with updated deps.
+ ImmutableMap.Builder<ModuleKey, Module> unprunedDepGraphBuilder = new ImmutableMap.Builder<>();
+ for (Module module : depGraph.values()) {
// Rewrite deps to point to the selected version.
- newDepGraphBuilder.put(
- module.getKey(),
+ ModuleKey key = module.getKey();
+ Module updatedModule =
module.withDepKeysTransformed(
depKey ->
ModuleKey.create(
- depKey.getName(), selectedVersions.get(selectionGroups.get(depKey)))));
+ depKey.getName(), selectedVersions.get(selectionGroups.get(depKey))));
+
+ // Add all updated modules to the un-pruned dep graph.
+ unprunedDepGraphBuilder.put(key, updatedModule);
+
+ // Remove any dep whose version isn't selected from the resolved graph.
+ Version selectedVersion = selectedVersions.get(selectionGroups.get(module.getKey()));
+ if (module.getKey().getVersion().equals(selectedVersion)) {
+ newDepGraphBuilder.put(key, updatedModule);
+ }
}
ImmutableMap<ModuleKey, Module> newDepGraph = newDepGraphBuilder.buildOrThrow();
+ ImmutableMap<ModuleKey, Module> unprunedDepGraph = unprunedDepGraphBuilder.buildOrThrow();
- // Further remove unreferenced modules from the graph. We can find out which modules are
+ // Further, removes unreferenced modules from the graph. We can find out which modules are
// referenced by collecting deps transitively from the root.
// We can also take this opportunity to check that none of the remaining modules conflict with
// each other (e.g. same module name but different compatibility levels, or not satisfying
// multiple_version_override).
- return new DepGraphWalker(newDepGraph, overrides, selectionGroups).walk();
+ ImmutableMap<ModuleKey, Module> prunedDepGraph =
+ new DepGraphWalker(newDepGraph, overrides, selectionGroups).walk();
+
+ // Return the result containing both the pruned and un-pruned dep graphs
+ return SelectionResult.create(prunedDepGraph, unprunedDepGraph);
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java
index 6f8082d..33081ec 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java
@@ -87,7 +87,7 @@
"rules_java", LocalPathOverride.create("bleh"));
BazelModuleResolutionValue value =
- BazelModuleResolutionFunction.createValue(depGraph, overrides);
+ BazelModuleResolutionFunction.createValue(depGraph, depGraph, overrides);
assertThat(value.getCanonicalRepoNameLookup())
.containsExactly(
"", ModuleKey.ROOT,
@@ -161,7 +161,7 @@
Label.parseAbsoluteUnchecked("@dep.2.0//incredible:conflict.bzl"), "myext");
BazelModuleResolutionValue value =
- BazelModuleResolutionFunction.createValue(depGraph, ImmutableMap.of());
+ BazelModuleResolutionFunction.createValue(depGraph, depGraph, ImmutableMap.of());
assertThat(value.getExtensionUsagesTable()).hasSize(5);
assertThat(value.getExtensionUsagesTable())
.containsCell(maven, ModuleKey.ROOT, root.getExtensionUsages().get(0));
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
index 5909eec..796f9b0 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
@@ -174,6 +174,7 @@
(skyKey, env) ->
BazelModuleResolutionFunction.createValue(
ImmutableMap.of(ModuleKey.ROOT, Module.builder().build()),
+ ImmutableMap.of(ModuleKey.ROOT, Module.builder().build()),
ImmutableMap.of()))
.put(
SkyFunctions.REPOSITORY_MAPPING,
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/SelectionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/SelectionTest.java
index 12d7b5a..9c15f5b 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/SelectionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/SelectionTest.java
@@ -22,6 +22,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.bazel.bzlmod.BzlmodTestUtil.ModuleBuilder;
+import com.google.devtools.build.lib.bazel.bzlmod.Selection.SelectionResult;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -52,7 +53,8 @@
.put(ModuleBuilder.create("D", "2.0", 1).buildEntry())
.buildOrThrow();
- assertThat(Selection.run(depGraph, /*overrides=*/ ImmutableMap.of()).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, /*overrides=*/ ImmutableMap.of());
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -68,6 +70,23 @@
.buildEntry(),
ModuleBuilder.create("D", "2.0", 1).buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph().entrySet())
+ .containsExactly(
+ ModuleBuilder.create("A", Version.EMPTY)
+ .setKey(ModuleKey.ROOT)
+ .addDep("BfromA", createModuleKey("B", "1.0"))
+ .addDep("CfromA", createModuleKey("C", "2.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B", "1.0")
+ .addDep("DfromB", createModuleKey("D", "2.0"))
+ .addOriginalDep("DfromB", createModuleKey("D", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("C", "2.0")
+ .addDep("DfromC", createModuleKey("D", "2.0"))
+ .buildEntry(),
+ ModuleBuilder.create("D", "1.0", 1).buildEntry(),
+ ModuleBuilder.create("D", "2.0", 1).buildEntry());
}
@Test
@@ -98,7 +117,8 @@
.put(ModuleBuilder.create("E", "1.0").buildEntry())
.build();
- assertThat(Selection.run(depGraph, /*overrides=*/ ImmutableMap.of()).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, /*overrides=*/ ImmutableMap.of());
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -112,6 +132,22 @@
ModuleBuilder.create("C", "2.0").addDep("D", createModuleKey("D", "2.0")).buildEntry(),
ModuleBuilder.create("D", "2.0").buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph().entrySet())
+ .containsExactly(
+ ModuleBuilder.create("A", Version.EMPTY)
+ .setKey(ModuleKey.ROOT)
+ .addDep("B", createModuleKey("B", "1.0"))
+ .addDep("C", createModuleKey("C", "2.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B", "1.0")
+ .addDep("D", createModuleKey("D", "2.0"))
+ .addOriginalDep("D", createModuleKey("D", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("C", "2.0").addDep("D", createModuleKey("D", "2.0")).buildEntry(),
+ ModuleBuilder.create("D", "2.0").buildEntry(),
+ ModuleBuilder.create("D", "1.0").addDep("E", createModuleKey("E", "1.0")).buildEntry(),
+ ModuleBuilder.create("E", "1.0").buildEntry());
}
@Test
@@ -138,7 +174,8 @@
.put(ModuleBuilder.create("D", "1.0").buildEntry())
.buildOrThrow();
- assertThat(Selection.run(depGraph, /*overrides=*/ ImmutableMap.of()).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, /*overrides=*/ ImmutableMap.of());
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -151,6 +188,22 @@
.buildEntry())
.inOrder();
// D is completely gone.
+
+ assertThat(selectionResult.getUnprunedDepGraph().entrySet())
+ .containsExactly(
+ ModuleBuilder.create("A", Version.EMPTY)
+ .setKey(ModuleKey.ROOT)
+ .addDep("B", createModuleKey("B", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B", "1.0").addDep("C", createModuleKey("C", "2.0")).buildEntry(),
+ ModuleBuilder.create("C", "2.0")
+ .addDep("B", createModuleKey("B", "1.0"))
+ .addOriginalDep("B", createModuleKey("B", "1.0-pre"))
+ .buildEntry(),
+ ModuleBuilder.create("B", "1.0-pre")
+ .addDep("D", createModuleKey("D", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("D", "1.0").buildEntry());
}
@Test
@@ -224,7 +277,8 @@
// \-> C 1.1
// \-> D 1.0 -> B 1.1
// \-> E 1.0 -> C 1.1
- assertThat(Selection.run(depGraph, /*overrides=*/ ImmutableMap.of()).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, /*overrides=*/ ImmutableMap.of());
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", "1.0")
.setKey(ModuleKey.ROOT)
@@ -240,6 +294,25 @@
ModuleBuilder.create("D", "1.0").addDep("B", createModuleKey("B", "1.1")).buildEntry(),
ModuleBuilder.create("E", "1.0").addDep("C", createModuleKey("C", "1.1")).buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph().entrySet())
+ .containsExactly(
+ ModuleBuilder.create("A", "1.0")
+ .setKey(ModuleKey.ROOT)
+ .addDep("B", createModuleKey("B", "1.1"))
+ .addOriginalDep("B", createModuleKey("B", "1.0"))
+ .addDep("C", createModuleKey("C", "1.1"))
+ .addOriginalDep("C", createModuleKey("C", "1.0"))
+ .addDep("D", createModuleKey("D", "1.0"))
+ .addDep("E", createModuleKey("E", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B", "1.0").addDep("C", createModuleKey("C", "2.0")).buildEntry(),
+ ModuleBuilder.create("B", "1.1").buildEntry(),
+ ModuleBuilder.create("C", "1.0", 1).buildEntry(),
+ ModuleBuilder.create("C", "1.1", 1).buildEntry(),
+ ModuleBuilder.create("C", "2.0", 2).buildEntry(),
+ ModuleBuilder.create("D", "1.0").addDep("B", createModuleKey("B", "1.1")).buildEntry(),
+ ModuleBuilder.create("E", "1.0").addDep("C", createModuleKey("C", "1.1")).buildEntry());
}
@Test
@@ -291,7 +364,8 @@
MultipleVersionOverride.create(
ImmutableList.of(Version.parse("1.0"), Version.parse("2.0")), ""));
- assertThat(Selection.run(depGraph, overrides).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, overrides);
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -301,6 +375,9 @@
ModuleBuilder.create("B", "1.0").buildEntry(),
ModuleBuilder.create("B", "2.0").buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph())
+ .isEqualTo(selectionResult.getResolvedDepGraph());
}
@Test
@@ -359,7 +436,8 @@
MultipleVersionOverride.create(
ImmutableList.of(Version.parse("1.0"), Version.parse("2.0")), ""));
- assertThat(Selection.run(depGraph, overrides).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, overrides);
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -375,6 +453,9 @@
ModuleBuilder.create("D", "1.0", 1).buildEntry(),
ModuleBuilder.create("D", "2.0", 2).buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph())
+ .isEqualTo(selectionResult.getResolvedDepGraph());
}
@Test
@@ -404,7 +485,8 @@
MultipleVersionOverride.create(
ImmutableList.of(Version.parse("1.0"), Version.parse("2.0")), ""));
- assertThat(Selection.run(depGraph, overrides).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, overrides);
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -420,6 +502,9 @@
ModuleBuilder.create("D", "1.0").buildEntry(),
ModuleBuilder.create("D", "2.0").buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph())
+ .isEqualTo(selectionResult.getResolvedDepGraph());
}
@Test
@@ -478,7 +563,8 @@
// \-> B3@1.0 -> C@1.7 [originally C@1.5]
// \-> B4@1.0 -> C@1.7 [allowed]
// \-> B5@1.0 -> C@2.0 [allowed]
- assertThat(Selection.run(depGraph, overrides).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, overrides);
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -503,6 +589,33 @@
ModuleBuilder.create("C", "1.7", 1).buildEntry(),
ModuleBuilder.create("C", "2.0", 2).buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph().entrySet())
+ .containsExactly(
+ ModuleBuilder.create("A", Version.EMPTY)
+ .setKey(ModuleKey.ROOT)
+ .addDep("B1", createModuleKey("B1", "1.0"))
+ .addDep("B2", createModuleKey("B2", "1.0"))
+ .addDep("B3", createModuleKey("B3", "1.0"))
+ .addDep("B4", createModuleKey("B4", "1.0"))
+ .addDep("B5", createModuleKey("B5", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B1", "1.0")
+ .addDep("C", createModuleKey("C", "1.3"))
+ .addOriginalDep("C", createModuleKey("C", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B2", "1.0").addDep("C", createModuleKey("C", "1.3")).buildEntry(),
+ ModuleBuilder.create("B3", "1.0")
+ .addDep("C", createModuleKey("C", "1.7"))
+ .addOriginalDep("C", createModuleKey("C", "1.5"))
+ .buildEntry(),
+ ModuleBuilder.create("B4", "1.0").addDep("C", createModuleKey("C", "1.7")).buildEntry(),
+ ModuleBuilder.create("B5", "1.0").addDep("C", createModuleKey("C", "2.0")).buildEntry(),
+ ModuleBuilder.create("C", "1.0", 1).buildEntry(),
+ ModuleBuilder.create("C", "1.3", 1).buildEntry(),
+ ModuleBuilder.create("C", "1.5", 1).buildEntry(),
+ ModuleBuilder.create("C", "1.7", 1).buildEntry(),
+ ModuleBuilder.create("C", "2.0", 2).buildEntry());
}
@Test
@@ -651,7 +764,8 @@
// \ \-> B4@1.1
// \-> B4@1.1
// C@1.5 and C@3.0, the versions violating the allowlist, are gone.
- assertThat(Selection.run(depGraph, overrides).entrySet())
+ SelectionResult selectionResult = Selection.run(depGraph, overrides);
+ assertThat(selectionResult.getResolvedDepGraph().entrySet())
.containsExactly(
ModuleBuilder.create("A", Version.EMPTY)
.setKey(ModuleKey.ROOT)
@@ -675,5 +789,33 @@
ModuleBuilder.create("C", "1.0", 1).buildEntry(),
ModuleBuilder.create("C", "2.0", 2).buildEntry())
.inOrder();
+
+ assertThat(selectionResult.getUnprunedDepGraph().entrySet())
+ .containsExactly(
+ ModuleBuilder.create("A", Version.EMPTY)
+ .setKey(ModuleKey.ROOT)
+ .addDep("B1", createModuleKey("B1", "1.0"))
+ .addDep("B2", createModuleKey("B2", "1.1"))
+ .addOriginalDep("B2", createModuleKey("B2", "1.0"))
+ .addDep("B3", createModuleKey("B3", "1.0"))
+ .addDep("B4", createModuleKey("B4", "1.1"))
+ .addOriginalDep("B4", createModuleKey("B4", "1.0"))
+ .buildEntry(),
+ ModuleBuilder.create("B1", "1.0")
+ .addDep("C", createModuleKey("C", "1.0"))
+ .addDep("B2", createModuleKey("B2", "1.1"))
+ .buildEntry(),
+ ModuleBuilder.create("B2", "1.0").addDep("C", createModuleKey("C", "1.5")).buildEntry(),
+ ModuleBuilder.create("B2", "1.1").buildEntry(),
+ ModuleBuilder.create("B3", "1.0")
+ .addDep("C", createModuleKey("C", "2.0"))
+ .addDep("B4", createModuleKey("B4", "1.1"))
+ .buildEntry(),
+ ModuleBuilder.create("B4", "1.0").addDep("C", createModuleKey("C", "3.0")).buildEntry(),
+ ModuleBuilder.create("B4", "1.1").buildEntry(),
+ ModuleBuilder.create("C", "1.0", 1).buildEntry(),
+ ModuleBuilder.create("C", "1.5", 1).buildEntry(),
+ ModuleBuilder.create("C", "2.0", 2).buildEntry(),
+ ModuleBuilder.create("C", "3.0", 3).buildEntry());
}
}