Log In
Log In
Places
All Projects
Status Monitor
Collapse sidebar
obs:server:fedora:2.6:testing
obs-server
obs-server-2.6.6-0014-api-added-project-package...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File obs-server-2.6.6-0014-api-added-project-package-maintainer-lookup-to-the-s.patch of Package obs-server
From 78d3c63c693195c658c834747e72991c4f84c918 Mon Sep 17 00:00:00 2001 From: Marcus Huewe <suse-tux@gmx.de> Date: Wed, 14 Jan 2015 22:59:25 +0100 Subject: [PATCH 14/14] [api] added project/package maintainer lookup to the /search/owner route This can be used to lookup the direct and indirect maintainers/bugowners for a specific project or package. --- src/api/app/controllers/search_controller.rb | 2 + src/api/app/models/owner.rb | 78 +++++++++++++++++------ src/api/test/functional/search_controller_test.rb | 5 ++ src/api/test/unit/code_quality_test.rb | 1 + 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/api/app/controllers/search_controller.rb b/src/api/app/controllers/search_controller.rb index fb515ad..e1da5ed 100644 --- a/src/api/app/controllers/search_controller.rb +++ b/src/api/app/controllers/search_controller.rb @@ -69,6 +69,8 @@ class SearchController < ApplicationController obj = params[:binary] unless params[:binary].blank? obj = User.find_by_login!(params[:user]) unless params[:user].blank? obj = Group.find_by_title!(params[:group]) unless params[:group].blank? + obj = Package.get_by_project_and_name(params[:project], params[:package]) unless params[:project].blank? or params[:package].blank? + obj = Project.get_by_name(params[:project]) unless not obj.nil? or params[:project].blank? if obj.blank? render_error :status => 400, :errorcode => "no_binary", diff --git a/src/api/app/models/owner.rb b/src/api/app/models/owner.rb index a9c3986..5c2c005 100644 --- a/src/api/app/models/owner.rb +++ b/src/api/app/models/owner.rb @@ -39,7 +39,11 @@ class Owner limit = params[:limit] || 1 projects = [] - if params[:project] + if obj.is_a? Project + projects = [obj] + elsif obj.is_a? Package + projects = [obj.project] + elsif params[:project] # default project specified projects = [Project.get_by_name(params[:project])] else @@ -78,6 +82,8 @@ class Owner elsif obj.is_a? String owners += self.find_assignees(project, obj, limit.to_i, devel, filter, (true unless params[:webui_mode].blank?)) + elsif obj.is_a? Project or obj.is_a? Package + owners += self.find_maintainers(obj, filter) else owners += self.find_containers(project, obj, devel, filter) end @@ -230,6 +236,35 @@ class Owner return maintainers end + def self.find_maintainers(container, filter) + maintainers = [] + sql = self._build_rolefilter_sql(filter) + add_owners = Proc.new {|cont| + m = Owner.new + m.rootproject = '' + if cont.is_a? Package + m.project = cont.project.name + m.package = cont.name + else + m.project = cont.name + end + m.filter = filter + self._extract_from_container(m, cont.relationships, sql, nil) + maintainers << m unless m.users.nil? and m.groups.nil? + } + project = container + if container.is_a? Package + add_owners.call container + project = container.project + end + # add maintainers from parent projects + while not project.nil? + add_owners.call(project) + project = project.find_parent + end + maintainers + end + def self.lookup_package_owner(rootproject, pkg, owner, limit, devel, filter, deepest, already_checked={}) return nil, limit, already_checked if already_checked[pkg.id] @@ -272,25 +307,7 @@ class Owner # no filter defined, so do not check for roles and just return container return m if rolefilter.empty? - - # construct where condition - sql = nil - if rolefilter.length > 0 - rolefilter.each do |rf| - if sql.nil? - sql = "( " - else - sql << " OR " - end - role = Role.find_by_title!(rf) - sql << "role_id = " << role.id.to_s - end - else - # match all roles - sql = "( 1 " - end - sql << " )" - + sql = self._build_rolefilter_sql(rolefilter) # lookup in package container m = self._extract_from_container(m, pkg.relationships, sql, objfilter) @@ -326,4 +343,25 @@ class Owner end unless objfilter.class == User return m end + + def self._build_rolefilter_sql(rolefilter) + # construct where condition + sql = nil + if rolefilter.length > 0 + rolefilter.each do |rf| + if sql.nil? + sql = "( " + else + sql << " OR " + end + role = Role.find_by_title!(rf) + sql << "role_id = " << role.id.to_s + end + else + # match all roles + sql = "( 1 " + end + sql << " )" + end + end diff --git a/src/api/test/functional/search_controller_test.rb b/src/api/test/functional/search_controller_test.rb index 78a31ac..f266280 100644 --- a/src/api/test/functional/search_controller_test.rb +++ b/src/api/test/functional/search_controller_test.rb @@ -479,6 +479,11 @@ class SearchControllerTest < ActionDispatch::IntegrationTest get "/search/owner?user=fred&filter=INVALID" assert_response 404 assert_xml_tag tag: 'status', :attributes => { :code => "not_found" } + get "/search/owner?package=TestPack" + assert_response 400 + assert_xml_tag tag: 'status', :attributes => { :code => "no_binary" } + get "/search/owner?project=DOESNOTEXIST" + assert_response 404 # set devel package (this one has another devel package in home:coolo:test) pkg = Package.find_by_project_and_name "home:Iggy", "TestPack" diff --git a/src/api/test/unit/code_quality_test.rb b/src/api/test/unit/code_quality_test.rb index f7e26c4..aa3e246 100644 --- a/src/api/test/unit/code_quality_test.rb +++ b/src/api/test/unit/code_quality_test.rb @@ -91,6 +91,7 @@ class CodeQualityTest < ActiveSupport::TestCase 'IssueTrackersController#update' => 100.78, 'MaintenanceIncident#initUpdateinfoId' => 140.32, 'Owner::_extract_from_container' => 84.07, + 'Owner::search' => 81.36, 'PersonController#internal_register' => 112.01, 'Project#update_one_repository_without_path' => 150.7, 'PublicController#binary_packages' => 126.16, -- 2.1.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Contact
Support
@OBShq
The Open Build Service is an
openSUSE project
.
Log In
Places
Places
All Projects
Status Monitor