335 lines
11 KiB
Ruby
335 lines
11 KiB
Ruby
module BuildListsHelper
|
|
|
|
# See: app/assets/javascripts/angularjs/models/build_list.js.erb
|
|
def build_list_status_color(status)
|
|
case status
|
|
when BuildList::BUILD_PUBLISHED, BuildList::SUCCESS, BuildList::BUILD_PUBLISHED_INTO_TESTING
|
|
'success'
|
|
when BuildList::BUILD_ERROR, BuildList::FAILED_PUBLISH, BuildList::REJECTED_PUBLISH, BuildList::FAILED_PUBLISH_INTO_TESTING, BuildList::PACKAGES_FAIL, BuildList::UNPERMITTED_ARCH
|
|
'error'
|
|
when BuildList::TESTS_FAILED
|
|
'warning'
|
|
else
|
|
'nocolor'
|
|
end
|
|
end
|
|
|
|
def can_run_dependent_build_lists?(build_list)
|
|
build_list.save_to_platform.main? &&
|
|
build_list.save_to_platform.distrib_type == 'mdv'
|
|
end
|
|
|
|
def availables_main_platforms
|
|
Platform.availables_main_platforms current_user
|
|
end
|
|
|
|
def dependent_projects(package)
|
|
return [] if package.dependent_packages.blank?
|
|
|
|
packages = BuildList::Package.
|
|
select('build_list_packages.project_id, build_list_packages.name').
|
|
joins(:build_list).
|
|
where(
|
|
platform_id: package.platform,
|
|
name: package.dependent_packages,
|
|
package_type: package.package_type,
|
|
build_lists: { status: BuildList::BUILD_PUBLISHED }
|
|
).
|
|
group('build_list_packages.project_id, build_list_packages.name').
|
|
reorder(:project_id).group_by(&:project_id)
|
|
|
|
Project.where(id: packages.keys).recent.map do |project|
|
|
[
|
|
project,
|
|
packages[project.id].map(&:name).sort
|
|
]
|
|
end
|
|
end
|
|
|
|
def external_nodes
|
|
BuildList::EXTERNAL_NODES.map do |type|
|
|
[I18n.t("layout.build_lists.external_nodes.#{type}"), type]
|
|
end
|
|
end
|
|
|
|
def auto_publish_statuses
|
|
BuildList::AUTO_PUBLISH_STATUSES.map do |status|
|
|
[I18n.t("layout.build_lists.auto_publish_status.#{status}"), status]
|
|
end
|
|
end
|
|
|
|
def mass_build_options
|
|
options_for_select(
|
|
MassBuild.recent.limit(15).pluck(:name, :id).unshift([t(:none), -1])
|
|
)
|
|
end
|
|
|
|
def build_list_options_for_new_core
|
|
[
|
|
[I18n.t("layout.true_"), 1],
|
|
[I18n.t("layout.false_"), 0]
|
|
]
|
|
end
|
|
|
|
def build_list_item_status_color(status)
|
|
case status
|
|
when BuildList::SUCCESS
|
|
'success'
|
|
when BuildList::BUILD_ERROR, BuildList::Item::GIT_ERROR #, BuildList::DEPENDENCIES_ERROR
|
|
'error'
|
|
else
|
|
''
|
|
end
|
|
end
|
|
|
|
def build_list_classified_update_types
|
|
advisoriable = BuildList::RELEASE_UPDATE_TYPES.map do |el|
|
|
[el, {class: 'advisoriable'}]
|
|
end
|
|
nonadvisoriable = (BuildList::UPDATE_TYPES - BuildList::RELEASE_UPDATE_TYPES).map do |el|
|
|
[el, {class: 'nonadvisoriable'}]
|
|
end
|
|
|
|
return advisoriable + nonadvisoriable
|
|
end
|
|
|
|
def build_list_item_version_link(item, str_version = false)
|
|
hash_size=5
|
|
if item.version =~ /^[\da-z]+$/ && item.name == item.build_list.project.name
|
|
bl = item.build_list
|
|
{
|
|
text: str_version ? "#{shortest_hash_id item.version, hash_size}" : shortest_hash_id(item.version, hash_size),
|
|
href: commit_path(bl.project, item.version)
|
|
}
|
|
else
|
|
{}
|
|
end
|
|
end
|
|
|
|
def build_list_version_name(bl)
|
|
hash_size=5
|
|
if bl.commit_hash.present?
|
|
if bl.last_published_commit_hash.present? && bl.last_published_commit_hash != bl.commit_hash
|
|
"#{shortest_hash_id bl.last_published_commit_hash, hash_size}...#{shortest_hash_id bl.commit_hash, hash_size}"
|
|
else
|
|
shortest_hash_id(bl.commit_hash, hash_size)
|
|
end
|
|
else
|
|
bl.project_version
|
|
end
|
|
end
|
|
|
|
def get_build_list_version_path(bl)
|
|
if bl.commit_hash.present?
|
|
if bl.last_published_commit_hash.present? && bl.last_published_commit_hash != bl.commit_hash
|
|
diff_path(bl.project, bl.last_published_commit_hash) + "...#{bl.commit_hash}"
|
|
else
|
|
commit_path(bl.project, bl.commit_hash)
|
|
end
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def build_list_version_link(bl)
|
|
hash_size=5
|
|
if bl.commit_hash.present?
|
|
if bl.last_published_commit_hash.present? && bl.last_published_commit_hash != bl.commit_hash
|
|
link_to "#{shortest_hash_id bl.last_published_commit_hash, hash_size}...#{shortest_hash_id bl.commit_hash, hash_size}",
|
|
diff_path(bl.project, bl.last_published_commit_hash) + "...#{bl.commit_hash}"
|
|
else
|
|
link_to shortest_hash_id(bl.commit_hash, hash_size), commit_path(bl.project, bl.commit_hash)
|
|
end
|
|
else
|
|
bl.project_version
|
|
end
|
|
end
|
|
|
|
def product_build_list_version_link(bl, str_version = false)
|
|
if bl.commit_hash.present?
|
|
link_to str_version ? "#{shortest_hash_id bl.commit_hash} ( #{bl.project_version} )" : shortest_hash_id(bl.commit_hash),
|
|
commit_path(bl.project, bl.commit_hash)
|
|
else
|
|
bl.project_version
|
|
end
|
|
end
|
|
|
|
def container_url(build_list = @build_list)
|
|
url = "#{APP_CONFIG['downloads_url']}/#{build_list.save_to_platform.name}/container/#{build_list.id}/"
|
|
url << "#{build_list.arch.name}/#{build_list.save_to_repository.name}/release/" if build_list.build_for_platform.try(:distrib_type) == 'mdv'
|
|
url.html_safe
|
|
end
|
|
|
|
def can_publish_in_future?(bl)
|
|
[
|
|
BuildList::SUCCESS,
|
|
BuildList::FAILED_PUBLISH,
|
|
BuildList::BUILD_PUBLISHED,
|
|
BuildList::TESTS_FAILED,
|
|
BuildList::BUILD_PUBLISHED_INTO_TESTING
|
|
].include?(bl.status)
|
|
end
|
|
|
|
def log_reload_time_options
|
|
t = I18n.t("layout.build_lists.log.reload_times").map { |i| i.reverse }
|
|
|
|
options_for_select(t, t.first).html_safe
|
|
end
|
|
|
|
def log_reload_lines_options
|
|
options_for_select([100, 200, 500, 1000, 1500, 2000], 1000).html_safe
|
|
end
|
|
|
|
def get_version_release build_list
|
|
pkg = build_list.source_packages.first
|
|
"#{pkg.version}-#{pkg.release}" if pkg.present?
|
|
end
|
|
|
|
def new_build_list_data(build_list, project, params)
|
|
res = {
|
|
build_list_id: params[:build_list_id],
|
|
name_with_owner: project.name_with_owner,
|
|
build_for_platform_id: params[:build_list].try(:[], :build_for_platform_id),
|
|
save_to_repository_id: save_to_repository_id(params),
|
|
project_version: project_version(project, params),
|
|
|
|
platforms: new_build_list_platforms(params),
|
|
save_to_repositories: save_to_repositories(project, params),
|
|
project_versions: build_list_project_versions(project),
|
|
arches: arches(params),
|
|
default_extra_repos: default_extra_repos(project),
|
|
extra_repos: extra_repos(params),
|
|
extra_build_lists: extra_build_lists(params),
|
|
auto_create_container: default_auto_create_container(params, build_list),
|
|
auto_publish_status: params[:build_list].try(:[], :auto_publish_status)
|
|
}
|
|
res.to_json
|
|
end
|
|
|
|
def is_repository_checked(repo, params)
|
|
include_repos(params).include? repo.id.to_s
|
|
end
|
|
|
|
def filter_by_save_to_platform
|
|
pls = availables_main_platforms
|
|
pls = pls.select{ |p| current_user_platforms.include?(p.id) } if current_user_platforms.present?
|
|
pls.map{ |pl| [pl.name, pl.id] }
|
|
end
|
|
|
|
private
|
|
|
|
def save_to_repositories(project, params)
|
|
project.repositories.map do |r|
|
|
# Show only main platforms which user used as default.
|
|
next if r.platform.main? && current_user_platforms.present? && current_user_platforms.exclude?(r.platform.id)
|
|
{
|
|
id: r.id,
|
|
name: "#{r.platform.name}/#{r.name}",
|
|
publish_without_qa: r.publish_without_qa?,
|
|
repo_name: r.name,
|
|
platform_id: r.platform.id,
|
|
default_branch: r.platform.default_branch,
|
|
default_arches: ( r.platform.platform_arch_settings.by_default.pluck(:arch_id).presence ||
|
|
Arch.where(name: Arch::DEFAULT).pluck(:id) )
|
|
}
|
|
end.compact.sort_by { |e| e[:name] }
|
|
end
|
|
|
|
def new_build_list_platforms(params)
|
|
availables_main_platforms.map do |pl|
|
|
# Show only main platforms which user used as default.
|
|
next if current_user_platforms.present? && current_user_platforms.exclude?(pl.id)
|
|
platform = { id: pl.id, name: pl.name, repositories: [] }
|
|
Repository.custom_sort(pl.repositories).each do |repo|
|
|
platform[:repositories] << { id: repo.id,
|
|
name: repo.name,
|
|
disabled: false,
|
|
checked: is_repository_checked(repo, params) }
|
|
end
|
|
platform
|
|
end.compact
|
|
end
|
|
|
|
def current_user_platforms
|
|
@current_user_platforms ||= (current_user.try(:builds_setting).try(:platforms) || []).select(&:present?).map(&:to_i)
|
|
end
|
|
|
|
def include_repos(params)
|
|
@include_repos ||= (params.try(:[], :build_list).try(:[], :include_repos) || []).map {|e| e.to_s}
|
|
end
|
|
|
|
def save_to_repository_id(params)
|
|
@save_to_repository_id ||= params[:build_list].try(:[], :save_to_repository_id).to_i
|
|
end
|
|
|
|
def project_version(project, params)
|
|
@project_version ||= params[:build_list].try(:[], :project_version) || project.resolve_default_branch
|
|
end
|
|
|
|
def build_list_project_versions(project)
|
|
return [] unless project
|
|
branches_kind = I18n.t('layout.git.repositories.branches')
|
|
tags_kind = I18n.t('layout.git.repositories.tags')
|
|
res = []
|
|
project.repo.branches.each do |br|
|
|
res << { name: br.name, kind: branches_kind }
|
|
end
|
|
project.repo.tags.each do |t|
|
|
res << { name: t.name, kind: tags_kind }
|
|
end
|
|
res.sort_by { |e| e[:name] }
|
|
end
|
|
|
|
def arches(params)
|
|
Arch.recent.map do |arch|
|
|
{
|
|
id: arch.id,
|
|
name: arch.name,
|
|
checked: (params[:arches]||[]).include?(arch.id) ||
|
|
(params[:arches].blank? &&
|
|
controller.action_name == 'new' &&
|
|
Arch::DEFAULT.include?(arch.name))
|
|
}
|
|
end
|
|
end
|
|
|
|
def default_extra_repos(project)
|
|
scope = project.repositories.joins(:platform).where(platforms: { platform_type: 'personal' })
|
|
scope = PlatformPolicy::Scope.new(current_user, scope).show
|
|
scope.map do |extra|
|
|
{
|
|
id: extra.id,
|
|
platform_id: extra.platform.id,
|
|
label: "#{extra.platform.name}/#{extra.name}",
|
|
path: url_for([extra.platform, extra])
|
|
}
|
|
end
|
|
end
|
|
|
|
def extra_repos(params)
|
|
Repository.where(id: params[:build_list].try(:[], :extra_repositories) ).map do |extra|
|
|
{
|
|
id: extra.id,
|
|
label: "#{extra.platform.name}/#{extra.name}",
|
|
path: url_for([extra.platform, extra])
|
|
}
|
|
end
|
|
end
|
|
|
|
def extra_build_lists(params)
|
|
BuildList.where(id: params[:build_list].try(:[], :extra_build_lists) ).map do |extra|
|
|
{
|
|
id: extra.id,
|
|
label: "#{extra.id} (#{extra.project.name} - #{extra.arch.name})",
|
|
path: url_for(extra)
|
|
}
|
|
end
|
|
end
|
|
|
|
def default_auto_create_container(params, build_list)
|
|
checked = params[:build_list].try(:[], :auto_create_container)
|
|
checked = build_list.auto_create_container if checked.nil?
|
|
checked
|
|
end
|
|
end
|