Author: kkaempf Date: Tue Dec 9 12:49:09 2008 New Revision: 11914 URL: http://svn.opensuse.org/viewcvs/zypp?rev=11914&view=rev Log: fix 'rule' pointer in decisions to detect '0'-rule correctly Modified: trunk/sat-solver/applayer/decision.c trunk/sat-solver/applayer/decision.h trunk/sat-solver/bindings/decision.i trunk/sat-solver/bindings/ruby/tests/reasons.rb Modified: trunk/sat-solver/applayer/decision.c URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/applayer/decision.c?rev=11914&r1=11913&r2=11914&view=diff ============================================================================== --- trunk/sat-solver/applayer/decision.c (original) +++ trunk/sat-solver/applayer/decision.c Tue Dec 9 12:49:09 2008 @@ -20,10 +20,10 @@ #include "solverdebug.h" Decision * -decision_new( Pool *pool, int op, Id solvable, Rule *rule ) +decision_new( Solver *solver, int op, Id solvable, Rule *rule ) { Decision *d = (Decision *)malloc( sizeof( Decision )); - d->pool = pool; + d->solver = solver; d->op = op; d->solvable = solvable; d->rule = rule; @@ -39,7 +39,6 @@ void solver_decisions_iterate( Solver *solver, int (*callback)( const Decision *d, void *user_data ), void *user_data ) { - Pool *pool = solver->pool; Repo *installed = solver->installed; Id p, *obsoletesmap = solver_create_decisions_obsoletesmap( solver ); Id s; @@ -78,7 +77,7 @@ s = p; if (installed) { - Solvable *solv = pool_id2solvable( pool, p ); + Solvable *solv = pool_id2solvable( solver->pool, p ); if (solv->repo == installed) continue; /* don't report 'keep installed' decision */ } @@ -91,7 +90,7 @@ op = DECISION_INSTALL; } } - d = decision_new( pool, op, s, why ? solver->rules + why : NULL ); + d = decision_new( solver, op, s, solver->rules + why ); if (callback( d, user_data )) break; } Modified: trunk/sat-solver/applayer/decision.h URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/applayer/decision.h?rev=11914&r1=11913&r2=11914&view=diff ============================================================================== --- trunk/sat-solver/applayer/decision.h (original) +++ trunk/sat-solver/applayer/decision.h Tue Dec 9 12:49:09 2008 @@ -17,7 +17,6 @@ * */ -#include "pool.h" #include "solver.h" enum decisions { @@ -29,12 +28,12 @@ typedef struct _Decision { enum decisions op; - Pool *pool; + Solver *solver; Id solvable; Rule *rule; } Decision; -Decision *decision_new( Pool *pool, int op, Id solvable, Rule *rule ); +Decision *decision_new( Solver *solver, int op, Id solvable, Rule *rule ); void decision_free( Decision *d ); void solver_decisions_iterate( Solver *solver, int (*callback)( const Decision *d, void *user_data ), void *user_data); Modified: trunk/sat-solver/bindings/decision.i URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/decision.i?rev=11914&r1=11913&r2=11914&view=diff ============================================================================== --- trunk/sat-solver/bindings/decision.i (original) +++ trunk/sat-solver/bindings/decision.i Tue Dec 9 12:49:09 2008 @@ -18,8 +18,8 @@ ~Decision() { decision_free( $self ); } - Pool *pool() - { return $self->pool; } + Solver *solver() + { return $self->solver; } int op() { return $self->op; } const char *op_s() @@ -33,8 +33,11 @@ return "unknown"; } XSolvable *solvable() - { return xsolvable_new( $self->pool, $self->solvable ); } + { return xsolvable_new( $self->solver->pool, $self->solvable ); } Rule *rule() - { return $self->rule; } + { if ($self->rule > $self->solver->rules) + return $self->rule; + return NULL; + } } Modified: trunk/sat-solver/bindings/ruby/tests/reasons.rb URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/bindings/ruby/tests/reasons.rb?rev=11914&r1=11913&r2=11914&view=diff ============================================================================== --- trunk/sat-solver/bindings/ruby/tests/reasons.rb (original) +++ trunk/sat-solver/bindings/ruby/tests/reasons.rb Tue Dec 9 12:49:09 2008 @@ -74,6 +74,36 @@ end # class Rule end +def explain solver, transaction + solver.each_to_install { |s| + puts "Install #{s}" + } + solver.each_to_remove { |s| + puts "Remove #{s}" + } + solver.each_decision do |d| + puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool) if d.rule})" + e = solver.explain( transaction, d) + if e.nil? + puts "\t unexplainable" + else + pis = pi_s e.shift + rel = e.shift + src = e.shift + if src.nil? + puts "\t #{pis}" + else + tgt = e.shift + if tgt + puts "\t [#{src}: #{pis} #{rel} provided by #{tgt}]" + else + puts "\t [#{src}: #{pis} #{rel}]" + end + end + end + end +end + # SolverProbleminfo to string def pi_s pi case pi @@ -118,23 +148,10 @@ @pool.prepare solver = @pool.create_solver( ) solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - solver.each_decision do |d| - puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool)})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end + def test_indirect_requires solv1 = @repo.create_solvable( 'A', '1.0-0' ) assert solv1 @@ -155,23 +172,10 @@ @pool.prepare solver = @pool.create_solver( ) solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - - solver.each_decision do |d| - puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool)})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end + + def test_indirect_requires_choose solv1 = @repo.create_solvable( 'A', '1.0-0' ) assert solv1 @@ -195,23 +199,10 @@ @pool.prepare solver = @pool.create_solver( ) solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - - solver.each_decision do |d| - puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool) if d.rule})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end + + def test_install_bash solvpath = Pathname( File.dirname( __FILE__ ) ) + Pathname( "../../testdata" ) + "os11-beta5-i386.solv" repo = @pool.add_solv( solvpath ) @@ -225,29 +216,10 @@ solver = @pool.create_solver( ) # solver.dont_install_recommended = true solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - - puts "#{solver.rule_count} rules" - puts "rpm(#{solver.rpmrules_start}..#{solver.rpmrules_end})" - puts "feature(#{solver.featurerules_start}..#{solver.featurerules_end})" - puts "update(#{solver.updaterules_start}..#{solver.updaterules_end})" - puts "job(#{solver.jobrules_start}..#{solver.jobrules_end})" - puts "learnt(#{solver.learntrules_start}..#{solver.learntrules_end})" - solver.each_decision do |d| - puts " #{d.solvable}\n\t#{d.op_s} (#{d.rule}:#{d.rule.to_dep(@pool) if d.rule})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end + + def test_conflicts installed = @pool.create_repo( 'installed' ) solv1 = installed.create_solvable( 'A', '1.0-0' ) @@ -270,23 +242,10 @@ @pool.prepare solver = @pool.create_solver( ) solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - - solver.each_decision do |d| - puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool) if d.rule})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end + + def test_obsoletes installed = @pool.create_repo( 'installed' ) solv1 = installed.create_solvable( 'A', '1.0-0' ) @@ -308,23 +267,10 @@ @pool.prepare solver = @pool.create_solver( ) solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - - solver.each_decision do |d| - puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool) if d.rule})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end + + def test_indirect_removal solv1 = @repo.create_solvable( 'A', '1.0-0' ) assert solv1 @@ -348,21 +294,7 @@ solver = @pool.create_solver( ) solver.allow_uninstall = true solver.solve( transaction ) - solver.each_to_install { |s| - puts "Install #{s}" - } - solver.each_to_remove { |s| - puts "Remove #{s}" - } - solver.each_decision do |d| - puts "Decision: #{d.solvable}: #{d.op_s} (#{d.rule.to_dep(@pool)})" - e = solver.explain( transaction, d) - pis = pi_s e.shift - rel = e.shift - src = e.shift - tgt = e.shift - puts "\t [#{src} #{pis} #{rel}: #{tgt}]" - end + explain solver, transaction end end -- To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org For additional commands, e-mail: zypp-commit+help@opensuse.org