openSUSE/open-build-service

View on GitHub
src/api/app/helpers/webui/projects/status_helper.rb

Summary

Maintainability
B
4 hrs
Test Coverage
F
10%
module Webui::Projects::StatusHelper
  def parse_status(project_name, package)
    comments_to_clear = []
    outs = []
    sortkey = "9-ok-#{package['name']}"
    age = age_from_devel(package['develmtime'].to_i)

    if package['requests_from'].empty?
      package['problems'].sort.each do |problem|
        case problem
        when 'different_changes'
          outs << link_to("Different changes in devel project (since #{age})",
                          package_rdiff_path(project: package['develproject'], package: package['develpackage'], oproject: project_name, opackage: package['name']))
          sortkey = "5-changes-#{package['develmtime']}-#{package['name']}"
        when 'different_sources'
          outs << link_to("Different sources in devel project (since #{age})", package_rdiff_path(project: package['develproject'], package: package['develpackage'],
                                                                                                  oproject: project_name, opackage: package['name']))
          sortkey = "6-changes-#{package['develmtime']}-#{package['name']}"
        when 'diff_against_link'
          outs << link_to('Linked package is different', package_rdiff_path(oproject: package['lproject'], opackage: package['lpackage'],
                                                                            project: project_name, package: package['name']))
          sortkey = "7-changes-#{package['name']}"
        when /^error-/
          outs << link_to(problem[6..-1], package_show_path(project: package['develproject'], package: package['develpackage']))
          sortkey = "1-problem-#{package['name']}"
        when 'currently_declined'
          outs << link_to("Current sources were declined: request #{package['currently_declined']}",
                          request_show_path(number: package['currently_declined']))
          sortkey = "2-declines-#{package['name']}"
        else
          outs << link_to(problem, package_show_path(project: package['develproject'], package: package['develpackage']))
          sortkey = "1-changes-#{package['name']}"
        end
      end
    end
    # rubocop:disable Rails/OutputSafety
    package['requests_to'].each do |number|
      outs.prepend("Request #{link_to(number, request_show_path(number: number))} to #{h(package['develproject'])}".html_safe)
      sortkey = "3-request-#{999_999 - number}-#{package['name']}"
    end
    package['requests_from'].each do |number|
      outs.prepend("Request #{link_to(number, request_show_path(number: number))} to #{h(project_name)}".html_safe)
      sortkey = "2-request-#{999_999 - number}-#{package['name']}"
    end
    # ignore the upstream version if there are already changes pending
    if package['upstream_version'] && sortkey.nil?
      outs += if package['upstream_url']
                "New upstream version #{link_to(package['upstream_version'], package['upstream_url'])} available"
              else
                "New upstream version #{package['upstream_version']} available"
              end
      sortkey = "8-outdated-#{package['name']}"
    end
    if package['firstfail']
      url = package_live_build_log_path(arch: h(package['failedarch']), repository: h(package['failedrepo']),
                                        project: h(project_name), package: h(package['name']))
      outs.prepend("#{link_to('Fails', url)} since #{distance_of_time_in_words_to_now(package['firstfail'].to_i)}".html_safe)

      sortkey = "1-fails-#{Time.now.to_i - package['firstfail']}-#{package['name']}"
    elsif package['failedcomment']
      comments_to_clear << package['failedcomment']
    end
    { summary: outs, sortkey: sortkey, icon_type: icon_from_sortkey(sortkey), comments_to_clear: comments_to_clear }
  end
  # rubocop:enable Rails/OutputSafety

  private

  def icon_from_sortkey(sortkey)
    # match the format 1-message-xyznotimportant
    # use message to choose the icon
    matches = /^\d-(?<key_type>\w+)-.*/.match(sortkey)
    case matches[:key_type]
    when 'fails', 'error', 'problem', 'declines', 'outdated'
      'error'
    when 'changes', 'request'
      'changes'
    else
      'ok'
    end
  end

  def age_from_devel(devel_mtime)
    distance_of_time_in_words_to_now(devel_mtime)
  end
end