Add alldependson obs-api 97/174397/1
authorshuai.fu <shuai01.fu@samsung.com>
Thu, 1 Jun 2017 06:05:05 +0000 (14:05 +0800)
committerjiankang.fan <jiankang.fan@samsung.com>
Mon, 2 Apr 2018 01:26:56 +0000 (09:26 +0800)
Change-Id: Ic728a69d1b832a9a65eab6b67be9899c47869374
Signed-off-by: shuai.fu <shuai01.fu@samsung.com>
src/api/app/controllers/build_controller.rb
src/api/config/routes.rb
src/backend/bs_repserver
src/backend/bs_sched
src/backend/bs_srcserver

index c1b4f30..b0a086b 100644 (file)
@@ -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
index 98e158c..593f080 100644 (file)
@@ -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
index e0cf283..04bb605 100755 (executable)
@@ -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,
index 1f76f2a..da6d420 100755 (executable)
@@ -7431,6 +7431,7 @@ NEXTPRP:
       'subpacks' => \%prunedsubpacks,
       'pkg2src' => \%pkg2src,
       'cycles' => \@cycles,
+         'dep2src' => \%dep2src,
     });
     %prunedsubpacks = ();
     # remove old entries again
index f40063f..5d9045c 100755 (executable)
@@ -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,