Skip to content

Commit

Permalink
Re-write build_succeed? method
Browse files Browse the repository at this point in the history
Instead of fetching and parsing build results for all repositories
we fetch the result for a single repo and stop iterating through the
result as soon as we find a summary element that is not empty (aka.
there is a package build in state failed, broken or unresolvable).
  • Loading branch information
bgeuken committed May 1, 2019
1 parent 29f543c commit 32e35ab
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 34 deletions.
48 changes: 14 additions & 34 deletions src/api/app/models/project.rb
Expand Up @@ -1323,43 +1323,23 @@ def reopen_release_targets
Backend::Api::Build::Project.wipe_binaries(name)
end

def build_succeeded?(repository)
states = {}
repository_states = {}

br = Buildresult.find_hashed(project: name, view: 'summary')
# no longer there?
return false if br.empty?

br.elements('result') do |result|
if result['repository'] == repository
repository_states[repository] ||= {}
result.elements('summary') do |summary|
summary.elements('statuscount') do |statuscount|
repository_states[repository][statuscount['code']] ||= 0
repository_states[repository][statuscount['code']] += statuscount['count'].to_i
end
end
else
result.elements('summary') do |summary|
summary.elements('statuscount') do |statuscount|
states[statuscount['code']] ||= 0
states[statuscount['code']] += statuscount['count'].to_i
end
end
end
def build_succeeded?(repo_name)
begin
build_result = Xmlhash.parse(Backend::Api::BuildResults::Status.failed_results_summary(name, repo_name))
rescue Backend::NotFoundError
return false
end
if repository_states.key?(repository)
return false if repository_states[repository].empty? # No buildresult is bad
repository_states[repository].each do |state, _|
return false if state.in?(['broken', 'failed', 'unresolvable'])
end
else
return false unless states.empty? # No buildresult is bad
states.each do |state, _|
return false if state.in?(['broken', 'failed', 'unresolvable'])

return false if build_result.empty?

build_result.elements('result').each do |result|
result.elements('summary').each do |summary|
# Since we query for failed, broken or unresolvable, a summary element
# with content means there was an "unsuccessful" build
return false if summary.present?
end
end

true
end

Expand Down
7 changes: 7 additions & 0 deletions src/api/lib/backend/api/build_results/status.rb
Expand Up @@ -52,6 +52,13 @@ def self.failed_results(project_name)
Xmlhash.parse(response)
end

# Lists summary of failed package builds of a project
# @return [String]
def self.failed_results_summary(project_name, repository_name)
http_get(['/build/:project/_result', project_name], params: { code: %w[failed broken unresolvable],
repository: repository_name, view: 'summary' }, expand: [:code])
end

# Returns the log's size for a build
# @return [String]
def self.build_log_size(project_name, package_name, repository_name, architecture_name)
Expand Down

0 comments on commit 32e35ab

Please sign in to comment.