@@ -59,7 +59,7 @@ func (ar *Archive) Resolve(release Release) []Release {
59
59
name : release .GetName (),
60
60
version : release .GetVersion (),
61
61
}
62
- return ar .resolve (map [string ]Release {}, []Dependency {mainDep })
62
+ return ar .resolve (map [string ]Release {}, []Dependency {mainDep }, map [ Dependency ] int {} )
63
63
}
64
64
65
65
type bareDependency struct {
@@ -79,7 +79,7 @@ func (b *bareDependency) String() string {
79
79
return b .GetName () + b .GetConstraint ().String ()
80
80
}
81
81
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 {
83
83
debug ("deps to process: %s" , depsToProcess )
84
84
if len (depsToProcess ) == 0 {
85
85
debug ("All dependencies have been resolved." )
@@ -99,7 +99,7 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
99
99
if existingRelease , has := solution [depName ]; has {
100
100
if match (existingRelease , dep ) {
101
101
debug ("%s already in solution and matching" , existingRelease )
102
- return ar .resolve (solution , depsToProcess [1 :])
102
+ return ar .resolve (solution , depsToProcess [1 :], problematicDeps )
103
103
}
104
104
debug ("%s already in solution do not match... rollingback" , existingRelease )
105
105
return nil
@@ -131,12 +131,18 @@ func (ar *Archive) resolve(solution map[string]Release, depsToProcess []Dependen
131
131
}
132
132
133
133
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 {
136
140
return res
137
141
}
138
142
debug ("%s did not work..." , release )
139
143
delete (solution , depName )
140
144
}
145
+
146
+ problematicDeps [dep ]++
141
147
return nil
142
148
}
0 commit comments