- hide solver internals
[platform/upstream/libsolv.git] / examples / p5solv
index 2519d2d..bf3dd67 100755 (executable)
@@ -3,7 +3,6 @@
 use POSIX;
 use Fcntl;
 use Config::IniFiles;
-use File::FnMatch;
 use Data::Dumper;
 use solv;
 use Devel::Peek;
@@ -95,16 +94,16 @@ sub download {
   if ($chksum) {
     my $fchksum = solv::Chksum->new($chksum->{'type'});
     $fchksum->add_fd(fileno($f));
-    if (!$fchksum->matches($chksum)) {
+    if ($fchksum != $chksum) {
       print "$file: checksum error\n";
       $self->{'incomplete'} = 1 if $markincomplete;
       return undef;
     }
   }
   if ($uncompress) {
-    return solv::xfopen_fd($file, POSIX::dup(fileno($f)));
+    return solv::xfopen_dup($file, fileno($f));
   } else {
-    return solv::xfopen_fd('', POSIX::dup(fileno($f)));
+    return solv::xfopen_dup(undef, fileno($f));
   }
 }
 
@@ -124,14 +123,14 @@ sub usecachedrepo {
       return undef if sysread($f, $fextcookie, 32) != 32;
     }
     sysseek($f, 0, Fcntl::SEEK_SET);
-    $f = solv::xfopen_fd('', POSIX::dup(fileno($f)));
+    my $fd = solv::xfopen_dup(undef, fileno($f));
     my $flags = $ext ? $solv::Repo::REPO_USE_LOADING|$solv::Repo::REPO_EXTEND_SOLVABLES : 0;
     $flags |= $solv::Repo::REPO_LOCALPOOL if $ext && $ext ne 'DL';
-    if (!$self->{'handle'}->add_solv($f, $flags)) {
-      solv::xfclose($f);
+    if (!$self->{'handle'}->add_solv($fd, $flags)) {
+      solv::xfclose($fd);
       return undef;
     }
-    solv::xfclose($f);
+    solv::xfclose($fd);
     $self->{'cookie'} = $fcookie unless $ext;
     $self->{'extcookie'} = $fextcookie if $fextcookie;
     utime undef, undef, $f if $mark;
@@ -162,7 +161,7 @@ sub writecachedrepo {
   };
   return unless $f;
   chmod 0444, $f;
-  my $ff = solv::xfopen_fd('', POSIX::dup(fileno($f)));
+  my $ff = solv::xfopen_dup(undef, fileno($f));
   if (!$info) {
     $self->{'handle'}->write($ff);
   } elsif ($ext) {
@@ -373,7 +372,7 @@ sub add_exts {
   my $di = $self->{'handle'}->Dataiterator($solv::SOLVID_META, $solv::SUSETAGS_FILE_NAME, undef, 0);
   $di->prepend_keyname($solv::SUSETAGS_FILE);
   for my $d (@$di) {
-    my $filename = $d->match_str();
+    my $filename = $d->str();
     next unless $filename && $filename =~ /^packages\.(..)(?:\..*)$/;
     next if $1 eq 'en' || $1 eq 'gz';
     $self->add_ext($repodata, $filename, $1);
@@ -479,6 +478,7 @@ sub load {
   print "reading\n";
   $self->{'handle'}->add_products("/etc/products.d", $solv::Repo::REPO_NO_INTERNALIZE);
   $self->{'handle'}->add_rpmdb(undef, $solv::Repo::REPO_REUSE_REPODATA);
+  $self->writecachedrepo();
   return 1;
 }
 
@@ -496,7 +496,7 @@ sub depglob {
   my $id = $pool->str2id($name, 0);
   if ($id) {
     my $match;
-    for my $s ($pool->providers($id)) {
+    for my $s ($pool->whatprovides($id)) {
       return $pool->Job($solv::Job::SOLVER_SOLVABLE_NAME, $id) if $globname && $s->{'nameid'} == $id;
       $match = 1;
     }
@@ -728,9 +728,9 @@ if ($cmd eq 'list' || $cmd eq 'info') {
 
 if ($cmd eq 'install' || $cmd eq 'erase' || $cmd eq 'up' || $cmd eq 'dup' || $cmd eq 'verify') {
   if (!@jobs) {
-    if ($cmd eq 'up' || $cmd eq 'verify') {
+    if ($cmd eq 'up' || $cmd eq 'verify' || $cmd eq 'dup') {
       push @jobs, $pool->Job($solv::Job::SOLVER_SOLVABLE_ALL, 0);
-    } elsif ($cmd ne 'dup') {
+    } else {
       die("no package matched.\n");
     }
   }
@@ -754,17 +754,15 @@ if ($cmd eq 'install' || $cmd eq 'erase' || $cmd eq 'up' || $cmd eq 'dup' || $cm
   my $solver;
   while (1) {
     $solver = $pool->Solver();
-    $solver->{'ignorealreadyrecommended'} = 1;
-    $solver->{'allowuninstall'} = 1 if $cmd eq 'erase';
-    if ($cmd eq 'dup' && !@jobs) {
-      $solver->{'distupgrade'} = 1;
-      $solver->{'updatesystem'} = 1;
-      $solver->{'allowdowngrade'} = 1;
-      $solver->{'allowvendorchange'} = 1;
-      $solver->{'allowarchchange'} = 1;
-      $solver->{'dosplitprovides'} = 1;
-    } elsif ($cmd eq 'up' and @jobs == 1 and $jobs[0]->{'how'} == ($solv::Job::SOLVER_UPDATE | $solv::Job::SOLVER_SOLVABLE_ALL)) {
-      $solver->{'dosplitprovides'} = 1;
+    $solver->set_flag($solv::Solver::SOLVER_FLAG_IGNORE_ALREADY_RECOMMENDED, 1);
+    $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_UNINSTALL, 1) if $cmd eq 'erase';
+    if ($cmd eq 'dup' && @jobs == 1 $jobs[0]->{'how'} == ($solv::Job::SOLVER_DISTUPGRADE | $solv::Job::SOLVER_SOLVABLE_ALL)) {
+      $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_DOWNGRADE, 1);
+      $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_VENDERCHANGE, 1);
+      $solver->set_flag($solv::Solver::SOLVER_FLAG_ALLOW_ARCHCHANGE, 1);
+      $solver->set_flag($solv::Solver::SOLVER_FLAG_SPLITPROVIDES, 1);
+    } elsif ($cmd eq 'up' && @jobs == 1 && $jobs[0]->{'how'} == ($solv::Job::SOLVER_UPDATE | $solv::Job::SOLVER_SOLVABLE_ALL)) {
+      $solver->set_flag($solv::Solver::SOLVER_FLAG_SPLITPROVIDES, 1);
     }
     my @problems = $solver->solve(\@jobs);
     last unless @problems;
@@ -800,6 +798,7 @@ if ($cmd eq 'install' || $cmd eq 'erase' || $cmd eq 'up' || $cmd eq 'dup' || $cm
            print "  - allow something else\n";
          }
         }
+        print "\n";
       }
       my $sol;
       while (1) {
@@ -817,7 +816,7 @@ if ($cmd eq 'install' || $cmd eq 'erase' || $cmd eq 'up' || $cmd eq 'dup' || $cm
          $jobs[$element->{'jobidx'}] = $pool->Job($solv::Job::SOLVER_NOOP, 0);
         } else {
          my $newjob = $element->Job();
-         push @jobs, $newjob if $newjob && !grep {$_->{'how'} == $newjob->{'how'} && $_->{'what'} == $newjob->{'what'}} @jobs;
+         push @jobs, $newjob if $newjob && !grep {$_ == $newjob} @jobs;
        }
       }
     }