examples
authorDuncan Mac-Vicar P <dmacvicar@suse.de>
Fri, 26 Oct 2007 13:57:21 +0000 (13:57 +0000)
committerDuncan Mac-Vicar P <dmacvicar@suse.de>
Fri, 26 Oct 2007 13:57:21 +0000 (13:57 +0000)
examples/ruby/basic.rb [new file with mode: 0644]
examples/ruby/yps.rb [new file with mode: 0644]

diff --git a/examples/ruby/basic.rb b/examples/ruby/basic.rb
new file mode 100644 (file)
index 0000000..baf807e
--- /dev/null
@@ -0,0 +1,49 @@
+require 'satsolver'
+
+include Satsolver
+
+pool = Pool.new
+#puts pool.methods.sort
+
+#s = pool.add_empty_source
+
+f = File.open('../../testsuite/data.libzypp/basic-exercises/exercise-20-packages.solv', 'r')
+s = pool.add_source_solv(f, 'foo')
+
+f = File.open('../../testsuite/data.libzypp/basic-exercises/exercise-20-system.solv', 'r')
+installed = pool.add_source_solv(f, 'system')
+
+pool.each_source do |repo|
+  puts repo.name
+end
+
+s.each_solvable do |r|
+  puts "#{r.name}"
+end
+
+q = Queue.new
+puts q.empty?
+
+r = pool.select_solvable(s, 'gnome-desktop')
+puts r.name
+
+# push one command and one resolvable to the queue
+q.push(SOLVER_INSTALL_SOLVABLE)
+q.push(r)
+
+pool.prepare
+pool.promoteepoch = true
+
+# no packages installed so use add_empty_source
+solv = Solver.new(pool, installed)
+
+solv.fixsystem = 0
+solv.updatesystem = 0
+solv.allowdowngrade = 0
+solv.allowuninstall = 0
+solv.noupdateprovide = 0
+
+# solve the queue
+solv.solve(q)
+
+solv.print_decisions
\ No newline at end of file
diff --git a/examples/ruby/yps.rb b/examples/ruby/yps.rb
new file mode 100644 (file)
index 0000000..bc2cbbe
--- /dev/null
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+require 'satsolver'
+include Satsolver
+
+def select_solvable(pool, source, name)
+  Id id;
+  Queue plist;
+  int i, end;
+  Solvable *s;
+
+  id = str2id(pool, name, 1)
+  queueinit(plist);
+  i = source ? source.start : 1
+  tend = source ? source.start + source.nsolvables : pool.nsolvables
+  for ( i in i..tend)
+    s = pool.solvables + i
+    next if not pool_installable(pool, s)
+    queuepush(plist, i) if (s.name == id)
+  end
+
+  prune_best_version_arch(pool, plist);
+
+  if (plist.count == 0)
+    puts("unknown package '#{name}'")
+    exit(1);
+  end
+
+  id = plist.elements[0];
+  queuefree(&plist);
+
+  return pool.solvables + id;
+end
+
+
+//-----------------------------------------------
+
+int
+main(int argc, char **argv)
+{
+  Pool *pool;   // available packages (multiple repos)
+  FILE *fp;
+  Source *system; // installed packages (single repo, aka 'Source')
+  Solvable *xs;
+  Solver *solv;
+  Source *channel;
+  Queue job;
+  Id id;
+  int erase = 0;
+
+  pool = pool_create();
+  pool_setarch(pool, "i686");
+  pool->verbose = 1;
+  queueinit(&job);
+
+  if (argc < 3)
+    {
+      fprintf(stderr, "Usage:\n  yps <system> <source> [ ... <source>] <name>\n");
+      fprintf(stderr, "    to install a package <name>\n");
+      fprintf(stderr, "\n  yps -e <system> <name>\n");
+      fprintf(stderr, "    to erase a package <name>\n");
+      exit(0);
+    }
+
+  // '-e' ?
+
+  if (argc > 1 && !strcmp(argv[1], "-e"))
+    {
+      erase = 1;
+      argc--;
+      argv++;
+    }
+
+  // Load system file (installed packages)
+
+  if ((fp = fopen(argv[1], "r")) == NULL)
+    {
+      perror(argv[1]);
+      exit(1);
+    }
+  system = pool_addsource_solv(pool, fp, "system");
+  channel = 0;
+  fclose(fp);
+
+  // Load further repo files (available packages)
+
+  argc--;
+  argv++;
+  while (argc > 2)           /* all but last arg are sources */
+    {
+      if ((fp = fopen(argv[1], "r")) == 0)
+  {
+    perror(argv[1]);
+    exit(1);
+  }
+      channel = pool_addsource_solv(pool, fp, argv[1]);
+      fclose(fp);
+      argv++;
+      argc--;
+    }
+
+  // setup job queue
+  if (!argv[1][0])
+    ;
+  else if (!erase)
+    {
+      xs = select_solvable(pool, channel, argv[1]);
+      queuepush(&job, SOLVER_INSTALL_SOLVABLE);
+      queuepush(&job, xs - pool->solvables);
+    }
+  else
+    {
+      id = str2id(pool, argv[1], 1);
+      queuepush(&job, SOLVER_ERASE_SOLVABLE_NAME);
+      queuepush(&job, id);
+    }
+
+  pool_prepare(pool);
+
+  pool->promoteepoch = 1;
+
+  // start solving
+
+  solv = solver_create(pool, system);
+
+  solv->fixsystem = 0;
+  solv->updatesystem = 0;
+  solv->allowdowngrade = 0;
+  solv->allowuninstall = 0;
+  solv->noupdateprovide = 0;
+
+  // Solve !
+
+  solve(solv, &job);
+
+  // clean up
+
+  queuefree(&job);
+  solver_free(solv);
+  pool_free(pool);
+
+  exit(0);
+}
+
+// EOF