Support "Recommends" RPM dependencies
authorMyungJoo Ham <myungjoo.ham@samsung.com>
Fri, 28 Oct 2016 01:11:57 +0000 (10:11 +0900)
committeryang.zhang <y0169.zhang@samsung.com>
Tue, 7 Mar 2017 05:42:27 +0000 (13:42 +0800)
This requires updates of obs-build (for GBS/OBS):
https://github.com/openSUSE/obs-build/pull/303

and Perl-BSSolv (for OBS):
https://github.com/openSUSE/perl-BSSolv/pull/7

and RPM > 4.12.0 or "Recommends" backported (for OBS/GBS):
https://review.tizen.org/gerrit/#/c/93958/

The issue that we are trying to resolve with these is:
https://github.com/openSUSE/obs-build/issues/302

Change-Id: I579f402a3502c57ca3b2cacfc12a5a3a975aac34
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
depanneur

index d2cb438..3acc2f5 100755 (executable)
--- a/depanneur
+++ b/depanneur
@@ -957,7 +957,8 @@ sub refresh_repo {
     # %fn name => package.rpm
     # %prov name => provides
     # %req  name => requires
-    my (%fn, %prov, %req);
+    # %rec  name => recommends
+    my (%fn, %prov, %req, %rec);
     my %exportfilters = %{$config->{'exportfilter'}};
     my %packs;
     # package id
@@ -971,8 +972,9 @@ sub refresh_repo {
     # F:acl.i586-1373460453/1373460459/0: http://.../packages/i586/acl-2.2.49-2.1.i586.rpm
     # P:acl.i586-1373460453/1373460459/0: acl = 2.2.49-2.1 acl(x86-32) = 2.2.49-2.1
     # R:acl.i586-1373460453/1373460459/0: libattr.so.1 libacl.so.1 libc.so.6(GLIBC_2.1)
+    # r:acl.i586-1373460453/1373460459/0: libattr.so.1
     # I:acl.i586-1373460453/1373460459/0: acl-2.2.49-2.1 1373460453
-    my ($pkgF, $pkgP, $pkgR);
+    my ($pkgF, $pkgP, $pkgR, $pkgr);
     while(<$fh>) {
       chomp;
       if (/^F:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
@@ -1005,6 +1007,11 @@ sub refresh_repo {
         $pkgR = $2;
         next if $req{$1};
         $req{$1} = $2;
+      } elsif (/^r:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+        # get package name and its recommends
+        $pkgr = $2;
+        next if $rec{$1};
+        $rec{$1} = $2;
       } elsif (/^I:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
         my $r = 0;
         if ($use_higher_deps == 1) {
@@ -1050,7 +1057,7 @@ sub refresh_repo {
     #get provides list and requres list of every packages
     for my $pack (keys %packs) {
       my $r = {};
-      my (@s, $s, @pr, @re);
+      my (@s, $s, @pr, @re, @rec);
       @s = split(' ', $prov{$packs{$pack}} || '');
       while (@s) {
         $s = shift @s;
@@ -1073,8 +1080,20 @@ sub refresh_repo {
         push @re, $s;
         splice(@s, 0, 2) if @s && $s[0] =~ /^[<=>]/;
       }
+      @s = split(' ', $rec{$packs{$pack}} || '');
+      while (@s) {
+       $s = shift @s;
+       next if !$dofileprovides && $s =~ /^\//;
+       if ($s =~ /^rpmlib\(/) {
+         splice(@s, 0, 2);
+         next;
+       }
+       push @rec, $s;
+       splice(@s, 0, 2) if @s && $s[0] =~ /^[<=>]/;
+      }
       $r->{'provides'} = \@pr;
       $r->{'requires'} = \@re;
+      $r->{'recommends'} = \@rec;
       $repo{$pack} = $r;
     }