This patch adds installs(), updates() and removes() methods to the Python
interface for the Solver.
Signed-off-by: Jan Blunck
---
bindings/python/tests/solvable.py | 24 +++++++----
bindings/solver.i | 80 +++++++++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+), 8 deletions(-)
diff --git a/bindings/python/tests/solvable.py b/bindings/python/tests/solvable.py
index 7c53659..720bfd2 100644
--- a/bindings/python/tests/solvable.py
+++ b/bindings/python/tests/solvable.py
@@ -75,17 +75,25 @@ class TestSequenceFunctions(unittest.TestCase):
transaction = self.pool.create_transaction()
transaction.install( solv1 )
-
+
+ system = self.pool.create_repo( '@system' )
+ self.pool.set_installed(system)
+ solv3 = system.create_solvable( 'two', '1.0-0', 'noarch' )
+ solv4 = system.create_solvable( 'three', '1.0-0', 'noarch' )
+ rel = satsolver.Relation( self.pool, 'two', satsolver.REL_EQ, '1.0-0' )
+ solv4.requires().add(rel)
+
solver = self.pool.create_solver()
-# self.pool.debug = 255
+ solver.set_allow_uninstall(True)
res = solver.solve( transaction )
assert res.__class__.__name__ == 'bool', res.__class__.__name__
-# solver.each_to_install { |s|
-# puts "Install #{s}"
-# }
-# solver.each_to_remove { |s|
-# puts "Remove #{s}"
-# }
+ assert res == True, res
+ for s in solver.installs():
+ assert s.name() == "one", s
+ for s in solver.updates():
+ assert s.name() == "two", s
+ for s in solver.removes():
+ assert s.name() == "three", s
if __name__ == '__main__':
diff --git a/bindings/solver.i b/bindings/solver.i
index ea9c3c3..3bc9748 100644
--- a/bindings/solver.i
+++ b/bindings/solver.i
@@ -985,5 +985,85 @@ typedef struct solver {} Solver;
return res;
}
#endif
+#if defined(SWIGPYTHON)
+ XSolvable **installs() {
+ Pool *pool = $self->pool;
+ Repo *installed = $self->installed;
+ int count = $self->decisionq.count;
+ Solvable *s;
+ Id p, *obsoletesmap = solver_create_decisions_obsoletesmap($self);
+ int i, j = 0;
+ XSolvable **xs = (XSolvable **) malloc((count + 1) * sizeof(XSolvable **));
+
+ for (i = 0; i < $self->decisionq.count; i++) {
+ p = $self->decisionq.elements[i];
+ if (p < 0)
+ continue;
+ if (p == SYSTEMSOLVABLE)
+ continue;
+ s = pool->solvables + p;
+ if (installed && s->repo == installed)
+ continue;
+ if (obsoletesmap[p])
+ continue;
+ xs[j] = xsolvable_new(pool, p);
+ ++j;
+ }
+ xs[j] = NULL;
+ sat_free(obsoletesmap);
+ return xs;
+ }
+
+ XSolvable **updates() {
+ Pool *pool = $self->pool;
+ Repo *installed = $self->installed;
+ int count = $self->decisionq.count;
+ Solvable *s;
+ Id p, *obsoletesmap = solver_create_decisions_obsoletesmap($self);
+ int i, j = 0;
+ XSolvable **xs = (XSolvable **) malloc((count + 1) * sizeof(XSolvable **));
+
+ for (i = 0; i < $self->decisionq.count; i++) {
+ p = $self->decisionq.elements[i];
+ if (p < 0)
+ continue;
+ if (p == SYSTEMSOLVABLE)
+ continue;
+ s = pool->solvables + p;
+ if (installed && s->repo == installed)
+ continue;
+ if (!obsoletesmap[p])
+ continue;
+ xs[j] = xsolvable_new(pool, p);
+ ++j;
+ }
+ xs[j] = NULL;
+ sat_free(obsoletesmap);
+ return xs;
+ }
+ XSolvable **removes() {
+ Pool *pool = $self->pool;
+ Repo *installed = $self->installed;
+ int count = installed ? installed->nsolvables : 0;
+ Solvable *s;
+ Id p, *obsoletesmap = solver_create_decisions_obsoletesmap($self);
+ int j = 0;
+ XSolvable **xs = (XSolvable **) malloc((count + 1) * sizeof(XSolvable **));
+
+ if (installed) {
+ FOR_REPO_SOLVABLES(installed, p, s) {
+ if ($self->decisionmap[p] > 0)
+ continue;
+ if (obsoletesmap[p])
+ continue;
+ xs[j] = xsolvable_new(pool, p);
+ ++j;
+ }
+ }
+ xs[j] = NULL;
+ sat_free(obsoletesmap);
+ return xs;
+ }
+#endif
};
--
1.6.1.3
--
To unsubscribe, e-mail: zypp-devel+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-devel+help@opensuse.org