From: Jun Wang Date: Mon, 29 Jan 2018 10:50:07 +0000 (+0800) Subject: Introduce perl-BSSolv module to analyse the package's reverse dependency X-Git-Tag: submit/devel/20190730.074511~20 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=76cd1893a1e99740781bb3a24bc92bd1169f8b32;p=tools%2Fdepanneur.git Introduce perl-BSSolv module to analyse the package's reverse dependency 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: If402232e849a8057446590de0766e1ce4e77cf09 Signed-off-by: Jun Wang --- diff --git a/debian/control b/debian/control index 91a07da..202c610 100644 --- a/debian/control +++ b/debian/control @@ -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 diff --git a/depanneur b/depanneur index fe49fe1..6cb4c16 100755 --- 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(); } diff --git a/packaging/depanneur.spec b/packaging/depanneur.spec index f55199d..9dfc1f7 100644 --- a/packaging/depanneur.spec +++ b/packaging/depanneur.spec @@ -13,6 +13,7 @@ Requires: perl(HTML::Template) Requires: perl(Config::Tiny) Requires: tizen-build >= 20171013 Requires: libparallel-forkmanager-perl +Requires: perl(BSSolv) %ifarch x86_64 Requires: tizen-build-initvm-x86_64 >= 20171013 %endif