1515
1616package pubgrub
1717
18+ import "strings"
19+
1820// Solver implements the PubGrub dependency resolution algorithm with CDCL.
1921//
2022// The solver uses Conflict-Driven Clause Learning (CDCL) to efficiently
@@ -118,6 +120,7 @@ func (s *Solver) Solve(root Term) (Solution, error) {
118120
119121 assign := state .partial .seedRoot (root .Name , version )
120122 state .markAssigned (root .Name )
123+ state .traceAssignment ("seed" , assign )
121124
122125 s .debug ("seeded root" , "package" , root .Name , "version" , version )
123126
@@ -179,7 +182,18 @@ func (s *Solver) Solve(root Term) (Solution, error) {
179182 return state .partial .buildSolution (), nil
180183 }
181184
182- s .debug ("selecting package" , "step" , steps , "package" , nextPkg )
185+ allowed := state .partial .allowedSet (nextPkg )
186+ allowedStr := "<nil>"
187+ if allowed != nil {
188+ allowedStr = allowed .String ()
189+ }
190+ pending := state .partial .pendingPackages ()
191+ s .debug ("selecting package" ,
192+ "step" , steps ,
193+ "package" , nextPkg ,
194+ "allowed" , allowedStr ,
195+ "pending" , joinNameValues (pending ),
196+ )
183197
184198 ver , found , err := state .pickVersion (nextPkg )
185199 if err != nil {
@@ -199,6 +213,7 @@ func (s *Solver) Solve(root Term) (Solution, error) {
199213 s .debug ("making decision" , "step" , steps , "package" , nextPkg , "version" , ver )
200214
201215 assign := state .partial .addDecision (nextPkg , ver )
216+ state .traceAssignment ("decision" , assign )
202217 state .markAssigned (assign .name )
203218
204219 deps , err := s .Source .GetDependencies (nextPkg , ver )
@@ -217,6 +232,17 @@ func (s *Solver) Solve(root Term) (Solution, error) {
217232 }
218233}
219234
235+ func joinNameValues (names []Name ) string {
236+ if len (names ) == 0 {
237+ return ""
238+ }
239+ values := make ([]string , len (names ))
240+ for i , name := range names {
241+ values [i ] = name .Value ()
242+ }
243+ return strings .Join (values , "," )
244+ }
245+
220246func extractDecisionVersion (root Term ) (Version , error ) {
221247 if ! root .Positive {
222248 return nil , & VersionError {Package : root .Name , Message : "root term must be positive" }
0 commit comments