From 215f63197551b15f4c35e6dcf22f34bb1e3c8d3f Mon Sep 17 00:00:00 2001 From: "shuai.fu" Date: Thu, 1 Jun 2017 14:05:05 +0800 Subject: [PATCH] Add alldependson obs-api Change-Id: Ic728a69d1b832a9a65eab6b67be9899c47869374 Signed-off-by: shuai.fu --- src/api/app/controllers/build_controller.rb | 9 +++ src/api/config/routes.rb | 2 + src/backend/bs_repserver | 98 +++++++++++++++++++++++++++++ src/backend/bs_sched | 1 + src/backend/bs_srcserver | 13 ++++ 5 files changed, 123 insertions(+) diff --git a/src/api/app/controllers/build_controller.rb b/src/api/app/controllers/build_controller.rb index c1b4f30..b0a086b 100644 --- a/src/api/app/controllers/build_controller.rb +++ b/src/api/app/controllers/build_controller.rb @@ -140,6 +140,15 @@ class BuildController < ApplicationController pass_to_backend end + def allbuilddepinfo + valid_http_methods :get + required_parameters :project, :repository, :arch + + # just for permission checking + Project.get_by_name params[:project] + + pass_to_backend + end # /build/:project/:repository/:arch/:package/:filename def file valid_http_methods :get, :put, :delete diff --git a/src/api/config/routes.rb b/src/api/config/routes.rb index 98e158c..593f080 100644 --- a/src/api/config/routes.rb +++ b/src/api/config/routes.rb @@ -236,6 +236,8 @@ OBSApi::Application.routes.draw do :constraints => cons match 'build/:project/:repository/:arch/_builddepinfo' => 'build#builddepinfo', :constraints => cons + match 'build/:project/:repository/:arch/_allbuilddepinfo' => 'build#allbuilddepinfo', + :constraints => cons match 'build/:project/:repository/:arch/:package' => 'build#index', :constraints => cons match 'build/:project/:repository/_buildconfig' => 'build#index', :constraints => cons match 'build/:project/:repository/:arch' => 'build#index', :constraints => cons diff --git a/src/backend/bs_repserver b/src/backend/bs_repserver index e0cf283..04bb605 100755 --- a/src/backend/bs_repserver +++ b/src/backend/bs_repserver @@ -2771,6 +2771,103 @@ sub getbuildinfo_post { return @r; } +sub sortpacks { + my ($depsp, $mapp, $cycp, @packs) = @_; + + return @packs if @packs < 2; + my @cycs; + @packs = BSSolv::depsort($depsp, $mapp, \@cycs, @packs); + if (@cycs) { + @$cycp = @cycs if $cycp; + print "cycle: ".join(' -> ', @$_)."\n" for @cycs; + } + return @packs; +} + + +sub getallbuilddepinfo { + my ($cgi, $projid, $repoid, $arch) = @_; + my %packids = map {$_ => 1} @{$cgi->{'package'} || []}; + my $view = $cgi->{'view'} || ''; + my $depends = BSUtil::retrieve("$reporoot/$projid/$repoid/$arch/:depends", 1); + return ({'package' => []}, $BSXML::builddepinfo) unless $depends; + my $subpacks = $depends->{'subpacks'} || {}; + my $pkgdeps = $depends->{'pkgdeps'} || {}; + my $pkg2src = $depends->{'pkg2src'} || {}; + my $dep2src = $depends->{'dep2src'} || {}; + my %subpack2pack; + my %notready; + if ($view eq 'pkgnames' || $view eq 'revpkgnames') { + for my $packid (sort keys %$pkg2src) { + my $n = $pkg2src->{$packid} || $packid; + if ($subpacks->{$n} && @{$subpacks->{$n}}) { + push @{$subpack2pack{$_}}, $packid for @{$subpacks->{$n}}; + } else { + push @{$subpack2pack{$n}}, $packid; + } + } + + if ($view eq 'revpkgnames') { + my %rdeps; + my @packs; + my @cycles; + my %pdeps; + + for my $p (sort keys %$pkg2src){ + push @packs,$p; + $pdeps{$p} = \@{$pkgdeps->{$p}}; + } + + @packs = sortpacks(\%pdeps, \$dep2src, \@cycles, @packs); + + for my $pkid (@{$cgi->{'package'}}) + { + $notready{$pkid} = 1; + for my $p (@packs) + { + my @blocked = grep {$notready{$dep2src->{$_}}} @{$pkgdeps->{$p}}; + if(@blocked) + { + + push @{$rdeps{$pkid}}, $p; + $notready{$p} = 1; + } + + @blocked = (); + + } + } + $pkgdeps = \%rdeps; + } + } + my @res; + for my $packid (sort keys %$pkg2src) { + next if %packids && !$packids{$packid}; + my $n = $pkg2src->{$packid}; + my @sp = sort @{$subpacks->{$n} || []}; + push @sp, $n unless @sp; + if ($n ne $sp[0] && (grep {$_ eq $n} @sp)) { + @sp = grep {$_ ne $n} @sp; + unshift @sp, $n; + } + my $deps = $pkgdeps->{$packid} || []; + $deps = [ map {@{$subpack2pack{$_} || []}} @$deps ] if $view eq 'pkgnames'; + $deps = [ sort(unify(@$deps)) ] if $view eq 'pkgnames' || $view eq 'revpkgnames'; + push @res, {'name' => $packid, + 'source' => $n, + 'pkgdep' => $deps, + 'subpkg' => \@sp, + }; + } + my @cycles = map {{'package' => $_}} @{$depends->{'cycles'} || []}; + my $res = { 'package' => \@res, }; + $res->{'cycle'} = \@cycles if @cycles; + return ($res, $BSXML::builddepinfo); +} + + + + sub getbuilddepinfo { my ($cgi, $projid, $repoid, $arch) = @_; my %packids = map {$_ => 1} @{$cgi->{'package'} || []}; @@ -3419,6 +3516,7 @@ my $dispatches = [ 'POST:/build/$project/$repository/$arch/_repository match:' => \&postrepo, '/build/$project/$repository/$arch/_builddepinfo package* view:?' => \&getbuilddepinfo, + '/build/$project/$repository/$arch/_allbuilddepinfo package* view:?' => \&getallbuilddepinfo, '/build/$project/$repository/$arch/_jobhistory package* code:* limit:num?' => \&getjobhistory, 'POST:/build/$project/$repository/$arch/_relsync' => \&postrelsync, '/build/$project/$repository/$arch/_relsync' => \&getrelsync, diff --git a/src/backend/bs_sched b/src/backend/bs_sched index 1f76f2a..da6d420 100755 --- a/src/backend/bs_sched +++ b/src/backend/bs_sched @@ -7431,6 +7431,7 @@ NEXTPRP: 'subpacks' => \%prunedsubpacks, 'pkg2src' => \%pkg2src, 'cycles' => \@cycles, + 'dep2src' => \%dep2src, }); %prunedsubpacks = (); # remove old entries again diff --git a/src/backend/bs_srcserver b/src/backend/bs_srcserver index f40063f..5d9045c 100755 --- a/src/backend/bs_srcserver +++ b/src/backend/bs_srcserver @@ -5550,6 +5550,18 @@ sub getbuilddepinfo { return ($res, $BSXML::builddepinfo); } +sub getallbuilddepinfo { + my ($cgi, $projid, $repoid, $arch) = @_; + + checkprojrepoarch($projid, $repoid, $arch); + my @args; + push @args, map {"package=$_"} @{$cgi->{'package'} || []}; + push @args, "view=$cgi->{'view'}" if $cgi->{'view'}; + my $res = BSWatcher::rpc("$BSConfig::reposerver/build/$projid/$repoid/$arch/_allbuilddepinfo", $BSXML::builddepinfo, @args); + return ($res, $BSXML::builddepinfo); +} + + sub getjobhistory { my ($cgi, $projid, $repoid, $arch) = @_; @@ -7629,6 +7641,7 @@ my $dispatches = [ '/build/$project/$repository/_buildconfig path:prp*' => \&getbuildconfig, '/build/$project/$repository/$arch package* view:?' => \&getpackagelist_build, '/build/$project/$repository/$arch/_builddepinfo package* view:?' => \&getbuilddepinfo, + '/build/$project/$repository/$arch/_allbuilddepinfo package* view:?' => \&getallbuilddepinfo, '/build/$project/$repository/$arch/_jobhistory package* code:* limit:num?' => \&getjobhistory, 'POST:/build/$project/$repository/$arch/_repository match:' => \&postrepo, 'POST:/build/$project/$repository/$arch/$package cmd=copy oproject:project? opackage:package? orepository:repository? setupdateinfoid:? resign:bool?' => \©build, -- 2.7.4