Skip to content

Commit df298c3

Browse files
authored
Merge pull request #14 from bugst/speedup_leaf_backtracking
Speedup dependency resolver by pre-cutting unsolvable branches
2 parents e797f1e + 1e9020d commit df298c3

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

resolver.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
7474
// Pick the first dependency in the deps to process
7575
dep := depsToProcess[0]
7676
depName := dep.GetName()
77-
debug("Considering next dep: %s", dep)
77+
debug("Considering next dep: %s", depName)
7878

7979
// If a release is already picked in the solution check if it match the dep
8080
if existingRelease, has := solution[depName]; has {
@@ -92,11 +92,27 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
9292
// Consider the latest versions first
9393
releases.SortDescent()
9494

95+
findMissingDeps := func(deps []Dependency) Dependency {
96+
for _, dep := range deps {
97+
if _, ok := ar.Releases[dep.GetName()]; !ok {
98+
return dep
99+
}
100+
}
101+
return nil
102+
}
103+
95104
debug("releases matching criteria: %s", releases)
96105
for _, release := range releases {
97-
debug("try with %s %s", release, release.GetDependencies())
106+
deps := release.GetDependencies()
107+
debug("try with %s %s", release, deps)
108+
109+
if missingDep := findMissingDeps(deps); missingDep != nil {
110+
debug("%s did not work, becuase his dependency %s does not exists", release, missingDep.GetName())
111+
continue
112+
}
113+
98114
solution[depName] = release
99-
res := ar.resolve(solution, append(depsToProcess[1:], release.GetDependencies()...))
115+
res := ar.resolve(solution, append(depsToProcess[1:], deps...))
100116
if res != nil {
101117
return res
102118
}

resolver_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,13 @@ func TestResolver(t *testing.T) {
9494
d100 := rel("D", "1.0.0", deps())
9595
d120 := rel("D", "1.2.0", deps("E"))
9696
e100 := rel("E", "1.0.0", deps())
97+
e101 := rel("E", "1.0.1", deps("F")) // INVALID
9798
arch := &Archive{
9899
Releases: map[string]Releases{
99100
"B": {b131, b130, b121, b120, b111, b110, b100},
100101
"C": {c200, c120, c111, c110, c102, c101, c100, c021, c020, c010},
101102
"D": {d100, d120},
102-
"E": {e100},
103+
"E": {e100, e101},
103104
},
104105
}
105106

0 commit comments

Comments
 (0)