diff --git a/src/backend/BSSrcServer/Remote.pm b/src/backend/BSSrcServer/Remote.pm index f504b4fe4ba77ad20753cfc0fc696d3d32f922cd..c5e651e00b97270eb2fd6266965adc5d95144d30 100644 --- a/src/backend/BSSrcServer/Remote.pm +++ b/src/backend/BSSrcServer/Remote.pm @@ -669,6 +669,40 @@ sub getremotebinaryversions { return $binaryversions; } +sub getpackagebinaryversionlist { + my ($proj, $projid, $repoid, $arch, $packages, $view) = @_; + my $xmldtd = $BSXML::packagebinaryversionlist; + my $elname = 'binaryversionlist'; + my $jev = $BSServerEvents::gev; + my $binaryversionlist; + $binaryversionlist = $jev->{'binaryversionlist'} if $BSStdServer::isajax; + $binaryversionlist ||= {}; + $jev->{'binaryversionlist'} = $binaryversionlist if $BSStdServer::isajax; + my @missing = grep {!exists $binaryversionlist->{$_}} @$packages; + while (@missing) { + # chunk it + my $chunkl = 0; + for (splice @missing) { + $chunkl += 9 + length($_); + last if @missing && $chunkl > 1900; + push @missing, $_; + } + my $param = { + 'uri' => "$proj->{'remoteurl'}/build/$proj->{'remoteproject'}/$repoid/$arch", + 'proxy' => $proj->{'remoteproxy'}, + }; + my @args = ("view=$view"); + push @args, map {"package=$_"} @missing; + my $pbvl = BSWatcher::rpc($param, $xmldtd, @args); + return undef if $BSStdServer::isajax && !$pbvl; + for (@{$pbvl->{$elname} || []}) { + $binaryversionlist->{$_->{'package'}} = $_; + } + $binaryversionlist->{$_} ||= undef for @missing; + @missing = grep {!exists $binaryversionlist->{$_}} @$packages; + } + return { $elname => [ map {$binaryversionlist->{$_}} grep {$binaryversionlist->{$_}} @$packages ] }; +} sub getremotebinaries_cache { my ($projid, $repoid, $arch, $binaries, $binarylist) = @_; diff --git a/src/backend/bs_srcserver b/src/backend/bs_srcserver index e4adfcc10ca58eeb935dd1ce5c42a2c109e0c54b..86aace276cd4d51f2bdc80d8dd22c1b47d331f59 100755 --- a/src/backend/bs_srcserver +++ b/src/backend/bs_srcserver @@ -3950,6 +3950,11 @@ sub getpackagelist_build { if (!$BSStdServer::isajax) { BSHandoff::handoff("/build/$projid/$repoid/$arch", undef, @args); } + my $view = $cgi->{'view'}; + if (@{$cgi->{'package'} || []} && ($view eq 'binaryversions' || $view eq 'binaryversionscode')) { + my $pbvl = BSSrcServer::Remote::getpackagebinaryversionlist($proj, $projid, $repoid, $arch, $cgi->{'package'}, $view); + return ($pbvl, $BSXML::packagebinaryversionlist); + } $param->{'uri'} = "$proj->{'remoteurl'}/build/$proj->{'remoteproject'}/$repoid/$arch"; $param->{'proxy'} = $proxy; }