Introduce perl-BSSolv module to analyse the package's reverse dependency
authory0169.zhang <y0169.zhang@samsung.com>
Thu, 25 Jan 2018 11:00:19 +0000 (19:00 +0800)
committery0169.zhang <y0169.zhang@samsung.com>
Mon, 29 Jan 2018 08:33:32 +0000 (16:33 +0800)
Use the function 'depsort' in perl-BSSolv to get the sorted packages
and traverse the sorted packages to output each package's reverse dependency

Change-Id: I196ad5181ff0f471067087d48d078d3603dd7189

debian/control
depanneur
packaging/depanneur.spec

index 424e860..c29cb07 100644 (file)
@@ -15,7 +15,8 @@ Depends: ${perl:Depends},
  libjson-perl,
  libconfig-tiny-perl,
  libhtml-template-perl,
- libparallel-forkmanager-perl
+ libparallel-forkmanager-perl,
+ perl-bssolv
 Description: Manages and executes the builds using the obs-build script.
   The depanneur tool goes through local Git trees and evaluates packaging
   meta-data to determine packages needed and the build order; it then starts
index fe49fe1..6cb4c16 100755 (executable)
--- a/depanneur
+++ b/depanneur
@@ -72,6 +72,7 @@ use Pod::Usage;
 use File::Temp qw/ tempfile tempdir /;
 use Build;
 use Build::Rpm;
+use BSSolv;
 use Data::Dumper;
 use File::Basename;
 
@@ -185,6 +186,8 @@ my $vmkernel = "";
 my $vmswapsize = "";
 my $disable_debuginfo = 0;#disable debuginfo when using build cmd
 my $depends = 0; #depends subcommand to put reverse dependency
+my $reverse_off = 0; #disable reverse dependency
+my $reverse_on = 1; #enable reverse dependency
 
 GetOptions (
     "repository=s" => \@repos,
@@ -1174,7 +1177,7 @@ sub refresh_repo {
 # to the whole package-depends
 #---------------------------------------------------------------------
 sub expand_deps {
-    my $spec = shift;
+    my ($spec, $rev_flag) = @_;
     my ($packname, $packvers, $subpacks, @packdeps);
     $subpacks = [];
 
@@ -1193,9 +1196,11 @@ sub expand_deps {
       $packvers = $d->{'version'};
       $subpacks = $d->{'subpacks'};
       @packdeps = @{$d->{'deps'} || []};
-      if ($d->{'prereqs'}) {
-        my %deps = map {$_ => 1} (@packdeps, @{$d->{'subpacks'} || []});
-        push @packdeps, grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
+      if ($rev_flag == $reverse_off) {
+          if ($d->{'prereqs'}) {
+            my %deps = map {$_ => 1} (@packdeps, @{$d->{'subpacks'} || []});
+            push @packdeps, grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
+          }
       }
     }
 
@@ -1484,6 +1489,7 @@ sub get_top_order {
 #---------------------------------------------------------------------
 sub update_pkgdeps
 {
+    my $rev_flag = shift;
     %tmp_expansion_errors = ();
     foreach my $name (keys %to_build) {
         #skip package which has been processed
@@ -1495,7 +1501,7 @@ sub update_pkgdeps
         if(! (grep $_ eq $name, @skipped)) {
             my $fn = $to_build{$name}->{filename};
             debug("Checking dependencies for $name");
-            my @bdeps = expand_deps($fn);
+            my @bdeps = expand_deps($fn, $rev_flag);
             if (!shift @bdeps ) {
                 #first value means if package has
                 #expansion error and ignore it
@@ -1609,7 +1615,7 @@ sub update_expansion_errors {
     foreach my $name (%tmp_expansion_errors) {
         next if(! defined($to_build{$name}) );
         my $fn = $to_build{$name}->{filename};
-        my @bdeps = expand_deps($fn);
+        my @bdeps = expand_deps($fn, $reverse_off);
         if (!shift @bdeps ) {
                 $new_expansion_errors{$name} = [@bdeps];
         }
@@ -2357,6 +2363,33 @@ sub get_binary_list() {
     return @bins;
 }
 
+sub update_pkgrdeps {
+    my @packs;
+    my %pdeps;
+    %pkgrdeps = ();
+
+    foreach my $p (keys %to_build) {
+           push @packs, $p;
+            $pdeps{$p} = \@{$pkgdeps{$p}};
+    }
+    @packs = BSSolv::depsort(\%pdeps, undef, undef, @packs);
+
+    my %notready;
+    foreach my $pkid (keys %to_build) {
+        %notready = ();
+        $notready{$pkid} = 1;
+        for my $p (@packs) {
+            my @blocked = grep {$notready{$_}} @{$pkgdeps{$p}};
+            if (@blocked) {
+                push @{$pkgrdeps{$pkid}}, $p;
+                $notready{$p} = 1;
+            }
+        }
+        my %uniq_deps = map {$_,1} @{$pkgrdeps{$pkid}};
+        $pkgrdeps{$pkid} = [keys(%uniq_deps)];
+    }
+}
+
 sub generate_depends() {
     ($_, $start_time) = my_system("date +\"%Y-%m-%d %H:%M %z\"");
     ($_, $gbs_version) = my_system("gbs -V");
@@ -2372,13 +2405,13 @@ sub generate_depends() {
         }
         foreach my $p (@pre_packs) {
             my $specs = $p->{"filename"};
+            my @spec_list = split(",", $specs);
+            foreach my $spec (@spec_list) {
             my $new_p;
             $new_p->{"project_base_path"} = $p->{"project_base_path"};
             $new_p->{"packaging_dir"} = $p->{"packaging_dir"};
             $new_p->{"upstream_branch"} = $p->{"upstream_branch"};
             $new_p->{"upstream_tag"} = $p->{"upstream_tag"};
-            my @spec_list = split(",", $specs);
-            foreach my $spec (@spec_list) {
                 $new_p->{"filename"} = $spec;
                 push @packs, $new_p;
             }
@@ -2423,18 +2456,18 @@ sub generate_depends() {
     my %packs = parse_packs($config, @packs);
     %to_build = %packs;
 
+    if (scalar (keys %to_build) == 0) {
+        warning("no available packages to generate depends.");
+        return;
+    }
+
     # Create & Update package dependency
     info("building repo metadata ...");
     refresh_repo();
 
     info("package dependency resolving ...");
-    update_pkgdeps();
-    update_pkgddeps();
-
-    if (scalar (keys %to_build) == 0) {
-        warning("no available packages to generate depends.");
-        return;
-    }
+    update_pkgdeps($reverse_on);
+    update_pkgrdeps();
 
     my $out = "$depends_dir/$dist/$arch/";
     mkdir_p($out);
@@ -2616,7 +2649,7 @@ if ($noinit == 0 && $incremental == 0) {
 }
 
 info("package dependency resolving ...");
-update_pkgdeps();
+update_pkgdeps($reverse_off);
 update_pkgddeps();
 
 my @bins = get_binary_list();
@@ -2658,7 +2691,7 @@ if (@bins) {
         resolve_skipped_packages();
     }
     $get_order = 0;
-    update_pkgdeps();
+    update_pkgdeps($reverse_off);
     update_pkgddeps();
 }
 
index 708dd40..9281da1 100644 (file)
@@ -13,6 +13,7 @@ Requires:       perl(HTML::Template)
 Requires:       perl(Config::Tiny)
 Requires:       tizen-build >= 20171013
 Requires:       libparallel-forkmanager-perl
+Requires:       perl(BSSolv)
 %if 0%{?centos_ver} == 7 || 0%{?suse_version} == 1315
 
 %else