Skip to content

Commit 7cce8cf

Browse files
committed
Speedup in worst-case scenario
1 parent 9a0ab19 commit 7cce8cf

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

resolver.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (ar *Archive) Resolve(release Release) []Release {
5959
name: release.GetName(),
6060
version: release.GetVersion(),
6161
}
62-
return ar.resolve(map[string]Release{}, []Dependency{mainDep})
62+
return ar.resolve(map[string]Release{}, []Dependency{mainDep}, map[Dependency]int{})
6363
}
6464

6565
type bareDependency struct {
@@ -79,7 +79,7 @@ func (b *bareDependency) String() string {
7979
return b.GetName() + b.GetConstraint().String()
8080
}
8181

82-
func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependency) []Release {
82+
func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependency, problematicDeps map[Dependency]int) []Release {
8383
debug("deps to process: %s", depsToProcess)
8484
if len(depsToProcess) == 0 {
8585
debug("All dependencies have been resolved.")
@@ -99,7 +99,7 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
9999
if existingRelease, has := solution[depName]; has {
100100
if match(existingRelease, dep) {
101101
debug("%s already in solution and matching", existingRelease)
102-
return ar.resolve(solution, depsToProcess[1:])
102+
return ar.resolve(solution, depsToProcess[1:], problematicDeps)
103103
}
104104
debug("%s already in solution do not match... rollingback", existingRelease)
105105
return nil
@@ -131,12 +131,18 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
131131
}
132132

133133
solution[depName] = release
134-
res := ar.resolve(solution, append(depsToProcess[1:], deps...))
135-
if res != nil {
134+
newDepsToProcess := append(depsToProcess[1:], deps...)
135+
// bubble up problematics deps so they are processed first
136+
sort.Slice(newDepsToProcess, func(i, j int) bool {
137+
return problematicDeps[newDepsToProcess[i]] > problematicDeps[newDepsToProcess[j]]
138+
})
139+
if res := ar.resolve(solution, newDepsToProcess, problematicDeps); res != nil {
136140
return res
137141
}
138142
debug("%s did not work...", release)
139143
delete(solution, depName)
140144
}
145+
146+
problematicDeps[dep]++
141147
return nil
142148
}

0 commit comments

Comments
 (0)