summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshuai.fu <shuai01.fu@samsung.com>2017-06-01 14:05:05 +0800
committerjiankang.fan <jiankang.fan@samsung.com>2018-04-02 09:26:56 +0800
commit215f63197551b15f4c35e6dcf22f34bb1e3c8d3f (patch)
tree4e7f490574aa1d69c3fb1574b61b7f0d65cf5b02
parentf2bb4cadd4d8e766d24a34f6ecc7a07cd811ed5b (diff)
downloadobs-server-2.4-215f63197551b15f4c35e6dcf22f34bb1e3c8d3f.tar.gz
obs-server-2.4-215f63197551b15f4c35e6dcf22f34bb1e3c8d3f.tar.bz2
obs-server-2.4-215f63197551b15f4c35e6dcf22f34bb1e3c8d3f.zip
Add alldependson obs-api
Change-Id: Ic728a69d1b832a9a65eab6b67be9899c47869374 Signed-off-by: shuai.fu <shuai01.fu@samsung.com>
-rw-r--r--src/api/app/controllers/build_controller.rb9
-rw-r--r--src/api/config/routes.rb2
-rwxr-xr-xsrc/backend/bs_repserver98
-rwxr-xr-xsrc/backend/bs_sched1
-rwxr-xr-xsrc/backend/bs_srcserver13
5 files changed, 123 insertions, 0 deletions
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?' => \&copybuild,