#757: merge master into branch

This commit is contained in:
Vokhmin Alexey V 2013-02-22 02:17:20 +04:00
commit 3e9c28e238
19 changed files with 399 additions and 99 deletions

View File

@ -59,8 +59,42 @@ $(document).ready(function() {
if (dialog.is(':visible')) { dialog.dialog('close'); } else { dialog.dialog('open'); }
});
var ownership_btn = $('.btn.ownership');
ownership_btn.click(function() {
ownership_btn.removeClass('active');
$('#filter_ownership').val($(this).val());
$(this).addClass('active');
return false;
});
var perpage_btn = $('.btn.per_page');
perpage_btn.click(function() {
perpage_btn.removeClass('active');
$('#per_page').val($(this).val());
$(this).addClass('active');
return false;
});
$('a#updated_at_clear').click(function() {
$($(this).attr('href')).val('');
return false;
});
$('#filter_clear').click(function() {
$('#monitoring_filter .input_cleanse').val('');
$('.btn-group .btn').removeClass('active');
if(ownership_btn.length > 0) { ownership_btn[0].click(); }
perpage_btn[0].click();
return false;
});
$('.mediumheight.min').datepicker({
dateFormat: 'dd/mm/yy',
showButtonPanel: true
});
});
function updateExtraReposAndContainers() {
$.get("/build_lists/update_extra_repos_and_containers", $('#new_build_list').serialize())
.done(function(data) {
@ -80,4 +114,4 @@ function setBranchSelected(selected_option) {
// hack for FF to force render of select box.
bl_version_sel[0].innerHTML = bl_version_sel[0].innerHTML;
}
}
}

View File

@ -2,4 +2,5 @@
@import "design/main";
@import "design/git";
@import "design/common";
@import "design/custom";
@import "design/custom";
@import "design/build_lists_monitoring";

View File

@ -0,0 +1,164 @@
article .all .top {
background: #e9f4fb;
border: 1px solid #dfeefa;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
// width: 760px;
color: 477cae;
padding: 8px;
}
article .all .top .column {
width: 190px;
margin: 5px 10px;
float:left;
}
div.reloader {
float: none;
}
.floatright, article input.floatright {
float: right;
margin-right: 8px;
}
.floatleft {
float: left;
}
h3.medium {
font-size: 13px;
margin: 5px 0px;
padding: 3px 0px;
}
.switch {
font-size: 11px;
float: center;
text-align: center;
color: #125687;
font-weight: bold;
//margin: -7px 0;
margin-bottom: -7px;
}
.top .switch a {
text-decoration: none;
}
.btn-group {
width: 180px;
}
.btn-group .btn {
width: 40%;
height: 26px;
padding: 2px 0px;
}
.btn-group > .btn:first-child,
.btn-group > .btn:last-child {
width: 30%;
}
.sel80.medium {
display: inline-block;
width: 180px;
margin-bottom: 0px;
height: 26px;
line-height: 26px;
padding: 4px 2px;
// margin-bottom: 5px;
color: #555;
vertical-align: middle;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
background-color: white;
border: 1px solid #CCC;
}
input.mediumheight {
height: 20px;
margin-bottom: 0px;
width: 180px;
margin-right: -19px;
}
input.mediumheight.min {
width: 85px;
font-size: 12px;
}
article .all .top form .butgrp {
margin-top: 20px;
float: right;
margin-right: 17px;
}
article .all .top form .butgrp input[type="submit"] {
width: 100px;
padding: 3px 5px 5px;
float: right;
margin-left: 10px;
}
.ui-datepicker, .ui-widget, .ui-widget-content, .ui-helper-clearfix, .ui-corner-all {
font-size: 75%;
z-index: 99!important;
}
article label {
font-size: 12px;
}
article .all .top form .floatleft a img,
article .all .top form .floatright a img {
vertical-align: middle;
}
/* bootstrap 3149*/
.btn {
display: inline-block;
padding: 4px 12px;
margin-bottom: 0;
line-height: 20px;
color: #333333;
text-align: center;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
vertical-align: middle;
cursor: pointer;
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
background-repeat: repeat-x;
border: 1px solid #bbbbbb;
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
border-bottom-color: #a2a2a2;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
/* bootstrap 3190*/
.btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] {
color: #333333;
background-color: #e6e6e6;
}
/* bootstrap 3222*/
.btn.active, .btn:active {
background-image: none;
outline: 0;
-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
}

View File

@ -1767,27 +1767,60 @@ table#myTable thead tr.search th form.button_to div input {
border: 1px solid #DDDDDD;
}
/*
table.tablesorter {
th.lpadding6 {
padding-left: 6px;
}
td a {
font-size: 10px;
}
#extra-repos-and-containers {
width: 330px;
.actions { width: 15px; }
}
div.right.slim {
padding-right: 5px;
width: 705px;
table.tablesorter {
font-size: 10px;
}
.semi {
opacity: 0.5;
}
#filter_new_build {
display: inline-block;
white-space: nowrap;
background-color: #125687;
background-image: -webkit-gradient(linear, left top, left bottom, from(#68a3d8), to(#125687));
background-image: -webkit-linear-gradient(top, #68a3d8, #125687);
background-image: -moz-linear-gradient(top, #68a3d8, #125687);
background-image: -ms-linear-gradient(top, #68a3d8, #125687);
background-image: -o-linear-gradient(top, #68a3d8, #125687);
background-image: linear-gradient(top, #68a3d8, #125687);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687');
border: 1px solid #5084b4;
padding: 3px 20px 5px;
margin: 0;
font-size: 12px;
text-decoration: none;
color: #FFF;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
text-align: center;
height: auto;
width: auto;
font-family: Tahoma;
}
#filter_new_build:hover{
background-color: #34719d;
background-image: -webkit-gradient(linear, left top, left bottom, from(#7fb3e1), to(#34719d));
background-image: -webkit-linear-gradient(top, #7fb3e1, #34719d);
background-image: -moz-linear-gradient(top, #7fb3e1, #34719d);
background-image: -ms-linear-gradient(top, #7fb3e1, #34719d);
background-image: -o-linear-gradient(top, #7fb3e1, #34719d);
background-image: linear-gradient(top, #7fb3e1, #34719d);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#7fb3e1', EndColorStr='#34719d');
text-decoration: none;
cursor: pointer;
}
#filter_new_build {
width: 100px;
padding: 3px 5px 5px;
float: right;
margin-left: 10px;
}
*/
#extra-repos-and-containers {
width: 330px;

View File

@ -16,6 +16,7 @@ class Projects::BuildListsController < Projects::BaseController
params[:filter].each do |k,v|
new_params[:filter][k] = v unless v.empty?
end
new_params[:per_page] = params[:per_page] if params[:per_page].present?
redirect_to @project ? project_build_lists_path(@project, new_params) : build_lists_path(new_params)
end
@ -24,7 +25,8 @@ class Projects::BuildListsController < Projects::BaseController
@filter = BuildList::Filter.new(@project, current_user, params[:filter] || {})
page = params[:page].to_i == 0 ? nil : params[:page]
@bls = @filter.find.recent.paginate :page => page
@per_page = BuildList::Filter::PER_PAGE.include?(params[:per_page].to_i) ? params[:per_page].to_i : 25
@bls = @filter.find.recent.paginate :page => page, :per_page => @per_page
@build_lists = BuildList.where(:id => @bls.pluck("#{BuildList.table_name}.id")).recent
@build_lists = @build_lists.includes [:save_to_platform, :save_to_repository, :arch, :user, :project => [:owner]]

View File

@ -10,7 +10,7 @@ class Projects::Git::BaseController < Projects::BaseController
protected
def set_treeish_and_path
@treeish, @path = @project.default_head(params[:treeish]), params[:path]
@treeish, @path = params[:treeish].presence || @project.default_head, params[:path]
end
def set_branch_and_tree

View File

@ -4,9 +4,10 @@ class Projects::Git::TreesController < Projects::Git::BaseController
skip_before_filter :set_branch_and_tree, :set_treeish_and_path, :only => :archive
def show
render('empty') and return unless @project.repo.commit nil
@tree = @tree / @path if @path.present?
@commit = @branch.present? ? @branch.commit() : @project.repo.log(@treeish, @path, :max_count => 1).first
render 'empty' unless @commit
raise Grit::NoSuchPathError unless @commit
end
def archive
@ -32,7 +33,8 @@ class Projects::Git::TreesController < Projects::Git::BaseController
end
def branches
@branches = @project.repo.branches.sort_by(&:name).select{ |b| b.name != @branch.name }.unshift(@branch)
raise Grit::NoSuchPathError if !@branch && @project.repo.commit(nil)
@branches = @project.repo.branches.sort_by(&:name).select{ |b| b.name != @branch.name }.unshift(@branch).compact
render 'refs'
end

View File

@ -4,8 +4,6 @@ module ApplicationHelper
case
when controller_name == 'issues' && action_name == 'new'
'right nopadding'
when controller_name == 'build_lists' && action_name == 'index'
'right slim'
when controller_name == 'build_lists' && ['new', 'create'].include?(action_name)
nil
when controller_name == 'platforms' && ['build_all', 'mass_builds'].include?(action_name)

View File

@ -1,5 +1,7 @@
# -*- encoding : utf-8 -*-
class BuildList::Filter
PER_PAGE = [25, 50, 100]
def initialize(project, user, options = {})
@project = project
@user = user
@ -70,14 +72,10 @@ class BuildList::Filter
end
def build_date_from_params(field_name, params)
if params[field_name].present?
Time.at(params[field_name].to_i)
elsif params["#{field_name}(1i)"].present? || params["#{field_name}(2i)"].present? || params["#{field_name}(3i)"].present?
Date.civil((params["#{field_name}(1i)"].presence || Date.today.year).to_i,
(params["#{field_name}(2i)"].presence || Date.today.month).to_i,
(params["#{field_name}(3i)"].presence || Date.today.day).to_i)
else
nil
end
return nil if params[field_name].blank?
params[field_name].strip!
return Date.parse(params[field_name]) if params[field_name] =~ /\A\d{2}\/\d{2}\/\d{4}\z/
return Time.at(params[field_name].to_i) if params[field_name] =~ /\A\d+\z/
nil
end
end

View File

@ -1,4 +1,4 @@
- act = action_name.to_sym; contr = controller_name.to_sym; treeish = project.default_head(params[:treeish])
- act = action_name.to_sym; contr = controller_name.to_sym; treeish = project.default_head(params[:treeish]); branch = @branch.try(:name) || project.default_head
#description-top
-if @commit
%ul.nav.zip
@ -34,7 +34,7 @@
%li{:class => ('selected' if act == :index && contr == :commits )}
= link_to t('project_menu.commits'), commits_path(project, treeish)
%li{:class => ('selected' if act == :branches && contr == :trees )}
= link_to t('project_menu.branches', :count => project.repo.branches.count), branches_path(project, treeish)
= link_to t('project_menu.branches', :count => project.repo.branches.count), branches_path(project, branch)
%li.tags{:class => ('selected' if act == :tags && contr == :trees )}
= link_to t('project_menu.tags', :count => project.repo.tags.count), tags_path(project)
.both

View File

@ -20,3 +20,4 @@
%td= link_to "#{build_list.save_to_platform.name}/#{build_list.save_to_repository.name}#{build_for}", [build_list.save_to_platform, build_list.save_to_repository]
%td= build_list.arch.try(:name) || t("layout.arches.unexisted_arch")
%td= link_to build_list.user.try(:fullname), build_list.user
%td= build_list.updated_at.strftime('%d/%m/%Y')

View File

@ -1,49 +1,107 @@
- content_for :sidebar do
= render 'server_status'
-html_options = {:class => 'sel80 medium input_cleanse', :tabindex => 2}
.top
.filter
= form_for :filter, :url => @action_url, :html => { :method => :post, :class => :form, :id => 'monitoring_filter' } do |f|
.column
= render 'server_status'
= hidden_field_tag :servertime, Time.now.utc.to_i
.reloader
= label_tag :autoreload do
= check_box_tag :autoreload, true, true
= t 'layout.autoreload_page'
.column
- if current_user
.bordered.nopadding
%h3.medium= t("layout.build_lists.ownership.header")
=f.hidden_field :ownership
.btn-group
- ownerships = %w[owned everything]
- ownerships << 'related' unless @project
- ownerships.each do |ownership|
-options = {:class => @filter.ownership == ownership ? 'active' : '', :value => ownership, :style => (@project ? 'width:50%;' : '')}
%button.btn.ownership{options}= t "layout.build_lists.ownership.#{ownership}"
%h3.medium= t 'number_rows'
=hidden_field_tag :per_page, @per_page
.btn-group
-BuildList::Filter::PER_PAGE.each do |num|
%button.btn.per_page{:value => num, :class => @per_page == num ? 'active' : ''}=num
%h3.medium= t 'activerecord.attributes.build_list.status'
.lineForm.aside
= f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, {:include_blank => true, :selected => @filter.status},
html_options.merge(:id => 'status')
.both
%br/
.column
%h3.medium= t 'activerecord.models.platform'
.lineForm.aside
= f.select :platform_id, Platform.main.collect{|pl| [pl.name, pl.id]}, {:include_blank => true, :selected => @filter.platform_id}, html_options.merge(:id => 'platform')
%h3.medium= t 'activerecord.attributes.build_list.arch'
.lineForm.aside
= f.select :arch_id, Arch.recent.collect{|arch| [arch.name, arch.id]}, {:include_blank => true, :selected => @filter.arch_id}, html_options.merge(:id => 'architecture')
%h3.medium= t 'activerecord.models.mass_build'
.lineForm.aside
= f.select :mass_build_id, options_from_collection_for_select( MassBuild.all, :id, :name, @filter.mass_build_id ), {:include_blank => true, :selected => @filter.mass_build_id},
html_options.merge(:id => 'mass_build')
= form_for :filter, :url => @action_url, :html => { :method => :post, :class => :form } do |f|
- if current_user
.bordered.nopadding
%h3= t("layout.build_lists.ownership.header")
.table
.lefter= f.radio_button :ownership, 'owned', :class => 'niceRadio', :id => 'myradio1'
.lefter= t("layout.build_lists.ownership.owned")
.column
-[:updated_at_start, :updated_at_end].each do |attr|
-class_name, message = attr == :updated_at_start ? %w[floatleft _on] : %w[floatright until]
%div{:class => class_name}
%h3.medium= t message
-date = @filter.send(attr) ? @filter.send(attr).strftime('%d/%m/%Y') : nil
=f.text_field attr, :readonly => "readonly", :size => 10, :class => 'mediumheight min input_cleanse', :value => date
=link_to image_tag('x.png', :alt => 'x', :class => 'semi'), "#filter_#{attr}", :id => 'updated_at_clear'
.both
- unless @project
.table
.lefter= f.radio_button :ownership, 'related', :class => 'niceRadio', :id => 'myradio2'
.lefter= t("layout.build_lists.ownership.related")
.both
.table
.lefter= f.radio_button :ownership, 'everything', :class => 'niceRadio', :id => 'myradio3'
.lefter= t("layout.build_lists.ownership.everything")
.both
%br
= f.submit t("layout.search.header")
.block
%h3.small= t("activerecord.attributes.build_list.new_core")
.lineForm.aside= f.select :new_core, build_list_options_for_new_core, {:include_blank => true, :selected => @filter.new_core}, {:class => 'sel80 aside', :id => 'new_core', :tabindex => 2}
%h3.small= t("activerecord.attributes.build_list.status")
.lineForm.aside= f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, {:include_blank => true, :selected => @filter.status}, {:class => 'sel80 aside', :id => 'status', :tabindex => 2}
%h3.small= t("activerecord.models.platform")
.lineForm.aside= f.select :platform_id, Platform.main.collect{|pl| [pl.name, pl.id]}, {:include_blank => true, :selected => @filter.platform_id}, {:class => 'sel80 aside', :id => 'platform', :tabindex => 2}
%h3.small= t("activerecord.attributes.build_list.mass_build")
.lineForm.aside= f.select :mass_build_id, options_from_collection_for_select( MassBuild.all, :id, :name, @filter.mass_build_id ), {:include_blank => true}
%h3.small= t("activerecord.attributes.build_list.arch")
.lineForm.aside= f.select :arch_id, Arch.recent.collect{|arch| [arch.name, arch.id]}, {:include_blank => true, :selected => @filter.arch_id}, {:class => 'sel80 aside', :id => 'architecture', :tabindex => 2}
-# TODO [BuildList#created_at filters] Uncomment here and in BuildList::Filter to return filters
%h3.small= t("layout.build_lists.created_at_start")
.date_select= f.date_select(:created_at_start, :include_blank => true, :selected => @filter.created_at_start)
%h3.small= t("layout.build_lists.created_at_end")
.date_select= f.date_select(:created_at_end, :include_blank => true, :selected => @filter.created_at_end)
%h3.small= t("layout.build_lists.updated_at_start")
.date_select= f.date_select(:updated_at_start, :include_blank => true, :selected => @filter.updated_at_start)
%h3.small= t("layout.build_lists.updated_at_end")
.date_select= f.date_select(:updated_at_end, :include_blank => true, :selected => @filter.updated_at_end)
%h3.small= t("layout.build_lists.project_name_search")
= f.text_field :project_name
%h3.small= t("layout.build_lists.bs_id_search")
= f.text_field :bs_id
%br
%br
= f.submit t("layout.search.header")
-%w[project_name bs_id].each do |filter|
%h3.medium= t "layout.build_lists.#{filter}_search"
%input.mediumheight.input_cleanse{:id => "filter_#{filter}", :name => "filter[#{filter}]", :size => "30", :type => "text"}/
%br/
%br/
.butgrp
= f.submit t('layout.search.header')
= f.submit t('reset'), :id => 'filter_clear'
-if @project and can?(:create, @project.build_lists.build)
%input{:id => 'filter_new_build', :type => 'button', :onclick => "location.href='#{new_project_build_list_path(@project)}'", :value => t('layout.build_lists.new_header')}
.both
.both
.switch
%a{:href => "#"}= t 'layout.build_lists.hide_filter'
:javascript
var MONITORING_FILTER_HIDE = "monitoring_filter_hide";
$(".switch").toggle(
function () {
var d = new Date();
d.setMonth(d.getMonth() + 1);
$(".filter").hide("slow");
$(".switch a").text("#{t 'layout.build_lists.show_filter'}");
setCookie(MONITORING_FILTER_HIDE, 'true', d);
},
function () {
$(".filter").show("slow");
$(".switch a").text("#{t 'layout.build_lists.hide_filter'}");
var d = new Date();
d.setMonth(d.getMonth() + 1);
setCookie(MONITORING_FILTER_HIDE, 'false', d);
}
);
#{cookies[:monitoring_filter_hide] == 'true' ? "$('.switch').click();" : ''}
#{if I18n.locale == :ru
"$.datepicker.regional['ru'] = {
closeText: 'Закрыть',
prevText: '<Пред',
nextText: 'След>',
currentText: 'Сейчас',
monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
dayNames: ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'],
dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
weekHeader: 'Не',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''
};
$.datepicker.setDefaults($.datepicker.regional['ru']);"
end
}

View File

@ -1,7 +1,6 @@
- queues ||= [:rpm, :publish]
.bordered.nopadding
%h3= t('layout.build_lists.build_server_status.header')
%h3.medium= t('layout.build_lists.build_server_status.header')
- queues.each do |queue|
.table
.lefter= t("layout.build_lists.build_server_status.#{queue}_workers")
@ -12,4 +11,3 @@
.righter= @build_server_status[queue][metric]
.both
%br
= link_to t('layout.build_lists.new_header'), new_project_build_list_path(@project), :class => 'button' if @project and can?(:create, @project.build_lists.build)

View File

@ -1,11 +1,6 @@
-set_meta_tags :title => t('.title')
= hidden_field_tag :servertime, Time.now.utc.to_i
%div.reloader
= label_tag :autoreload do
= check_box_tag :autoreload, true, true
= t("layout.autoreload_page")
.both
= render 'filter'
%table.tablesorter{:cellpadding => "0", :cellspacing => "0"}
%thead
@ -18,6 +13,7 @@
%th.lpadding16= t("activerecord.attributes.build_list.save_to_repository")
%th.lpadding6= t("activerecord.attributes.build_list.arch_short")
%th.lpadding16= t("activerecord.attributes.build_list.user")
%th.lpadding6= t("activerecord.attributes.build_list.updated_at")
%tbody= render :partial => 'projects/build_lists/build_list', :collection => @build_lists
.both
@ -74,5 +70,4 @@
= will_paginate @bls
= render 'filter'
= render @project ? 'projects/base/submenu' : 'projects/build_lists/submenu'

View File

@ -20,6 +20,7 @@ en:
user_list: User list
edit: Edit
show: View
hide: Hide
cancel: Cancel
create: Create
update: Update
@ -203,3 +204,7 @@ en:
from: from
by: by
diff: Diff
number_rows: Number rows
reset: Reset
_on: 'On'
until: Until

View File

@ -154,6 +154,9 @@ en:
600000: "10 m"
900000: "15 m"
show_filter: Show filters
hide_filter: Hide filters
flash:
build_list:
saved: Build list for project version '%{project_version}', platform '%{build_for_platform}' and architecture '%{arch}' has been created successfully
@ -169,4 +172,4 @@ en:
can_not_published: Build can only be published with status "Build complete"
frozen_platform: In case of a repository for package storage with frozen platform allowed only bugfix and security updates
wrong_include_repos: Include repos have to belongs to build for platform
wrong_commit_hash: Unable find commit '%{commit_hash}' in project
wrong_commit_hash: Unable find commit '%{commit_hash}' in project

View File

@ -97,8 +97,8 @@ ru:
ownership:
header: Принадлежность заданий
owned: Мне
related: Связанные со мной
owned: Мои
related: Связанные
everything: Все
build_server_status:
@ -153,6 +153,9 @@ ru:
600000: "10 мин"
900000: "15 мин"
show_filter: Показать фильтры
hide_filter: Скрыть фильтры
flash:
build_list:
saved: Билд лист для версии '%{project_version}', платформы '%{build_for_platform}' и архитектуры '%{arch}' создан успешно
@ -168,4 +171,4 @@ ru:
can_not_published: Опубликовать сборку можно только со статусом "Собран"
frozen_platform: В случае выбора репозитория для сохранения пакетов из замороженнной платформы разрешены только bugfix и security обновления
wrong_include_repos: Включаемые репозитории должны принадлежать платформе для сборки
wrong_commit_hash: Невозможно найти коммит '%{commit_hash}' в проекте
wrong_commit_hash: Невозможно найти коммит '%{commit_hash}' в проекте

View File

@ -20,6 +20,7 @@ ru:
user_list: Список пользователей
edit: Редактировать
show: Просмотр
hide: Скрыть
cancel: Отмена
create: Создать
update: Обновить
@ -204,3 +205,7 @@ ru:
from: из
by: от
diff: Изменения
number_rows: Количество строк
reset: Сброс
_on: с
until: по

View File

@ -14,4 +14,4 @@
@import "codemirror/modes/tiddlywiki";
@import "bootstrap";
@import "chosen.scss";
@import "chosen.scss";