diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue
index f7da7ebfcfe..b930fb116a3 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue
@@ -1,5 +1,6 @@
@@ -49,10 +48,8 @@
:data-md-prepend="prepend"
:title="buttonTitle"
:aria-label="buttonTitle">
-
-
+
+
diff --git a/app/assets/stylesheets/framework/avatar.scss b/app/assets/stylesheets/framework/avatar.scss
index f1aedc227f3..50c100d398f 100644
--- a/app/assets/stylesheets/framework/avatar.scss
+++ b/app/assets/stylesheets/framework/avatar.scss
@@ -59,7 +59,7 @@
&.avatar-tile {
border-radius: 0;
- border: none;
+ border: 0;
}
&:not([href]):hover {
@@ -96,7 +96,7 @@
.avatar {
border-radius: 0;
- border: none;
+ border: 0;
height: auto;
width: 100%;
margin: 0;
diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss
index def986180fc..9c1439dfad5 100644
--- a/app/assets/stylesheets/framework/blocks.scss
+++ b/app/assets/stylesheets/framework/blocks.scss
@@ -39,7 +39,7 @@
}
&.top-block {
- border-top: none;
+ border-top: 0;
.container-fluid {
background-color: inherit;
@@ -63,7 +63,7 @@
&.footer-block {
margin-top: 0;
- border-bottom: none;
+ border-bottom: 0;
margin-bottom: -$gl-padding;
}
@@ -100,7 +100,7 @@
&.build-content {
background-color: $white-light;
- border-top: none;
+ border-top: 0;
}
}
@@ -287,12 +287,12 @@
cursor: pointer;
color: $blue-300;
z-index: 1;
- border: none;
+ border: 0;
background-color: transparent;
&:hover,
&:focus {
- border: none;
+ border: 0;
color: $blue-400;
}
}
diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss
index 00a0e9cef67..c4a95afc4d2 100644
--- a/app/assets/stylesheets/framework/buttons.scss
+++ b/app/assets/stylesheets/framework/buttons.scss
@@ -304,7 +304,7 @@
}
.btn-clipboard {
- border: none;
+ border: 0;
padding: 0 5px;
}
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index ea3007f5e08..393a0052114 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -28,7 +28,7 @@
pre {
&.clean {
background: none;
- border: none;
+ border: 0;
margin: 0;
padding: 0;
}
@@ -142,7 +142,7 @@ li.note {
img { max-width: 100%; }
.note-title {
li {
- border-bottom: none !important;
+ border-bottom: 0 !important;
}
}
}
@@ -187,7 +187,7 @@ li.note {
pre {
background: $white-light;
- border: none;
+ border: 0;
font-size: 12px;
}
}
@@ -386,7 +386,7 @@ img.emoji {
}
.hide-bottom-border {
- border-bottom: none !important;
+ border-bottom: 0 !important;
}
.gl-accessibility {
diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss
index 6382551fcc9..1247e5e4876 100644
--- a/app/assets/stylesheets/framework/files.scss
+++ b/app/assets/stylesheets/framework/files.scss
@@ -142,7 +142,7 @@
*/
&.blame {
table {
- border: none;
+ border: 0;
margin: 0;
}
@@ -150,20 +150,20 @@
border-bottom: 1px solid $blame-border;
&:last-child {
- border-bottom: none;
+ border-bottom: 0;
}
}
td {
- border-top: none;
- border-bottom: none;
+ border-top: 0;
+ border-bottom: 0;
&:first-child {
- border-left: none;
+ border-left: 0;
}
&:last-child {
- border-right: none;
+ border-right: 0;
}
&.blame-commit {
diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss
index a7333925f80..74b6b31b07e 100644
--- a/app/assets/stylesheets/framework/filters.scss
+++ b/app/assets/stylesheets/framework/filters.scss
@@ -255,7 +255,7 @@
.clear-search {
width: 35px;
background-color: $white-light;
- border: none;
+ border: 0;
outline: none;
z-index: 1;
@@ -418,7 +418,7 @@
.droplab-dropdown .dropdown-menu .filter-dropdown-item {
.btn {
- border: none;
+ border: 0;
width: 100%;
text-align: left;
padding: 8px 16px;
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 5d777f0d468..1cdfa904374 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -10,7 +10,7 @@
z-index: 1000;
margin-bottom: 0;
min-height: $header-height;
- border: none;
+ border: 0;
border-bottom: 1px solid $border-color;
position: fixed;
top: 0;
@@ -169,7 +169,7 @@
.navbar-collapse {
flex: 0 0 auto;
- border-top: none;
+ border-top: 0;
padding: 0;
@media (max-width: $screen-xs-max) {
@@ -352,77 +352,7 @@
.header-user .dropdown-menu-nav,
.header-new .dropdown-menu-nav {
- margin-top: 4px;
-}
-
-.search {
- margin: 4px 8px 0;
-
- form {
- height: 32px;
- border: 0;
- border-radius: $border-radius-default;
- transition: border-color ease-in-out 0.15s, background-color ease-in-out 0.15s;
-
- &:hover {
- box-shadow: none;
- }
- }
-
- .search-input {
- color: $white-light;
- background: none;
- transition: color ease-in-out 0.15s;
- }
-
- .search-input::placeholder {
- transition: color ease-in-out 0.15s;
- }
-
- .location-badge {
- font-size: 12px;
- margin: -4px 4px -4px -4px;
- line-height: 25px;
- padding: 4px 8px;
- border-radius: 2px 0 0 2px;
- height: 32px;
- transition: border-color ease-in-out 0.15s;
- }
-
- &.search-active {
- form {
- background-color: rgba($indigo-200, .3);
- box-shadow: none;
-
- .search-input {
- color: $gl-text-color;
- transition: color ease-in-out 0.15s;
- }
-
- .search-input::placeholder {
- color: $gl-text-color-tertiary;
- }
-
- .search-input-wrap {
- .search-icon,
- .clear-icon {
- color: $gl-text-color-tertiary;
- transition: color ease-in-out 0.15s;
- }
- }
- }
-
- .location-badge {
- background-color: $nav-badge-bg;
- border-color: $border-color;
- }
-
- .search-input-wrap {
- .clear-icon {
- color: $white-light;
- }
- }
- }
+ margin-top: $dropdown-vertical-offset;
}
.breadcrumbs {
diff --git a/app/assets/stylesheets/framework/highlight.scss b/app/assets/stylesheets/framework/highlight.scss
index c63114f85b4..813a1711ea2 100644
--- a/app/assets/stylesheets/framework/highlight.scss
+++ b/app/assets/stylesheets/framework/highlight.scss
@@ -1,5 +1,5 @@
.file-content.code {
- border: none;
+ border: 0;
box-shadow: none;
margin: 0;
padding: 0;
@@ -7,7 +7,7 @@
pre {
padding: 10px 0;
- border: none;
+ border: 0;
border-radius: 0;
font-family: $monospace_font;
font-size: $code_font_size;
diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss
index 511608c618c..ad3bb0e35d1 100644
--- a/app/assets/stylesheets/framework/lists.scss
+++ b/app/assets/stylesheets/framework/lists.scss
@@ -42,7 +42,7 @@
}
&:last-child {
- border-bottom: none;
+ border-bottom: 0;
&.bottom {
background: $gray-light;
@@ -92,7 +92,7 @@ ul.unstyled-list {
}
ul.unstyled-list > li {
- border-bottom: none;
+ border-bottom: 0;
}
// Generic content list
@@ -178,7 +178,7 @@ ul.content-list {
// When dragging a list item
&.ui-sortable-helper {
- border-bottom: none;
+ border-bottom: 0;
}
&.list-placeholder {
@@ -295,7 +295,7 @@ ul.indent-list {
}
> .group-list-tree > .group-row.has-children:first-child {
- border-top: none;
+ border-top: 0;
}
}
@@ -413,7 +413,7 @@ ul.indent-list {
padding: 0;
&.has-children {
- border-top: none;
+ border-top: 0;
}
&:first-child {
diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss
index 0a5a16c09b0..cd6f94fb354 100644
--- a/app/assets/stylesheets/framework/markdown_area.scss
+++ b/app/assets/stylesheets/framework/markdown_area.scss
@@ -138,15 +138,23 @@
.toolbar-btn {
float: left;
- padding: 0 5px;
- color: $gl-text-color-secondary;
+ padding: 0 7px;
background: transparent;
border: 0;
outline: 0;
+ svg {
+ width: 14px;
+ height: 14px;
+ margin-top: 3px;
+ fill: $gl-text-color-secondary;
+ }
+
&:hover,
&:focus {
- color: $gl-link-color;
+ svg {
+ fill: $gl-link-color;
+ }
}
}
diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss
index 2fee2164190..16d5edde61e 100644
--- a/app/assets/stylesheets/framework/mixins.scss
+++ b/app/assets/stylesheets/framework/mixins.scss
@@ -36,7 +36,7 @@
margin: 0;
&:last-child {
- border-bottom: none;
+ border-bottom: 0;
}
&.active {
diff --git a/app/assets/stylesheets/framework/responsive_tables.scss b/app/assets/stylesheets/framework/responsive_tables.scss
index 8b7afdbe1a5..7829d722560 100644
--- a/app/assets/stylesheets/framework/responsive_tables.scss
+++ b/app/assets/stylesheets/framework/responsive_tables.scss
@@ -24,7 +24,7 @@
@media (min-width: $screen-md-min) {
margin: 0;
padding: $gl-padding 0;
- border: none;
+ border: 0;
&:not(:last-child) {
border-bottom: 1px solid $white-normal;
diff --git a/app/assets/stylesheets/framework/secondary-navigation-elements.scss b/app/assets/stylesheets/framework/secondary-navigation-elements.scss
index 9e1f77e5726..8498b37abe4 100644
--- a/app/assets/stylesheets/framework/secondary-navigation-elements.scss
+++ b/app/assets/stylesheets/framework/secondary-navigation-elements.scss
@@ -63,7 +63,7 @@
.nav-links {
margin-bottom: 0;
- border-bottom: none;
+ border-bottom: 0;
float: left;
&.wide {
@@ -335,69 +335,16 @@
border-bottom: 1px solid $border-color;
.nav-links {
- border-bottom: none;
+ border-bottom: 0;
}
}
}
-.page-with-layout-nav {
- .right-sidebar {
- top: ($header-height + 1) * 2;
- }
-
- &.page-with-sub-nav {
- .right-sidebar {
- top: ($header-height + 1) * 3;
-
- &.affix {
- top: $header-height;
- }
- }
- }
-}
-
-.with-performance-bar .page-with-layout-nav {
- .right-sidebar {
- top: ($header-height + 1) * 2 + $performance-bar-height;
- }
-
- &.page-with-sub-nav {
- .right-sidebar {
- top: ($header-height + 1) * 3 + $performance-bar-height;
-
- &.affix {
- top: $header-height + $performance-bar-height;
- }
- }
- }
-}
-
-@media (max-width: $screen-xs-max) {
- .top-area {
- flex-flow: row wrap;
-
- .nav-controls {
- $controls-margin: $btn-xs-side-margin - 2px;
- flex: 0 0 100%;
-
- &.controls-flex {
- display: flex;
- flex-flow: row wrap;
- align-items: center;
- justify-content: center;
- padding: 0 0 $gl-padding-top;
- }
-
- .controls-item,
- .controls-item-full,
- .controls-item:last-child {
- flex: 1 1 35%;
- display: block;
- width: 100%;
- margin: $controls-margin;
- }
- }
- }
+.project-item-select-holder.btn-group {
+ display: flex;
+ max-width: 350px;
+ overflow: hidden;
+ float: right;
.new-project-item-link {
white-space: nowrap;
diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss
index aa35cd9bea4..bb70b270299 100644
--- a/app/assets/stylesheets/framework/selects.scss
+++ b/app/assets/stylesheets/framework/selects.scss
@@ -17,7 +17,7 @@
.select2-arrow {
background-image: none;
background-color: transparent;
- border: none;
+ border: 0;
padding-top: 12px;
padding-right: 20px;
font-size: 10px;
@@ -60,12 +60,17 @@
border-radius: $border-radius-base;
border: 1px solid $dropdown-border-color;
min-width: 175px;
- color: $gl-grayish-blue;
+ color: $gl-text-color;
+ z-index: 999;
}
-.select2-results .select2-result-label,
-.select2-more-results {
- padding: 10px 15px;
+.select2-drop-mask {
+ z-index: 998;
+}
+
+.select2-drop.select2-drop-above.select2-drop-active {
+ border-top: 1px solid $dropdown-border-color;
+ margin-top: -6px;
}
.select2-container-active {
@@ -158,18 +163,35 @@
}
}
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-ajax-error,
-.select2-results .select2-selection-limit {
- background: $gray-light;
- display: list-item;
- padding: 10px 15px;
-}
-
.select2-results {
margin: 0;
- padding: 10px 0;
+ padding: #{$gl-padding / 2} 0;
+
+ .select2-no-results,
+ .select2-searching,
+ .select2-ajax-error,
+ .select2-selection-limit {
+ background: transparent;
+ padding: #{$gl-padding / 2} $gl-padding;
+ }
+
+ .select2-result-label,
+ .select2-more-results {
+ padding: #{$gl-padding / 2} $gl-padding;
+ }
+
+ .select2-highlighted {
+ background: transparent;
+ color: $gl-text-color;
+
+ .select2-result-label {
+ background: $dropdown-item-hover-bg;
+ }
+ }
+
+ .select2-result {
+ padding: 0 1px;
+ }
li.select2-result-with-children > .select2-result-label {
font-weight: $gl-font-weight-bold;
@@ -190,8 +212,6 @@
}
.select2-highlighted {
- background: $gl-link-color !important;
-
.group-result {
.group-path {
color: $white-light;
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index ef58382ba41..1a19b7320a0 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -9,7 +9,7 @@
&.container-blank {
background: none;
padding: 0;
- border: none;
+ border: 0;
}
}
}
@@ -111,7 +111,7 @@
}
.block:last-of-type {
- border: none;
+ border: 0;
}
}
diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss
index 4dd31bf28cd..5bde96caf42 100644
--- a/app/assets/stylesheets/framework/tables.scss
+++ b/app/assets/stylesheets/framework/tables.scss
@@ -33,7 +33,7 @@ table {
th {
background-color: $gray-light;
font-weight: $gl-font-weight-normal;
- border-bottom: none;
+ border-bottom: 0;
&.wide {
width: 55%;
diff --git a/app/assets/stylesheets/framework/timeline.scss b/app/assets/stylesheets/framework/timeline.scss
index f718ec4bcad..373f35e71d8 100644
--- a/app/assets/stylesheets/framework/timeline.scss
+++ b/app/assets/stylesheets/framework/timeline.scss
@@ -21,7 +21,7 @@
}
&.text-file .diff-file {
- border-bottom: none;
+ border-bottom: 0;
}
}
@@ -66,5 +66,5 @@
.discussion .timeline-entry {
margin: 0;
- border-right: none;
+ border-right: 0;
}
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index 3c0b4c82d19..0817cce114c 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -167,7 +167,7 @@
&.plain-readme {
background: none;
- border: none;
+ border: 0;
padding: 0;
margin: 0;
font-size: 14px;
diff --git a/app/assets/stylesheets/framework/zen.scss b/app/assets/stylesheets/framework/zen.scss
index 0c226ff7598..5a4d3ba0ee9 100644
--- a/app/assets/stylesheets/framework/zen.scss
+++ b/app/assets/stylesheets/framework/zen.scss
@@ -9,7 +9,7 @@
z-index: 1031;
textarea {
- border: none;
+ border: 0;
box-shadow: none;
border-radius: 0;
color: $black;
@@ -57,7 +57,15 @@
padding: 5px;
font-size: 36px;
+ svg {
+ fill: $gl-text-color;
+ }
+
&:hover {
color: $black;
+
+ svg {
+ fill: $black;
+ }
}
}
diff --git a/app/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss
index 46978be8ba0..27b10b536a2 100644
--- a/app/assets/stylesheets/pages/builds.scss
+++ b/app/assets/stylesheets/pages/builds.scss
@@ -48,7 +48,7 @@
overflow-x: auto;
font-size: 12px;
border-radius: 0;
- border: none;
+ border: 0;
.bash {
display: block;
diff --git a/app/assets/stylesheets/pages/ci_projects.scss b/app/assets/stylesheets/pages/ci_projects.scss
index bf6a48889bf..fbe1f3081a0 100644
--- a/app/assets/stylesheets/pages/ci_projects.scss
+++ b/app/assets/stylesheets/pages/ci_projects.scss
@@ -36,7 +36,7 @@
pre.commit-message {
background: none;
padding: 0;
- border: none;
+ border: 0;
margin: 20px 0;
border-radius: 0;
}
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index ee3ca246374..b1850be8a5f 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -1,6 +1,6 @@
.commit-description {
background: none;
- border: none;
+ border: 0;
padding: 0;
margin-top: 10px;
word-break: normal;
@@ -247,7 +247,7 @@
word-break: normal;
pre {
- border: none;
+ border: 0;
background: inherit;
padding: 0;
margin: 0;
diff --git a/app/assets/stylesheets/pages/cycle_analytics.scss b/app/assets/stylesheets/pages/cycle_analytics.scss
index 82d9be29201..292e0ad394b 100644
--- a/app/assets/stylesheets/pages/cycle_analytics.scss
+++ b/app/assets/stylesheets/pages/cycle_analytics.scss
@@ -80,7 +80,7 @@
.panel {
.content-block {
padding: 24px 0;
- border-bottom: none;
+ border-bottom: 0;
position: relative;
@media (max-width: $screen-xs-max) {
@@ -222,11 +222,11 @@
}
&:first-child {
- border-top: none;
+ border-top: 0;
}
&:last-child {
- border-bottom: none;
+ border-bottom: 0;
}
.stage-nav-item-cell {
@@ -290,7 +290,7 @@
border-bottom: 1px solid $gray-darker;
&:last-child {
- border-bottom: none;
+ border-bottom: 0;
margin-bottom: 0;
}
diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss
index faa3d1fb4d5..bce94e09367 100644
--- a/app/assets/stylesheets/pages/diff.scss
+++ b/app/assets/stylesheets/pages/diff.scss
@@ -47,7 +47,7 @@
table {
width: 100%;
font-family: $monospace_font;
- border: none;
+ border: 0;
border-collapse: separate;
margin: 0;
padding: 0;
@@ -105,7 +105,7 @@
.new_line {
@include user-select(none);
margin: 0;
- border: none;
+ border: 0;
padding: 0 5px;
border-right: 1px solid;
text-align: right;
@@ -133,7 +133,7 @@
display: block;
margin: 0;
padding: 0 1.5em;
- border: none;
+ border: 0;
position: relative;
&.parallel {
@@ -359,7 +359,7 @@
cursor: pointer;
&:first-child {
- border-left: none;
+ border-left: 0;
}
&:hover {
@@ -388,7 +388,7 @@
.file-content .diff-file {
margin: 0;
- border: none;
+ border: 0;
}
.diff-wrap-lines .line_content {
@@ -400,7 +400,7 @@
}
.files-changed {
- border-bottom: none;
+ border-bottom: 0;
}
.diff-stats-summary-toggler {
diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss
index edfafa79c44..c586dab4cf2 100644
--- a/app/assets/stylesheets/pages/editor.scss
+++ b/app/assets/stylesheets/pages/editor.scss
@@ -3,13 +3,13 @@
border-top: 1px solid $border-color;
border-right: 1px solid $border-color;
border-left: 1px solid $border-color;
- border-bottom: none;
+ border-bottom: 0;
border-radius: $border-radius-small $border-radius-small 0 0;
background: $gray-normal;
}
#editor {
- border: none;
+ border: 0;
border-radius: 0;
height: 500px;
margin: 0;
@@ -171,7 +171,7 @@
width: 100%;
margin: 5px 0;
padding: 0;
- border-left: none;
+ border-left: 0;
}
}
diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss
index b5b0f3d9dfa..26c5f093c6b 100644
--- a/app/assets/stylesheets/pages/environments.scss
+++ b/app/assets/stylesheets/pages/environments.scss
@@ -117,7 +117,7 @@
}
.no-btn {
- border: none;
+ border: 0;
background: none;
outline: none;
width: 100%;
@@ -133,11 +133,11 @@
}
.folder-row {
- border-left: none;
- border-right: none;
+ border-left: 0;
+ border-right: 0;
@media (min-width: $screen-sm-max) {
- border-top: none;
+ border-top: 0;
}
}
@@ -256,12 +256,6 @@
padding: 0;
padding-bottom: 100%;
- .label-axis-text {
- fill: $black;
- font-weight: $gl-font-weight-normal;
- font-size: 10px;
- }
-
.text-metric-usage,
.legend-metric-title {
fill: $black;
@@ -276,19 +270,33 @@
left: 0;
top: 0;
- .label-axis-text,
- .text-metric-usage {
+ text {
+ fill: $gl-text-color;
+ stroke-width: 0;
+ }
+
+ .text-metric-bold {
+ font-weight: $gl-font-weight-bold;
+ }
+
+ .label-axis-text {
fill: $black;
font-weight: $gl-font-weight-normal;
- font-size: 12px;
+ font-size: 10px;
}
.legend-axis-text {
fill: $black;
}
- .tick > text {
- font-size: 12px;
+ .tick {
+ > line {
+ stroke: $gray-darker;
+ }
+
+ > text {
+ font-size: 12px;
+ }
}
.text-metric-title {
diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss
index 1723d716805..eea8b7dd193 100644
--- a/app/assets/stylesheets/pages/events.scss
+++ b/app/assets/stylesheets/pages/events.scss
@@ -85,7 +85,7 @@
}
pre {
- border: none;
+ border: 0;
background: $gray-light;
border-radius: 0;
color: $events-pre-color;
@@ -128,14 +128,14 @@
}
}
- &:last-child { border: none; }
+ &:last-child { border: 0; }
.event_commits {
li {
&.commit {
background: transparent;
padding: 0;
- border: none;
+ border: 0;
.commit-row-title {
font-size: $gl-font-size;
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index 7059a4cfe85..43520c72725 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -79,7 +79,7 @@
.title {
padding: 0;
margin-bottom: 16px;
- border-bottom: none;
+ border-bottom: 0;
}
.btn-edit {
@@ -131,12 +131,12 @@
top: $header-height;
bottom: 0;
right: 0;
- transition: width .3s;
+ transition: width $right-sidebar-transition-duration;
background: $gray-light;
z-index: 200;
overflow: hidden;
- a,
+ a:not(.btn-retry),
.btn-link {
color: inherit;
}
@@ -164,7 +164,7 @@
}
&:last-child {
- border: none;
+ border: 0;
}
span {
@@ -338,7 +338,7 @@
.block {
width: $gutter_collapsed_width - 2px;
padding: 15px 0 0;
- border-bottom: none;
+ border-bottom: 0;
overflow: hidden;
}
@@ -399,7 +399,7 @@
}
.btn-clipboard {
- border: none;
+ border: 0;
color: $issuable-sidebar-color;
&:hover {
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index 92d49bd864a..b7985c4dea5 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -139,7 +139,7 @@
border-left: 1px solid $border-color;
&:first-of-type {
- border-left: none;
+ border-left: 0;
border-top-left-radius: $border-radius-default;
}
@@ -165,7 +165,7 @@
border-bottom: 1px solid $border-color;
a {
- border: none;
+ border: 0;
border-bottom: 2px solid $link-underline-blue;
margin-right: 0;
color: $black;
diff --git a/app/assets/stylesheets/pages/merge_conflicts.scss b/app/assets/stylesheets/pages/merge_conflicts.scss
index dbf3e2b763c..04bde64c752 100644
--- a/app/assets/stylesheets/pages/merge_conflicts.scss
+++ b/app/assets/stylesheets/pages/merge_conflicts.scss
@@ -262,7 +262,7 @@ $colors: (
.editor {
pre {
height: 350px;
- border: none;
+ border: 0;
border-radius: 0;
margin-bottom: 0;
}
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index 6e485ebad1b..5832cf4637f 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -150,18 +150,6 @@
display: block;
}
- .mr-widget-body {
- @include clearfix;
-
- &.media > *:first-child {
- margin-right: 10px;
- }
-
- .approve-btn {
- margin-right: 5px;
- }
- }
-
.mr-widget-pipeline-graph {
padding: 0 4px;
@@ -169,9 +157,8 @@
z-index: 300;
}
- .ci-action-icon-wrapper svg {
- width: 16px;
- height: 16px;
+ .ci-action-icon-wrapper {
+ line-height: 16px;
}
}
@@ -195,10 +182,6 @@
overflow: hidden;
word-break: break-all;
- &.media > *:first-child {
- margin-right: 10px;
- }
-
&.label-truncated {
position: relative;
display: inline-block;
@@ -216,6 +199,18 @@
background-color: $gray-light;
}
}
+ }
+
+ .mr-widget-body {
+ @include clearfix;
+
+ &.media > *:first-child {
+ margin-right: 10px;
+ }
+
+ .approve-btn {
+ margin-right: 5px;
+ }
h4 {
float: left;
@@ -239,10 +234,6 @@
margin-right: 7px;
}
- .approve-btn {
- margin-right: 5px;
- }
-
label {
font-weight: $gl-font-weight-normal;
}
@@ -342,17 +333,6 @@
}
}
- .mini-pipeline-graph-dropdown-menu .mini-pipeline-graph-dropdown-item {
- display: flex;
- align-items: center;
-
- .ci-status-text,
- .ci-status-icon {
- top: 0;
- margin-right: 10px;
- }
- }
-
.mr-widget-help {
padding: 10px 16px 10px 48px;
font-style: italic;
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index 5127307c5e7..237c71b71f0 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -16,7 +16,7 @@
.discussion {
.new-note {
margin: 0;
- border: none;
+ border: 0;
}
}
@@ -106,15 +106,35 @@
background-color: $orange-100;
border-radius: $border-radius-default $border-radius-default 0 0;
border: 1px solid $border-gray-normal;
- border-bottom: none;
+ border-bottom: 0;
padding: 3px 12px;
margin: auto;
align-items: center;
+ .icon {
+ margin-right: $issuable-warning-icon-margin;
+ }
+
+ .md-area {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
+
+ .disabled-comment {
+ border: none;
+ border-radius: $label-border-radius;
+ padding-top: $gl-vert-padding;
+ padding-bottom: $gl-vert-padding;
+
+ .icon svg {
+ position: relative;
+ top: 2px;
+ margin-right: $btn-xs-side-margin;
+ width: $gl-font-size;
+ height: $gl-font-size;
+ fill: $orange-600;
+ }
+ }
}
.sidebar-item-value {
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index ca363c6eac4..9537eeeee97 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -331,7 +331,7 @@ ul.notes {
td {
border: 1px solid $white-normal;
- border-left: none;
+ border-left: 0;
&.notes_line {
vertical-align: middle;
@@ -476,6 +476,10 @@ ul.notes {
float: none;
margin-left: 0;
}
+
+ .btn-group > .discussion-next-btn {
+ margin-left: -1px;
+ }
}
.note-actions {
@@ -666,7 +670,7 @@ ul.notes {
.timeline-entry-inner {
padding-left: $gl-padding;
padding-right: $gl-padding;
- border-bottom: none;
+ border-bottom: 0;
}
}
}
@@ -679,7 +683,7 @@ ul.notes {
padding: 90px 0;
&.discussion-locked {
- border: none;
+ border: 0;
background-color: $white-light;
}
@@ -759,7 +763,7 @@ ul.notes {
top: 0;
padding: 0;
background-color: transparent;
- border: none;
+ border: 0;
outline: 0;
color: $gray-darkest;
transition: color $general-hover-transition-duration $general-hover-transition-curve;
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index 2a8cbc61af7..cb24274c612 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -179,7 +179,7 @@
* Play button with icon in dropdowns
*/
.no-btn {
- border: none;
+ border: 0;
background: none;
outline: none;
width: 100%;
@@ -288,7 +288,7 @@
.pipeline-actions {
@include new-style-dropdown;
- border-bottom: none;
+ border-bottom: 0;
}
.tab-pane {
@@ -318,7 +318,7 @@
}
.build-log {
- border: none;
+ border: 0;
line-height: initial;
}
}
@@ -386,13 +386,13 @@
// Remove right connecting horizontal line from first build in last stage
&:first-child {
&::after {
- border: none;
+ border: 0;
}
}
// Remove right curved connectors from all builds in last stage
&:not(:first-child) {
&::after {
- border: none;
+ border: 0;
}
}
// Remove opposite curve
@@ -409,7 +409,7 @@
// Remove left curved connectors from all builds in first stage
&:not(:first-child) {
&::before {
- border: none;
+ border: 0;
}
}
// Remove opposite curve
@@ -518,7 +518,7 @@
.dropdown-menu-toggle {
background-color: transparent;
- border: none;
+ border: 0;
padding: 0;
&:focus {
@@ -823,6 +823,11 @@ button.mini-pipeline-graph-dropdown-toggle {
margin-left: 2px;
display: inline-block;
+ &::after {
+ content: '';
+ display: block;
+ }
+
@media (max-width: $screen-xs-max) {
max-width: 60%;
}
@@ -951,7 +956,7 @@ button.mini-pipeline-graph-dropdown-toggle {
.terminal-container {
.content-block {
- border-bottom: none;
+ border-bottom: 0;
}
#terminal {
diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss
index eab39f698c3..28dc71dc641 100644
--- a/app/assets/stylesheets/pages/profile.scss
+++ b/app/assets/stylesheets/pages/profile.scss
@@ -113,7 +113,7 @@
li {
padding: 3px 0;
- border: none;
+ border: 0;
}
}
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index b0c3474e3d5..aaad6dbba8e 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -80,7 +80,7 @@
.project-feature-settings {
background: $gray-lighter;
- border-top: none;
+ border-top: 0;
margin-bottom: 16px;
}
@@ -128,7 +128,7 @@
.project-feature-toggle {
position: relative;
- border: none;
+ border: 0;
outline: 0;
display: block;
width: 100px;
@@ -483,7 +483,7 @@ a.deploy-project-label {
flex: 1;
padding: 0;
background: transparent;
- border: none;
+ border: 0;
line-height: 34px;
margin: 0;
@@ -1012,7 +1012,7 @@ pre.light-well {
margin: 0;
border-radius: 0 0 1px 1px;
padding: 20px 0;
- border: none;
+ border: 0;
}
.table-bordered {
@@ -1165,7 +1165,7 @@ pre.light-well {
table-layout: fixed;
&.table-responsive {
- border: none;
+ border: 0;
}
.variable-key {
diff --git a/app/assets/stylesheets/pages/repo.scss b/app/assets/stylesheets/pages/repo.scss
index 1bb4e3cc345..fee4638e20f 100644
--- a/app/assets/stylesheets/pages/repo.scss
+++ b/app/assets/stylesheets/pages/repo.scss
@@ -64,7 +64,7 @@
.monaco-editor.vs {
.current-line {
- border: none;
+ border: 0;
background: $well-light-border;
}
@@ -139,7 +139,7 @@
&.active {
background: $white-light;
- border-bottom: none;
+ border-bottom: 0;
}
a {
@@ -181,7 +181,7 @@
&.tabs-divider {
width: 100%;
background-color: $white-light;
- border-right: none;
+ border-right: 0;
border-top-right-radius: 2px;
}
}
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index eed711b1b66..fe455a04960 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -5,7 +5,7 @@
margin-bottom: $gl-padding;
&:last-child {
- border-bottom: none;
+ border-bottom: 0;
}
}
@@ -57,7 +57,7 @@ input[type="checkbox"]:hover {
}
.search-input {
- border: none;
+ border: 0;
font-size: 14px;
padding: 0 20px 0 0;
margin-left: 5px;
@@ -78,10 +78,6 @@ input[type="checkbox"]:hover {
}
.search-input-wrap {
- // Fallback if flexbox is not supported
- display: inline-block;
- width: 100%;
-
.search-icon,
.clear-icon {
position: absolute;
diff --git a/app/assets/stylesheets/pages/todos.scss b/app/assets/stylesheets/pages/todos.scss
index 6c8d87185e9..2139a029fc7 100644
--- a/app/assets/stylesheets/pages/todos.scss
+++ b/app/assets/stylesheets/pages/todos.scss
@@ -141,7 +141,7 @@
}
pre {
- border: none;
+ border: 0;
background: $gray-light;
border-radius: 0;
color: $todo-body-pre-color;
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index e2f6e511c86..50f0ef4414a 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -252,7 +252,7 @@
margin-top: 20px;
padding: 0;
border-top: 1px solid $white-dark;
- border-bottom: none;
+ border-bottom: 0;
}
.commit-stats li {
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index b1ed973d178..9c222549cdc 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -57,12 +57,11 @@ module IssuableActions
def destroy
issuable.destroy
- destroy_method = "destroy_#{issuable.class.name.underscore}".to_sym
- TodoService.new.public_send(destroy_method, issuable, current_user) # rubocop:disable GitlabSecurity/PublicSend
+ TodoService.new.destroy_issuable(issuable, current_user)
name = issuable.human_class_name
flash[:notice] = "The #{name} was successfully deleted."
- index_path = polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable.class])
+ index_path = polymorphic_path([parent, issuable.class])
respond_to do |format|
format.html { redirect_to index_path }
@@ -164,4 +163,8 @@ module IssuableActions
def update_service
raise NotImplementedError
end
+
+ def parent
+ @project || @group
+ end
end
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index 57b45f335fa..3c64fd964ff 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -39,7 +39,7 @@ module NotesActions
@note = Notes::CreateService.new(note_project, current_user, create_params).execute
if @note.is_a?(Note)
- Banzai::NoteRenderer.render([@note], @project, current_user)
+ Notes::RenderService.new(current_user).execute([@note], @project)
end
respond_to do |format|
@@ -52,7 +52,7 @@ module NotesActions
@note = Notes::UpdateService.new(project, current_user, note_params).execute(note)
if @note.is_a?(Note)
- Banzai::NoteRenderer.render([@note], @project, current_user)
+ Notes::RenderService.new(current_user).execute([@note], @project)
end
respond_to do |format|
diff --git a/app/controllers/concerns/renders_notes.rb b/app/controllers/concerns/renders_notes.rb
index 4791bc561a4..824ad06465c 100644
--- a/app/controllers/concerns/renders_notes.rb
+++ b/app/controllers/concerns/renders_notes.rb
@@ -3,7 +3,7 @@ module RendersNotes
preload_noteable_for_regular_notes(notes)
preload_max_access_for_authors(notes, @project)
preload_first_time_contribution_for_authors(noteable, notes)
- Banzai::NoteRenderer.render(notes, @project, current_user)
+ Notes::RenderService.new(current_user).execute(notes, @project)
notes
end
diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb
index cd94a36a6e7..d9884a47ec4 100644
--- a/app/controllers/dashboard/projects_controller.rb
+++ b/app/controllers/dashboard/projects_controller.rb
@@ -57,5 +57,7 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
@events = EventCollection
.new(projects, offset: params[:offset].to_i, filter: event_filter)
.to_a
+
+ Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?)
end
end
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 19a5db6fd17..280ed93faf8 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -32,6 +32,8 @@ class DashboardController < Dashboard::ApplicationController
@events = EventCollection
.new(projects, offset: params[:offset].to_i, filter: @event_filter)
.to_a
+
+ Events::RenderService.new(current_user).execute(@events)
end
def set_show_full_reference
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index bc3e95f1aed..eb53a522f90 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -155,6 +155,8 @@ class GroupsController < Groups::ApplicationController
@events = EventCollection
.new(@projects, offset: params[:offset].to_i, filter: event_filter)
.to_a
+
+ Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?)
end
def user_actions
diff --git a/app/controllers/metrics_controller.rb b/app/controllers/metrics_controller.rb
index 37587a52eaf..d81ad135198 100644
--- a/app/controllers/metrics_controller.rb
+++ b/app/controllers/metrics_controller.rb
@@ -3,10 +3,16 @@ class MetricsController < ActionController::Base
protect_from_forgery with: :exception
- before_action :validate_prometheus_metrics
-
def index
- render text: metrics_service.metrics_text, content_type: 'text/plain; version=0.0.4'
+ response = if Gitlab::Metrics.prometheus_metrics_enabled?
+ metrics_service.metrics_text
+ else
+ help_page = help_page_url('administration/monitoring/prometheus/gitlab_metrics',
+ anchor: 'gitlab-prometheus-metrics'
+ )
+ "# Metrics are disabled, see: #{help_page}\n"
+ end
+ render text: response, content_type: 'text/plain; version=0.0.4'
end
private
@@ -14,8 +20,4 @@ class MetricsController < ActionController::Base
def metrics_service
@metrics_service ||= MetricsService.new
end
-
- def validate_prometheus_metrics
- render_404 unless Gitlab::Metrics.prometheus_metrics_enabled?
- end
end
diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb
index 0e71977a58a..1269759fc2b 100644
--- a/app/controllers/projects/merge_requests/application_controller.rb
+++ b/app/controllers/projects/merge_requests/application_controller.rb
@@ -2,7 +2,6 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
before_action :check_merge_requests_available!
before_action :merge_request
before_action :authorize_read_merge_request!
- before_action :ensure_ref_fetched
private
@@ -10,12 +9,6 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
@issuable = @merge_request ||= @project.merge_requests.find_by!(iid: params[:id])
end
- # Make sure merge requests created before 8.0
- # have head file in refs/merge-requests/
- def ensure_ref_fetched
- @merge_request.ensure_ref_fetched if Gitlab::Database.read_write?
- end
-
def merge_request_params
params.require(:merge_request).permit(merge_request_params_attributes)
end
diff --git a/app/controllers/projects/merge_requests/creations_controller.rb b/app/controllers/projects/merge_requests/creations_controller.rb
index 99dc3dda9e7..129682f64aa 100644
--- a/app/controllers/projects/merge_requests/creations_controller.rb
+++ b/app/controllers/projects/merge_requests/creations_controller.rb
@@ -4,7 +4,6 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
include RendersCommits
skip_before_action :merge_request
- skip_before_action :ensure_ref_fetched
before_action :authorize_create_merge_request!
before_action :apply_diff_view_cookie!, only: [:diffs, :diff_for_path]
before_action :build_merge_request, except: [:create]
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 17cac69e588..c86acae8fe4 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -7,7 +7,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
include IssuableCollections
skip_before_action :merge_request, only: [:index, :bulk_update]
- skip_before_action :ensure_ref_fetched, only: [:index, :bulk_update]
before_action :authorize_update_issuable!, only: [:close, :edit, :update, :remove_wip, :sort]
@@ -52,7 +51,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
def show
validates_merge_request
- ensure_ref_fetched
close_merge_request_without_source_project
check_if_can_be_merged
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index db543d688a0..1688121e27e 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -300,6 +300,8 @@ class ProjectsController < Projects::ApplicationController
@events = EventCollection
.new(projects, offset: params[:offset].to_i, filter: event_filter)
.to_a
+
+ Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?)
end
def project_params
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 4ee855806ab..5fca31b4956 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -108,6 +108,8 @@ class UsersController < ApplicationController
.references(:project)
.with_associations
.limit_recent(20, params[:offset])
+
+ Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?)
end
def load_projects
diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb
index fd88e0d794a..079b3cd3aa0 100644
--- a/app/helpers/events_helper.rb
+++ b/app/helpers/events_helper.rb
@@ -172,16 +172,6 @@ module EventsHelper
end
end
- def event_note(text, options = {})
- text = first_line_in_markdown(text, 150, options)
-
- sanitize(
- text,
- tags: %w(a img gl-emoji b pre code p span),
- attributes: Rails::Html::WhiteListSanitizer.allowed_attributes + ['style', 'data-src', 'data-name', 'data-unicode-version']
- )
- end
-
def event_commit_title(message)
message ||= ''
(message.split("\n").first || "").truncate(70)
diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb
index 46bced00c72..2c85d7d7720 100644
--- a/app/helpers/markup_helper.rb
+++ b/app/helpers/markup_helper.rb
@@ -69,10 +69,16 @@ module MarkupHelper
# as Markdown. HTML tags in the parsed output are not counted toward the
# +max_chars+ limit. If the length limit falls within a tag's contents, then
# the tag contents are truncated without removing the closing tag.
- def first_line_in_markdown(text, max_chars = nil, options = {})
- md = markdown(text, options).strip
+ def first_line_in_markdown(object, attribute, max_chars = nil, options = {})
+ md = markdown_field(object, attribute, options)
- truncate_visible(md, max_chars || md.length) if md.present?
+ text = truncate_visible(md, max_chars || md.length) if md.present?
+
+ sanitize(
+ text,
+ tags: %w(a img gl-emoji b pre code p span),
+ attributes: Rails::Html::WhiteListSanitizer.allowed_attributes + ['style', 'data-src', 'data-name', 'data-unicode-version']
+ )
end
def markdown(text, context = {})
@@ -83,15 +89,17 @@ module MarkupHelper
prepare_for_rendering(html, context)
end
- def markdown_field(object, field)
+ def markdown_field(object, field, context = {})
object = object.for_display if object.respond_to?(:for_display)
redacted_field_html = object.try(:"redacted_#{field}_html")
return '' unless object.present?
return redacted_field_html if redacted_field_html
- html = Banzai.render_field(object, field)
- prepare_for_rendering(html, object.banzai_render_context(field))
+ html = Banzai.render_field(object, field, context)
+ context.reverse_merge!(object.banzai_render_context(field)) if object.respond_to?(:banzai_render_context)
+
+ prepare_for_rendering(html, context)
end
def markup(file_name, text, context = {})
@@ -218,7 +226,7 @@ module MarkupHelper
data: data,
title: options[:title],
aria: { label: options[:title] } do
- icon(options[:icon])
+ sprite_icon(options[:icon])
end
end
diff --git a/app/models/clusters/providers/gcp.rb b/app/models/clusters/providers/gcp.rb
index 7700ba86f1a..c4391729dd7 100644
--- a/app/models/clusters/providers/gcp.rb
+++ b/app/models/clusters/providers/gcp.rb
@@ -55,7 +55,7 @@ module Clusters
before_transition any => [:creating] do |provider, transition|
operation_id = transition.args.first
- raise 'operation_id is required' unless operation_id
+ raise ArgumentError.new('operation_id is required') unless operation_id.present?
provider.operation_id = operation_id
end
diff --git a/app/models/concerns/ignorable_column.rb b/app/models/concerns/ignorable_column.rb
index eb9f3423e48..03793e8bcbb 100644
--- a/app/models/concerns/ignorable_column.rb
+++ b/app/models/concerns/ignorable_column.rb
@@ -21,8 +21,8 @@ module IgnorableColumn
@ignored_columns ||= Set.new
end
- def ignore_column(name)
- ignored_columns << name.to_s
+ def ignore_column(*names)
+ ignored_columns.merge(names.map(&:to_s))
end
end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 3133dc9e7eb..f80601f3484 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -8,7 +8,8 @@ class MergeRequest < ActiveRecord::Base
include CreatedAtFilterable
include TimeTrackable
- ignore_column :locked_at
+ ignore_column :locked_at,
+ :ref_fetched
belongs_to :target_project, class_name: "Project"
belongs_to :source_project, class_name: "Project"
@@ -426,7 +427,7 @@ class MergeRequest < ActiveRecord::Base
end
def create_merge_request_diff
- fetch_ref
+ fetch_ref!
# n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37435
Gitlab::GitalyClient.allow_n_plus_1_calls do
@@ -811,29 +812,14 @@ class MergeRequest < ActiveRecord::Base
end
end
- def fetch_ref
- write_ref
- update_column(:ref_fetched, true)
+ def fetch_ref!
+ target_project.repository.fetch_source_branch!(source_project.repository, source_branch, ref_path)
end
def ref_path
"refs/#{Repository::REF_MERGE_REQUEST}/#{iid}/head"
end
- def ref_fetched?
- super ||
- begin
- computed_value = project.repository.ref_exists?(ref_path)
- update_column(:ref_fetched, true) if computed_value
-
- computed_value
- end
- end
-
- def ensure_ref_fetched
- fetch_ref unless ref_fetched?
- end
-
def in_locked_state
begin
lock_mr
@@ -975,10 +961,4 @@ class MergeRequest < ActiveRecord::Base
project.merge_requests.merged.where(author_id: author_id).empty?
end
-
- private
-
- def write_ref
- target_project.repository.fetch_source_branch(source_project.repository, source_branch, ref_path)
- end
end
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 0601a61a926..4d401e7ba18 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -36,7 +36,7 @@ class Namespace < ActiveRecord::Base
validates :path,
presence: true,
length: { maximum: 255 },
- dynamic_path: true
+ namespace_path: true
validate :nesting_level_allowed
diff --git a/app/models/project.rb b/app/models/project.rb
index b91b6a2220f..d8607d04a98 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -242,10 +242,8 @@ class Project < ActiveRecord::Base
message: Gitlab::Regex.project_name_regex_message }
validates :path,
presence: true,
- dynamic_path: true,
+ project_path: true,
length: { maximum: 255 },
- format: { with: Gitlab::PathRegex.project_path_format_regex,
- message: Gitlab::PathRegex.project_path_format_message },
uniqueness: { scope: :namespace_id }
validates :namespace, presence: true
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 69cddb36b2e..ef715d982ae 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -969,8 +969,8 @@ class Repository
gitlab_shell.fetch_remote(raw_repository, remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags)
end
- def fetch_source_branch(source_repository, source_branch, local_ref)
- raw_repository.fetch_source_branch(source_repository.raw_repository, source_branch, local_ref)
+ def fetch_source_branch!(source_repository, source_branch, local_ref)
+ raw_repository.fetch_source_branch!(source_repository.raw_repository, source_branch, local_ref)
end
def compare_source_branch(target_branch_name, source_repository, source_branch_name, straight:)
diff --git a/app/models/user.rb b/app/models/user.rb
index bcda4564595..aa88cda4dc0 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -146,7 +146,7 @@ class User < ActiveRecord::Base
presence: true,
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: Gitlab::Database::MAX_INT_VALUE }
validates :username,
- dynamic_path: true,
+ user_path: true,
presence: true,
uniqueness: { case_sensitive: false }
@@ -164,7 +164,7 @@ class User < ActiveRecord::Base
before_validation :set_notification_email, if: :email_changed?
before_validation :set_public_email, if: :public_email_changed?
before_save :ensure_incoming_email_token
- before_save :ensure_user_rights_and_limits, if: :external_changed?
+ before_save :ensure_user_rights_and_limits, if: ->(user) { user.new_record? || user.external_changed? }
before_save :skip_reconfirmation!, if: ->(user) { user.email_changed? && user.read_only_attribute?(:email) }
before_save :check_for_verified_email, if: ->(user) { user.email_changed? && !user.new_record? }
after_save :ensure_namespace_correct
@@ -1139,8 +1139,9 @@ class User < ActiveRecord::Base
self.can_create_group = false
self.projects_limit = 0
else
- self.can_create_group = gitlab_config.default_can_create_group
- self.projects_limit = current_application_settings.default_projects_limit
+ # Only revert these back to the default if they weren't specifically changed in this update.
+ self.can_create_group = gitlab_config.default_can_create_group unless can_create_group_changed?
+ self.projects_limit = current_application_settings.default_projects_limit unless projects_limit_changed?
end
end
diff --git a/app/services/base_renderer.rb b/app/services/base_renderer.rb
new file mode 100644
index 00000000000..d6e30bd7008
--- /dev/null
+++ b/app/services/base_renderer.rb
@@ -0,0 +1,7 @@
+class BaseRenderer
+ attr_reader :current_user
+
+ def initialize(current_user = nil)
+ @current_user = current_user
+ end
+end
diff --git a/app/services/events/render_service.rb b/app/services/events/render_service.rb
new file mode 100644
index 00000000000..0b62d8aedf1
--- /dev/null
+++ b/app/services/events/render_service.rb
@@ -0,0 +1,21 @@
+module Events
+ class RenderService < BaseRenderer
+ def execute(events, atom_request: false)
+ events.map(&:note).compact.group_by(&:project).each do |project, notes|
+ render_notes(notes, project, atom_request)
+ end
+ end
+
+ private
+
+ def render_notes(notes, project, atom_request)
+ Notes::RenderService.new(current_user).execute(notes, project, render_options(atom_request))
+ end
+
+ def render_options(atom_request)
+ return {} unless atom_request
+
+ { only_path: false, xhtml: true }
+ end
+ end
+end
diff --git a/app/services/notes/render_service.rb b/app/services/notes/render_service.rb
new file mode 100644
index 00000000000..a77e98c2b07
--- /dev/null
+++ b/app/services/notes/render_service.rb
@@ -0,0 +1,21 @@
+module Notes
+ class RenderService < BaseRenderer
+ # Renders a collection of Note instances.
+ #
+ # notes - The notes to render.
+ # project - The project to use for redacting.
+ # user - The user viewing the notes.
+
+ # Possible options:
+ # requested_path - The request path.
+ # project_wiki - The project's wiki.
+ # ref - The current Git reference.
+ # only_path - flag to turn relative paths into absolute ones.
+ # xhtml - flag to save the html in XHTML
+ def execute(notes, project, **opts)
+ renderer = Banzai::ObjectRenderer.new(project, current_user, **opts)
+
+ renderer.render(notes, :note)
+ end
+ end
+end
diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb
index b6125cafa83..e694c5761da 100644
--- a/app/services/todo_service.rb
+++ b/app/services/todo_service.rb
@@ -31,12 +31,12 @@ class TodoService
mark_pending_todos_as_done(issue, current_user)
end
- # When we destroy an issue we should:
+ # When we destroy an issuable we should:
#
# * refresh the todos count cache for the current user
#
- def destroy_issue(issue, current_user)
- destroy_issuable(issue, current_user)
+ def destroy_issuable(issuable, user)
+ user.update_todos_count_cache
end
# When we reassign an issue we should:
@@ -72,14 +72,6 @@ class TodoService
mark_pending_todos_as_done(merge_request, current_user)
end
- # When we destroy a merge request we should:
- #
- # * refresh the todos count cache for the current user
- #
- def destroy_merge_request(merge_request, current_user)
- destroy_issuable(merge_request, current_user)
- end
-
# When we reassign a merge request we should:
#
# * creates a pending todo for new assignee if merge request is assigned
@@ -234,10 +226,6 @@ class TodoService
create_mention_todos(issuable.project, issuable, author, nil, skip_users)
end
- def destroy_issuable(issuable, user)
- user.update_todos_count_cache
- end
-
def toggling_tasks?(issuable)
issuable.previous_changes.include?('description') &&
issuable.tasks? && issuable.updated_tasks.any?
diff --git a/app/services/users/migrate_to_ghost_user_service.rb b/app/services/users/migrate_to_ghost_user_service.rb
index 3a9c151cf9b..976017dfa82 100644
--- a/app/services/users/migrate_to_ghost_user_service.rb
+++ b/app/services/users/migrate_to_ghost_user_service.rb
@@ -25,7 +25,7 @@ module Users
user.block
# Reverse the user block if record migration fails
- if !migrate_records && transition
+ if !migrate_records_in_transaction && transition
transition.rollback
user.save!
end
@@ -36,18 +36,22 @@ module Users
private
- def migrate_records
+ def migrate_records_in_transaction
user.transaction(requires_new: true) do
@ghost_user = User.ghost
- migrate_issues
- migrate_merge_requests
- migrate_notes
- migrate_abuse_reports
- migrate_award_emojis
+ migrate_records
end
end
+ def migrate_records
+ migrate_issues
+ migrate_merge_requests
+ migrate_notes
+ migrate_abuse_reports
+ migrate_award_emojis
+ end
+
def migrate_issues
user.issues.update_all(author_id: ghost_user.id)
Issue.where(last_edited_by_id: user.id).update_all(last_edited_by_id: ghost_user.id)
diff --git a/app/validators/abstract_path_validator.rb b/app/validators/abstract_path_validator.rb
new file mode 100644
index 00000000000..adbccb65a84
--- /dev/null
+++ b/app/validators/abstract_path_validator.rb
@@ -0,0 +1,38 @@
+class AbstractPathValidator < ActiveModel::EachValidator
+ extend Gitlab::EncodingHelper
+
+ def self.path_regex
+ raise NotImplementedError
+ end
+
+ def self.format_regex
+ raise NotImplementedError
+ end
+
+ def self.format_error_message
+ raise NotImplementedError
+ end
+
+ def self.full_path(record, value)
+ value
+ end
+
+ def self.valid_path?(path)
+ encode!(path)
+ "#{path}/" =~ path_regex
+ end
+
+ def validate_each(record, attribute, value)
+ unless value =~ self.class.format_regex
+ record.errors.add(attribute, self.class.format_error_message)
+ return
+ end
+
+ full_path = self.class.full_path(record, value)
+ return unless full_path
+
+ unless self.class.valid_path?(full_path)
+ record.errors.add(attribute, "#{value} is a reserved name")
+ end
+ end
+end
diff --git a/app/validators/dynamic_path_validator.rb b/app/validators/dynamic_path_validator.rb
deleted file mode 100644
index 4688aabc2a8..00000000000
--- a/app/validators/dynamic_path_validator.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# DynamicPathValidator
-#
-# Custom validator for GitLab path values.
-# These paths are assigned to `Namespace` (& `Group` as a subclass) & `Project`
-#
-# Values are checked for formatting and exclusion from a list of illegal path
-# names.
-class DynamicPathValidator < ActiveModel::EachValidator
- extend Gitlab::EncodingHelper
-
- class << self
- def valid_user_path?(path)
- encode!(path)
- "#{path}/" =~ Gitlab::PathRegex.root_namespace_path_regex
- end
-
- def valid_group_path?(path)
- encode!(path)
- "#{path}/" =~ Gitlab::PathRegex.full_namespace_path_regex
- end
-
- def valid_project_path?(path)
- encode!(path)
- "#{path}/" =~ Gitlab::PathRegex.full_project_path_regex
- end
- end
-
- def path_valid_for_record?(record, value)
- full_path = record.respond_to?(:build_full_path) ? record.build_full_path : value
-
- return true unless full_path
-
- case record
- when Project
- self.class.valid_project_path?(full_path)
- when Group
- self.class.valid_group_path?(full_path)
- else # User or non-Group Namespace
- self.class.valid_user_path?(full_path)
- end
- end
-
- def validate_each(record, attribute, value)
- unless value =~ Gitlab::PathRegex.namespace_format_regex
- record.errors.add(attribute, Gitlab::PathRegex.namespace_format_message)
- return
- end
-
- unless path_valid_for_record?(record, value)
- record.errors.add(attribute, "#{value} is a reserved name")
- end
- end
-end
diff --git a/app/validators/namespace_path_validator.rb b/app/validators/namespace_path_validator.rb
new file mode 100644
index 00000000000..4a0aa64ae0c
--- /dev/null
+++ b/app/validators/namespace_path_validator.rb
@@ -0,0 +1,19 @@
+class NamespacePathValidator < AbstractPathValidator
+ extend Gitlab::EncodingHelper
+
+ def self.path_regex
+ Gitlab::PathRegex.full_namespace_path_regex
+ end
+
+ def self.format_regex
+ Gitlab::PathRegex.namespace_format_regex
+ end
+
+ def self.format_error_message
+ Gitlab::PathRegex.namespace_format_message
+ end
+
+ def self.full_path(record, value)
+ record.build_full_path
+ end
+end
diff --git a/app/validators/project_path_validator.rb b/app/validators/project_path_validator.rb
new file mode 100644
index 00000000000..829b596ad3c
--- /dev/null
+++ b/app/validators/project_path_validator.rb
@@ -0,0 +1,19 @@
+class ProjectPathValidator < AbstractPathValidator
+ extend Gitlab::EncodingHelper
+
+ def self.path_regex
+ Gitlab::PathRegex.full_project_path_regex
+ end
+
+ def self.format_regex
+ Gitlab::PathRegex.project_path_format_regex
+ end
+
+ def self.format_error_message
+ Gitlab::PathRegex.project_path_format_message
+ end
+
+ def self.full_path(record, value)
+ record.build_full_path
+ end
+end
diff --git a/app/validators/user_path_validator.rb b/app/validators/user_path_validator.rb
new file mode 100644
index 00000000000..adf02901802
--- /dev/null
+++ b/app/validators/user_path_validator.rb
@@ -0,0 +1,15 @@
+class UserPathValidator < AbstractPathValidator
+ extend Gitlab::EncodingHelper
+
+ def self.path_regex
+ Gitlab::PathRegex.root_namespace_path_regex
+ end
+
+ def self.format_regex
+ Gitlab::PathRegex.namespace_format_regex
+ end
+
+ def self.format_error_message
+ Gitlab::PathRegex.namespace_format_message
+ end
+end
diff --git a/app/views/admin/background_jobs/show.html.haml b/app/views/admin/background_jobs/show.html.haml
index 3ef8f2a3acb..f0cc4d7ee62 100644
--- a/app/views/admin/background_jobs/show.html.haml
+++ b/app/views/admin/background_jobs/show.html.haml
@@ -42,4 +42,4 @@
.panel.panel-default
- %iframe{ src: sidekiq_path, width: '100%', height: 970, style: "border: none" }
+ %iframe{ src: sidekiq_path, width: '100%', height: 970, style: "border: 0" }
diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml
index 38fd053ae65..efe1fb99efc 100644
--- a/app/views/dashboard/todos/_todo.html.haml
+++ b/app/views/dashboard/todos/_todo.html.haml
@@ -36,7 +36,7 @@
.todo-body
.todo-note
.md
- = event_note(todo.body, project: todo.project)
+ = first_line_in_markdown(todo, :body, 150, project: todo.project)
- if todo.pending?
.todo-actions
diff --git a/app/views/events/_event_note.atom.haml b/app/views/events/_event_note.atom.haml
index 6fa2f9bd4db..7e264eb5575 100644
--- a/app/views/events/_event_note.atom.haml
+++ b/app/views/events/_event_note.atom.haml
@@ -1,2 +1,2 @@
%div{ xmlns: "http://www.w3.org/1999/xhtml" }
- = markdown(note.note, pipeline: :atom, project: note.project, author: note.author)
+ = markdown_field(note, :note)
diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml
index df4b9562215..de6383e4097 100644
--- a/app/views/events/event/_note.html.haml
+++ b/app/views/events/event/_note.html.haml
@@ -10,7 +10,7 @@
.event-body
.event-note
.md
- = event_note(event.target.note, project: event.project)
+ = first_line_in_markdown(event.target, :note, 150, project: event.project)
- note = event.target
- if note.attachment.url
- if note.attachment.image?
diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml
index 770608eddff..f8a2ea18989 100644
--- a/app/views/projects/_md_preview.html.haml
+++ b/app/views/projects/_md_preview.html.haml
@@ -19,16 +19,16 @@
%li.pull-right
.toolbar-group
- = markdown_toolbar_button({ icon: "bold fw", data: { "md-tag" => "**" }, title: "Add bold text" })
- = markdown_toolbar_button({ icon: "italic fw", data: { "md-tag" => "*" }, title: "Add italic text" })
- = markdown_toolbar_button({ icon: "quote-right fw", data: { "md-tag" => "> ", "md-prepend" => true }, title: "Insert a quote" })
- = markdown_toolbar_button({ icon: "code fw", data: { "md-tag" => "`", "md-block" => "```" }, title: "Insert code" })
- = markdown_toolbar_button({ icon: "list-ul fw", data: { "md-tag" => "* ", "md-prepend" => true }, title: "Add a bullet list" })
- = markdown_toolbar_button({ icon: "list-ol fw", data: { "md-tag" => "1. ", "md-prepend" => true }, title: "Add a numbered list" })
- = markdown_toolbar_button({ icon: "check-square-o fw", data: { "md-tag" => "* [ ] ", "md-prepend" => true }, title: "Add a task list" })
+ = markdown_toolbar_button({ icon: "bold", data: { "md-tag" => "**" }, title: "Add bold text" })
+ = markdown_toolbar_button({ icon: "italic", data: { "md-tag" => "*" }, title: "Add italic text" })
+ = markdown_toolbar_button({ icon: "quote", data: { "md-tag" => "> ", "md-prepend" => true }, title: "Insert a quote" })
+ = markdown_toolbar_button({ icon: "code", data: { "md-tag" => "`", "md-block" => "```" }, title: "Insert code" })
+ = markdown_toolbar_button({ icon: "list-bulleted", data: { "md-tag" => "* ", "md-prepend" => true }, title: "Add a bullet list" })
+ = markdown_toolbar_button({ icon: "list-numbered", data: { "md-tag" => "1. ", "md-prepend" => true }, title: "Add a numbered list" })
+ = markdown_toolbar_button({ icon: "task-done", data: { "md-tag" => "* [ ] ", "md-prepend" => true }, title: "Add a task list" })
.toolbar-group
%button.toolbar-btn.js-zen-enter.has-tooltip{ type: "button", tabindex: -1, aria: { label: "Go full screen" }, title: "Go full screen", data: { container: "body" } }
- = icon("arrows-alt fw")
+ = sprite_icon("screen-full")
.md-write-holder
= yield
diff --git a/app/views/projects/commit/_ajax_signature.html.haml b/app/views/projects/commit/_ajax_signature.html.haml
index 83821326aec..1d6a0fa38ca 100644
--- a/app/views/projects/commit/_ajax_signature.html.haml
+++ b/app/views/projects/commit/_ajax_signature.html.haml
@@ -1,2 +1,2 @@
- if commit.has_signature?
- %button{ class: commit_signature_badge_classes('js-loading-gpg-badge'), data: { toggle: 'tooltip', placement: 'auto top', title: 'GPG signature (loading...)', 'commit-sha' => commit.sha } }
+ %a{ href: '#', tabindex: 0, class: commit_signature_badge_classes('js-loading-gpg-badge'), data: { toggle: 'tooltip', placement: 'auto top', title: 'GPG signature (loading...)', 'commit-sha' => commit.sha } }
diff --git a/app/views/projects/commit/_signature_badge.html.haml b/app/views/projects/commit/_signature_badge.html.haml
index edff018ba6d..b6b7aae6f9a 100644
--- a/app/views/projects/commit/_signature_badge.html.haml
+++ b/app/views/projects/commit/_signature_badge.html.haml
@@ -24,5 +24,5 @@
= link_to('Learn more about signing commits', help_page_path('user/project/repository/gpg_signed_commits/index.md'), class: 'gpg-popover-help-link')
-%button{ class: css_classes, data: { toggle: 'popover', html: 'true', placement: 'auto top', title: title, content: content } }
+%a{ href: '#', tabindex: 0, class: css_classes, data: { toggle: 'popover', html: 'true', placement: 'auto top', title: title, content: content } }
= label
diff --git a/app/views/projects/issues/_new_branch.html.haml b/app/views/projects/issues/_new_branch.html.haml
index e1b4a49850a..4f78102be0c 100644
--- a/app/views/projects/issues/_new_branch.html.haml
+++ b/app/views/projects/issues/_new_branch.html.haml
@@ -1,3 +1,7 @@
+- can_create_merge_request = can?(current_user, :create_merge_request, @project)
+- data_action = can_create_merge_request ? 'create-mr' : 'create-branch'
+- value = can_create_merge_request ? 'Create a merge request' : 'Create a branch'
+
- if can?(current_user, :push_code, @project)
.create-mr-dropdown-wrap{ data: { can_create_path: can_create_branch_project_issue_path(@project, @issue), create_mr_path: create_merge_request_project_issue_path(@project, @issue), create_branch_path: project_branches_path(@project, branch_name: @issue.to_branch_name, issue_iid: @issue.iid) } }
.btn-group.unavailable
@@ -6,20 +10,21 @@
%span.text
Checking branch availability…
.btn-group.available.hide
- %input.btn.js-create-merge-request.btn-inverted.btn-success{ type: 'button', value: 'Create a merge request', data: { action: 'create-mr' } }
+ %input.btn.js-create-merge-request.btn-inverted.btn-success{ type: 'button', value: value, data: { action: data_action } }
%button.btn.btn-inverted.dropdown-toggle.btn-inverted.btn-success.js-dropdown-toggle{ type: 'button', data: { 'dropdown-trigger' => '#create-merge-request-dropdown' } }
= icon('caret-down')
%ul#create-merge-request-dropdown.dropdown-menu.dropdown-menu-align-right{ data: { dropdown: true } }
- %li.droplab-item-selected{ role: 'button', data: { value: 'create-mr', 'text' => 'Create a merge request' } }
- .menu-item
- .icon-container
- = icon('check')
- .description
- %strong Create a merge request
- %span
- Creates a merge request named after this issue, with source branch created from '#{@project.default_branch}'.
- %li.divider.droplab-item-ignore
- %li{ role: 'button', data: { value: 'create-branch', 'text' => 'Create a branch' } }
+ - if can_create_merge_request
+ %li.droplab-item-selected{ role: 'button', data: { value: 'create-mr', 'text' => 'Create a merge request' } }
+ .menu-item
+ .icon-container
+ = icon('check')
+ .description
+ %strong Create a merge request
+ %span
+ Creates a merge request named after this issue, with source branch created from '#{@project.default_branch}'.
+ %li.divider.droplab-item-ignore
+ %li{ class: [!can_create_merge_request && 'droplab-item-selected'], role: 'button', data: { value: 'create-branch', 'text' => 'Create a branch' } }
.menu-item
.icon-container
= icon('check')
diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml
index 1927216e191..467f19b4c56 100644
--- a/app/views/projects/tags/_tag.html.haml
+++ b/app/views/projects/tags/_tag.html.haml
@@ -7,7 +7,7 @@
- if protected_tag?(@project, tag)
%span.label.label-success.prepend-left-4
- protected
+ = s_('TagsPage|protected')
- if tag.message.present?
@@ -18,7 +18,7 @@
= render 'projects/branches/commit', commit: commit, project: @project
- else
%p
- Cant find HEAD commit for this tag
+ = s_("TagsPage|Can't find HEAD commit for this tag")
- if release && release.description.present?
.description.prepend-top-default
.wiki
@@ -28,9 +28,9 @@
= render 'projects/buttons/download', project: @project, ref: tag.name, pipeline: @tags_pipelines[tag.name]
- if can?(current_user, :push_code, @project)
- = link_to edit_project_tag_release_path(@project, tag.name), class: 'btn has-tooltip', title: "Edit release notes", data: { container: "body" } do
+ = link_to edit_project_tag_release_path(@project, tag.name), class: 'btn has-tooltip', title: s_('TagsPage|Edit release notes'), data: { container: "body" } do
= icon("pencil")
- if can?(current_user, :admin_project, @project)
- = link_to project_tag_path(@project, tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, tag) ? 'disabled' : ''}", title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{tag.name}' tag cannot be undone. Are you sure?", container: 'body' }, remote: true do
+ = link_to project_tag_path(@project, tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, tag) ? 'disabled' : ''}", title: s_('TagsPage|Delete tag'), method: :delete, data: { confirm: s_('TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?') % { tag_name: tag.name }, container: 'body' }, remote: true do
= icon("trash-o")
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index 27d58d4c0e8..fd3b8c01b83 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -1,16 +1,16 @@
- @no_container = true
- @sort ||= sort_value_recently_updated
-- page_title "Tags"
+- page_title _('TagsPage|Tags')
- add_to_breadcrumbs("Repository", project_tree_path(@project))
.flex-list{ class: container_class }
.top-area.adjust
.nav-text.row-main-content
- Tags give the ability to mark specific points in history as being important
+ = s_('TagsPage|Tags give the ability to mark specific points in history as being important')
.nav-controls.row-fixed-content
= form_tag(filter_tags_path, method: :get) do
- = search_field_tag :search, params[:search], { placeholder: 'Filter by tag name', id: 'tag-search', class: 'form-control search-text-input input-short', spellcheck: false }
+ = search_field_tag :search, params[:search], { placeholder: s_('TagsPage|Filter by tag name'), id: 'tag-search', class: 'form-control search-text-input input-short', spellcheck: false }
.dropdown
%button.dropdown-toggle{ type: 'button', data: { toggle: 'dropdown'} }
@@ -19,13 +19,13 @@
= icon('chevron-down')
%ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable
%li.dropdown-header
- Sort by
+ = s_('TagsPage|Sort by')
- tags_sort_options_hash.each do |value, title|
%li
= link_to title, filter_tags_path(sort: value), class: ("is-active" if @sort == value)
- if can?(current_user, :push_code, @project)
= link_to new_project_tag_path(@project), class: 'btn btn-create new-tag-btn' do
- New tag
+ = s_('TagsPage|New tag')
.tags
- if @tags.any?
@@ -36,9 +36,9 @@
- else
.nothing-here-block
- Repository has no tags yet.
+ = s_('TagsPage|Repository has no tags yet.')
%br
%small
- Use git tag command to add a new one:
+ = s_('TagsPage|Use git tag command to add a new one:')
%br
%span.monospace git tag -a v1.4 -m 'version 1.4'
diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml
index 521b4d927bc..3e99e0e8234 100644
--- a/app/views/projects/tags/new.html.haml
+++ b/app/views/projects/tags/new.html.haml
@@ -1,4 +1,4 @@
-- page_title "New Tag"
+- page_title s_('TagsPage|New Tag')
- default_ref = params[:ref] || @project.default_branch
- if @error
@@ -7,7 +7,7 @@
= @error
%h3.page-title
- New Tag
+ = s_('TagsPage|New Tag')
%hr
= form_tag namespace_project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal common-note-form tag-form js-quick-submit js-requires-input" do
@@ -23,20 +23,23 @@
= button_tag type: 'button', title: default_ref, class: 'dropdown-menu-toggle wide form-control js-branch-select', required: true, data: { toggle: 'dropdown', selected: default_ref, field_name: 'ref' } do
.text-left.dropdown-toggle-text= default_ref
= render 'shared/ref_dropdown', dropdown_class: 'wide'
- .help-block Existing branch name, tag, or commit SHA
+ .help-block
+ = s_('TagsPage|Existing branch name, tag, or commit SHA')
.form-group
= label_tag :message, nil, class: 'control-label'
.col-sm-10
= text_area_tag :message, @message, required: false, tabindex: 3, class: 'form-control', rows: 5
- .help-block Optionally, add a message to the tag.
+ .help-block
+ = s_('TagsPage|Optionally, add a message to the tag.')
%hr
.form-group
= label_tag :release_description, 'Release notes', class: 'control-label'
.col-sm-10
= render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do
- = render 'projects/zen', attr: :release_description, classes: 'note-textarea', placeholder: "Write your release notes or drag files here...", current_text: @release_description
+ = render 'projects/zen', attr: :release_description, classes: 'note-textarea', placeholder: s_('TagsPage|Write your release notes or drag files here...'), current_text: @release_description
= render 'shared/notes/hints'
- .help-block Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page.
+ .help-block
+ = s_('TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page.')
.form-actions
= button_tag 'Create tag', class: 'btn btn-create', tabindex: 3
= link_to 'Cancel', project_tags_path(@project), class: 'btn btn-cancel'
diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml
index 43aa2b27af6..dfe2c37ed8e 100644
--- a/app/views/projects/tags/show.html.haml
+++ b/app/views/projects/tags/show.html.haml
@@ -1,7 +1,7 @@
- @no_container = true
-- add_to_breadcrumbs "Tags", project_tags_path(@project)
+- add_to_breadcrumbs s_('TagsPage|Tags'), project_tags_path(@project)
- breadcrumb_title @tag.name
-- page_title @tag.name, "Tags"
+- page_title @tag.name, s_('TagsPage|Tags')
%div{ class: container_class }
.top-area.multi-line
@@ -12,25 +12,25 @@
= @tag.name
- if protected_tag?(@project, @tag)
%span.label.label-success
- protected
+ = s_('TagsPage|protected')
- if @commit
= render 'projects/branches/commit', commit: @commit, project: @project
- else
- Cant find HEAD commit for this tag
+ = s_("TagsPage|Can't find HEAD commit for this tag")
.nav-controls.controls-flex
- if can?(current_user, :push_code, @project)
- = link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: 'Edit release notes' do
+ = link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Edit release notes') do
= icon("pencil")
- = link_to project_tree_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: 'Browse files' do
+ = link_to project_tree_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Browse files') do
= icon('files-o')
- = link_to project_commits_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: 'Browse commits' do
+ = link_to project_commits_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Browse commits') do
= icon('history')
.btn-container.controls-item
= render 'projects/buttons/download', project: @project, ref: @tag.name
- if can?(current_user, :admin_project, @project)
.btn-container.controls-item-full
- = link_to project_tag_path(@project, @tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, @tag) ? 'disabled' : ''}", title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{@tag.name}' tag cannot be undone. Are you sure?" } do
+ = link_to project_tag_path(@project, @tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, @tag) ? 'disabled' : ''}", title: s_('TagsPage|Delete tag'), method: :delete, data: { confirm: s_('TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?') % { tag_name: @tag.name } } do
%i.fa.fa-trash-o
- if @tag.message.present?
@@ -43,4 +43,4 @@
.wiki
= markdown_field(@release, :description)
- else
- This tag has no release notes.
+ = s_('TagsPage|This tag has no release notes.')
diff --git a/changelogs/unreleased/27375-dashboard-activity-performance.yml b/changelogs/unreleased/27375-dashboard-activity-performance.yml
new file mode 100644
index 00000000000..87c6197a24d
--- /dev/null
+++ b/changelogs/unreleased/27375-dashboard-activity-performance.yml
@@ -0,0 +1,5 @@
+---
+title: Improve DashboardController#activity.json performance
+merge_request: 14985
+author:
+type: performance
diff --git a/changelogs/unreleased/38247-hide-create-mr-button-in-issue-show.yml b/changelogs/unreleased/38247-hide-create-mr-button-in-issue-show.yml
new file mode 100644
index 00000000000..57ddd8f8388
--- /dev/null
+++ b/changelogs/unreleased/38247-hide-create-mr-button-in-issue-show.yml
@@ -0,0 +1,5 @@
+---
+title: Remove create MR button from issues when MRs are disabled
+merge_request: 15071
+author: George Andrinopoulos
+type: fixed
diff --git a/changelogs/unreleased/38385-gpg-tooltips-not-working-in-safari.yml b/changelogs/unreleased/38385-gpg-tooltips-not-working-in-safari.yml
new file mode 100644
index 00000000000..c7e840f0723
--- /dev/null
+++ b/changelogs/unreleased/38385-gpg-tooltips-not-working-in-safari.yml
@@ -0,0 +1,5 @@
+---
+title: Fix GPG signature popup info in Safari and Firefox
+merge_request: 15228
+author:
+type: fixed
diff --git a/changelogs/unreleased/38589-internationalize-tags-page.yml b/changelogs/unreleased/38589-internationalize-tags-page.yml
new file mode 100644
index 00000000000..4af3da8c23c
--- /dev/null
+++ b/changelogs/unreleased/38589-internationalize-tags-page.yml
@@ -0,0 +1,5 @@
+---
+title: Internationalized tags page
+merge_request: 38589
+author:
+type: other
diff --git a/changelogs/unreleased/39668-tooltip-safari.yml b/changelogs/unreleased/39668-tooltip-safari.yml
new file mode 100644
index 00000000000..5a0f677cf10
--- /dev/null
+++ b/changelogs/unreleased/39668-tooltip-safari.yml
@@ -0,0 +1,5 @@
+---
+title: Remove native title tooltip in pipeline jobs dropdown in Safari
+merge_request:
+author:
+type: fixed
diff --git a/changelogs/unreleased/39757-border-zero-of-scss-lint.yml b/changelogs/unreleased/39757-border-zero-of-scss-lint.yml
new file mode 100644
index 00000000000..ef0ac6c7df9
--- /dev/null
+++ b/changelogs/unreleased/39757-border-zero-of-scss-lint.yml
@@ -0,0 +1,5 @@
+---
+title: Enable BorderZero rule in scss-lint
+merge_request: 15168
+author: Takuya Noguchi
+type: other
diff --git a/changelogs/unreleased/dm-block-group-and-project-creation-when-external-by-default.yml b/changelogs/unreleased/dm-block-group-and-project-creation-when-external-by-default.yml
new file mode 100644
index 00000000000..42bcf9b1edd
--- /dev/null
+++ b/changelogs/unreleased/dm-block-group-and-project-creation-when-external-by-default.yml
@@ -0,0 +1,6 @@
+---
+title: Make sure group and project creation is blocked for new users that are external
+ by default
+merge_request:
+author:
+type: fixed
diff --git a/changelogs/unreleased/dm-reallow-project-path-ending-in-period.yml b/changelogs/unreleased/dm-reallow-project-path-ending-in-period.yml
new file mode 100644
index 00000000000..ad41d9b84c3
--- /dev/null
+++ b/changelogs/unreleased/dm-reallow-project-path-ending-in-period.yml
@@ -0,0 +1,5 @@
+---
+title: Reallow project paths ending in periods
+merge_request:
+author:
+type: fixed
diff --git a/changelogs/unreleased/expose-job-duration.yml b/changelogs/unreleased/expose-job-duration.yml
new file mode 100644
index 00000000000..1fe5d897d47
--- /dev/null
+++ b/changelogs/unreleased/expose-job-duration.yml
@@ -0,0 +1,5 @@
+---
+title: Expose duration in Job entity
+merge_request: 13644
+author: Mehdi Lahmam (@mehlah)
+type: added
diff --git a/changelogs/unreleased/fix-md-form-tabs-double-click-toggle.yml b/changelogs/unreleased/fix-md-form-tabs-double-click-toggle.yml
new file mode 100644
index 00000000000..0ec9bcbcde2
--- /dev/null
+++ b/changelogs/unreleased/fix-md-form-tabs-double-click-toggle.yml
@@ -0,0 +1,6 @@
+---
+title: Fix markdown form tabs toggling preview mode from double clicking write mode
+ button
+merge_request: 15119
+author:
+type: fixed
diff --git a/changelogs/unreleased/jej-fs-prevent-push-when-missing-objects.yml b/changelogs/unreleased/jej-fs-prevent-push-when-missing-objects.yml
new file mode 100644
index 00000000000..4eeedec2c99
--- /dev/null
+++ b/changelogs/unreleased/jej-fs-prevent-push-when-missing-objects.yml
@@ -0,0 +1,5 @@
+---
+title: Prevent git push when LFS objects are missing
+merge_request: 13837
+author:
+type: added
diff --git a/changelogs/unreleased/pawel-metrics-to-prometheus-33643.yml b/changelogs/unreleased/pawel-metrics-to-prometheus-33643.yml
new file mode 100644
index 00000000000..abab2e55f90
--- /dev/null
+++ b/changelogs/unreleased/pawel-metrics-to-prometheus-33643.yml
@@ -0,0 +1,5 @@
+---
+title: Add Prometheus equivalent of all InfluxDB metrics
+merge_request: 13891
+author:
+type: changed
diff --git a/changelogs/unreleased/pawel-show_empty_page_when_prometheus_metrics_are_disabled-35639.yml b/changelogs/unreleased/pawel-show_empty_page_when_prometheus_metrics_are_disabled-35639.yml
new file mode 100644
index 00000000000..987f7286244
--- /dev/null
+++ b/changelogs/unreleased/pawel-show_empty_page_when_prometheus_metrics_are_disabled-35639.yml
@@ -0,0 +1,5 @@
+---
+title: Make Prometheus metrics endpoint return empty response when metrics are disabled
+merge_request: 14490
+author:
+type: changed
diff --git a/changelogs/unreleased/remove-ensure-ref-fetched-from-controllers.yml b/changelogs/unreleased/remove-ensure-ref-fetched-from-controllers.yml
new file mode 100644
index 00000000000..57f54bec1e6
--- /dev/null
+++ b/changelogs/unreleased/remove-ensure-ref-fetched-from-controllers.yml
@@ -0,0 +1,5 @@
+---
+title: Stop merge requests from fetching their refs when the data is already available.
+merge_request: 15129
+author:
+type: removed
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 12694f8016f..d1156b0c8a8 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -535,6 +535,7 @@ Settings.webpack.dev_server['port'] ||= 3808
Settings['monitoring'] ||= Settingslogic.new({})
Settings.monitoring['ip_whitelist'] ||= ['127.0.0.1/8']
Settings.monitoring['unicorn_sampler_interval'] ||= 10
+Settings.monitoring['ruby_sampler_interval'] ||= 60
Settings.monitoring['sidekiq_exporter'] ||= Settingslogic.new({})
Settings.monitoring.sidekiq_exporter['enabled'] ||= false
Settings.monitoring.sidekiq_exporter['address'] ||= 'localhost'
diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb
index 31839297523..e8f33593fe0 100644
--- a/config/initializers/7_prometheus_metrics.rb
+++ b/config/initializers/7_prometheus_metrics.rb
@@ -11,7 +11,15 @@ Prometheus::Client.configure do |config|
config.multiprocess_files_dir ||= Rails.root.join('tmp/prometheus_multiproc_dir')
end
- config.pid_provider = Prometheus::Client::Support::Unicorn.method(:worker_pid_provider)
+ config.pid_provider = -> do
+ wid = Prometheus::Client::Support::Unicorn.worker_id
+ wid = Process.pid if wid.nil?
+ if wid.nil?
+ "process_pid_#{Process.pid}"
+ else
+ "worker_id_#{wid}"
+ end
+ end
end
Sidekiq.configure_server do |config|
@@ -19,3 +27,11 @@ Sidekiq.configure_server do |config|
Gitlab::Metrics::SidekiqMetricsExporter.instance.start
end
end
+
+if Gitlab::Metrics.prometheus_metrics_enabled?
+ unless Sidekiq.server?
+ Gitlab::Metrics::Samplers::UnicornSampler.initialize_instance(Settings.monitoring.unicorn_sampler_interval).start
+ end
+
+ Gitlab::Metrics::Samplers::RubySampler.initialize_instance(Settings.monitoring.ruby_sampler_interval).start
+end
diff --git a/config/initializers/8_metrics.rb b/config/initializers/8_metrics.rb
index 2d8704622b6..7ef594836d6 100644
--- a/config/initializers/8_metrics.rb
+++ b/config/initializers/8_metrics.rb
@@ -77,7 +77,6 @@ def instrument_classes(instrumentation)
instrumentation.instrument_instance_methods(Banzai::ObjectRenderer)
instrumentation.instrument_instance_methods(Banzai::Redactor)
- instrumentation.instrument_methods(Banzai::NoteRenderer)
[Issuable, Mentionable, Participable].each do |klass|
instrumentation.instrument_instance_methods(klass)
@@ -116,17 +115,9 @@ def instrument_classes(instrumentation)
# Needed for https://gitlab.com/gitlab-org/gitlab-ce/issues/30224#note_32306159
instrumentation.instrument_instance_method(MergeRequestDiff, :load_commits)
-
- # Needed for https://gitlab.com/gitlab-org/gitlab-ce/issues/36061
- instrumentation.instrument_instance_method(MergeRequest, :ensure_ref_fetched)
- instrumentation.instrument_instance_method(MergeRequest, :fetch_ref)
end
# rubocop:enable Metrics/AbcSize
-unless Sidekiq.server?
- Gitlab::Metrics::UnicornSampler.initialize_instance(Settings.monitoring.unicorn_sampler_interval).start
-end
-
Gitlab::Application.configure do |config|
# 0 should be Sentry to catch errors in this middleware
config.middleware.insert(1, Gitlab::Metrics::RequestsRackMiddleware)
@@ -192,7 +183,7 @@ if Gitlab::Metrics.enabled?
GC::Profiler.enable
- Gitlab::Metrics::InfluxSampler.initialize_instance.start
+ Gitlab::Metrics::Samplers::InfluxSampler.initialize_instance.start
module TrackNewRedisConnections
def connect(*args)
diff --git a/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb b/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb
new file mode 100644
index 00000000000..4e8f495d65d
--- /dev/null
+++ b/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb
@@ -0,0 +1,14 @@
+class RemoveRefFetchedFromMergeRequests < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ # We don't need to cache this anymore: the refs are now created
+ # upon save/update and there is no more use for this flag
+ #
+ # See https://gitlab.com/gitlab-org/gitlab-ce/issues/36061
+ def change
+ remove_column :merge_requests, :ref_fetched, :boolean
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index f88abaab86e..c58555f664f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20171026082505) do
+ActiveRecord::Schema.define(version: 20171101134435) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -1027,7 +1027,6 @@ ActiveRecord::Schema.define(version: 20171026082505) do
t.datetime "last_edited_at"
t.integer "last_edited_by_id"
t.integer "head_pipeline_id"
- t.boolean "ref_fetched"
t.string "merge_jid"
t.boolean "discussion_locked"
t.integer "latest_merge_request_diff_id"
diff --git a/doc/administration/logs.md b/doc/administration/logs.md
index c9ed2d84ccb..debaa2330d0 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -192,4 +192,13 @@ installations from source.
It logs information whenever a [repository check is run][repocheck] on a project.
+## Reconfigure Logs
+
+Reconfigure log files live in `/var/log/gitlab/reconfigure` for Omnibus GitLab
+packages. Installations from source don't have reconfigure logs. A reconfigure log
+is populated whenever `gitlab-ctl reconfigure` is run manually or as part of an upgrade.
+
+Reconfigure logs files are named according to the UNIX timestamp of when the reconfigure
+was initiated, such as `1509705644.log`
+
[repocheck]: repository_checks.md
diff --git a/doc/development/ux_guide/resources.md b/doc/development/ux_guide/resources.md
index 2f760c94414..db57258237f 100644
--- a/doc/development/ux_guide/resources.md
+++ b/doc/development/ux_guide/resources.md
@@ -10,4 +10,8 @@ you can use during GitLab development.
## Design repository
All design files are stored in the [gitlab-design](https://gitlab.com/gitlab-org/gitlab-design)
-repository and maintained by GitLab UX designers.
\ No newline at end of file
+repository and maintained by GitLab UX designers.
+
+## [brand.ai](https://brand.ai/git-lab/primary-brand)
+
+We are in the process of capturing our UI paradigms on brand.ai, see https://brand.ai/git-lab/primary-brand
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 67cecb6a7ad..398a7906dcb 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -822,6 +822,7 @@ module API
class Job < Grape::Entity
expose :id, :status, :stage, :name, :ref, :tag, :coverage
expose :created_at, :started_at, :finished_at
+ expose :duration
expose :user, with: User
expose :artifacts_file, using: JobArtifactFile, if: -> (job, opts) { job.artifacts? }
expose :commit, with: Commit
diff --git a/lib/banzai.rb b/lib/banzai.rb
index 35ca234c1ba..5df98f66f3b 100644
--- a/lib/banzai.rb
+++ b/lib/banzai.rb
@@ -3,8 +3,8 @@ module Banzai
Renderer.render(text, context)
end
- def self.render_field(object, field)
- Renderer.render_field(object, field)
+ def self.render_field(object, field, context = {})
+ Renderer.render_field(object, field, context)
end
def self.cache_collection_render(texts_and_contexts)
diff --git a/lib/banzai/filter/absolute_link_filter.rb b/lib/banzai/filter/absolute_link_filter.rb
new file mode 100644
index 00000000000..1ec6201523f
--- /dev/null
+++ b/lib/banzai/filter/absolute_link_filter.rb
@@ -0,0 +1,34 @@
+require 'uri'
+
+module Banzai
+ module Filter
+ # HTML filter that converts relative urls into absolute ones.
+ class AbsoluteLinkFilter < HTML::Pipeline::Filter
+ def call
+ return doc unless context[:only_path] == false
+
+ doc.search('a.gfm').each do |el|
+ process_link_attr el.attribute('href')
+ end
+
+ doc
+ end
+
+ protected
+
+ def process_link_attr(html_attr)
+ return if html_attr.blank?
+ return if html_attr.value.start_with?('//')
+
+ uri = URI(html_attr.value)
+ html_attr.value = absolute_link_attr(uri) if uri.relative?
+ rescue URI::Error
+ # noop
+ end
+
+ def absolute_link_attr(uri)
+ URI.join(Gitlab.config.gitlab.url, uri).to_s
+ end
+ end
+ end
+end
diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb
index a0f7e4e5ad5..9fef386de16 100644
--- a/lib/banzai/filter/abstract_reference_filter.rb
+++ b/lib/banzai/filter/abstract_reference_filter.rb
@@ -311,30 +311,6 @@ module Banzai
def project_refs_cache
RequestStore[:banzai_project_refs] ||= {}
end
-
- def cached_call(request_store_key, cache_key, path: [])
- if RequestStore.active?
- cache = RequestStore[request_store_key] ||= Hash.new do |hash, key|
- hash[key] = Hash.new { |h, k| h[k] = {} }
- end
-
- cache = cache.dig(*path) if path.any?
-
- get_or_set_cache(cache, cache_key) { yield }
- else
- yield
- end
- end
-
- def get_or_set_cache(cache, key)
- if cache.key?(key)
- cache[key]
- else
- value = yield
- cache[key] = value if key.present?
- value
- end
- end
end
end
end
diff --git a/lib/banzai/filter/reference_filter.rb b/lib/banzai/filter/reference_filter.rb
index c6ae28adf87..b9d5ecf70ec 100644
--- a/lib/banzai/filter/reference_filter.rb
+++ b/lib/banzai/filter/reference_filter.rb
@@ -8,6 +8,8 @@ module Banzai
# :project (required) - Current project, ignored if reference is cross-project.
# :only_path - Generate path-only links.
class ReferenceFilter < HTML::Pipeline::Filter
+ include RequestStoreReferenceCache
+
class << self
attr_accessor :reference_type
end
diff --git a/lib/banzai/filter/user_reference_filter.rb b/lib/banzai/filter/user_reference_filter.rb
index afb6e25963c..c7fa8a8119f 100644
--- a/lib/banzai/filter/user_reference_filter.rb
+++ b/lib/banzai/filter/user_reference_filter.rb
@@ -60,10 +60,14 @@ module Banzai
self.class.references_in(text) do |match, username|
if username == 'all' && !skip_project_check?
link_to_all(link_content: link_content)
- elsif namespace = namespaces[username.downcase]
- link_to_namespace(namespace, link_content: link_content) || match
else
- match
+ cached_call(:banzai_url_for_object, match, path: [User, username.downcase]) do
+ if namespace = namespaces[username.downcase]
+ link_to_namespace(namespace, link_content: link_content) || match
+ else
+ match
+ end
+ end
end
end
end
@@ -74,7 +78,10 @@ module Banzai
# The keys of this Hash are the namespace paths, the values the
# corresponding Namespace objects.
def namespaces
- @namespaces ||= Namespace.where_full_path_in(usernames).index_by(&:full_path).transform_keys(&:downcase)
+ @namespaces ||= Namespace.eager_load(:owner, :route)
+ .where_full_path_in(usernames)
+ .index_by(&:full_path)
+ .transform_keys(&:downcase)
end
# Returns all usernames referenced in the current document.
diff --git a/lib/banzai/note_renderer.rb b/lib/banzai/note_renderer.rb
deleted file mode 100644
index 2b7c10f1a0e..00000000000
--- a/lib/banzai/note_renderer.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-module Banzai
- module NoteRenderer
- # Renders a collection of Note instances.
- #
- # notes - The notes to render.
- # project - The project to use for redacting.
- # user - The user viewing the notes.
- # path - The request path.
- # wiki - The project's wiki.
- # git_ref - The current Git reference.
- def self.render(notes, project, user = nil, path = nil, wiki = nil, git_ref = nil)
- renderer = ObjectRenderer.new(project,
- user,
- requested_path: path,
- project_wiki: wiki,
- ref: git_ref)
-
- renderer.render(notes, :note)
- end
- end
-end
diff --git a/lib/banzai/object_renderer.rb b/lib/banzai/object_renderer.rb
index e40556e869c..9bb8ed913d8 100644
--- a/lib/banzai/object_renderer.rb
+++ b/lib/banzai/object_renderer.rb
@@ -37,7 +37,7 @@ module Banzai
objects.each_with_index do |object, index|
redacted_data = redacted[index]
- object.__send__("redacted_#{attribute}_html=", redacted_data[:document].to_html.html_safe) # rubocop:disable GitlabSecurity/PublicSend
+ object.__send__("redacted_#{attribute}_html=", redacted_data[:document].to_html(save_options).html_safe) # rubocop:disable GitlabSecurity/PublicSend
object.user_visible_reference_count = redacted_data[:visible_reference_count] if object.respond_to?(:user_visible_reference_count)
end
end
@@ -83,5 +83,10 @@ module Banzai
skip_redaction: true
)
end
+
+ def save_options
+ return {} unless base_context[:xhtml]
+ { save_with: Nokogiri::XML::Node::SaveOptions::AS_XHTML }
+ end
end
end
diff --git a/lib/banzai/pipeline/post_process_pipeline.rb b/lib/banzai/pipeline/post_process_pipeline.rb
index 131ac3b0eec..dcd52bc03c7 100644
--- a/lib/banzai/pipeline/post_process_pipeline.rb
+++ b/lib/banzai/pipeline/post_process_pipeline.rb
@@ -3,9 +3,10 @@ module Banzai
class PostProcessPipeline < BasePipeline
def self.filters
FilterArray[
+ Filter::RedactorFilter,
Filter::RelativeLinkFilter,
Filter::IssuableStateFilter,
- Filter::RedactorFilter
+ Filter::AbsoluteLinkFilter
]
end
diff --git a/lib/banzai/renderer.rb b/lib/banzai/renderer.rb
index 5f91884a878..5cb9adf52b0 100644
--- a/lib/banzai/renderer.rb
+++ b/lib/banzai/renderer.rb
@@ -32,12 +32,9 @@ module Banzai
# Convert a Markdown-containing field on an object into an HTML-safe String
# of HTML. This method is analogous to calling render(object.field), but it
# can cache the rendered HTML in the object, rather than Redis.
- #
- # The context to use is managed by the object and cannot be changed.
- # Use #render, passing it the field text, if a custom rendering is needed.
- def self.render_field(object, field)
+ def self.render_field(object, field, context = {})
unless object.respond_to?(:cached_markdown_fields)
- return cacheless_render_field(object, field)
+ return cacheless_render_field(object, field, context)
end
object.refresh_markdown_cache! unless object.cached_html_up_to_date?(field)
@@ -46,9 +43,9 @@ module Banzai
end
# Same as +render_field+, but without consulting or updating the cache field
- def self.cacheless_render_field(object, field, options = {})
+ def self.cacheless_render_field(object, field, context = {})
text = object.__send__(field) # rubocop:disable GitlabSecurity/PublicSend
- context = object.banzai_render_context(field).merge(options)
+ context = context.reverse_merge(object.banzai_render_context(field)) if object.respond_to?(:banzai_render_context)
cacheless_render(text, context)
end
diff --git a/lib/banzai/request_store_reference_cache.rb b/lib/banzai/request_store_reference_cache.rb
new file mode 100644
index 00000000000..426131442a2
--- /dev/null
+++ b/lib/banzai/request_store_reference_cache.rb
@@ -0,0 +1,27 @@
+module Banzai
+ module RequestStoreReferenceCache
+ def cached_call(request_store_key, cache_key, path: [])
+ if RequestStore.active?
+ cache = RequestStore[request_store_key] ||= Hash.new do |hash, key|
+ hash[key] = Hash.new { |h, k| h[k] = {} }
+ end
+
+ cache = cache.dig(*path) if path.any?
+
+ get_or_set_cache(cache, cache_key) { yield }
+ else
+ yield
+ end
+ end
+
+ def get_or_set_cache(cache, key)
+ if cache.key?(key)
+ cache[key]
+ else
+ value = yield
+ cache[key] = value if key.present?
+ value
+ end
+ end
+ end
+end
diff --git a/lib/constraints/group_url_constrainer.rb b/lib/constraints/group_url_constrainer.rb
index 6fc1d56d7a0..fd2ac2db0a9 100644
--- a/lib/constraints/group_url_constrainer.rb
+++ b/lib/constraints/group_url_constrainer.rb
@@ -2,7 +2,7 @@ class GroupUrlConstrainer
def matches?(request)
full_path = request.params[:group_id] || request.params[:id]
- return false unless DynamicPathValidator.valid_group_path?(full_path)
+ return false unless NamespacePathValidator.valid_path?(full_path)
Group.find_by_full_path(full_path, follow_redirects: request.get?).present?
end
diff --git a/lib/constraints/project_url_constrainer.rb b/lib/constraints/project_url_constrainer.rb
index 5bef29eb1da..e90ecb5ec69 100644
--- a/lib/constraints/project_url_constrainer.rb
+++ b/lib/constraints/project_url_constrainer.rb
@@ -4,7 +4,7 @@ class ProjectUrlConstrainer
project_path = request.params[:project_id] || request.params[:id]
full_path = [namespace_path, project_path].join('/')
- return false unless DynamicPathValidator.valid_project_path?(full_path)
+ return false unless ProjectPathValidator.valid_path?(full_path)
# We intentionally allow SELECT(*) here so result of this query can be used
# as cache for further Project.find_by_full_path calls within request
diff --git a/lib/constraints/user_url_constrainer.rb b/lib/constraints/user_url_constrainer.rb
index d16ae7f3f40..b7633aa7cbb 100644
--- a/lib/constraints/user_url_constrainer.rb
+++ b/lib/constraints/user_url_constrainer.rb
@@ -2,7 +2,7 @@ class UserUrlConstrainer
def matches?(request)
full_path = request.params[:username]
- return false unless DynamicPathValidator.valid_user_path?(full_path)
+ return false unless UserPathValidator.valid_path?(full_path)
User.find_by_full_path(full_path, follow_redirects: request.get?).present?
end
diff --git a/lib/github/import.rb b/lib/github/import.rb
index 8cabbdec940..fef63dd7168 100644
--- a/lib/github/import.rb
+++ b/lib/github/import.rb
@@ -163,7 +163,6 @@ module Github
iid: pull_request.iid,
title: pull_request.title,
description: description,
- ref_fetched: true,
source_project: pull_request.source_project,
source_branch: pull_request.source_branch_name,
source_branch_sha: pull_request.source_branch_sha,
diff --git a/lib/gitlab/checks/change_access.rb b/lib/gitlab/checks/change_access.rb
index b6805230348..ef92fc5a0a0 100644
--- a/lib/gitlab/checks/change_access.rb
+++ b/lib/gitlab/checks/change_access.rb
@@ -12,7 +12,8 @@ module Gitlab
change_existing_tags: 'You are not allowed to change existing tags on this project.',
update_protected_tag: 'Protected tags cannot be updated.',
delete_protected_tag: 'Protected tags cannot be deleted.',
- create_protected_tag: 'You are not allowed to create this tag as it is protected.'
+ create_protected_tag: 'You are not allowed to create this tag as it is protected.',
+ lfs_objects_missing: 'LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all".'
}.freeze
attr_reader :user_access, :project, :skip_authorization, :protocol
@@ -36,6 +37,7 @@ module Gitlab
push_checks
branch_checks
tag_checks
+ lfs_objects_exist_check
true
end
@@ -136,6 +138,14 @@ module Gitlab
def matching_merge_request?
Checks::MatchingMergeRequest.new(@newrev, @branch_name, @project).match?
end
+
+ def lfs_objects_exist_check
+ lfs_check = Checks::LfsIntegrity.new(project, @newrev)
+
+ if lfs_check.objects_missing?
+ raise GitAccess::UnauthorizedError, ERROR_MESSAGES[:lfs_objects_missing]
+ end
+ end
end
end
end
diff --git a/lib/gitlab/checks/lfs_integrity.rb b/lib/gitlab/checks/lfs_integrity.rb
new file mode 100644
index 00000000000..27a95764dc1
--- /dev/null
+++ b/lib/gitlab/checks/lfs_integrity.rb
@@ -0,0 +1,24 @@
+module Gitlab
+ module Checks
+ class LfsIntegrity
+ REV_LIST_OBJECT_LIMIT = 2_000
+
+ def initialize(project, newrev)
+ @project = project
+ @newrev = newrev
+ end
+
+ def objects_missing?
+ return false unless @newrev && @project.lfs_enabled?
+
+ new_lfs_pointers = Gitlab::Git::LfsChanges.new(@project.repository, @newrev).new_pointers(object_limit: REV_LIST_OBJECT_LIMIT)
+
+ return false unless new_lfs_pointers.present?
+
+ existing_count = @project.lfs_objects.where(oid: new_lfs_pointers.map(&:lfs_oid)).count
+
+ existing_count != new_lfs_pointers.count
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/daemon.rb b/lib/gitlab/daemon.rb
index dfd17e35707..f07fd1dfdda 100644
--- a/lib/gitlab/daemon.rb
+++ b/lib/gitlab/daemon.rb
@@ -43,7 +43,7 @@ module Gitlab
if thread
thread.wakeup if thread.alive?
- thread.join
+ thread.join unless Thread.current == thread
@thread = nil
end
end
diff --git a/lib/gitlab/git/lfs_changes.rb b/lib/gitlab/git/lfs_changes.rb
index 2749e2e69e2..732dd5d998a 100644
--- a/lib/gitlab/git/lfs_changes.rb
+++ b/lib/gitlab/git/lfs_changes.rb
@@ -8,25 +8,22 @@ module Gitlab
def new_pointers(object_limit: nil, not_in: nil)
@new_pointers ||= begin
- object_ids = new_objects(not_in: not_in)
- object_ids = object_ids.take(object_limit) if object_limit
+ rev_list.new_objects(not_in: not_in, require_path: true) do |object_ids|
+ object_ids = object_ids.take(object_limit) if object_limit
- Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids)
+ Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids)
+ end
end
end
def all_pointers
- object_ids = rev_list.all_objects(require_path: true)
-
- Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids)
+ rev_list.all_objects(require_path: true) do |object_ids|
+ Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids)
+ end
end
private
- def new_objects(not_in:)
- rev_list.new_objects(require_path: true, lazy: true, not_in: not_in)
- end
-
def rev_list
::Gitlab::Git::RevList.new(path_to_repo: @repository.path_to_repo,
newrev: @newrev)
diff --git a/lib/gitlab/git/popen.rb b/lib/gitlab/git/popen.rb
index b45da6020ee..d41fe78daa1 100644
--- a/lib/gitlab/git/popen.rb
+++ b/lib/gitlab/git/popen.rb
@@ -7,7 +7,7 @@ module Gitlab
module Popen
FAST_GIT_PROCESS_TIMEOUT = 15.seconds
- def popen(cmd, path, vars = {})
+ def popen(cmd, path, vars = {}, lazy_block: nil)
unless cmd.is_a?(Array)
raise "System commands must be given as an array of strings"
end
@@ -22,7 +22,12 @@ module Gitlab
yield(stdin) if block_given?
stdin.close
- @cmd_output << stdout.read
+ if lazy_block
+ return lazy_block.call(stdout.lazy)
+ else
+ @cmd_output << stdout.read
+ end
+
@cmd_output << stderr.read
@cmd_status = wait_thr.value.exitstatus
end
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 182ffc96ef9..df4ad586e12 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -1044,7 +1044,7 @@ module Gitlab
delete_refs(tmp_ref) if tmp_ref
end
- def fetch_source_branch(source_repository, source_branch, local_ref)
+ def fetch_source_branch!(source_repository, source_branch, local_ref)
with_repo_branch_commit(source_repository, source_branch) do |commit|
if commit
write_ref(local_ref, commit.sha)
diff --git a/lib/gitlab/git/rev_list.rb b/lib/gitlab/git/rev_list.rb
index e0c884aceaa..4974205b8fd 100644
--- a/lib/gitlab/git/rev_list.rb
+++ b/lib/gitlab/git/rev_list.rb
@@ -25,17 +25,18 @@ module Gitlab
# This skips commit objects and root trees, which might not be needed when
# looking for blobs
#
- # Can return a lazy enumerator to limit work done on megabytes of data
- def new_objects(require_path: nil, lazy: false, not_in: nil)
- object_output = execute([*base_args, newrev, *not_in_refs(not_in), '--objects'])
+ # When given a block it will yield objects as a lazy enumerator so
+ # the caller can limit work done instead of processing megabytes of data
+ def new_objects(require_path: nil, not_in: nil, &lazy_block)
+ args = [*base_args, newrev, *not_in_refs(not_in), '--objects']
- objects_from_output(object_output, require_path: require_path, lazy: lazy)
+ get_objects(args, require_path: require_path, &lazy_block)
end
- def all_objects(require_path: nil)
- object_output = execute([*base_args, '--all', '--objects'])
+ def all_objects(require_path: nil, &lazy_block)
+ args = [*base_args, '--all', '--objects']
- objects_from_output(object_output, require_path: require_path, lazy: true)
+ get_objects(args, require_path: require_path, &lazy_block)
end
# This methods returns an array of missed references
@@ -64,6 +65,10 @@ module Gitlab
output.split("\n")
end
+ def lazy_execute(args, &lazy_block)
+ popen(args, nil, Gitlab::Git::Env.to_env_hash, lazy_block: lazy_block)
+ end
+
def base_args
[
Gitlab.config.git.bin_path,
@@ -72,20 +77,28 @@ module Gitlab
]
end
- def objects_from_output(object_output, require_path: nil, lazy: nil)
- objects = object_output.lazy.map do |output_line|
+ def get_objects(args, require_path: nil)
+ if block_given?
+ lazy_execute(args) do |lazy_output|
+ objects = objects_from_output(lazy_output, require_path: require_path)
+
+ yield(objects)
+ end
+ else
+ object_output = execute(args)
+
+ objects_from_output(object_output, require_path: require_path)
+ end
+ end
+
+ def objects_from_output(object_output, require_path: nil)
+ object_output.map do |output_line|
sha, path = output_line.split(' ', 2)
next if require_path && path.blank?
sha
end.reject(&:nil?)
-
- if lazy
- objects
- else
- objects.force
- end
end
end
end
diff --git a/lib/gitlab/hook_data/merge_request_builder.rb b/lib/gitlab/hook_data/merge_request_builder.rb
index eaef19c9d04..503452c8ff3 100644
--- a/lib/gitlab/hook_data/merge_request_builder.rb
+++ b/lib/gitlab/hook_data/merge_request_builder.rb
@@ -19,7 +19,6 @@ module Gitlab
merge_user_id
merge_when_pipeline_succeeds
milestone_id
- ref_fetched
source_branch
source_project_id
state
diff --git a/lib/gitlab/metrics/background_transaction.rb b/lib/gitlab/metrics/background_transaction.rb
new file mode 100644
index 00000000000..d01de5eef0a
--- /dev/null
+++ b/lib/gitlab/metrics/background_transaction.rb
@@ -0,0 +1,16 @@
+module Gitlab
+ module Metrics
+ class BackgroundTransaction < Transaction
+ def initialize(worker_class)
+ super()
+ @worker_class = worker_class
+ end
+
+ protected
+
+ def labels
+ { controller: @worker_class.name, action: 'perform' }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/base_sampler.rb b/lib/gitlab/metrics/base_sampler.rb
deleted file mode 100644
index 716d20bb91a..00000000000
--- a/lib/gitlab/metrics/base_sampler.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-require 'logger'
-module Gitlab
- module Metrics
- class BaseSampler < Daemon
- # interval - The sampling interval in seconds.
- def initialize(interval)
- interval_half = interval.to_f / 2
-
- @interval = interval
- @interval_steps = (-interval_half..interval_half).step(0.1).to_a
-
- super()
- end
-
- def safe_sample
- sample
- rescue => e
- Rails.logger.warn("#{self.class}: #{e}, stopping")
- stop
- end
-
- def sample
- raise NotImplementedError
- end
-
- # Returns the sleep interval with a random adjustment.
- #
- # The random adjustment is put in place to ensure we:
- #
- # 1. Don't generate samples at the exact same interval every time (thus
- # potentially missing anything that happens in between samples).
- # 2. Don't sample data at the same interval two times in a row.
- def sleep_interval
- while (step = @interval_steps.sample)
- if step != @last_step
- @last_step = step
-
- return @interval + @last_step
- end
- end
- end
-
- private
-
- attr_reader :running
-
- def start_working
- @running = true
- sleep(sleep_interval)
-
- while running
- safe_sample
-
- sleep(sleep_interval)
- end
- end
-
- def stop_working
- @running = false
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/influx_db.rb b/lib/gitlab/metrics/influx_db.rb
index 7b06bb953aa..bdf7910b7c7 100644
--- a/lib/gitlab/metrics/influx_db.rb
+++ b/lib/gitlab/metrics/influx_db.rb
@@ -11,6 +11,8 @@ module Gitlab
settings[:enabled] || false
end
+ # Prometheus histogram buckets used for arbitrary code measurements
+ EXECUTION_MEASUREMENT_BUCKETS = [0.001, 0.002, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1].freeze
RAILS_ROOT = Rails.root.to_s
METRICS_ROOT = Rails.root.join('lib', 'gitlab', 'metrics').to_s
PATH_REGEX = /^#{RAILS_ROOT}\/?/
@@ -99,26 +101,29 @@ module Gitlab
cpu_stop = System.cpu_time
real_stop = Time.now.to_f
- real_time = (real_stop - real_start) * 1000.0
+ real_time = (real_stop - real_start)
cpu_time = cpu_stop - cpu_start
- trans.increment("#{name}_real_time", real_time)
- trans.increment("#{name}_cpu_time", cpu_time)
- trans.increment("#{name}_call_count", 1)
+ Gitlab::Metrics.histogram("gitlab_#{name}_real_duration_seconds".to_sym,
+ "Measure #{name}",
+ Transaction::BASE_LABELS,
+ EXECUTION_MEASUREMENT_BUCKETS)
+ .observe(trans.labels, real_time)
+
+ Gitlab::Metrics.histogram("gitlab_#{name}_cpu_duration_seconds".to_sym,
+ "Measure #{name}",
+ Transaction::BASE_LABELS,
+ EXECUTION_MEASUREMENT_BUCKETS)
+ .observe(trans.labels, cpu_time / 1000.0)
+
+ # InfluxDB stores the _real_time time values as milliseconds
+ trans.increment("#{name}_real_time", real_time * 1000, false)
+ trans.increment("#{name}_cpu_time", cpu_time, false)
+ trans.increment("#{name}_call_count", 1, false)
retval
end
- # Adds a tag to the current transaction (if any)
- #
- # name - The name of the tag to add.
- # value - The value of the tag.
- def tag_transaction(name, value)
- trans = current_transaction
-
- trans&.add_tag(name, value)
- end
-
# Sets the action of the current transaction (if any)
#
# action - The name of the action.
diff --git a/lib/gitlab/metrics/influx_sampler.rb b/lib/gitlab/metrics/influx_sampler.rb
deleted file mode 100644
index 6db1dd755b7..00000000000
--- a/lib/gitlab/metrics/influx_sampler.rb
+++ /dev/null
@@ -1,101 +0,0 @@
-module Gitlab
- module Metrics
- # Class that sends certain metrics to InfluxDB at a specific interval.
- #
- # This class is used to gather statistics that can't be directly associated
- # with a transaction such as system memory usage, garbage collection
- # statistics, etc.
- class InfluxSampler < BaseSampler
- # interval - The sampling interval in seconds.
- def initialize(interval = Metrics.settings[:sample_interval])
- super(interval)
- @last_step = nil
-
- @metrics = []
-
- @last_minor_gc = Delta.new(GC.stat[:minor_gc_count])
- @last_major_gc = Delta.new(GC.stat[:major_gc_count])
-
- if Gitlab::Metrics.mri?
- require 'allocations'
-
- Allocations.start
- end
- end
-
- def sample
- sample_memory_usage
- sample_file_descriptors
- sample_objects
- sample_gc
-
- flush
- ensure
- GC::Profiler.clear
- @metrics.clear
- end
-
- def flush
- Metrics.submit_metrics(@metrics.map(&:to_hash))
- end
-
- def sample_memory_usage
- add_metric('memory_usage', value: System.memory_usage)
- end
-
- def sample_file_descriptors
- add_metric('file_descriptors', value: System.file_descriptor_count)
- end
-
- if Metrics.mri?
- def sample_objects
- sample = Allocations.to_hash
- counts = sample.each_with_object({}) do |(klass, count), hash|
- name = klass.name
-
- next unless name
-
- hash[name] = count
- end
-
- # Symbols aren't allocated so we'll need to add those manually.
- counts['Symbol'] = Symbol.all_symbols.length
-
- counts.each do |name, count|
- add_metric('object_counts', { count: count }, type: name)
- end
- end
- else
- def sample_objects
- end
- end
-
- def sample_gc
- time = GC::Profiler.total_time * 1000.0
- stats = GC.stat.merge(total_time: time)
-
- # We want the difference of GC runs compared to the last sample, not the
- # total amount since the process started.
- stats[:minor_gc_count] =
- @last_minor_gc.compared_with(stats[:minor_gc_count])
-
- stats[:major_gc_count] =
- @last_major_gc.compared_with(stats[:major_gc_count])
-
- stats[:count] = stats[:minor_gc_count] + stats[:major_gc_count]
-
- add_metric('gc_statistics', stats)
- end
-
- def add_metric(series, values, tags = {})
- prefix = sidekiq? ? 'sidekiq_' : 'rails_'
-
- @metrics << Metric.new("#{prefix}#{series}", values, tags)
- end
-
- def sidekiq?
- Sidekiq.server?
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/instrumentation.rb b/lib/gitlab/metrics/instrumentation.rb
index 6aa38542cb4..023e9963493 100644
--- a/lib/gitlab/metrics/instrumentation.rb
+++ b/lib/gitlab/metrics/instrumentation.rb
@@ -118,19 +118,21 @@ module Gitlab
def self.instrument(type, mod, name)
return unless Metrics.enabled?
- name = name.to_sym
+ name = name.to_sym
target = type == :instance ? mod : mod.singleton_class
if type == :instance
target = mod
- label = "#{mod.name}##{name}"
+ method_name = "##{name}"
method = mod.instance_method(name)
else
target = mod.singleton_class
- label = "#{mod.name}.#{name}"
+ method_name = ".#{name}"
method = mod.method(name)
end
+ label = "#{mod.name}#{method_name}"
+
unless instrumented?(target)
target.instance_variable_set(PROXY_IVAR, Module.new)
end
@@ -153,7 +155,8 @@ module Gitlab
proxy_module.class_eval <<-EOF, __FILE__, __LINE__ + 1
def #{name}(#{args_signature})
if trans = Gitlab::Metrics::Instrumentation.transaction
- trans.method_call_for(#{label.to_sym.inspect}).measure { super }
+ trans.method_call_for(#{label.to_sym.inspect}, #{mod.name.inspect}, "#{method_name}")
+ .measure { super }
else
super
end
diff --git a/lib/gitlab/metrics/method_call.rb b/lib/gitlab/metrics/method_call.rb
index d3465e5ec19..90235095306 100644
--- a/lib/gitlab/metrics/method_call.rb
+++ b/lib/gitlab/metrics/method_call.rb
@@ -2,15 +2,45 @@ module Gitlab
module Metrics
# Class for tracking timing information about method calls
class MethodCall
- attr_reader :real_time, :cpu_time, :call_count
+ MUTEX = Mutex.new
+ BASE_LABELS = { module: nil, method: nil }.freeze
+ attr_reader :real_time, :cpu_time, :call_count, :labels
+
+ def self.call_real_duration_histogram
+ return @call_real_duration_histogram if @call_real_duration_histogram
+
+ MUTEX.synchronize do
+ @call_real_duration_histogram ||= Gitlab::Metrics.histogram(
+ :gitlab_method_call_real_duration_seconds,
+ 'Method calls real duration',
+ Transaction::BASE_LABELS.merge(BASE_LABELS),
+ [0.1, 0.2, 0.5, 1, 2, 5, 10]
+ )
+ end
+ end
+
+ def self.call_cpu_duration_histogram
+ return @call_cpu_duration_histogram if @call_cpu_duration_histogram
+
+ MUTEX.synchronize do
+ @call_duration_histogram ||= Gitlab::Metrics.histogram(
+ :gitlab_method_call_cpu_duration_seconds,
+ 'Method calls cpu duration',
+ Transaction::BASE_LABELS.merge(BASE_LABELS),
+ [0.1, 0.2, 0.5, 1, 2, 5, 10]
+ )
+ end
+ end
# name - The full name of the method (including namespace) such as
# `User#sign_in`.
#
- # series - The series to use for storing the data.
- def initialize(name, series)
+ def initialize(name, module_name, method_name, transaction)
+ @module_name = module_name
+ @method_name = method_name
+ @transaction = transaction
@name = name
- @series = series
+ @labels = { module: @module_name, method: @method_name }
@real_time = 0
@cpu_time = 0
@call_count = 0
@@ -22,21 +52,27 @@ module Gitlab
start_cpu = System.cpu_time
retval = yield
- @real_time += System.monotonic_time - start_real
- @cpu_time += System.cpu_time - start_cpu
+ real_time = System.monotonic_time - start_real
+ cpu_time = System.cpu_time - start_cpu
+
+ @real_time += real_time
+ @cpu_time += cpu_time
@call_count += 1
+ self.class.call_real_duration_histogram.observe(@transaction.labels.merge(labels), real_time / 1000.0)
+ self.class.call_cpu_duration_histogram.observe(@transaction.labels.merge(labels), cpu_time / 1000.0)
+
retval
end
# Returns a Metric instance of the current method call.
def to_metric
Metric.new(
- @series,
+ Instrumentation.series,
{
- duration: real_time,
+ duration: real_time,
cpu_duration: cpu_time,
- call_count: call_count
+ call_count: call_count
},
method: @name
)
diff --git a/lib/gitlab/metrics/prometheus.rb b/lib/gitlab/metrics/prometheus.rb
index 460dab47276..09103b4ca2d 100644
--- a/lib/gitlab/metrics/prometheus.rb
+++ b/lib/gitlab/metrics/prometheus.rb
@@ -5,6 +5,9 @@ module Gitlab
module Prometheus
include Gitlab::CurrentSettings
+ REGISTRY_MUTEX = Mutex.new
+ PROVIDER_MUTEX = Mutex.new
+
def metrics_folder_present?
multiprocess_files_dir = ::Prometheus::Client.configuration.multiprocess_files_dir
@@ -20,23 +23,38 @@ module Gitlab
end
def registry
- @registry ||= ::Prometheus::Client.registry
+ return @registry if @registry
+
+ REGISTRY_MUTEX.synchronize do
+ @registry ||= ::Prometheus::Client.registry
+ end
end
def counter(name, docstring, base_labels = {})
- provide_metric(name) || registry.counter(name, docstring, base_labels)
+ safe_provide_metric(:counter, name, docstring, base_labels)
end
def summary(name, docstring, base_labels = {})
- provide_metric(name) || registry.summary(name, docstring, base_labels)
+ safe_provide_metric(:summary, name, docstring, base_labels)
end
def gauge(name, docstring, base_labels = {}, multiprocess_mode = :all)
- provide_metric(name) || registry.gauge(name, docstring, base_labels, multiprocess_mode)
+ safe_provide_metric(:gauge, name, docstring, base_labels, multiprocess_mode)
end
def histogram(name, docstring, base_labels = {}, buckets = ::Prometheus::Client::Histogram::DEFAULT_BUCKETS)
- provide_metric(name) || registry.histogram(name, docstring, base_labels, buckets)
+ safe_provide_metric(:histogram, name, docstring, base_labels, buckets)
+ end
+
+ private
+
+ def safe_provide_metric(method, name, *args)
+ metric = provide_metric(name)
+ return metric if metric
+
+ PROVIDER_MUTEX.synchronize do
+ provide_metric(name) || registry.method(method).call(name, *args)
+ end
end
def provide_metric(name)
@@ -47,8 +65,6 @@ module Gitlab
end
end
- private
-
def prometheus_metrics_enabled_unmemoized
metrics_folder_present? && current_application_settings[:prometheus_metrics_enabled] || false
end
diff --git a/lib/gitlab/metrics/rack_middleware.rb b/lib/gitlab/metrics/rack_middleware.rb
index adc0db1a874..2d45765df3f 100644
--- a/lib/gitlab/metrics/rack_middleware.rb
+++ b/lib/gitlab/metrics/rack_middleware.rb
@@ -2,20 +2,6 @@ module Gitlab
module Metrics
# Rack middleware for tracking Rails and Grape requests.
class RackMiddleware
- CONTROLLER_KEY = 'action_controller.instance'.freeze
- ENDPOINT_KEY = 'api.endpoint'.freeze
- CONTENT_TYPES = {
- 'text/html' => :html,
- 'text/plain' => :txt,
- 'application/json' => :json,
- 'text/js' => :js,
- 'application/atom+xml' => :atom,
- 'image/png' => :png,
- 'image/jpeg' => :jpeg,
- 'image/gif' => :gif,
- 'image/svg+xml' => :svg
- }.freeze
-
def initialize(app)
@app = app
end
@@ -35,12 +21,6 @@ module Gitlab
# Even in the event of an error we want to submit any metrics we
# might've gathered up to this point.
ensure
- if env[CONTROLLER_KEY]
- tag_controller(trans, env)
- elsif env[ENDPOINT_KEY]
- tag_endpoint(trans, env)
- end
-
trans.finish
end
@@ -48,60 +28,19 @@ module Gitlab
end
def transaction_from_env(env)
- trans = Transaction.new
+ trans = WebTransaction.new(env)
- trans.set(:request_uri, filtered_path(env))
- trans.set(:request_method, env['REQUEST_METHOD'])
+ trans.set(:request_uri, filtered_path(env), false)
+ trans.set(:request_method, env['REQUEST_METHOD'], false)
trans
end
- def tag_controller(trans, env)
- controller = env[CONTROLLER_KEY]
- action = "#{controller.class.name}##{controller.action_name}"
- suffix = CONTENT_TYPES[controller.content_type]
-
- if suffix && suffix != :html
- action += ".#{suffix}"
- end
-
- trans.action = action
- end
-
- def tag_endpoint(trans, env)
- endpoint = env[ENDPOINT_KEY]
-
- begin
- route = endpoint.route
- rescue
- # endpoint.route is calling env[Grape::Env::GRAPE_ROUTING_ARGS][:route_info]
- # but env[Grape::Env::GRAPE_ROUTING_ARGS] is nil in the case of a 405 response
- # so we're rescuing exceptions and bailing out
- end
-
- if route
- path = endpoint_paths_cache[route.request_method][route.path]
- trans.action = "Grape##{route.request_method} #{path}"
- end
- end
-
private
def filtered_path(env)
ActionDispatch::Request.new(env).filtered_path.presence || env['REQUEST_URI']
end
-
- def endpoint_paths_cache
- @endpoint_paths_cache ||= Hash.new do |hash, http_method|
- hash[http_method] = Hash.new do |inner_hash, raw_path|
- inner_hash[raw_path] = endpoint_instrumentable_path(raw_path)
- end
- end
- end
-
- def endpoint_instrumentable_path(raw_path)
- raw_path.sub('(.:format)', '').sub('/:version', '')
- end
end
end
end
diff --git a/lib/gitlab/metrics/samplers/base_sampler.rb b/lib/gitlab/metrics/samplers/base_sampler.rb
new file mode 100644
index 00000000000..37f90c4673d
--- /dev/null
+++ b/lib/gitlab/metrics/samplers/base_sampler.rb
@@ -0,0 +1,64 @@
+require 'logger'
+
+module Gitlab
+ module Metrics
+ module Samplers
+ class BaseSampler < Daemon
+ # interval - The sampling interval in seconds.
+ def initialize(interval)
+ interval_half = interval.to_f / 2
+
+ @interval = interval
+ @interval_steps = (-interval_half..interval_half).step(0.1).to_a
+
+ super()
+ end
+
+ def safe_sample
+ sample
+ rescue => e
+ Rails.logger.warn("#{self.class}: #{e}, stopping")
+ stop
+ end
+
+ def sample
+ raise NotImplementedError
+ end
+
+ # Returns the sleep interval with a random adjustment.
+ #
+ # The random adjustment is put in place to ensure we:
+ #
+ # 1. Don't generate samples at the exact same interval every time (thus
+ # potentially missing anything that happens in between samples).
+ # 2. Don't sample data at the same interval two times in a row.
+ def sleep_interval
+ while step = @interval_steps.sample
+ if step != @last_step
+ @last_step = step
+
+ return @interval + @last_step
+ end
+ end
+ end
+
+ private
+
+ attr_reader :running
+
+ def start_working
+ @running = true
+ sleep(sleep_interval)
+ while running
+ safe_sample
+ sleep(sleep_interval)
+ end
+ end
+
+ def stop_working
+ @running = false
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/samplers/influx_sampler.rb b/lib/gitlab/metrics/samplers/influx_sampler.rb
new file mode 100644
index 00000000000..f4f9b5ca792
--- /dev/null
+++ b/lib/gitlab/metrics/samplers/influx_sampler.rb
@@ -0,0 +1,103 @@
+module Gitlab
+ module Metrics
+ module Samplers
+ # Class that sends certain metrics to InfluxDB at a specific interval.
+ #
+ # This class is used to gather statistics that can't be directly associated
+ # with a transaction such as system memory usage, garbage collection
+ # statistics, etc.
+ class InfluxSampler < BaseSampler
+ # interval - The sampling interval in seconds.
+ def initialize(interval = Metrics.settings[:sample_interval])
+ super(interval)
+ @last_step = nil
+
+ @metrics = []
+
+ @last_minor_gc = Delta.new(GC.stat[:minor_gc_count])
+ @last_major_gc = Delta.new(GC.stat[:major_gc_count])
+
+ if Gitlab::Metrics.mri?
+ require 'allocations'
+
+ Allocations.start
+ end
+ end
+
+ def sample
+ sample_memory_usage
+ sample_file_descriptors
+ sample_objects
+ sample_gc
+
+ flush
+ ensure
+ GC::Profiler.clear
+ @metrics.clear
+ end
+
+ def flush
+ Metrics.submit_metrics(@metrics.map(&:to_hash))
+ end
+
+ def sample_memory_usage
+ add_metric('memory_usage', value: System.memory_usage)
+ end
+
+ def sample_file_descriptors
+ add_metric('file_descriptors', value: System.file_descriptor_count)
+ end
+
+ if Metrics.mri?
+ def sample_objects
+ sample = Allocations.to_hash
+ counts = sample.each_with_object({}) do |(klass, count), hash|
+ name = klass.name
+
+ next unless name
+
+ hash[name] = count
+ end
+
+ # Symbols aren't allocated so we'll need to add those manually.
+ counts['Symbol'] = Symbol.all_symbols.length
+
+ counts.each do |name, count|
+ add_metric('object_counts', { count: count }, type: name)
+ end
+ end
+ else
+ def sample_objects
+ end
+ end
+
+ def sample_gc
+ time = GC::Profiler.total_time * 1000.0
+ stats = GC.stat.merge(total_time: time)
+
+ # We want the difference of GC runs compared to the last sample, not the
+ # total amount since the process started.
+ stats[:minor_gc_count] =
+ @last_minor_gc.compared_with(stats[:minor_gc_count])
+
+ stats[:major_gc_count] =
+ @last_major_gc.compared_with(stats[:major_gc_count])
+
+ stats[:count] = stats[:minor_gc_count] + stats[:major_gc_count]
+
+ add_metric('gc_statistics', stats)
+ end
+
+ def add_metric(series, values, tags = {})
+ prefix = sidekiq? ? 'sidekiq_' : 'rails_'
+
+ @metrics << Metric.new("#{prefix}#{series}", values, tags)
+ end
+
+ def sidekiq?
+ Sidekiq.server?
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/samplers/ruby_sampler.rb b/lib/gitlab/metrics/samplers/ruby_sampler.rb
new file mode 100644
index 00000000000..8b5a60e6b8b
--- /dev/null
+++ b/lib/gitlab/metrics/samplers/ruby_sampler.rb
@@ -0,0 +1,110 @@
+require 'prometheus/client/support/unicorn'
+
+module Gitlab
+ module Metrics
+ module Samplers
+ class RubySampler < BaseSampler
+ def metrics
+ @metrics ||= init_metrics
+ end
+
+ def with_prefix(prefix, name)
+ "ruby_#{prefix}_#{name}".to_sym
+ end
+
+ def to_doc_string(name)
+ name.to_s.humanize
+ end
+
+ def labels
+ {}
+ end
+
+ def initialize(interval)
+ super(interval)
+
+ if Metrics.mri?
+ require 'allocations'
+
+ Allocations.start
+ end
+ end
+
+ def init_metrics
+ metrics = {}
+ metrics[:sampler_duration] = Metrics.histogram(with_prefix(:sampler_duration, :seconds), 'Sampler time', {})
+ metrics[:total_time] = Metrics.gauge(with_prefix(:gc, :time_total), 'Total GC time', labels, :livesum)
+ GC.stat.keys.each do |key|
+ metrics[key] = Metrics.gauge(with_prefix(:gc, key), to_doc_string(key), labels, :livesum)
+ end
+
+ metrics[:objects_total] = Metrics.gauge(with_prefix(:objects, :total), 'Objects total', labels.merge(class: nil), :livesum)
+ metrics[:memory_usage] = Metrics.gauge(with_prefix(:memory, :usage_total), 'Memory used total', labels, :livesum)
+ metrics[:file_descriptors] = Metrics.gauge(with_prefix(:file, :descriptors_total), 'File descriptors total', labels, :livesum)
+
+ metrics
+ end
+
+ def sample
+ start_time = System.monotonic_time
+ sample_gc
+ sample_objects
+
+ metrics[:memory_usage].set(labels, System.memory_usage)
+ metrics[:file_descriptors].set(labels, System.file_descriptor_count)
+
+ metrics[:sampler_duration].observe(labels.merge(worker_label), (System.monotonic_time - start_time) / 1000.0)
+ ensure
+ GC::Profiler.clear
+ end
+
+ private
+
+ def sample_gc
+ metrics[:total_time].set(labels, GC::Profiler.total_time * 1000)
+
+ GC.stat.each do |key, value|
+ metrics[key].set(labels, value)
+ end
+ end
+
+ def sample_objects
+ list_objects.each do |name, count|
+ metrics[:objects_total].set(labels.merge(class: name), count)
+ end
+ end
+
+ if Metrics.mri?
+ def list_objects
+ sample = Allocations.to_hash
+ counts = sample.each_with_object({}) do |(klass, count), hash|
+ name = klass.name
+
+ next unless name
+
+ hash[name] = count
+ end
+
+ # Symbols aren't allocated so we'll need to add those manually.
+ counts['Symbol'] = Symbol.all_symbols.length
+ counts
+ end
+ else
+ def list_objects
+ end
+ end
+
+ def worker_label
+ return {} unless defined?(Unicorn::Worker)
+ worker_no = ::Prometheus::Client::Support::Unicorn.worker_id
+
+ if worker_no
+ { unicorn: worker_no }
+ else
+ { unicorn: 'master' }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/samplers/unicorn_sampler.rb b/lib/gitlab/metrics/samplers/unicorn_sampler.rb
new file mode 100644
index 00000000000..ea325651fbb
--- /dev/null
+++ b/lib/gitlab/metrics/samplers/unicorn_sampler.rb
@@ -0,0 +1,50 @@
+module Gitlab
+ module Metrics
+ module Samplers
+ class UnicornSampler < BaseSampler
+ def initialize(interval)
+ super(interval)
+ end
+
+ def unicorn_active_connections
+ @unicorn_active_connections ||= Gitlab::Metrics.gauge(:unicorn_active_connections, 'Unicorn active connections', {}, :max)
+ end
+
+ def unicorn_queued_connections
+ @unicorn_queued_connections ||= Gitlab::Metrics.gauge(:unicorn_queued_connections, 'Unicorn queued connections', {}, :max)
+ end
+
+ def enabled?
+ # Raindrops::Linux.tcp_listener_stats is only present on Linux
+ unicorn_with_listeners? && Raindrops::Linux.respond_to?(:tcp_listener_stats)
+ end
+
+ def sample
+ Raindrops::Linux.tcp_listener_stats(tcp_listeners).each do |addr, stats|
+ unicorn_active_connections.set({ type: 'tcp', address: addr }, stats.active)
+ unicorn_queued_connections.set({ type: 'tcp', address: addr }, stats.queued)
+ end
+
+ Raindrops::Linux.unix_listener_stats(unix_listeners).each do |addr, stats|
+ unicorn_active_connections.set({ type: 'unix', address: addr }, stats.active)
+ unicorn_queued_connections.set({ type: 'unix', address: addr }, stats.queued)
+ end
+ end
+
+ private
+
+ def tcp_listeners
+ @tcp_listeners ||= Unicorn.listener_names.grep(%r{\A[^/]+:\d+\z})
+ end
+
+ def unix_listeners
+ @unix_listeners ||= Unicorn.listener_names - tcp_listeners
+ end
+
+ def unicorn_with_listeners?
+ defined?(Unicorn) && Unicorn.listener_names.any?
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/sidekiq_middleware.rb b/lib/gitlab/metrics/sidekiq_middleware.rb
index b983a40611f..55c707d5386 100644
--- a/lib/gitlab/metrics/sidekiq_middleware.rb
+++ b/lib/gitlab/metrics/sidekiq_middleware.rb
@@ -5,7 +5,7 @@ module Gitlab
# This middleware is intended to be used as a server-side middleware.
class SidekiqMiddleware
def call(worker, message, queue)
- trans = Transaction.new("#{worker.class.name}#perform")
+ trans = BackgroundTransaction.new(worker.class)
begin
# Old gitlad-shell messages don't provide enqueued_at/created_at attributes
diff --git a/lib/gitlab/metrics/subscribers/action_view.rb b/lib/gitlab/metrics/subscribers/action_view.rb
index d435a33e9c7..3da474fc1ec 100644
--- a/lib/gitlab/metrics/subscribers/action_view.rb
+++ b/lib/gitlab/metrics/subscribers/action_view.rb
@@ -15,10 +15,24 @@ module Gitlab
private
+ def metric_view_rendering_duration_seconds
+ @metric_view_rendering_duration_seconds ||= Gitlab::Metrics.histogram(
+ :gitlab_view_rendering_duration_seconds,
+ 'View rendering time',
+ Transaction::BASE_LABELS.merge({ path: nil }),
+ [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0]
+ )
+ end
+
def track(event)
values = values_for(event)
tags = tags_for(event)
+ metric_view_rendering_duration_seconds.observe(
+ current_transaction.labels.merge(tags),
+ event.duration
+ )
+
current_transaction.increment(:view_duration, event.duration)
current_transaction.add_metric(SERIES, values, tags)
end
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index 96cad941d5c..064299f40c8 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -7,9 +7,10 @@ module Gitlab
def sql(event)
return unless current_transaction
+ metric_sql_duration_seconds.observe(current_transaction.labels, event.duration / 1000.0)
- current_transaction.increment(:sql_duration, event.duration)
- current_transaction.increment(:sql_count, 1)
+ current_transaction.increment(:sql_duration, event.duration, false)
+ current_transaction.increment(:sql_count, 1, false)
end
private
@@ -17,6 +18,15 @@ module Gitlab
def current_transaction
Transaction.current
end
+
+ def metric_sql_duration_seconds
+ @metric_sql_duration_seconds ||= Gitlab::Metrics.histogram(
+ :gitlab_sql_duration_seconds,
+ 'SQL time',
+ Transaction::BASE_LABELS,
+ [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0]
+ )
+ end
end
end
end
diff --git a/lib/gitlab/metrics/subscribers/rails_cache.rb b/lib/gitlab/metrics/subscribers/rails_cache.rb
index aaed2184f44..efd3c9daf79 100644
--- a/lib/gitlab/metrics/subscribers/rails_cache.rb
+++ b/lib/gitlab/metrics/subscribers/rails_cache.rb
@@ -7,28 +7,29 @@ module Gitlab
attach_to :active_support
def cache_read(event)
- increment(:cache_read, event.duration)
+ observe(:read, event.duration)
return unless current_transaction
return if event.payload[:super_operation] == :fetch
if event.payload[:hit]
- current_transaction.increment(:cache_read_hit_count, 1)
+ current_transaction.increment(:cache_read_hit_count, 1, false)
else
- current_transaction.increment(:cache_read_miss_count, 1)
+ metric_cache_misses_total.increment(current_transaction.labels)
+ current_transaction.increment(:cache_read_miss_count, 1, false)
end
end
def cache_write(event)
- increment(:cache_write, event.duration)
+ observe(:write, event.duration)
end
def cache_delete(event)
- increment(:cache_delete, event.duration)
+ observe(:delete, event.duration)
end
def cache_exist?(event)
- increment(:cache_exists, event.duration)
+ observe(:exists, event.duration)
end
def cache_fetch_hit(event)
@@ -40,16 +41,18 @@ module Gitlab
def cache_generate(event)
return unless current_transaction
+ metric_cache_misses_total.increment(current_transaction.labels)
current_transaction.increment(:cache_read_miss_count, 1)
end
- def increment(key, duration)
+ def observe(key, duration)
return unless current_transaction
- current_transaction.increment(:cache_duration, duration)
- current_transaction.increment(:cache_count, 1)
- current_transaction.increment("#{key}_duration".to_sym, duration)
- current_transaction.increment("#{key}_count".to_sym, 1)
+ metric_cache_operation_duration_seconds.observe(current_transaction.labels.merge({ operation: key }), duration / 1000.0)
+ current_transaction.increment(:cache_duration, duration, false)
+ current_transaction.increment(:cache_count, 1, false)
+ current_transaction.increment("cache_#{key}_duration".to_sym, duration, false)
+ current_transaction.increment("cache_#{key}_count".to_sym, 1, false)
end
private
@@ -57,6 +60,23 @@ module Gitlab
def current_transaction
Transaction.current
end
+
+ def metric_cache_operation_duration_seconds
+ @metric_cache_operation_duration_seconds ||= Gitlab::Metrics.histogram(
+ :gitlab_cache_operation_duration_seconds,
+ 'Cache access time',
+ Transaction::BASE_LABELS.merge({ action: nil }),
+ [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0]
+ )
+ end
+
+ def metric_cache_misses_total
+ @metric_cache_misses_total ||= Gitlab::Metrics.counter(
+ :gitlab_cache_misses_total,
+ 'Cache read miss',
+ Transaction::BASE_LABELS
+ )
+ end
end
end
end
diff --git a/lib/gitlab/metrics/transaction.rb b/lib/gitlab/metrics/transaction.rb
index 4f9fb1c7853..ee3afc5ffdb 100644
--- a/lib/gitlab/metrics/transaction.rb
+++ b/lib/gitlab/metrics/transaction.rb
@@ -2,34 +2,33 @@ module Gitlab
module Metrics
# Class for storing metrics information of a single transaction.
class Transaction
+ # base labels shared among all transactions
+ BASE_LABELS = { controller: nil, action: nil }.freeze
+
THREAD_KEY = :_gitlab_metrics_transaction
+ METRICS_MUTEX = Mutex.new
# The series to store events (e.g. Git pushes) in.
EVENT_SERIES = 'events'.freeze
attr_reader :tags, :values, :method, :metrics
- attr_accessor :action
-
def self.current
Thread.current[THREAD_KEY]
end
- # action - A String describing the action performed, usually the class
- # plus method name.
- def initialize(action = nil)
+ def initialize
@metrics = []
@methods = {}
- @started_at = nil
+ @started_at = nil
@finished_at = nil
@values = Hash.new(0)
- @tags = {}
- @action = action
+ @tags = {}
@memory_before = 0
- @memory_after = 0
+ @memory_after = 0
end
def duration
@@ -44,12 +43,15 @@ module Gitlab
Thread.current[THREAD_KEY] = self
@memory_before = System.memory_usage
- @started_at = System.monotonic_time
+ @started_at = System.monotonic_time
yield
ensure
@memory_after = System.memory_usage
- @finished_at = System.monotonic_time
+ @finished_at = System.monotonic_time
+
+ self.class.metric_transaction_duration_seconds.observe(labels, duration * 1000)
+ self.class.metric_transaction_allocated_memory_bytes.observe(labels, allocated_memory * 1024.0)
Thread.current[THREAD_KEY] = nil
end
@@ -66,33 +68,29 @@ module Gitlab
# event_name - The name of the event (e.g. "git_push").
# tags - A set of tags to attach to the event.
def add_event(event_name, tags = {})
- @metrics << Metric.new(EVENT_SERIES,
- { count: 1 },
- { event: event_name }.merge(tags),
- :event)
+ self.class.metric_event_counter(event_name, tags).increment(tags.merge(labels))
+ @metrics << Metric.new(EVENT_SERIES, { count: 1 }, tags.merge(event: event_name), :event)
end
# Returns a MethodCall object for the given name.
- def method_call_for(name)
+ def method_call_for(name, module_name, method_name)
unless method = @methods[name]
- @methods[name] = method = MethodCall.new(name, Instrumentation.series)
+ @methods[name] = method = MethodCall.new(name, module_name, method_name, self)
end
method
end
- def increment(name, value)
+ def increment(name, value, use_prometheus = true)
+ self.class.metric_transaction_counter(name).increment(labels, value) if use_prometheus
@values[name] += value
end
- def set(name, value)
+ def set(name, value, use_prometheus = true)
+ self.class.metric_transaction_gauge(name).set(labels, value) if use_prometheus
@values[name] = value
end
- def add_tag(key, value)
- @tags[key] = value
- end
-
def finish
track_self
submit
@@ -117,14 +115,83 @@ module Gitlab
submit_hashes = submit.map do |metric|
hash = metric.to_hash
-
- hash[:tags][:action] ||= @action if @action && !metric.event?
+ hash[:tags][:action] ||= action if action && !metric.event?
hash
end
Metrics.submit_metrics(submit_hashes)
end
+
+ def labels
+ BASE_LABELS
+ end
+
+ # returns string describing the action performed, usually the class plus method name.
+ def action
+ "#{labels[:controller]}##{labels[:action]}" if labels && !labels.empty?
+ end
+
+ def self.metric_transaction_duration_seconds
+ return @metric_transaction_duration_seconds if @metric_transaction_duration_seconds
+
+ METRICS_MUTEX.synchronize do
+ @metric_transaction_duration_seconds ||= Gitlab::Metrics.histogram(
+ :gitlab_transaction_duration_seconds,
+ 'Transaction duration',
+ BASE_LABELS,
+ [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0]
+ )
+ end
+ end
+
+ def self.metric_transaction_allocated_memory_bytes
+ return @metric_transaction_allocated_memory_bytes if @metric_transaction_allocated_memory_bytes
+
+ METRICS_MUTEX.synchronize do
+ @metric_transaction_allocated_memory_bytes ||= Gitlab::Metrics.histogram(
+ :gitlab_transaction_allocated_memory_bytes,
+ 'Transaction allocated memory bytes',
+ BASE_LABELS,
+ [1000, 10000, 20000, 500000, 1000000, 2000000, 5000000, 10000000, 20000000, 100000000]
+ )
+ end
+ end
+
+ def self.metric_event_counter(event_name, tags)
+ return @metric_event_counters[event_name] if @metric_event_counters&.has_key?(event_name)
+
+ METRICS_MUTEX.synchronize do
+ @metric_event_counters ||= {}
+ @metric_event_counters[event_name] ||= Gitlab::Metrics.counter(
+ "gitlab_transaction_event_#{event_name}_total".to_sym,
+ "Transaction event #{event_name} counter",
+ tags.merge(BASE_LABELS)
+ )
+ end
+ end
+
+ def self.metric_transaction_counter(name)
+ return @metric_transaction_counters[name] if @metric_transaction_counters&.has_key?(name)
+
+ METRICS_MUTEX.synchronize do
+ @metric_transaction_counters ||= {}
+ @metric_transaction_counters[name] ||= Gitlab::Metrics.counter(
+ "gitlab_transaction_#{name}_total".to_sym, "Transaction #{name} counter", BASE_LABELS
+ )
+ end
+ end
+
+ def self.metric_transaction_gauge(name)
+ return @metric_transaction_gauges[name] if @metric_transaction_gauges&.has_key?(name)
+
+ METRICS_MUTEX.synchronize do
+ @metric_transaction_gauges ||= {}
+ @metric_transaction_gauges[name] ||= Gitlab::Metrics.gauge(
+ "gitlab_transaction_#{name}".to_sym, "Transaction gauge #{name}", BASE_LABELS, :livesum
+ )
+ end
+ end
end
end
end
diff --git a/lib/gitlab/metrics/unicorn_sampler.rb b/lib/gitlab/metrics/unicorn_sampler.rb
deleted file mode 100644
index f6987252039..00000000000
--- a/lib/gitlab/metrics/unicorn_sampler.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-module Gitlab
- module Metrics
- class UnicornSampler < BaseSampler
- def initialize(interval)
- super(interval)
- end
-
- def unicorn_active_connections
- @unicorn_active_connections ||= Gitlab::Metrics.gauge(:unicorn_active_connections, 'Unicorn active connections', {}, :max)
- end
-
- def unicorn_queued_connections
- @unicorn_queued_connections ||= Gitlab::Metrics.gauge(:unicorn_queued_connections, 'Unicorn queued connections', {}, :max)
- end
-
- def enabled?
- # Raindrops::Linux.tcp_listener_stats is only present on Linux
- unicorn_with_listeners? && Raindrops::Linux.respond_to?(:tcp_listener_stats)
- end
-
- def sample
- Raindrops::Linux.tcp_listener_stats(tcp_listeners).each do |addr, stats|
- unicorn_active_connections.set({ type: 'tcp', address: addr }, stats.active)
- unicorn_queued_connections.set({ type: 'tcp', address: addr }, stats.queued)
- end
-
- Raindrops::Linux.unix_listener_stats(unix_listeners).each do |addr, stats|
- unicorn_active_connections.set({ type: 'unix', address: addr }, stats.active)
- unicorn_queued_connections.set({ type: 'unix', address: addr }, stats.queued)
- end
- end
-
- private
-
- def tcp_listeners
- @tcp_listeners ||= Unicorn.listener_names.grep(%r{\A[^/]+:\d+\z})
- end
-
- def unix_listeners
- @unix_listeners ||= Unicorn.listener_names - tcp_listeners
- end
-
- def unicorn_with_listeners?
- defined?(Unicorn) && Unicorn.listener_names.any?
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/web_transaction.rb b/lib/gitlab/metrics/web_transaction.rb
new file mode 100644
index 00000000000..89ff02a96d6
--- /dev/null
+++ b/lib/gitlab/metrics/web_transaction.rb
@@ -0,0 +1,82 @@
+module Gitlab
+ module Metrics
+ class WebTransaction < Transaction
+ CONTROLLER_KEY = 'action_controller.instance'.freeze
+ ENDPOINT_KEY = 'api.endpoint'.freeze
+
+ CONTENT_TYPES = {
+ 'text/html' => :html,
+ 'text/plain' => :txt,
+ 'application/json' => :json,
+ 'text/js' => :js,
+ 'application/atom+xml' => :atom,
+ 'image/png' => :png,
+ 'image/jpeg' => :jpeg,
+ 'image/gif' => :gif,
+ 'image/svg+xml' => :svg
+ }.freeze
+
+ def initialize(env)
+ super()
+ @env = env
+ end
+
+ def labels
+ return @labels if @labels
+
+ # memoize transaction labels only source env variables were present
+ @labels = if @env[CONTROLLER_KEY]
+ labels_from_controller || {}
+ elsif @env[ENDPOINT_KEY]
+ labels_from_endpoint || {}
+ end
+
+ @labels || {}
+ end
+
+ private
+
+ def labels_from_controller
+ controller = @env[CONTROLLER_KEY]
+
+ action = "#{controller.action_name}"
+ suffix = CONTENT_TYPES[controller.content_type]
+
+ if suffix && suffix != :html
+ action += ".#{suffix}"
+ end
+
+ { controller: controller.class.name, action: action }
+ end
+
+ def labels_from_endpoint
+ endpoint = @env[ENDPOINT_KEY]
+
+ begin
+ route = endpoint.route
+ rescue
+ # endpoint.route is calling env[Grape::Env::GRAPE_ROUTING_ARGS][:route_info]
+ # but env[Grape::Env::GRAPE_ROUTING_ARGS] is nil in the case of a 405 response
+ # so we're rescuing exceptions and bailing out
+ end
+
+ if route
+ path = endpoint_paths_cache[route.request_method][route.path]
+ { controller: 'Grape', action: "#{route.request_method} #{path}" }
+ end
+ end
+
+ def endpoint_paths_cache
+ @endpoint_paths_cache ||= Hash.new do |hash, http_method|
+ hash[http_method] = Hash.new do |inner_hash, raw_path|
+ inner_hash[raw_path] = endpoint_instrumentable_path(raw_path)
+ end
+ end
+ end
+
+ def endpoint_instrumentable_path(raw_path)
+ raw_path.sub('(.:format)', '').sub('/:version', '')
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/middleware/rails_queue_duration.rb b/lib/gitlab/middleware/rails_queue_duration.rb
index 63c3372da51..bc70b2459ef 100644
--- a/lib/gitlab/middleware/rails_queue_duration.rb
+++ b/lib/gitlab/middleware/rails_queue_duration.rb
@@ -14,11 +14,22 @@ module Gitlab
proxy_start = env['HTTP_GITLAB_WORKHORSE_PROXY_START'].presence
if trans && proxy_start
# Time in milliseconds since gitlab-workhorse started the request
- trans.set(:rails_queue_duration, Time.now.to_f * 1_000 - proxy_start.to_f / 1_000_000)
+ duration = Time.now.to_f * 1_000 - proxy_start.to_f / 1_000_000
+ trans.set(:rails_queue_duration, duration)
+ metric_rails_queue_duration_seconds.observe(trans.labels, duration / 1_000)
end
@app.call(env)
end
+
+ private
+
+ def metric_rails_queue_duration_seconds
+ @metric_rails_queue_duration_seconds ||= Gitlab::Metrics.histogram(
+ :gitlab_rails_queue_duration_seconds,
+ Gitlab::Metrics::Transaction::BASE_LABELS
+ )
+ end
end
end
end
diff --git a/lib/gitlab/o_auth/user.rb b/lib/gitlab/o_auth/user.rb
index 47c2a422387..b4b3b00c84d 100644
--- a/lib/gitlab/o_auth/user.rb
+++ b/lib/gitlab/o_auth/user.rb
@@ -179,7 +179,7 @@ module Gitlab
valid_username = ::Namespace.clean_path(username)
uniquify = Uniquify.new
- valid_username = uniquify.string(valid_username) { |s| !DynamicPathValidator.valid_user_path?(s) }
+ valid_username = uniquify.string(valid_username) { |s| !UserPathValidator.valid_path?(s) }
name = auth_hash.name
name = valid_username if name.strip.empty?
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index 77b843f84ae..8e688dede89 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:34-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:29-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
@@ -34,6 +34,11 @@ msgstr[1] "%s подавания бяха пропуснати, за да не
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} подаде %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -54,6 +59,12 @@ msgstr[1] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr ""
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "1 схема"
@@ -110,9 +121,18 @@ msgstr "Добавете SSH ключ в профила си, за да може
msgid "Add new directory"
msgstr "Добавяне на нова папка"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr ""
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -128,6 +148,9 @@ msgstr "Наистина ли искате да изтриете този пла
msgid "Are you sure you want to discard your changes?"
msgstr ""
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -161,18 +184,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -235,6 +261,9 @@ msgstr[1] "Клонове"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Търсете в клоновете"
@@ -445,15 +474,24 @@ msgstr "пропуснато"
msgid "CiStatus|running"
msgstr "протича в момента"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -496,27 +534,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -526,7 +570,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -538,18 +585,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -582,6 +623,11 @@ msgid_plural "Commits"
msgstr[0] "Подаване"
msgstr[1] "Подавания"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
msgstr ""
@@ -663,6 +709,12 @@ msgstr "Ръководство за сътрудничество"
msgid "Contributors"
msgstr "Сътрудници"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -676,7 +728,7 @@ msgid "Create New Directory"
msgstr "Създаване на нова папка"
msgid "Create a personal access token on your account to pull or push via %{protocol}."
-msgstr "Създайте си личен жетон за достъп в профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}."
+msgstr "Създайте си личен жетон за достъп в акаунта си, за да можете да изтегляте и изпращате промени чрез %{protocol}."
msgid "Create directory"
msgstr "Създаване на папка"
@@ -684,9 +736,21 @@ msgstr "Създаване на папка"
msgid "Create empty bare repository"
msgstr "Създаване на празно хранилище"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "Създаване на заявка за сливане"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "Създаване на нов…"
@@ -773,6 +837,9 @@ msgstr "Име на папката"
msgid "Discard changes"
msgstr ""
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -845,12 +912,18 @@ msgstr "Всяка седмица (в неделя, в 4 ч. сутринта)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "Собственикът не може да бъде променен"
msgid "Failed to remove the pipeline schedule"
msgstr "Планът за схема не може да бъде премахнат"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "Файлове"
@@ -895,9 +968,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -940,6 +1019,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -984,6 +1108,12 @@ msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Шаблон за интервала"
@@ -1052,6 +1182,9 @@ msgstr "Научете повече в"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "документацията относно планирането на схеми"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "Напускане на групата"
@@ -1075,6 +1208,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "Медиана"
@@ -1105,6 +1244,9 @@ msgstr ""
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Нов проблем"
@@ -1122,18 +1264,27 @@ msgstr "Нова папка"
msgid "New file"
msgstr "Нов файл"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "Нов проблем"
msgid "New merge request"
msgstr "Нова заявка за сливане"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "Нов план"
msgid "New snippet"
msgstr "Нов отрязък"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "Нов етикет"
@@ -1212,6 +1363,12 @@ msgstr "Наблюдение"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Филтър"
@@ -1353,9 +1510,54 @@ msgstr "с етапи"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Проектът „%{project_name}“ е добавен в опашката за изтриване."
@@ -1365,9 +1567,6 @@ msgstr "Проектът „%{project_name}“ беше създаден усп
msgid "Project '%{project_name}' was successfully updated."
msgstr "Проектът „%{project_name}“ беше обновен успешно."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Проектът „%{project_name}“ ще бъде изтрит."
-
msgid "Project access must be granted explicitly to each user."
msgstr "Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."
@@ -1425,6 +1624,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1446,12 +1651,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Прочетете повече"
@@ -1515,6 +1729,9 @@ msgstr "Отмяна на тази заявка за сливане"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1533,6 +1750,15 @@ msgstr "Планиране на схемите"
msgid "Search branches and tags"
msgstr "Търсете в клоновете и етикетите"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "Изберете формата на архива"
@@ -1546,7 +1772,7 @@ msgid "Service Templates"
msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
-msgstr "Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}."
+msgstr "Задайте парола на акаунта си, за да можете да изтегляте и изпращате промени чрез %{protocol}."
msgid "Set up CI"
msgstr "Настройка на НИ"
@@ -1580,13 +1806,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1706,6 +1935,12 @@ msgstr "Създайте %{new_merge_request} с тези промени"
msgid "Start the Runner!"
msgstr ""
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "Преминаване към клон/етикет"
@@ -1732,6 +1967,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."
@@ -1744,6 +1982,15 @@ msgstr "Връзката на разклонение беше премахнат
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "Етапът от цикъла на разработка"
@@ -1774,6 +2021,12 @@ msgstr "Етапът на подготовка за издаване показ
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "Времето, което отнема всеки запис от данни за съответния етап."
@@ -1783,6 +2036,9 @@ msgstr "Стойността, която се намира в средата н
msgid "There are problems accessing Git storage: "
msgstr ""
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1967,6 +2223,9 @@ msgstr ""
msgid "Unstar"
msgstr "Без звезда"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2030,6 +2289,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2150,9 +2412,21 @@ msgstr "На път сте да премахнете връзката на ра
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "Можете да добавяте файлове само когато се намирате в клон"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Не можете да създавате повече проекти"
@@ -2178,7 +2452,7 @@ msgid "You will receive notifications only for comments in which you were @menti
msgstr "Ще получавате известия само за коментари, в които Ви @споменават"
msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account"
-msgstr "Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"
+msgstr "Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за акаунта си"
msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile"
msgstr "Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"
@@ -2186,6 +2460,9 @@ msgstr "Няма да можете да изтегляте или изпраща
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "Вашето име"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] "родител"
msgstr[1] "родители"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index f65012d1e1f..431e11818c1 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:36-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:30-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -34,6 +34,11 @@ msgstr[1] "%s zusätzliche Commits wurden ausgelassen um Leistungsprobleme zu ve
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} hat %{commit_timeago} committet"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -54,6 +59,12 @@ msgstr[1] "%{storage_name}: %{failed_attempts} fehlgeschlagene Speicherzugriffe:
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(beachte die Informationen zur Installation auf %{link})."
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] ""
@@ -110,9 +121,18 @@ msgstr "Füge einen SSH Schlüssel zu deinem Profil hinzu, um mittels SSH zu üb
msgid "Add new directory"
msgstr "Erstelle eine neues Verzeichnis"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr "Alle"
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -128,6 +148,9 @@ msgstr "Bist Du sicher, dass Du diesen Pipeline-Zeitplan löschen möchtest?"
msgid "Are you sure you want to discard your changes?"
msgstr "Bist Du sicher, dass Du alle Änderungen zurücksetzen willst?"
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr "Bist Du sicher, dass Du den Registrierungstoken zurücksetzen willst?"
@@ -161,18 +184,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr "Abrechnung"
@@ -235,6 +261,9 @@ msgstr[1] "Zweige"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "Branch %{branch_name} wurde erstellt. Um die automatische Bereitstellung einzurichten, wähle eine GitLab CI Yaml Vorlage und committe Deine Änderungen. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Branches durchsuchen"
@@ -445,15 +474,24 @@ msgstr "übersprungen"
msgid "CiStatus|running"
msgstr "laufend"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr "Schließen"
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -496,27 +534,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -526,7 +570,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -538,18 +585,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -582,6 +623,11 @@ msgid_plural "Commits"
msgstr[0] "Commit"
msgstr[1] "Commits"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
msgstr ""
@@ -663,6 +709,12 @@ msgstr "Mitarbeitsanleitung"
msgid "Contributors"
msgstr "Mitarbeiter"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr "Öffentlichen SSH-Schlüssel in die Zwischenablage kopieren"
@@ -684,9 +736,21 @@ msgstr "Erstelle Verzeichnis"
msgid "Create empty bare repository"
msgstr "Erstelle leeres Repository"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "Erstelle Merge Request"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "Erstelle neues..."
@@ -773,6 +837,9 @@ msgstr "Verzeichnisname"
msgid "Discard changes"
msgstr "Änderungen verwerfen"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -845,12 +912,18 @@ msgstr "Wöchentlich (Sonntags um 4:00 Uhr)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "Wechsel des Besitzers fehlgeschlagen"
msgid "Failed to remove the pipeline schedule"
msgstr "Entfernung der Pipelineplanung fehlgeschlagen"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "Dateien"
@@ -895,9 +968,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -940,6 +1019,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr "Systemzustand"
@@ -984,6 +1108,12 @@ msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervallmuster"
@@ -1052,6 +1182,9 @@ msgstr "Erfahre mehr in den"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "Pipelineplanungsdokumentation"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "Verlasse die Gruppe"
@@ -1075,6 +1208,12 @@ msgstr ""
msgid "Locked Files"
msgstr "Gesperrte Dateien"
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "Median"
@@ -1105,6 +1244,9 @@ msgstr "hier"
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Neues Ticket"
@@ -1122,18 +1264,27 @@ msgstr "Neues Verzeichnis"
msgid "New file"
msgstr "Neue Datei"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "Neues Ticket"
msgid "New merge request"
msgstr "Neuer Merge Request"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "Neuer Zeitplan"
msgid "New snippet"
msgstr "Neuer Schnipsel"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "Neuer Tag"
@@ -1212,6 +1363,12 @@ msgstr "Beobachten"
msgid "Notifications"
msgstr "Benachrichtigungen"
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Filter"
@@ -1353,9 +1510,54 @@ msgstr "mit Stages"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr "Profil"
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Das Projekt '%{project_name}' wurde zur Löschung eingeplant."
@@ -1365,9 +1567,6 @@ msgstr "Das Projekt '%{project_name}' wurde erfolgreich erstellt."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Das Projekt '%{project_name}' wurde erfolgreich aktualisiert."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Das Projekt '%{project_name}' wird gelöscht."
-
msgid "Project access must be granted explicitly to each user."
msgstr "Jedem Nutzer muss explizit der Zugriff auf das Projekt gewährt werden."
@@ -1425,6 +1624,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1446,12 +1651,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr "Übertragungsereignisse"
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Mehr lesen"
@@ -1515,6 +1729,9 @@ msgstr "Merge Request zurücksetzen"
msgid "SSH Keys"
msgstr "SSH-Schlüssel"
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1533,6 +1750,15 @@ msgstr "Pipelines planen"
msgid "Search branches and tags"
msgstr "Suche nach Branches und Tags"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "Archivierungsformat auswählen"
@@ -1580,13 +1806,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1706,6 +1935,12 @@ msgstr "Beginne einen %{new_merge_request} mit diesen Änderungen"
msgid "Start the Runner!"
msgstr "Starte den Runner!"
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "Zu Branch/Tag wechseln"
@@ -1732,6 +1967,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Die Entwicklungsphase stellt die Zeit vom ersten Commit bis zum Erstellen eines Merge Requests dar. Sobald Du Deinen ersten Merge Request anlegst, werden dessen Daten automatisch ergänzt."
@@ -1744,6 +1982,15 @@ msgstr "Die Beziehung des Ablegers wurde entfernt."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "Die Ticketphase stellt die Zeit vom Anlegen eines Tickets bis zum Zuweisen eines Meilensteins oder Hinzufügen zur Aufgabentafel dar. Erstelle einen Ticket, damit dessen Daten hier erscheinen."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "Die Phase des Entwicklungslebenszyklus."
@@ -1774,6 +2021,12 @@ msgstr "Die Staging-Phase stellt die Zeit zwischen der Umsetzung eines Merge Re
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "Die Testphase stellt die Zeit dar, die GitLab CI benötigt um die Pipelines von zugehörigen Merge Requests abzuarbeiten. Sobald die erste Pipeline abgeschlossen ist, werden deren Daten hier automatisch angezeigt."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "Zeit, die für das jeweilige Ereignis in der Phase ermittelt wurde."
@@ -1783,6 +2036,9 @@ msgstr "Der mittlere aller erfassten Werte. Zum Beispiel ist für 3, 5, 9 der Me
msgid "There are problems accessing Git storage: "
msgstr "Es gibt ein Problem beim Zugriff auf den Gitspeicher:"
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1967,6 +2223,9 @@ msgstr ""
msgid "Unstar"
msgstr "Entfavorisieren"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2030,6 +2289,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
@@ -2150,9 +2412,21 @@ msgstr "Du bist dabei, die Beziehung des Ablegers zum Ursprungsprojekt %{forked_
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "Du bist dabei %{project_name_with_namespace} einem andere Besitzer zu übergeben. Bist Du dir WIRKLICH sicher?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "Du kannst Dateien nur hinzufügen, wenn Du dich auf einem Branch befindest."
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Du hast die Projektbegrenzung erreicht."
@@ -2186,6 +2460,9 @@ msgstr "Du kannst erst mittels SSH übertragen (push) oder abrufen (pull), nachd
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "Dein Name"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] "Vorgänger"
msgstr[1] "Vorgänger"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 838c7b62810..0a1b379b3d3 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:36-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:30-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Esperanto\n"
"Language: eo_UY\n"
@@ -34,6 +34,11 @@ msgstr[1] "%s enmetadoj estis transsaltitaj, por ne troŝarĝi la sistemon."
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} enmetis %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -54,6 +59,12 @@ msgstr[1] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr ""
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "1 ĉenstablo"
@@ -110,9 +121,18 @@ msgstr "Aldonu SSH-ŝlosilon al via profilo por ebligi al vi eltiri kaj alpuŝi
msgid "Add new directory"
msgstr "Aldoni novan dosierujon"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr ""
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -128,6 +148,9 @@ msgstr "Ĉu vi certe volas forigi ĉi tiun ĉenstablan planon?"
msgid "Are you sure you want to discard your changes?"
msgstr ""
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -161,18 +184,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -235,6 +261,9 @@ msgstr[1] "Branĉoj"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "La branĉo %{branch_name} estis kreita. Por agordi aŭtomatan disponigadon, bonvolu elekti Yaml-ŝablonon por GitLab CI kaj enmeti viajn ŝanĝojn. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Serĉu branĉon"
@@ -445,15 +474,24 @@ msgstr "transsaltita"
msgid "CiStatus|running"
msgstr "plenumiĝanta"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -496,27 +534,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -526,7 +570,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -538,18 +585,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -582,6 +623,11 @@ msgid_plural "Commits"
msgstr[0] "Enmetado"
msgstr[1] "Enmetadoj"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
msgstr ""
@@ -663,6 +709,12 @@ msgstr "Gvidlinioj por kontribuado"
msgid "Contributors"
msgstr "Kontribuantoj"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -684,9 +736,21 @@ msgstr "Krei dosierujon"
msgid "Create empty bare repository"
msgstr "Krei malplenan deponejon"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "Krei peton pri kunfando"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "Krei novan…"
@@ -773,6 +837,9 @@ msgstr "Nomo de dosierujo"
msgid "Discard changes"
msgstr ""
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -845,12 +912,18 @@ msgstr "Ĉiusemajne (en dimanĉo, je 4:00)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "Ne eblas ŝanĝi la posedanton"
msgid "Failed to remove the pipeline schedule"
msgstr "Ne eblas forigi la ĉenstablan planon"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "Dosieroj"
@@ -895,9 +968,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -940,6 +1019,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -984,6 +1108,12 @@ msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervala ŝablono"
@@ -1052,6 +1182,9 @@ msgstr "Lernu pli en la"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "dokumentado pri ĉenstablaj planoj"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "Forlasi la grupon"
@@ -1075,6 +1208,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "Mediano"
@@ -1105,6 +1244,9 @@ msgstr ""
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Nova problemo"
@@ -1122,18 +1264,27 @@ msgstr "Nova dosierujo"
msgid "New file"
msgstr "Nova dosiero"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "Nova problemo"
msgid "New merge request"
msgstr "Nova peto pri kunfando"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "Nova plano"
msgid "New snippet"
msgstr "Nova kodaĵo"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "Nova etikedo"
@@ -1212,6 +1363,12 @@ msgstr "Rigardado"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Filtrilo"
@@ -1353,9 +1510,54 @@ msgstr "kun etapoj"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "La projekto „%{project_name}“ estis alvicigita por forigado."
@@ -1365,9 +1567,6 @@ msgstr "La projekto „%{project_name}“ estis sukcese kreita."
msgid "Project '%{project_name}' was successfully updated."
msgstr "La projekto „%{project_name}“ estis sukcese ĝisdatigita."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "La projekto „%{project_name}“ estos forigita."
-
msgid "Project access must be granted explicitly to each user."
msgstr "Ĉiu uzanto devas akiri propran atingon al la projekto."
@@ -1425,6 +1624,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1446,12 +1651,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Legu pli"
@@ -1515,6 +1729,9 @@ msgstr "Malfari ĉi tiun peton pri kunfando"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1533,6 +1750,15 @@ msgstr "Planado de la ĉenstabloj"
msgid "Search branches and tags"
msgstr "Serĉu branĉon aŭ etikedon"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "Elektu formaton de arkivo"
@@ -1580,13 +1806,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1706,6 +1935,12 @@ msgstr "Kreu %{new_merge_request} kun ĉi tiuj ŝanĝoj"
msgid "Start the Runner!"
msgstr ""
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "Iri al branĉo/etikedo"
@@ -1732,6 +1967,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "La etapo de programado montras la tempon de la unua enmetado ĝis la kreado de la peto pri kunfando. La datenoj aldoniĝos aŭtomate ĉi tie post kiam vi kreas la unuan peton pri kunfando."
@@ -1744,6 +1982,15 @@ msgstr "La rilato de disbranĉigo estis forigita."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "La etapo de la problemo montras kiom la tempo pasas de la kreado de problemo ĝis la atribuado de la problemo al cela etapo de la projekto, aŭ al listo sur la problemtabulo. Komencu krei problemojn por vidi la datenojn por ĉi tiu etapo."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "La etapo de la disvolva ciklo."
@@ -1774,6 +2021,12 @@ msgstr "La etapo de preparo por eldono montras la tempon inter la aplikado de la
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "La etapo de testado montras kiom da tempo necesas al „GitLab CI“ por plenumi ĉiujn ĉenstablojn por la rilata peto pri kunfando. La datenoj aldoniĝos aŭtomate post kiam via unua ĉenstablo finiĝos."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "La tempo, kiu estas necesa por ĉiu dateno kolektita de la etapo."
@@ -1783,6 +2036,9 @@ msgstr "La valoro, kiu troviĝas en la mezo de aro da rigardataj valoroj. Ekzemp
msgid "There are problems accessing Git storage: "
msgstr ""
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1967,6 +2223,9 @@ msgstr ""
msgid "Unstar"
msgstr "Malsteligi"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2030,6 +2289,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2148,11 +2410,23 @@ msgid "You are going to remove the fork relationship to source project %{forked_
msgstr "Vi forigos la rilaton de la disbranĉigo al la originala projekto, „%{forked_from_project}“. Ĉu vi estas ABSOLUTE certa?"
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
-msgstr "Vi transigos „%{project_name_with_namespace}“ al alia posedanto. Ĉu vi estas ABSOLUTE certa?"
+msgstr "Vi estas transigonta „%{project_name_with_namespace}“ al alia posedanto. Ĉu vi estas ABSOLUTE certa?"
+
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
msgid "You can only add files when you are on a branch"
msgstr "Oni povas aldoni dosierojn nur kiam oni estas en branĉo"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Vi ne povas krei pliajn projektojn"
@@ -2186,6 +2460,9 @@ msgstr "Vi ne povos eltiri aŭ alpuŝi kodon per SSH antaŭ ol vi %{add_ssh_key_
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "Via nomo"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] "patro"
msgstr[1] "patroj"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index c930e22a083..31ff4e08592 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:31-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -34,6 +34,11 @@ msgstr[1] "%s cambios adicionales han sido omitidos para evitar problemas de ren
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} cambió %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -54,6 +59,12 @@ msgstr[1] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr ""
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] ""
@@ -110,9 +121,18 @@ msgstr "Agregar una clave SSH a tu perfil para actualizar o enviar a través de
msgid "Add new directory"
msgstr "Agregar nuevo directorio"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr ""
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -128,6 +148,9 @@ msgstr "¿Estás seguro que deseas eliminar esta programación del pipeline?"
msgid "Are you sure you want to discard your changes?"
msgstr ""
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -161,18 +184,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -235,6 +261,9 @@ msgstr[1] "Ramas"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "La rama %{branch_name} fue creada. Para configurar el auto despliegue, escoge una plantilla Yaml para GitLab CI y envía tus cambios. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Buscar ramas"
@@ -445,15 +474,24 @@ msgstr "omitido"
msgid "CiStatus|running"
msgstr "en ejecución"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -496,27 +534,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -526,7 +570,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -538,18 +585,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -582,6 +623,11 @@ msgid_plural "Commits"
msgstr[0] "Cambio"
msgstr[1] "Cambios"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
msgstr ""
@@ -663,6 +709,12 @@ msgstr "Guía de contribución"
msgid "Contributors"
msgstr "Contribuidores"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -684,9 +736,21 @@ msgstr "Crear directorio"
msgid "Create empty bare repository"
msgstr "Crear repositorio vacío"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "Crear solicitud de fusión"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "Crear nuevo..."
@@ -773,6 +837,9 @@ msgstr "Nombre del directorio"
msgid "Discard changes"
msgstr ""
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -845,12 +912,18 @@ msgstr "Todas las semanas (domingos a las 4:00 am)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "Error al cambiar el propietario"
msgid "Failed to remove the pipeline schedule"
msgstr "Error al eliminar la programación del pipeline"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "Archivos"
@@ -895,9 +968,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -940,6 +1019,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -984,6 +1108,12 @@ msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Patrón de intervalo"
@@ -1052,6 +1182,9 @@ msgstr "Más información en la"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "documentación sobre la programación de pipelines"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "Abandonar grupo"
@@ -1075,6 +1208,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "Mediana"
@@ -1105,6 +1244,9 @@ msgstr ""
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Nueva incidencia"
@@ -1122,18 +1264,27 @@ msgstr "Nuevo directorio"
msgid "New file"
msgstr "Nuevo archivo"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "Nueva incidencia"
msgid "New merge request"
msgstr "Nueva solicitud de fusión"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "Nueva programación"
msgid "New snippet"
msgstr "Nuevo fragmento de código"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "Nueva etiqueta"
@@ -1212,6 +1363,12 @@ msgstr "Vigilancia"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Filtrar"
@@ -1353,9 +1510,54 @@ msgstr "con etapas"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Proyecto ‘%{project_name}’ en cola para eliminación."
@@ -1365,9 +1567,6 @@ msgstr "Proyecto ‘%{project_name}’ fue creado satisfactoriamente."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Proyecto ‘%{project_name}’ fue actualizado satisfactoriamente."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Proyecto ‘%{project_name}’ será eliminado."
-
msgid "Project access must be granted explicitly to each user."
msgstr "El acceso al proyecto debe concederse explícitamente a cada usuario."
@@ -1425,6 +1624,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1446,12 +1651,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Leer más"
@@ -1515,6 +1729,9 @@ msgstr "Revertir esta solicitud de fusión"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1533,6 +1750,15 @@ msgstr "Programación de Pipelines"
msgid "Search branches and tags"
msgstr "Buscar ramas y etiquetas"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "Seleccionar formato de archivo"
@@ -1580,13 +1806,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1706,6 +1935,12 @@ msgstr "Iniciar una %{new_merge_request} con estos cambios"
msgid "Start the Runner!"
msgstr ""
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "Cambiar rama/etiqueta"
@@ -1732,6 +1967,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "La etapa de desarrollo muestra el tiempo desde el primer cambio hasta la creación de la solicitud de fusión. Los datos serán automáticamente incorporados aquí una vez creada tu primera solicitud de fusión."
@@ -1744,6 +1982,15 @@ msgstr "La relación con la bifurcación se ha eliminado."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "La etapa de incidencia muestra el tiempo que toma desde la creación de un tema hasta asignar el tema a un hito, o añadir el tema a una lista en el panel de temas. Empieza a crear temas para ver los datos de esta etapa."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "La etapa del ciclo de vida de desarrollo."
@@ -1774,6 +2021,12 @@ msgstr "La etapa de puesta en escena muestra el tiempo entre la fusión y el des
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "La etapa de pruebas muestra el tiempo que GitLab CI toma para ejecutar cada pipeline para la solicitud de fusión relacionada. Los datos se añadirán automáticamente luego de que el primer pipeline termine de ejecutarse."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "El tiempo utilizado por cada entrada de datos obtenido por esa etapa."
@@ -1783,6 +2036,9 @@ msgstr "El valor en el punto medio de una serie de valores observados. Por ejemp
msgid "There are problems accessing Git storage: "
msgstr ""
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1967,6 +2223,9 @@ msgstr ""
msgid "Unstar"
msgstr "No Destacar"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2030,6 +2289,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2150,9 +2412,21 @@ msgstr "Vas a eliminar el enlace de la bifurcación con el proyecto original %{f
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "Vas a transferir %{project_name_with_namespace} a otro propietario. ¿Estás TOTALMENTE seguro?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "Solo puedes agregar archivos cuando estás en una rama"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Has alcanzado el límite de tu proyecto"
@@ -2186,6 +2460,9 @@ msgstr "No podrás actualizar o enviar código al proyecto a través de SSH hast
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "Tu nombre"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] "padre"
msgstr[1] "padres"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 56cc02c55d5..a4f9a34b13b 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:36-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:30-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -23,8 +23,8 @@ msgstr[1] "%d validations"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d couche"
+msgstr[1] "%d couches"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -34,6 +34,11 @@ msgstr[1] "%s validations supplémentaires ont été masquées afin d'éviter de
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} a validé %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} validations de retard sur %{default_branch}, %{number_commits_ahead} validations d'avance"
@@ -54,6 +59,12 @@ msgstr[1] "%{storage_name} : %{failed_attempts} tentatives d’accès au stocka
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(Lisez %{link} pour savoir comment l'installer)."
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "1 pipeline"
@@ -63,13 +74,13 @@ msgid "1st contribution!"
msgstr "1ère contribution !"
msgid "2FA enabled"
-msgstr ""
+msgstr "2FA activé"
msgid "A collection of graphs regarding Continuous Integration"
msgstr "Un ensemble de graphiques concernant l’Intégration Continue (CI)"
msgid "About auto deploy"
-msgstr "A propos de l'auto-déploiement"
+msgstr "À propos de l'auto-déploiement"
msgid "Abuse Reports"
msgstr "Rapports d’abus"
@@ -99,7 +110,7 @@ msgid "Add Contribution guide"
msgstr "Ajouter un guide de contribution"
msgid "Add Group Webhooks and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Ajouter des Webhooks de groupe et GitLab Enterprise Edition."
msgid "Add License"
msgstr "Ajouter une licence"
@@ -110,9 +121,18 @@ msgstr "Ajoutez une clef SSH à votre profil pour pouvoir récupérer et pousser
msgid "Add new directory"
msgstr "Ajouter un nouveau dossier"
+msgid "AdminHealthPageLink|health page"
+msgstr "État des services"
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr "Tous"
+msgid "An error occurred. Please try again."
+msgstr "Une erreur est survenue. Merci de réessayer."
+
msgid "Appearance"
msgstr "Apparence"
@@ -123,13 +143,16 @@ msgid "Archived project! Repository is read-only"
msgstr "Projet archivé ! Le dépôt est en lecture seule"
msgid "Are you sure you want to delete this pipeline schedule?"
-msgstr "Êtes-vous sûr de vouloir supprimer ce pipeline programmé"
+msgstr "Êtes-vous sûr·e de vouloir supprimer ce pipeline programmé ?"
msgid "Are you sure you want to discard your changes?"
-msgstr "Êtes-vous sûr de vouloir annuler vos modifications ?"
+msgstr "Êtes-vous sûr·e de vouloir annuler vos modifications ?"
+
+msgid "Are you sure you want to leave this group?"
+msgstr "Êtes-vous sûr·e de vouloir quitter ce groupe ?"
msgid "Are you sure you want to reset registration token?"
-msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton d’inscription ?"
+msgstr "Êtes-vous sûr·e de vouloir réinitialiser le jeton d’inscription ?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton de bilan de santé ?"
@@ -147,64 +170,67 @@ msgid "Authentication Log"
msgstr "Journal d'authentification"
msgid "Author"
-msgstr ""
+msgstr "Auteur"
msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Les applications de révision automatique et le déploiement automatique requièrent un nom de domaine et un %{kubernetes} pour fonctionner correctement."
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
-msgstr ""
+msgstr "Les applications de révision automatique et de déploiement automatique requièrent un nom de domaine pour fonctionner correctement."
msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Les applications de révision automatique et de déploiement automatique requièrent un %{kubernetes} pour fonctionner correctement."
msgid "AutoDevOps|Auto DevOps (Beta)"
-msgstr ""
-
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
+msgstr "Auto DevOps (Béta)"
msgid "AutoDevOps|Auto DevOps documentation"
-msgstr ""
+msgstr "Documentation Auto DevOps"
msgid "AutoDevOps|Enable in settings"
-msgstr ""
+msgstr "Activer dans les paramètres"
+
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr "AutoDevOps vous permet de construire, tester et déployer automatiquement votre application à partir d'une configuration CI/CD prédéfinie."
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
-msgstr ""
+msgstr "En savoir plus dans %{link_to_documentation}"
+
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr "Vous pouvez activer %{link_to_settings} pour ce projet."
msgid "Billing"
msgstr "Facturation"
msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
-msgstr ""
+msgstr "%{group_name} est actuellement abonné au forfait %{plan_link}."
msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
-msgstr ""
+msgstr "La mise à niveau de certains abonnements n’est actuellement pas disponible."
msgid "BillingPlans|Current plan"
-msgstr ""
+msgstr "Abonnement actuel"
msgid "BillingPlans|Customer Support"
-msgstr ""
+msgstr "Support client"
msgid "BillingPlans|Downgrade"
-msgstr ""
+msgstr "Retour à un forfait inférieur"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
-msgstr ""
+msgstr "En savoir plus sur chaque abonnement en lisant nos %{faq_link}."
msgid "BillingPlans|Manage plan"
-msgstr ""
+msgstr "Gérer l'abonnement"
msgid "BillingPlans|Please contact %{customer_support_link} in that case."
-msgstr ""
+msgstr "Merci de contacter %{customer_support_link} à ce sujet."
msgid "BillingPlans|See all %{plan_name} features"
-msgstr ""
+msgstr "Voir toutes les fonctionnalités de l’abonnement %{plan_name}"
msgid "BillingPlans|This group uses the plan associated with its parent group."
-msgstr "Ce groupe utilise le plan associé à son groupe parent."
+msgstr "Ce groupe utilise l’abonnement associé à son groupe parent."
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
msgstr "Pour gérer le plan de ce groupe, visitez la section facturation de %{parent_billing_page_link}."
@@ -213,19 +239,19 @@ msgid "BillingPlans|Upgrade"
msgstr "Mise à niveau"
msgid "BillingPlans|You are currently on the %{plan_link} plan."
-msgstr ""
+msgstr "Vous êtes actuellement abonné·e au forfait %{plan_link}."
msgid "BillingPlans|frequently asked questions"
-msgstr ""
+msgstr "Foire aux questions"
msgid "BillingPlans|monthly"
-msgstr ""
+msgstr "Mensuellement"
msgid "BillingPlans|paid annually at %{price_per_year}"
-msgstr ""
+msgstr "au prix annuel de %{price_per_year}"
msgid "BillingPlans|per user"
-msgstr ""
+msgstr "par utilisateur"
msgid "Branch"
msgid_plural "Branches"
@@ -233,7 +259,10 @@ msgstr[0] "Branche"
msgstr[1] "Branches"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
-msgstr "La branche %{branch_name} a été crée. Pour mettre en place le déploiement automatisé, sélectionnez un modèle de fichier Yaml pour l'intégration continue (CI) de GitLab, et validez les modifications. %{link_to_autodeploy_doc}"
+msgstr "La branche %{branch_name} a été créée. Pour mettre en place le déploiement automatisé, sélectionnez un modèle de fichier Yaml pour l'intégration continue (CI) de GitLab, et validez les modifications. %{link_to_autodeploy_doc}"
+
+msgid "Branch has changed"
+msgstr "La branche a été modifiée"
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Rechercher la branche"
@@ -314,7 +343,7 @@ msgid "Branches|To discard the local changes and overwrite the branch with the u
msgstr "Pour rejeter les changements locaux et écraser la branche avec la version du dépôt en amont, veuillez la supprimer ici puis cliquez ci-dessus sur 'Mettre à jour maintenant'."
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
-msgstr "Vous êtes sur le point de supprimer définitivement la branche protégées %{branch_name}."
+msgstr "Vous êtes sur le point de supprimer définitivement la branche protégée %{branch_name}."
msgid "Branches|diverged from upstream"
msgstr "a dévié du dépôt en amont"
@@ -362,13 +391,13 @@ msgid "Change Weight"
msgstr "Changer le poids"
msgid "ChangeTypeActionLabel|Pick into branch"
-msgstr "Sélectionner dans la branche"
+msgstr "Picorer dans la branche"
msgid "ChangeTypeActionLabel|Revert in branch"
msgstr "Défaire dans la branche"
msgid "ChangeTypeAction|Cherry-pick"
-msgstr "Sélectionner"
+msgstr "Picorer"
msgid "ChangeTypeAction|Revert"
msgstr "Défaire"
@@ -377,19 +406,19 @@ msgid "Changelog"
msgstr "Journal des modifications"
msgid "Charts"
-msgstr "Graphiques"
+msgstr "Statistiques"
msgid "Chat"
msgstr "Chat"
msgid "Cherry-pick this commit"
-msgstr "Sélectionner cette validation"
+msgstr "Picorer cette validation"
msgid "Cherry-pick this merge request"
-msgstr "Sélectionner cette demande de fusion"
+msgstr "Picorer cette demande de fusion"
msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all."
-msgstr ""
+msgstr "Choisissez quels groupes vous souhaitez répliquer sur le nœud secondaire. Laissez vide pour tous les répliquer."
msgid "CiStatusLabel|canceled"
msgstr "annulé"
@@ -445,134 +474,146 @@ msgstr "ignoré"
msgid "CiStatus|running"
msgstr "en cours"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr "CircuitBreaker API"
+
msgid "Clone repository"
-msgstr ""
+msgstr "Cloner le dépôt"
msgid "Close"
msgstr "Fermer"
+msgid "Cluster"
+msgstr "Cluster"
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
-msgstr ""
+msgstr "Un %{link_to_container_project} doit avoir été créé pour ce compte"
+
+msgid "ClusterIntegration|Cluster details"
+msgstr "Détails du cluster"
msgid "ClusterIntegration|Cluster integration"
-msgstr ""
+msgstr "Intégration du cluster"
msgid "ClusterIntegration|Cluster integration is disabled for this project."
-msgstr ""
+msgstr "L'intégration du cluster est désactivée pour ce projet."
msgid "ClusterIntegration|Cluster integration is enabled for this project."
-msgstr ""
+msgstr "L'intégration du cluster est activée pour ce projet."
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "L'intégration de cluster est activée pour ce projet. La désactivation de cette intégration n’affectera pas votre cluster, il coupera temporairement la connexion de GitLab à celui-ci."
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
-msgstr ""
+msgstr "Le cluster est en cours de création sur Google Container Engine…"
msgid "ClusterIntegration|Cluster name"
-msgstr ""
+msgstr "Nom du cluster"
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
-msgstr ""
+msgstr "Le cluster a été correctement créé sur Google Container Engine"
msgid "ClusterIntegration|Copy cluster name"
-msgstr ""
+msgstr "Copier le nom du cluster"
msgid "ClusterIntegration|Create cluster"
-msgstr ""
+msgstr "Créer le cluster"
msgid "ClusterIntegration|Create new cluster on Google Container Engine"
-msgstr ""
+msgstr "Créer un nouveau cluster sur Google Container Engine"
msgid "ClusterIntegration|Enable cluster integration"
-msgstr ""
+msgstr "Activer l’intégration du cluster"
msgid "ClusterIntegration|Google Cloud Platform project ID"
-msgstr ""
+msgstr "ID de projet Google Cloud Platform"
msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine"
msgid "ClusterIntegration|Google Container Engine project"
-msgstr ""
-
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine"
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
-msgstr ""
+msgstr "En savoir plus sur %{link_to_documentation}"
-msgid "ClusterIntegration|See machine types"
-msgstr ""
+msgid "ClusterIntegration|Machine type"
+msgstr "Type de machine"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
-msgstr ""
+msgstr "Assurez-vous que votre compte %{link_to_requirements} pour créer des clusters"
+
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr "Gérer l’intégration du cluster sur votre projet GitLab"
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
-msgstr ""
+msgstr "Gérer votre cluster en visitant le lien %{link_gke}"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
-
-msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
-
-msgid "ClusterIntegration|Remove cluster integration"
-msgstr ""
-
-msgid "ClusterIntegration|Remove integration"
-msgstr ""
-
-msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
-msgstr ""
-
-msgid "ClusterIntegration|Save changes"
-msgstr ""
-
-msgid "ClusterIntegration|See your projects"
-msgstr ""
-
-msgid "ClusterIntegration|See zones"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
+msgstr "Nombre de nœuds"
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "Veuillez vous assurer que votre compte Google répond aux exigences suivantes : "
-msgid "ClusterIntegration|Toggle Cluster"
-msgstr ""
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr "Espace de noms du projet (facultatif, unique)"
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
+msgstr "Lire notre %{link_to_help_page} sur l’intégration d’un cluster."
+
+msgid "ClusterIntegration|Remove cluster integration"
+msgstr "Retirer l’intégration du cluster"
+
+msgid "ClusterIntegration|Remove integration"
+msgstr "Retirer l’intégration"
+
+msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
+msgstr "Supprimer l'intégration du cluster supprimera sa configuration que vous avez ajoutée pour ce projet. Cela ne supprimera pas votre projet."
+
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr "Voir et modifier les détails de votre cluster"
+
+msgid "ClusterIntegration|See machine types"
+msgstr "Voir les types de machine"
+
+msgid "ClusterIntegration|See your projects"
+msgstr "Voir vos projets"
+
+msgid "ClusterIntegration|See zones"
+msgstr "Voir les zones"
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr "Un problème est survenu de notre côté."
+
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
+msgstr "Un problème est survenu lors de la création de votre cluster sur Google Container Engine."
+
+msgid "ClusterIntegration|Toggle Cluster"
+msgstr "Activer/désactiver le cluster"
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "Avec un cluster associé à ce projet, vous pouvez utiliser des applications de revue, déployer vos applications, exécuter vos pipelines et bien plus encore, de manière très simple."
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
-msgstr ""
+msgstr "Votre compte doit disposer de %{link_to_container_engine}"
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "Zone"
msgid "ClusterIntegration|access to Google Container Engine"
-msgstr ""
+msgstr "Accéder à Google Container Engine"
msgid "ClusterIntegration|cluster"
-msgstr ""
+msgstr "cluster"
msgid "ClusterIntegration|help page"
-msgstr ""
+msgstr "page d’aide"
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "répond aux exigences"
msgid "ClusterIntegration|properly configured"
-msgstr ""
+msgstr "correctement configuré"
msgid "Comments"
msgstr "Commentaires"
@@ -582,8 +623,13 @@ msgid_plural "Commits"
msgstr[0] "Validation"
msgstr[1] "Validations"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
-msgstr ""
+msgstr "Message de validation"
msgid "Commit duration in minutes for last 30 commits"
msgstr "Durée des 30 derniers pipelines en minutes"
@@ -613,49 +659,49 @@ msgid "Compare"
msgstr "Comparer"
msgid "Container Registry"
-msgstr ""
+msgstr "Registre de conteneur"
msgid "ContainerRegistry|Created"
-msgstr ""
+msgstr "Créé"
msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "D’abord inscrivez-vous au registre de conteneur GitLab à l’aide de votre nom d’utilisateur GitLab et de votre mot de passe. Si vous avez %{link_2fa} vous devrez utiliser un %{link_token} :"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
-msgstr ""
+msgstr "GitLab prend en charge jusqu'à 3 niveaux de noms d’image. Les exemples d’images suivants sont valides pour votre projet :"
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr ""
+msgstr "Comment utiliser le registre de conteneur"
msgid "ContainerRegistry|Learn more about"
-msgstr ""
+msgstr "En savoir plus sur"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "Aucune étiquettes dans le registre de conteneur pour l’image de ce conteneur."
msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "Une fois identifié·e, vous êtes libre de créer et télécharger une image de conteneur en utilisant les commandes courantes de %{build} et %{push}"
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "Supprimer le dépôt"
msgid "ContainerRegistry|Remove tag"
-msgstr ""
+msgstr "Supprimer l’étiquette"
msgid "ContainerRegistry|Size"
-msgstr ""
+msgstr "Taille"
msgid "ContainerRegistry|Tag"
-msgstr ""
+msgstr "Étiquette"
msgid "ContainerRegistry|Tag ID"
-msgstr ""
+msgstr "ID d‘étiquette"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "Utilisez des noms d’images différents"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "Avec le registre de conteneur Docker intégré à GitLab, chaque projet peut avoir son propre espace pour stocker ses images Docker."
msgid "Contribution guide"
msgstr "Guilde de contribution"
@@ -663,6 +709,12 @@ msgstr "Guilde de contribution"
msgid "Contributors"
msgstr "Contributeurs"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Contrôler la concurrence maximale des remplacements de fichier-joint LFS pour ce nœud secondaire"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Contrôler la concurrence maximale des remplacements de dépôt pour ce nœud secondaire"
+
msgid "Copy SSH public key to clipboard"
msgstr "Copier la clé publique SSH dans le presse-papier"
@@ -684,9 +736,21 @@ msgstr "Créer un dossier"
msgid "Create empty bare repository"
msgstr "Créer un dépôt vide"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "Créer une demande de fusion"
+msgid "Create new branch"
+msgstr "Créer une nouvelle branche"
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "Créer nouveau..."
@@ -721,7 +785,7 @@ msgid "CycleAnalyticsStage|Code"
msgstr "Code"
msgid "CycleAnalyticsStage|Issue"
-msgstr "Incident"
+msgstr "Ticket"
msgid "CycleAnalyticsStage|Plan"
msgstr "Planification"
@@ -762,7 +826,7 @@ msgid "Description"
msgstr "Description"
msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
-msgstr ""
+msgstr "Les modèles de description permettent de définir des modèles spécifiques au contexte pour les champs de description de tickets et demandes de fusion pour votre projet."
msgid "Details"
msgstr "Détails"
@@ -773,8 +837,11 @@ msgstr "Nom du dossier"
msgid "Discard changes"
msgstr "Supprimer les modifications"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr "Passer l’introduction Cycle Analytics"
+
msgid "Dismiss Merge Request promotion"
-msgstr ""
+msgstr "Rejeter la promotion de la demande de fusion"
msgid "Don't show again"
msgstr "Ne plus montrer"
@@ -822,7 +889,7 @@ msgid "EventFilterBy|Filter by comments"
msgstr "Filtrer par commentaires"
msgid "EventFilterBy|Filter by issue events"
-msgstr "Filtrer par événements d'incident"
+msgstr "Filtrer par événements de ticket"
msgid "EventFilterBy|Filter by merge events"
msgstr "Filtrer par événements de fusion"
@@ -834,23 +901,29 @@ msgid "EventFilterBy|Filter by team"
msgstr "Filtrer par équipe"
msgid "Every day (at 4:00am)"
-msgstr "Chaque jour (à 4:00 du matin)"
+msgstr "Chaque jour (à 4h00 du matin)"
msgid "Every month (on the 1st at 4:00am)"
msgstr "Chaque mois (le 1er à 4:00 du matin)"
msgid "Every week (Sundays at 4:00am)"
-msgstr "Chaque semaine (dimanche à 4:00 du matin)"
+msgstr "Chaque semaine (dimanche à 4h00 du matin)"
msgid "Explore projects"
msgstr "Explorer les projets"
+msgid "Explore public groups"
+msgstr "Explorer les groupes publics"
+
msgid "Failed to change the owner"
msgstr "Échec du changement de propriétaire"
msgid "Failed to remove the pipeline schedule"
msgstr "Échec de la suppression du pipeline programmé"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "Fichiers"
@@ -878,13 +951,13 @@ msgid "ForkedFromProjectPath|Forked from"
msgstr "Fourché depuis"
msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)"
-msgstr ""
+msgstr "Fourché depuis %{project_name} (supprimé)"
msgid "Format"
msgstr "Format"
msgid "From issue creation until deploy to production"
-msgstr "Depuis la création de l'incident jusqu'au déploiement en production"
+msgstr "Depuis la création du ticket jusqu'au déploiement en production"
msgid "From merge request merge until deploy to production"
msgstr "Depuis la fusion de la demande de fusion jusqu'au déploiement en production"
@@ -893,19 +966,25 @@ msgid "GPG Keys"
msgstr "Clés GPG"
msgid "Geo Nodes"
-msgstr ""
+msgstr "Nœuds Geo"
+
+msgid "Geo|File sync capacity"
+msgstr "Capacité de synchronisation de fichier"
msgid "Geo|Groups to replicate"
-msgstr ""
+msgstr "Groupes à répliquer"
+
+msgid "Geo|Repository sync capacity"
+msgstr "Capacité de synchronisation du dépôt"
msgid "Geo|Select groups to replicate."
-msgstr ""
+msgstr "Sélectionner les groupes à répliquer."
msgid "Git storage health information has been reset"
msgstr "Les informations de santé du stockage Git ont été réinitialisées"
msgid "GitLab Runner section"
-msgstr "Section de Runner GitLab"
+msgstr "Section de l'Exécuteur GitLab"
msgid "Go to your fork"
msgstr "Aller à votre fourche"
@@ -914,37 +993,82 @@ msgid "GoToYourFork|Fork"
msgstr "Fourche"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "L’authentification Google n’est pas %{link_to_documentation}. Demandez à votre administrateur GitLab si vous souhaitez utiliser ce service."
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr ""
+msgstr "Empêcher le partage d'un projet de %{group} avec d'autres groupes"
msgid "GroupSettings|Share with group lock"
-msgstr ""
+msgstr "Verrou de partage avec un groupe"
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "Ce paramètre est appliqué sur %{ancestor_group} et a été modifié dans ce sous-groupe."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Ce paramètre est appliqué sur %{ancestor_group}. Pour partager des projets dans ce groupe avec un autre groupe, demander au propriétaire de modifier le paramètre ou %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Ce paramètre s’applique sur %{ancestor_group}. Vous pouvez modifier le paramètre ou le %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
+msgstr "Ce paramètre s’appliquera à tous les sous-groupes, sauf s’il est modifié par un propriétaire du groupe. Les groupes déjà liés au projet continueront d’y avoir accès à moins d’être retirés manuellement."
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
-msgstr ""
+msgstr "ne peut pas être désactivé lorsque le groupe parent « Verrou de partage avec un groupe » est activé, sauf pour le propriétaire du groupe parent"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
-msgstr ""
+msgstr "supprimer le verrou de partage avec un groupe pour %{ancestor_group_name}"
+
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "Un groupe est une collection de plusieurs projets."
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "Si vous organisez vos projets au sein d’un groupe, il fonctionnera comme un dossier."
+
+msgid "GroupsEmptyState|No groups found"
+msgstr "Aucun groupe trouvé"
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr "Vous pouvez gérer les autorisations des membres de votre groupe et accéder à chacun de ses projets."
+
+msgid "GroupsTreeRole|as"
+msgstr "comme"
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr "Êtes-vous sûr·e de vouloir quitter le groupe « ${this.group.fullName} » ?"
+
+msgid "GroupsTree|Create a project in this group."
+msgstr "Créez un projet dans ce groupe."
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr "Créer un sous-groupe de ce groupe."
+
+msgid "GroupsTree|Edit group"
+msgstr "Modifier le groupe"
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr "Impossible de quitter le groupe. Veuillez vous assurer que vous n’êtes pas seul·e propriétaire."
+
+msgid "GroupsTree|Filter by name..."
+msgstr "Filtrer par nom…"
+
+msgid "GroupsTree|Leave this group"
+msgstr "Quitter ce groupe"
+
+msgid "GroupsTree|Loading groups"
+msgstr "Chargement des groupes"
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr "Désolé, aucun groupe ne correspond à vos critères de recherche"
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "Désolé, aucun groupe ni projet ne correspond à vos critères de recherche"
msgid "Health Check"
-msgstr "Bilan de santé"
+msgstr "État des services"
msgid "Health information can be retrieved from the following endpoints. More information is available"
-msgstr "Des informations de santé peuvent être récupérées depuis les adresses suivantes. Plus d’informations"
+msgstr "L’état des service peut être récupéré depuis les adresses suivantes. Plus d’information disponible."
msgid "HealthCheck|Access token is"
msgstr "Le jeton d’accès est"
@@ -968,21 +1092,27 @@ msgid "Import repository"
msgstr "Importer un dépôt"
msgid "Improve Issue boards with GitLab Enterprise Edition."
-msgstr ""
+msgstr "Améliorer le tableau de tickets avec GitLab Entreprise Edition."
msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Améliorer la gestion des tickets avec les poids de ticket et GitLab Entreprise Edition."
msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Améliorer la recherche avec la Recherche Globale Avancée et GitLab Enterprise Edition."
msgid "Install a Runner compatible with GitLab CI"
-msgstr "Installez un Runner compatible avec l'intégration continue de GitLab"
+msgstr "Installez un Exécuteur compatible avec l'intégration continue de GitLab"
msgid "Instance"
msgid_plural "Instances"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Instance"
+msgstr[1] "Instances"
+
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr "Interne - Le groupe ainsi que tous les projets internes sont accessibles pour n’importe quel·le utilisa·teur·trice connecté·e."
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr "Interne - Le projet est accessible pour n’importe quel·le utilisa·teur·trice connecté·e."
msgid "Interval Pattern"
msgstr "Schéma d’intervalle"
@@ -991,13 +1121,13 @@ msgid "Introducing Cycle Analytics"
msgstr "Introduction à l'analyseur de cycle"
msgid "Issue board focus mode"
-msgstr ""
+msgstr "Mode focus du tableau de tickets"
msgid "Issue boards with milestones"
-msgstr "Tableaux d'incidents avec leurs jalons"
+msgstr "Tableaux des tickets avec leurs jalons"
msgid "Issue events"
-msgstr "Événements de l'incident"
+msgstr "Événements du ticket"
msgid "IssueBoards|Board"
msgstr "Tableau"
@@ -1006,7 +1136,7 @@ msgid "IssueBoards|Boards"
msgstr "Tableaux"
msgid "Issues"
-msgstr "Incidents"
+msgstr "Tickets"
msgid "LFSStatus|Disabled"
msgstr "Désactivé"
@@ -1015,7 +1145,7 @@ msgid "LFSStatus|Enabled"
msgstr "Activé"
msgid "Labels"
-msgstr "Étiquettes"
+msgstr "Labels"
msgid "Last %d day"
msgid_plural "Last %d days"
@@ -1029,16 +1159,16 @@ msgid "Last commit"
msgstr "Dernière validation"
msgid "Last edited %{date}"
-msgstr ""
+msgstr "Dernière modification le %{date}"
msgid "Last edited by %{name}"
-msgstr ""
+msgstr "Dernière modification par %{name}"
msgid "Last update"
-msgstr ""
+msgstr "Dernière mise à jour"
msgid "Last updated"
-msgstr ""
+msgstr "Dernière mise à jour"
msgid "LastPushEvent|You pushed to"
msgstr "Vous avez poussé sur"
@@ -1052,6 +1182,9 @@ msgstr "En apprendre plus dans le"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "documentation concernant la programmation de pipeline"
+msgid "Leave"
+msgstr "Quitter"
+
msgid "Leave group"
msgstr "Quitter le groupe"
@@ -1075,6 +1208,12 @@ msgstr "Verrouillé"
msgid "Locked Files"
msgstr "Fichiers verrouillés"
+msgid "Login"
+msgstr "Se connecter"
+
+msgid "Maximum git storage failures"
+msgstr "Nombre maximum d’échecs du stockage git"
+
msgid "Median"
msgstr "Médian"
@@ -1094,7 +1233,7 @@ msgid "Messages"
msgstr "Messages"
msgid "MissingSSHKeyWarningLink|add an SSH key"
-msgstr "ajouter une clef SSH"
+msgstr "ajouter une clé SSH"
msgid "Monitoring"
msgstr "Surveillance"
@@ -1103,12 +1242,15 @@ msgid "More information is available|here"
msgstr "ici"
msgid "Multiple issue boards"
-msgstr ""
+msgstr "Multiple tableaux de tickets"
+
+msgid "New Cluster"
+msgstr "Nouveau cluster"
msgid "New Issue"
msgid_plural "New Issues"
-msgstr[0] "Nouvel incident"
-msgstr[1] "Nouveaux incidents"
+msgstr[0] "Nouveau ticket"
+msgstr[1] "Nouveaux tickets"
msgid "New Pipeline Schedule"
msgstr "Nouveau pipeline programmé"
@@ -1120,25 +1262,34 @@ msgid "New directory"
msgstr "Nouveau dossier"
msgid "New file"
-msgstr "Nouveau Fichier"
+msgstr "Nouveau fichier"
+
+msgid "New group"
+msgstr "Nouveau groupe"
msgid "New issue"
-msgstr "Nouvel incident"
+msgstr "Nouveau ticket"
msgid "New merge request"
msgstr "Nouvelle demande de fusion"
+msgid "New project"
+msgstr "Nouveau projet"
+
msgid "New schedule"
msgstr "Nouveau programme"
msgid "New snippet"
msgstr "Nouvel extrait de code"
+msgid "New subgroup"
+msgstr "Nouveau sous-groupe"
+
msgid "New tag"
msgstr "Nouveau tag"
msgid "No container images stored for this project. Add one by following the instructions above."
-msgstr ""
+msgstr "Aucune image de conteneur stockée pour ce projet. Ajoutez en une en suivant les instructions ci-dessous."
msgid "No repository"
msgstr "Pas de dépôt"
@@ -1147,7 +1298,7 @@ msgid "No schedules"
msgstr "Aucun programme"
msgid "None"
-msgstr "Aucun(e)"
+msgstr "Aucun·e"
msgid "Not available"
msgstr "Indisponible"
@@ -1159,7 +1310,7 @@ msgid "Notification events"
msgstr "Événement de notifications"
msgid "NotificationEvent|Close issue"
-msgstr "Clore l'incident"
+msgstr "Clore le ticket"
msgid "NotificationEvent|Close merge request"
msgstr "Clore la demande de fusion"
@@ -1171,7 +1322,7 @@ msgid "NotificationEvent|Merge merge request"
msgstr "Fusionner le demande de fusion"
msgid "NotificationEvent|New issue"
-msgstr "Nouvel incident"
+msgstr "Nouveau ticket"
msgid "NotificationEvent|New merge request"
msgstr "Nouvelle demande de fusion"
@@ -1180,13 +1331,13 @@ msgid "NotificationEvent|New note"
msgstr "Nouvelle note"
msgid "NotificationEvent|Reassign issue"
-msgstr "Réassigner l'incident"
+msgstr "Réassigner le ticket"
msgid "NotificationEvent|Reassign merge request"
msgstr "Réassigner la demande de fusion"
msgid "NotificationEvent|Reopen issue"
-msgstr "Ré-ouvrir l'incident"
+msgstr "Ré-ouvrir le ticket"
msgid "NotificationEvent|Successful pipeline"
msgstr "Pipeline réussi"
@@ -1212,17 +1363,23 @@ msgstr "Surveillé"
msgid "Notifications"
msgstr "Notifications"
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Filtre"
msgid "Only project members can comment."
-msgstr ""
+msgstr "Seuls les membres du projet peuvent commenter."
msgid "OpenedNDaysAgo|Opened"
msgstr "Ouvert"
msgid "Opens in a new window"
-msgstr ""
+msgstr "Ouvrir dans une nouvelle fenêtre"
msgid "Options"
msgstr "Paramètres"
@@ -1249,7 +1406,7 @@ msgid "Password"
msgstr "Mot de Passe"
msgid "People without permission will never get a notification and won\\'t be able to comment."
-msgstr ""
+msgstr "Les personnes sans autorisation ne recevront jamais de notifications et ne pourront pas commenter."
msgid "Pipeline"
msgstr "Pipeline"
@@ -1330,13 +1487,13 @@ msgid "Pipelines charts"
msgstr "Graphique des pipelines"
msgid "Pipelines for last month"
-msgstr "Pipelines pour le dernier mois"
+msgstr "Pipelines du dernier mois"
msgid "Pipelines for last week"
-msgstr "Pipelines pour la dernière semaine"
+msgstr "Pipelines de la semaine dernière"
msgid "Pipelines for last year"
-msgstr "Pipelines pour la dernière année"
+msgstr "Pipelines de l’année dernière"
msgid "Pipeline|all"
msgstr "Tous"
@@ -1353,9 +1510,54 @@ msgstr "avec les étapes"
msgid "Preferences"
msgstr "Préférences"
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr "Privé - L’accès au projet doit être autorisé explicitement pour chaque utilisa·teur·trice."
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr "Privé - Le groupe ainsi que ses projets ne sont accessibles qu’à ses membres."
+
msgid "Profile"
msgstr "Profil"
+msgid "Profiles|Account scheduled for removal."
+msgstr "Compte programmé pour sa suppression."
+
+msgid "Profiles|Delete Account"
+msgstr "Supprimer le compte"
+
+msgid "Profiles|Delete account"
+msgstr "Supprimer le compte"
+
+msgid "Profiles|Delete your account?"
+msgstr "Supprimer votre compte ?"
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr "Supprimer un compte aura les conséquences suivantes :"
+
+msgid "Profiles|Invalid password"
+msgstr "Mot de passe incorrect"
+
+msgid "Profiles|Invalid username"
+msgstr "Nom d’utilisateur incorrect"
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr "Saisissez votre %{confirmationValue} pour confirmer :"
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr "Vous n’avez pas les autorisations suffisantes pour supprimer cet·te utilisa·teur·trice."
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr "Vous devez transférer la propriété ou supprimer ces groupes avant de pouvoir supprimer votre compte."
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr "Votre compte est actuellement propriétaire des groupes suivants :"
+
+msgid "Profiles|your account"
+msgstr "votre compte"
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr "Le projet “%{project_name}” est en train d’être supprimé."
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Projet '%{project_name}' en attente de suppression."
@@ -1365,9 +1567,6 @@ msgstr "Projet '%{project_name}' créé avec succès."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Projet '%{project_name}' mis à jour avec succès."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Le projet '%{project_name}' sera supprimé."
-
msgid "Project access must be granted explicitly to each user."
msgstr "L’accès au projet doit être explicitement accordé à chaque utilisateur."
@@ -1408,23 +1607,29 @@ msgid "ProjectLifecycle|Stage"
msgstr "Étape"
msgid "ProjectNetworkGraph|Graph"
-msgstr "Graphique "
+msgstr "Graphes"
msgid "ProjectSettings|Contact an admin to change this setting."
-msgstr ""
+msgstr "Contactez un administrateur pour modifier ce paramètre."
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
-msgstr ""
+msgstr "Seules les validations signées peuvent être poussées sur ce dépôt."
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
-msgstr ""
+msgstr "Ce paramètre est appliqué au niveau du serveur et peut être modifié par un administrateur."
msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
-msgstr ""
+msgstr "Ce paramètre est appliqué au niveau du serveur mais il a été modifié pour ce projet."
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr "Ce paramètre s’appliquera à tous les projets à moins qu’un administrateur ne le modifie."
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
+msgid "Projects"
+msgstr "Projets"
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "Fréquemment visité"
@@ -1446,12 +1651,21 @@ msgstr "Désolé, aucun projet ne correspond à votre recherche"
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr "Cette fonctionnalité requiert le support du localStorage par votre navigateur"
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr "Public - Le groupe ainsi que n’importe quel projet public est accessible sans authentification."
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr "Public - Le projet est accessible sans aucune authentification."
+
msgid "Push Rules"
msgstr "Règles de poussée"
msgid "Push events"
msgstr "Évènements de poussée"
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Lire plus"
@@ -1471,10 +1685,10 @@ msgid "Related Commits"
msgstr "Validations liés"
msgid "Related Deployed Jobs"
-msgstr "Tâches de déploiement liés"
+msgstr "Tâches de déploiement liées"
msgid "Related Issues"
-msgstr "Incidents liés"
+msgstr "Tickets liés"
msgid "Related Jobs"
msgstr "Tâches liées"
@@ -1504,7 +1718,7 @@ msgid "Reset health check access token"
msgstr "Réinitialiser le jeton d’accès au bilan de santé"
msgid "Reset runners registration token"
-msgstr "Réinitialiser le jeton d’inscription des Runners"
+msgstr "Réinitialiser le jeton d’inscription des exécuteurs"
msgid "Revert this commit"
msgstr "Défaire cette validation"
@@ -1515,6 +1729,9 @@ msgstr "Défaire cette demande de fusion"
msgid "SSH Keys"
msgstr "Clés SSH"
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr "Enregistrer les modifications"
@@ -1533,6 +1750,15 @@ msgstr "Programmer des pipelines"
msgid "Search branches and tags"
msgstr "Rechercher dans les branches et les étiquettes"
+msgid "Seconds before reseting failure information"
+msgstr "Nombre de secondes avant de réinitialiser les informations d’échec"
+
+msgid "Seconds to wait after a storage failure"
+msgstr "Nombre de secondes d'attente après un échec de stockage"
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr "Nombre de secondes d’attente pour un essai d'accès au stockage"
+
msgid "Select Archive Format"
msgstr "Sélectionnez le format de l'archive"
@@ -1578,16 +1804,19 @@ msgid "Snippets"
msgstr "Extraits de code"
msgid "Something went wrong on our end."
-msgstr ""
-
-msgid "Something went wrong while fetching the projects."
-msgstr ""
-
-msgid "Something went wrong while fetching the registry list."
-msgstr ""
+msgstr "Une erreur est survenue de notre côté."
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
-msgstr ""
+msgstr "Quelque chose ne s'est pas bien passé en essayant de changer l’état de verrouillage de cet ${this.issuableDisplayName(this.issuableType)}"
+
+msgid "Something went wrong while fetching the projects."
+msgstr "Une erreur s'est produite lors de la récupération des projets."
+
+msgid "Something went wrong while fetching the registry list."
+msgstr "Une erreur s'est produite lors de la récupération de la liste du registre."
+
+msgid "Sort by"
+msgstr "Trier par"
msgid "SortOptions|Access level, ascending"
msgstr "Niveau d’accès, croissant"
@@ -1608,7 +1837,7 @@ msgid "SortOptions|Due soon"
msgstr "Échéance proche"
msgid "SortOptions|Label priority"
-msgstr "Priorité des étiquettes"
+msgstr "Priorité du label"
msgid "SortOptions|Largest group"
msgstr "Taille de groupe"
@@ -1662,7 +1891,7 @@ msgid "SortOptions|Oldest joined"
msgstr "Rejoint depuis longtemps"
msgid "SortOptions|Oldest sign in"
-msgstr "Authentifié depuis longtemps"
+msgstr "Authentifié·e depuis longtemps"
msgid "SortOptions|Oldest updated"
msgstr "Mise à jour depuis longtemps"
@@ -1674,7 +1903,7 @@ msgid "SortOptions|Priority"
msgstr "Priorité"
msgid "SortOptions|Recent sign in"
-msgstr "Authentifié récemment"
+msgstr "Authentifié·e récemment"
msgid "SortOptions|Start later"
msgstr "Commence plus tard"
@@ -1692,10 +1921,10 @@ msgid "Spam Logs"
msgstr "Journaux des messages indésirables"
msgid "Specify the following URL during the Runner setup:"
-msgstr "Spécifiez l’URL suivante lors de la configuration du Runner :"
+msgstr "Spécifiez l’URL suivante lors de la configuration de l'Exécuteur :"
msgid "StarProject|Star"
-msgstr "S'abonner"
+msgstr "Mettre en favori"
msgid "Starred projects"
msgstr "Projets favoris"
@@ -1704,7 +1933,13 @@ msgid "Start a %{new_merge_request} with these changes"
msgstr "Créer une %{new_merge_request} avec ces changements"
msgid "Start the Runner!"
-msgstr "Démarrer le Runner !"
+msgstr "Démarrer l'Exécuteur !"
+
+msgid "Subgroups"
+msgstr "Sous-groupes"
+
+msgid "Subscribe"
+msgstr ""
msgid "Switch branch/tag"
msgstr "Changer de branche / d'étiquette"
@@ -1730,6 +1965,9 @@ msgid "Thanks! Don't show me this again"
msgstr "Merci de ne plus afficher ce message"
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr "La Recherche Globale Avancée de GitLab est un outils qui vous fait gagner du temps. Au lieu de créer du code similaire et perdre du temps, vous pouvez maintenant chercher dans le code d'autres équipes pour vous aider sur votre projet."
+
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr ""
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
@@ -1742,22 +1980,31 @@ msgid "The fork relationship has been removed."
msgstr "La relation de fourche a été supprimée."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "L'étape des incidents montre le temps nécessaire entre la création d'un incident et son assignation à un jalon, ou son ajout à une liste d'un tableau d'incidents. Débutez à créer des incidents pour voir des données pour cette étape."
+msgstr "L'étape des tickets montre le temps nécessaire entre la création d'un ticket et son assignation à un jalon, ou son ajout à une liste d'un tableau de tickets. Commencez par créer des tickets pour voir des données pour cette étape."
+
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr "Nombre d’échecs avant que GitLab n’empêche tout accès au stockage. Ce nombre d’échecs peut être réinitialisé dans l’interface d’administration : %{link_to_health_page} ou en suivant le %{api_documentation_link}."
msgid "The phase of the development lifecycle."
msgstr "Les étapes du cycle de développement."
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
-msgstr "Les pipelines programmés exécutent des pipelines dans le futur, de façon répétée, pour les branches et tags spécifiées. Ces pipelines programmés héritent d’un accès partiel au projet basé sur l’utilisateur qui leurs est associé."
+msgstr "Les pipelines programmés exécutent des pipelines dans le futur, de façon répétée, pour les branches et tags spécifiées. Ces pipelines programmés héritent d’un accès partiel au projet basé sur l’utilisa·teur·trice qui leurs est associé·e."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "L’étape de planification montre le temps entre l’étape précédente et l’envoi de votre première validation. Ce temps sera automatiquement ajouté quand vous pousserez votre première validation."
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
-msgstr "L’étape de mise en production montre le temps nécessaire entre la création d’un incident et le déploiement du code en production. Les données seront automatiquement ajoutées une fois que vous aurez complété le cycle complet, depuis l’idée jusqu’à la mise en production."
+msgstr "L’étape de mise en production montre le temps nécessaire entre la création d’un ticket et le déploiement du code en production. Les données seront automatiquement ajoutées une fois que vous aurez complété le cycle complet, depuis l’idée jusqu’à la mise en production."
msgid "The project can be accessed by any logged in user."
-msgstr "Votre projet peut être accédé par n’importe quel utilisateur authentifié"
+msgstr "Votre projet peut être accédé par n’importe quel utilisa·teur·trice authentifié·e."
msgid "The project can be accessed without any authentication."
msgstr "Votre projet peut être accédé sans aucune authentification."
@@ -1774,6 +2021,12 @@ msgstr "L’étape de pré-production indique le temps entre la fusion de la DF
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "L’étape de test montre le temps que le CI de GitLab met pour exécuter chaque pipeline liés à la demande de fusion. Les données seront automatiquement ajoutées après que votre premier pipeline s’achèvera."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr "Délai en secondes pendant lequel GitLab gardera les informations d’échec. Si aucun échec ne survient pendant ce délai, les informations de ce montage seront réinitialisées."
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr "Temps en secondes pendant lequel GitLab essaiera d’accéder au stockage. Après ce délai, une erreur d’expiration d’attente sera déclenchée."
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "Le temps pris par chaque entrée récoltée durant cette étape."
@@ -1783,29 +2036,32 @@ msgstr "La valeur située au point médian d’une série de valeur observée. C
msgid "There are problems accessing Git storage: "
msgstr "Il y a des difficultés à accéder aux données Git : "
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr "Cette branche a changé depuis le début de l’édition. Souhaitez-vous créer une nouvelle branche ?"
+
msgid "This is a confidential issue."
-msgstr ""
+msgstr "Ce ticket est confidentiel."
msgid "This is the author's first Merge Request to this project."
-msgstr ""
+msgstr "C’est la première demande de fusion de cet auteur pour ce projet."
msgid "This issue is confidential and locked."
-msgstr ""
+msgstr "Ce ticket est confidentiel et verrouillé."
msgid "This issue is locked."
-msgstr ""
+msgstr "Ce ticket est verrouillé."
msgid "This means you can not push code until you create an empty repository or import existing one."
-msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous ne créez pas un dépôt vide, ou importez une dépôt existant."
+msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’avez pas créé un dépôt vide, ou que vous n’avez pas importé un dépôt existant."
msgid "This merge request is locked."
-msgstr ""
+msgstr "Cette demande de fusion est verrouillée."
msgid "Time before an issue gets scheduled"
-msgstr "Temps avant qu’un incident ne soit planifié"
+msgstr "Temps avant qu’un ticket ne soit planifié"
msgid "Time before an issue starts implementation"
-msgstr "Temps avant que résolution ne débute"
+msgstr "Temps avant que la résolution du ticket ne débute"
msgid "Time between merge request creation and merge/close"
msgstr "Temps entre la création d'une demande de fusion et sa fusion/clôture"
@@ -1814,7 +2070,7 @@ msgid "Time until first merge request"
msgstr "Temps jusqu’à la première demande de fusion"
msgid "Timeago|%s days ago"
-msgstr "Il y a %s jours"
+msgstr "il y a %s jours"
msgid "Timeago|%s days remaining"
msgstr "Il reste %s jours"
@@ -1844,7 +2100,7 @@ msgid "Timeago|%s weeks remaining"
msgstr "Il reste %s semaines"
msgid "Timeago|%s years ago"
-msgstr "Il y a %s ans"
+msgstr "il y a %s ans"
msgid "Timeago|%s years remaining"
msgstr "Il reste %s ans"
@@ -1931,7 +2187,7 @@ msgid "Timeago|in 1 year"
msgstr "Dans 1 an"
msgid "Timeago|in a while"
-msgstr ""
+msgstr "il y a longtemps"
msgid "Timeago|less than a minute ago"
msgstr "il y a moins d'une minute"
@@ -1956,7 +2212,7 @@ msgid "Total test time for all commits/merges"
msgstr "Temps total de test pour toutes les validations/fusions"
msgid "Track activity with Contribution Analytics."
-msgstr ""
+msgstr "Suivre l’activité avec Contribution Analytics."
msgid "Unlock"
msgstr "Déverrouiller"
@@ -1965,22 +2221,25 @@ msgid "Unlocked"
msgstr "Déverrouillé"
msgid "Unstar"
-msgstr "Se désabonner"
+msgstr "Supprimer des favoris"
+
+msgid "Unsubscribe"
+msgstr ""
msgid "Upgrade your plan to activate Advanced Global Search."
-msgstr ""
+msgstr "Mettez à jour votre abonnement pour activer la Recherche Globale Avancée."
msgid "Upgrade your plan to activate Contribution Analytics."
-msgstr ""
+msgstr "Mettez à jour votre abonnement pour activer Contribution Analytics."
msgid "Upgrade your plan to activate Group Webhooks."
-msgstr ""
+msgstr "Mettez à jour votre abonnement pour activer les Webhooks de groupe."
msgid "Upgrade your plan to activate Issue weight."
-msgstr ""
+msgstr "Mettez à niveau votre abonnement pour activer les poids de ticket."
msgid "Upgrade your plan to improve Issue boards."
-msgstr ""
+msgstr "Mettez à niveau votre abonnement pour améliorer les tableaux de tickets."
msgid "Upload New File"
msgstr "Téléverser un nouveau fichier"
@@ -2025,139 +2284,154 @@ msgid "We don't have enough data to show this stage."
msgstr "Nous n'avons pas suffisamment de données pour afficher cette étape."
msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
-msgstr ""
+msgstr "Les webhooks vous permettent d’appeler une URL si, par exemple, du nouveau code est poussé ou un nouveau ticket est créé. Vous pouvez configurer les webhooks pour écouter les événements spécifiques comme des poussées de code, des tickets ou des demandes de fusion. Les webhooks de groupes s’appliqueront à tous les projets dans un groupe, ce qui vous permet de normaliser la fonctionnalité du webhook dans votre groupe entier."
msgid "Weight"
msgstr "Poids"
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr "Si l’accès à un stockage échoue, GitLab empêchera l’accès au stockage pendant la durée spécifiée ici. Cela permettra au système de fichiers de récupérer. Les dépôts présents sur les secteurs en erreur seront temporairement indisponibles."
+
msgid "Wiki"
msgstr "Wiki"
msgid "WikiClone|Clone your wiki"
-msgstr ""
+msgstr "Clonez votre wiki"
msgid "WikiClone|Git Access"
-msgstr ""
+msgstr "Accès git"
msgid "WikiClone|Install Gollum"
-msgstr ""
+msgstr "Installer Gollum"
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
-msgstr ""
+msgstr "Il est recommandé d’installer %{markdown} pour que les spécificités de GFM s’affichent en local :"
msgid "WikiClone|Start Gollum and edit locally"
-msgstr ""
+msgstr "Démarrer Gollum et modifier localement"
msgid "WikiEmptyPageError|You are not allowed to create wiki pages"
-msgstr ""
+msgstr "Vous n’êtes pas autorisé·e à créer des pages wiki"
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "Il s’agit d’une ancienne version de la page."
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
-msgstr ""
+msgstr "Vous pouvez consulter le %{most_recent_link} ou parcourir l’%{history_link}."
msgid "WikiHistoricalPage|history"
-msgstr ""
+msgstr "historique"
msgid "WikiHistoricalPage|most recent version"
-msgstr ""
+msgstr "version la plus récente"
msgid "WikiMarkdownDocs|More examples are in the %{docs_link}"
-msgstr ""
+msgstr "D’autres exemples se trouvent dans la %{docs_link}"
msgid "WikiMarkdownDocs|documentation"
-msgstr ""
+msgstr "documentation"
msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
-msgstr ""
+msgstr "Pour créer un lien vers une (nouvelle) page, il suffit de saisir %{link_example}"
msgid "WikiNewPagePlaceholder|how-to-setup"
-msgstr ""
+msgstr "consignes-installation"
msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
-msgstr ""
+msgstr "Astuce : vous pouvez saisir le chemin d’accès complet du nouveau fichier. Nous créerons automatiquement les répertoires manquants."
msgid "WikiNewPageTitle|New Wiki Page"
-msgstr ""
+msgstr "Nouvelle Page Wiki"
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
-msgstr ""
+msgstr "Êtes-vous sûr·e de vouloir supprimer cette page ?"
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "Quelqu’un a modifié la page en même temps que vous. Veuillez consulter %{page_link} et vérifiez que vos modifications ne suppriment pas involontairement les siennes."
msgid "WikiPageConflictMessage|the page"
-msgstr ""
+msgstr "la page"
msgid "WikiPageCreate|Create %{page_title}"
-msgstr ""
+msgstr "Créer %{page_title}"
msgid "WikiPageEdit|Update %{page_title}"
-msgstr ""
+msgstr "Mettre à jour %{page_title}"
msgid "WikiPage|Page slug"
-msgstr ""
+msgstr "Slug de la page"
msgid "WikiPage|Write your content or drag files here..."
-msgstr ""
+msgstr "Écrivez du contenu ou faîtes glisser des fichiers ici..."
msgid "Wiki|Create Page"
-msgstr ""
+msgstr "Créer une Page"
msgid "Wiki|Create page"
-msgstr ""
+msgstr "Créer la page"
msgid "Wiki|Edit Page"
-msgstr ""
+msgstr "Modifier cette Page"
msgid "Wiki|Empty page"
-msgstr ""
+msgstr "Page vide"
msgid "Wiki|More Pages"
-msgstr ""
+msgstr "Plus de Pages"
msgid "Wiki|New page"
-msgstr ""
+msgstr "Nouvelle page"
msgid "Wiki|Page history"
-msgstr ""
+msgstr "Historique de la page"
msgid "Wiki|Page version"
-msgstr ""
+msgstr "Version de la page"
msgid "Wiki|Pages"
-msgstr ""
+msgstr "Pages"
msgid "Wiki|Wiki Pages"
-msgstr ""
+msgstr "Pages du Wiki"
msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
-msgstr ""
+msgstr "Avec Contribution Analytics vous pouvez avoir un aperçu de l’activité des tickets, demandes de fusion et des événements de poussée de votre organisation et de ses membres."
msgid "Withdraw Access Request"
msgstr "Retirer la demande d'accès"
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
-msgstr "Vous êtes sur le point de supprimer %{group_name}. Les groupes supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr ?"
+msgstr "Vous êtes sur le point de supprimer %{group_name}. Les groupes supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr·e ?"
msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?"
-msgstr "Vous êtes sur le point de supprimer %{project_name_with_namespace}. Les projets supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr ?"
+msgstr "Vous êtes sur le point de supprimer %{project_name_with_namespace}. Les projets supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr·e ?"
msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?"
-msgstr "Vous allez supprimer la relation de fourche avec le projet source %{forked_from_project}. Êtes-vous VRAIMENT sûr."
+msgstr "Vous allez supprimer la relation de fourche avec le projet source %{forked_from_project}. Êtes-vous ABSOLUMENT sûr·e ?"
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
-msgstr "Vous allez transférer %{project_name_with_namespace} à un nouveau propriétaire. Êtes vous VRAIMENT sûr ?"
+msgstr "Vous allez transférer %{project_name_with_namespace} à un nouveau propriétaire. Êtes vous ABSOLUMENT sûr·e ?"
+
+msgid "You are on a read-only GitLab instance."
+msgstr "Vous êtes sur une instance GitLab en lecture seule."
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr "Vous êtes sur une instance GitLab en lecture seule. Si vous souhaitez apporter des modifications, vous devez aller sur %{link_to_primary_node}."
msgid "You can only add files when you are on a branch"
msgstr "Vous ne pouvez ajouter de fichier que dans une branche"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "Vous ne pouvez pas écrire sur une instance GitLab Geo secondaire en lecture-seule. Veuillez utiliser le %{link_to_primary_node} à la place."
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr "Vous ne pouvez pas écrire sur cette instance GitLab en lecture-seule."
+
msgid "You have reached your project limit"
msgstr "Vous avez atteint votre limite de projet"
msgid "You must sign in to star a project"
-msgstr "Vous devez vous identifier pour vous abonner à un projet"
+msgstr "Vous devez vous connecter pour mettre un projet en favori"
msgid "You need permission."
msgstr "Vous avez besoin d’une autorisation."
@@ -2184,7 +2458,10 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss
msgstr "Vous ne pourrez pas récupérer ou pousser de code par SSH tant que vous n’aurez pas %{add_ssh_key_link} dans votre profil"
msgid "Your comment will not be visible to the public."
-msgstr ""
+msgstr "Votre commentaire ne sera pas visible publiquement."
+
+msgid "Your groups"
+msgstr "Vos groupes"
msgid "Your name"
msgstr "Votre nom"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] "parent"
msgstr[1] "parents"
+msgid "password"
+msgstr "mot de passe"
+
+msgid "personal access token"
+msgstr "jeton d’accès personnel"
+
msgid "to help your contributors communicate effectively!"
msgstr "pour aider vos contributeurs à communiquer efficacement !"
-msgid "personal access token"
-msgstr ""
+msgid "username"
+msgstr "nom d’utilisateur"
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index 5697c4e415c..4ac7676ca18 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:36-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:31-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -34,6 +34,11 @@ msgstr[1] "%s commit aggiuntivi sono stati omessi per evitare degradi di prestaz
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} ha committato %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -54,6 +59,12 @@ msgstr[1] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr ""
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] ""
@@ -110,9 +121,18 @@ msgstr "Aggiungi una chiave SSH al tuo profilo per eseguire pull o push tramite
msgid "Add new directory"
msgstr "Aggiungi una directory (cartella)"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr ""
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -128,6 +148,9 @@ msgstr "Sei sicuro di voler cancellare questa pipeline programmata?"
msgid "Are you sure you want to discard your changes?"
msgstr ""
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -161,18 +184,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -235,6 +261,9 @@ msgstr[1] ""
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "La branch %{branch_name} è stata creata. Per impostare un rilascio automatico scegli un template CI di Gitlab e committa le tue modifiche %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Cerca branches"
@@ -445,15 +474,24 @@ msgstr "saltata"
msgid "CiStatus|running"
msgstr "in corso"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -496,27 +534,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -526,7 +570,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -538,18 +585,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -582,6 +623,11 @@ msgid_plural "Commits"
msgstr[0] ""
msgstr[1] ""
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
msgstr ""
@@ -663,6 +709,12 @@ msgstr "Guida per contribuire"
msgid "Contributors"
msgstr "Collaboratori"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -684,9 +736,21 @@ msgstr "Crea cartella"
msgid "Create empty bare repository"
msgstr "Crea una repository vuota"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "Crea una richiesta di merge"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "Crea nuovo..."
@@ -773,6 +837,9 @@ msgstr "Nome cartella"
msgid "Discard changes"
msgstr ""
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -845,12 +912,18 @@ msgstr "Ogni settimana (Di domenica alle 4 del mattino)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "Impossibile cambiare owner"
msgid "Failed to remove the pipeline schedule"
msgstr "Impossibile rimuovere la pipeline pianificata"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr ""
@@ -895,9 +968,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -940,6 +1019,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -984,6 +1108,12 @@ msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervallo di Pattern"
@@ -1052,6 +1182,9 @@ msgstr "Leggi di più su"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "documentazione sulla pianificazione delle pipelines"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "Abbandona il gruppo"
@@ -1075,6 +1208,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "Mediano"
@@ -1105,6 +1244,9 @@ msgstr ""
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Nuovo Issue"
@@ -1122,18 +1264,27 @@ msgstr "Nuova directory"
msgid "New file"
msgstr "Nuovo file"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "Nuovo Issue"
msgid "New merge request"
msgstr "Nuova richiesta di merge"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "Nuova pianficazione"
msgid "New snippet"
msgstr "Nuovo snippet"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "Nuovo tag"
@@ -1212,6 +1363,12 @@ msgstr "Osserva"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Filtra"
@@ -1353,9 +1510,54 @@ msgstr "con più stadi"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Il Progetto '%{project_name}' in coda di eliminazione."
@@ -1365,9 +1567,6 @@ msgstr "Il Progetto '%{project_name}' è stato creato con successo."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Il Progetto '%{project_name}' è stato aggiornato con successo."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Il Progetto '%{project_name}' verrà eliminato"
-
msgid "Project access must be granted explicitly to each user."
msgstr "L'accesso al progetto dev'esser fornito esplicitamente ad ogni utente"
@@ -1425,6 +1624,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1446,12 +1651,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Vedi altro"
@@ -1515,6 +1729,9 @@ msgstr "Ripristina questa richiesta di merge"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1533,6 +1750,15 @@ msgstr "Pianificazione pipelines"
msgid "Search branches and tags"
msgstr "Ricerca branches e tags"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "Seleziona formato d'archivio"
@@ -1580,13 +1806,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1706,6 +1935,12 @@ msgstr "inizia una %{new_merge_request} con queste modifiche"
msgid "Start the Runner!"
msgstr ""
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "Cambia branch/tag"
@@ -1732,6 +1967,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Lo stadio di programmazione mostra il tempo trascorso dal primo commit alla creazione di una richiesta di merge (MR). I dati saranno aggiunti una volta che avrai creato la prima richiesta di merge."
@@ -1744,6 +1982,15 @@ msgstr "La relazione del fork è stata rimossa"
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "Lo stadio di Issue mostra il tempo che impiega un issue ad esser correlato ad una Milestone, o ad esser aggiunto ad una tua Lavagna. Inizia la creazione di problemi per visualizzare i dati in questo stadio."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "Il ciclo vitale della fase di sviluppo."
@@ -1774,6 +2021,12 @@ msgstr "Lo stadio di pre-rilascio mostra il tempo che trascorre da una MR (Richi
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "Lo stadio di test mostra il tempo che ogni Pipeline impiega per essere eseguita in ogni Richiesta di Merge correlata. L'informazione sarà disponibile automaticamente quando la tua prima Pipeline avrà finito d'esser eseguita."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "Il tempo aggregato relativo eventi/data entry raccolto in quello stadio."
@@ -1783,6 +2036,9 @@ msgstr "Il valore falsato nel mezzo di una serie di dati osservati. ES: tra 3,5,
msgid "There are problems accessing Git storage: "
msgstr ""
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1967,6 +2223,9 @@ msgstr ""
msgid "Unstar"
msgstr ""
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2030,6 +2289,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2150,9 +2412,21 @@ msgstr "Stai per rimuovere la relazione con il progetto sorgente %{forked_from_p
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "Stai per trasferire %{project_name_with_namespace} ad un altro owner. Sei ASSOLUTAMENTE sicuro?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "Puoi aggiungere files solo quando sei in una branch"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "Hai raggiunto il tuo limite di progetto"
@@ -2186,6 +2460,9 @@ msgstr "Non sarai in grado di effettuare push o pull tramite SSH fino a che %{ad
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "Il tuo nome"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 4b70f8dd9df..9045ae26c4a 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:31-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -31,6 +31,10 @@ msgstr[0] "パフォーマンス低下を避けるため %s 個のコミット
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_timeago}に%{commit_author_link}がコミットしました。"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -50,6 +54,12 @@ msgstr[0] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr ""
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "%d 個のパイプライン"
@@ -105,9 +115,18 @@ msgstr "SSHでプルやプッシュする場合は、プロフィールにSSH鍵
msgid "Add new directory"
msgstr "新規ディレクトリを追加"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr ""
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -123,6 +142,9 @@ msgstr "このパイプラインスケジュールを削除しますか?"
msgid "Are you sure you want to discard your changes?"
msgstr ""
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -156,18 +178,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -229,6 +254,9 @@ msgstr[0] "ブランチ"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "%{branch_name} ブランチが作成されました。自動デプロイを設定するには、GitLab CI Yaml テンプレートを選択して、変更をコミットしてください。 %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "ブランチを検索"
@@ -439,15 +467,24 @@ msgstr "スキップ済み"
msgid "CiStatus|running"
msgstr "実行中"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -490,27 +527,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -520,7 +563,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -532,18 +578,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -575,6 +615,10 @@ msgid "Commit"
msgid_plural "Commits"
msgstr[0] "コミット"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+
msgid "Commit Message"
msgstr ""
@@ -656,6 +700,12 @@ msgstr "貢献者向けガイド"
msgid "Contributors"
msgstr "貢献者"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -677,9 +727,21 @@ msgstr "ディレクトリを作成"
msgid "Create empty bare repository"
msgstr "空のbareレポジトリーを作成"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "マージリクエストを作成"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "新規作成"
@@ -765,6 +827,9 @@ msgstr "ディレクトリ名"
msgid "Discard changes"
msgstr ""
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -837,12 +902,18 @@ msgstr "毎週 (日曜日の午前4:00)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "オーナーを変更できませんでした"
msgid "Failed to remove the pipeline schedule"
msgstr "パイプラインスケジュールを削除できませんでした"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "ファイル"
@@ -886,9 +957,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -931,6 +1008,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -974,6 +1096,12 @@ msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "間隔のパターン"
@@ -1041,6 +1169,9 @@ msgstr "詳しく見る:"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "詳しくはパイプラインスケジュールのドキュメントを参照"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "グループを離脱"
@@ -1063,6 +1194,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "中央値"
@@ -1093,6 +1230,9 @@ msgstr ""
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "新規課題"
@@ -1109,18 +1249,27 @@ msgstr "新規ディレクトリ"
msgid "New file"
msgstr "新規ファイル"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "新規課題"
msgid "New merge request"
msgstr "新規マージリクエスト"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "新規スケジュール"
msgid "New snippet"
msgstr "新規スニペット"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "新規タグ"
@@ -1199,6 +1348,12 @@ msgstr "すべて通知"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "フィルター"
@@ -1340,9 +1495,54 @@ msgstr "ステージあり"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "'%{project_name}' プロジェクトは削除処理待ちです。"
@@ -1352,9 +1552,6 @@ msgstr "'%{project_name}' プロジェクトは正常に作成されました。
msgid "Project '%{project_name}' was successfully updated."
msgstr "'%{project_name}' プロジェクトは正常に更新されました。"
-msgid "Project '%{project_name}' will be deleted."
-msgstr "'%{project_name}' プロジェクトは削除されます。"
-
msgid "Project access must be granted explicitly to each user."
msgstr "ユーザーごとにプロジェクトアクセスの権限を指定しなければなりません。"
@@ -1412,6 +1609,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1433,12 +1636,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "続きを読む"
@@ -1502,6 +1714,9 @@ msgstr "このマージリクエストをリバート"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1520,6 +1735,15 @@ msgstr "パイプラインスケジューリング"
msgid "Search branches and tags"
msgstr "ブランチまたはタグを検索"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "アーカイブのフォーマットを選択"
@@ -1566,13 +1790,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1692,6 +1919,12 @@ msgstr "この変更で %{new_merge_request} を作成する"
msgid "Start the Runner!"
msgstr ""
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "ブランチ・タグ切り替え"
@@ -1717,6 +1950,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "コーディングステージでは、最初のコミットからマージリクエストが作成されるまでの時間が表示されます。このデータは最初のマージリクエストが作成されたときに自動的に追加されます。"
@@ -1729,6 +1965,15 @@ msgstr "フォークのリレーションが削除されました。"
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "課題ステージでは、課題が登録されてからマイルストーンに割り当てられるか、課題ボードのリストに追加されるまでの時間が表示されます。このリストに表示するには課題を最初に作成してください。"
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "開発ライフサイクルの段階"
@@ -1759,6 +2004,12 @@ msgstr "ステージングステージでは、マージリクエストがマー
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "テスティングステージでは、GitLab CI が関連するマージリクエストの各パイプラインを実行する時間が表示されます。このデータは最初のパイプラインが完了したときに自動的に追加されます。"
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "このステージに収集されたデータ毎の時間"
@@ -1768,6 +2019,9 @@ msgstr "得られた一連のデータを小さい順に並べたときに中央
msgid "There are problems accessing Git storage: "
msgstr ""
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1950,6 +2204,9 @@ msgstr ""
msgid "Unstar"
msgstr "スターを外す"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2013,6 +2270,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2133,9 +2393,21 @@ msgstr "元のプロジェクト (%{forked_from_project}) とのリレーショ
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "%{project_name_with_namespace} プロジェクトを別のオーナーに移譲しようとしています。本当によろしいですか?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "ファイルを追加するには、どこかのブランチにいなければいけません"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "プロジェクト数の上限に達しています"
@@ -2169,6 +2441,9 @@ msgstr "%{add_ssh_key_link} をプロファイルに追加していないので
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "名前"
@@ -2192,9 +2467,15 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "親"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 5a6c8ef9c7a..ab74d4cbeae 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:31-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -31,6 +31,10 @@ msgstr[0] "%s 추가 커밋은 성능 이슈를 방지하기 위해 생략되었
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_timeago} 에 %{commit_author_link} 님이 커밋하였습니다. "
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -50,6 +54,12 @@ msgstr[0] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr "설치 방법에 대한 정보를 얻기 위해 %{link} 를 체크아웃하세요."
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "%d 파이프라인"
@@ -105,9 +115,18 @@ msgstr "프로필에 SSH 키를 추가하여 SSH를 통해 Pull 하거나 Push
msgid "Add new directory"
msgstr "새 디렉토리 추가"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr "전체"
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -123,6 +142,9 @@ msgstr "이 파이프라인 스케쥴을 삭제 하시겠습니까?"
msgid "Are you sure you want to discard your changes?"
msgstr "변경 내용을 취소하시겠습니까?"
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr "등록 토큰을 초기화 하시겠습니까?"
@@ -156,18 +178,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -229,6 +254,9 @@ msgstr[0] "브랜치"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "%{branch_name} 브랜치가 생성되었습니다. 자동 배포를 설정하려면 GitLab CI Yaml 템플릿을 선택하고 변경 사항을 적용하십시오. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "브랜치 검색"
@@ -439,15 +467,24 @@ msgstr "건너 뜀"
msgid "CiStatus|running"
msgstr "실행 중"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -490,27 +527,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -520,7 +563,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -532,18 +578,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -575,6 +615,10 @@ msgid "Commit"
msgid_plural "Commits"
msgstr[0] "커밋"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+
msgid "Commit Message"
msgstr ""
@@ -656,6 +700,12 @@ msgstr "기여에 대한 안내"
msgid "Contributors"
msgstr "기여해 주신 분들"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -677,9 +727,21 @@ msgstr "디렉토리 만들기"
msgid "Create empty bare repository"
msgstr "빈 bare 저장소 만들기"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "머지 리퀘스트 만들기"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "새로 만들기 ..."
@@ -765,6 +827,9 @@ msgstr "디렉토리 이름"
msgid "Discard changes"
msgstr "변경 내용 취소"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -837,12 +902,18 @@ msgstr "매주 (일요일 오전 4시에)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "소유자를 변경하지 못했습니다"
msgid "Failed to remove the pipeline schedule"
msgstr "파이프라인 스케줄을 제거하지 못했습니다."
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "파일"
@@ -886,9 +957,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -931,6 +1008,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr "헬스 체크"
@@ -974,6 +1096,12 @@ msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "주기 패턴"
@@ -1041,6 +1169,9 @@ msgstr "더 자세히 알아보기"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "파이프라인 스케쥴 문서로부터 더 알아보기"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "그룹 떠나기"
@@ -1063,6 +1194,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "중앙값"
@@ -1093,6 +1230,9 @@ msgstr "여기"
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "새 이슈"
@@ -1109,18 +1249,27 @@ msgstr "새 디렉토리"
msgid "New file"
msgstr "새 파일"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "새 이슈"
msgid "New merge request"
msgstr "새 머지 리퀘스트"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "새 일정"
msgid "New snippet"
msgstr "새 스니펫"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "새 태그 "
@@ -1199,6 +1348,12 @@ msgstr "Watch"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "필터"
@@ -1340,9 +1495,54 @@ msgstr "스테이징"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "'%{project_name}'프로젝트가 삭제 처리 중입니다."
@@ -1352,9 +1552,6 @@ msgstr "'%{project_name}'프로젝트가 성공적으로 생성되었습니다."
msgid "Project '%{project_name}' was successfully updated."
msgstr "'%{project_name}'프로젝트가 성공적으로 업데이트되었습니다."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "'%{project_name}'프로젝트가 삭제됩니다."
-
msgid "Project access must be granted explicitly to each user."
msgstr "프로젝트 액세스는 각 사용자에게 명시적으로 부여되어야합니다."
@@ -1412,6 +1609,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1433,12 +1636,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr "푸쉬 이벤트"
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "더 읽기"
@@ -1502,6 +1714,9 @@ msgstr "이 머지 리퀘스트 되돌리기"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1520,6 +1735,15 @@ msgstr "파이프라인 스케줄링"
msgid "Search branches and tags"
msgstr "브랜치 및 태그 검색"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "아카이브 포맷 선택"
@@ -1566,13 +1790,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1692,6 +1919,12 @@ msgstr "이 변경 사항으로 %{new_merge_request} 을 시작하십시오."
msgid "Start the Runner!"
msgstr "Runner 시작!"
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "스위치 브랜치/태그"
@@ -1717,6 +1950,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Coding Stage는 첫 번째 커밋에서부터 머지 리퀘스트 생성까지의 시간을 보여줍니다. 첫 번째 머지 리퀘스트을 생성하면 데이터가 자동으로 여기에 추가됩니다."
@@ -1729,6 +1965,15 @@ msgstr "포크 관계가 제거되었습니다."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "이슈 단계에는 이슈를 작성하여 마일스톤으로 지정하는 데 걸리는 시간 또는 이슈 보드의 목록에 이슈를 추가하는 시간이 표시됩니다. 이 단계의 데이터를 보기 위해서는 이슈를 먼저 작성해야 합니다."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "개발 수명주기의 단계."
@@ -1759,6 +2004,12 @@ msgstr "Staging 단계에서는 MR 머지과 프로덕션 환경에 코드 배
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "테스트 단계에서는 GitLab CI가 관련 머지 리퀘스트을 위해 모든 파이프라인을 실행하는 데 걸리는 시간을 보여줍니다. 첫 번째 파이프라인 실행이 완료되면 데이터가 자동으로 추가됩니다."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "해당 단계에서 수집 한 각 데이터 입력에 소요 된 시간"
@@ -1768,6 +2019,9 @@ msgstr "값은 일련의 관측 값 중점에 있습니다. 예를 들어, 3, 5,
msgid "There are problems accessing Git storage: "
msgstr "git storage에 접근하는데 문제가 발생했습니다. "
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1950,6 +2204,9 @@ msgstr ""
msgid "Unstar"
msgstr "별표 제거"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2013,6 +2270,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2133,9 +2393,21 @@ msgstr "포크 관계를 소스 프로젝트 %{forked_from_project}에 대해
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "%{project_name_with_namespace}을 다른 소유자에게 이전하려고합니다. \"정말로\" 확실합니까?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "브랜치에 있을 때에만 파일을 추가 할 수 있습니다."
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "프로젝트 숫자 한도에 도달했습니다."
@@ -2169,6 +2441,9 @@ msgstr "당신의 프로필에 %{add_ssh_key_link} 를 하기 전에는 SSH를
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "귀하의 이름"
@@ -2192,9 +2467,15 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "부모"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index fc7bbc79899..7e33af9f747 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:31-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -34,6 +34,11 @@ msgstr[1] "%s andere commits zijn weggelaten om prestatieproblemen te voorkomen.
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr ""
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -54,6 +59,12 @@ msgstr[1] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(bekijk de %{link} voor meer info over hoe je het kan installeren)."
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] ""
@@ -110,9 +121,18 @@ msgstr ""
msgid "Add new directory"
msgstr "Nieuwe map toevoegen"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr "Alles"
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr "Uiterlijk"
@@ -128,6 +148,9 @@ msgstr ""
msgid "Are you sure you want to discard your changes?"
msgstr ""
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr ""
@@ -161,18 +184,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr "Facturatie"
@@ -235,6 +261,9 @@ msgstr[1] ""
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr ""
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "BranchSwitcherPlaceholder|Zoek branches"
@@ -445,15 +474,24 @@ msgstr "overgeslagen"
msgid "CiStatus|running"
msgstr ""
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -496,27 +534,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -526,7 +570,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -538,18 +585,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -582,6 +623,11 @@ msgid_plural "Commits"
msgstr[0] ""
msgstr[1] ""
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Commit Message"
msgstr ""
@@ -663,6 +709,12 @@ msgstr ""
msgid "Contributors"
msgstr ""
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -684,9 +736,21 @@ msgstr "Maak map aan"
msgid "Create empty bare repository"
msgstr ""
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr ""
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr ""
@@ -773,6 +837,9 @@ msgstr ""
msgid "Discard changes"
msgstr ""
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -845,12 +912,18 @@ msgstr ""
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr ""
msgid "Failed to remove the pipeline schedule"
msgstr ""
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr ""
@@ -895,9 +968,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -940,6 +1019,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -984,6 +1108,12 @@ msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -1052,6 +1182,9 @@ msgstr ""
msgid "Learn more in the|pipeline schedules documentation"
msgstr ""
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr ""
@@ -1075,6 +1208,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr ""
@@ -1105,6 +1244,9 @@ msgstr ""
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Nieuwe issue"
@@ -1122,18 +1264,27 @@ msgstr ""
msgid "New file"
msgstr ""
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr ""
msgid "New merge request"
msgstr ""
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr ""
msgid "New snippet"
msgstr ""
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr ""
@@ -1212,6 +1363,12 @@ msgstr ""
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr ""
@@ -1353,9 +1510,54 @@ msgstr ""
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr ""
@@ -1365,9 +1567,6 @@ msgstr ""
msgid "Project '%{project_name}' was successfully updated."
msgstr ""
-msgid "Project '%{project_name}' will be deleted."
-msgstr ""
-
msgid "Project access must be granted explicitly to each user."
msgstr ""
@@ -1425,6 +1624,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1446,12 +1651,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr ""
@@ -1515,6 +1729,9 @@ msgstr ""
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1533,6 +1750,15 @@ msgstr ""
msgid "Search branches and tags"
msgstr ""
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr ""
@@ -1580,13 +1806,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1706,6 +1935,12 @@ msgstr ""
msgid "Start the Runner!"
msgstr ""
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr ""
@@ -1732,6 +1967,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
@@ -1744,6 +1982,15 @@ msgstr ""
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr ""
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr ""
@@ -1774,6 +2021,12 @@ msgstr ""
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr ""
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -1783,6 +2036,9 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1967,6 +2223,9 @@ msgstr ""
msgid "Unstar"
msgstr ""
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2030,6 +2289,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2150,9 +2412,21 @@ msgstr ""
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr ""
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr ""
@@ -2186,6 +2460,9 @@ msgstr ""
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr ""
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index e6ba0c8cf9a..473086886ac 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-04 13:27-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -18,13 +18,13 @@ msgstr ""
msgid "%d commit"
msgid_plural "%d commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commit"
+msgstr[1] "%d commits"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d camada"
+msgstr[1] "%d camadas"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -34,36 +34,47 @@ msgstr[1] "%s commits adicionais foram omitidos para prevenir problemas de perfo
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} fez commit %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] "%{count} participante"
+msgstr[1] "%{count} participantes"
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
-msgstr ""
+msgstr "%{number_commits_behind} commits atrás de %{default_branch}, %{number_commits_ahead} commits à frente"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
-msgstr ""
+msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab permitirá o acesso na próxima tentativa."
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds."
-msgstr ""
+msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab irá bloquear o acesso por %{number_of_seconds} segundos."
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved."
-msgstr ""
+msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab não tentará mais automaticamente. Redefina as informações de storage quando o problema for resolvido."
msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{storage_name}: falha na tentativa de acesso ao storage no host:"
+msgstr[1] "%{storage_name}: %{failed_attempts} falhas de acesso ao storage:"
msgid "(checkout the %{link} for information on how to install it)."
-msgstr ""
+msgstr "(veja o %{link} para informações de como instalar)."
+
+msgid "+ %{moreCount} more"
+msgstr "%{moreCount} mais"
+
+msgid "- show less"
+msgstr "- exibir menos"
msgid "1 pipeline"
msgid_plural "%d pipelines"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 pipeline"
+msgstr[1] "%d pipelines"
msgid "1st contribution!"
-msgstr ""
+msgstr "1ª contribuição!"
msgid "2FA enabled"
-msgstr ""
+msgstr "Autenticação de 2 passos ativada"
msgid "A collection of graphs regarding Continuous Integration"
msgstr "Uma coleção de gráficos sobre Integração Contínua"
@@ -72,16 +83,16 @@ msgid "About auto deploy"
msgstr "Sobre o deploy automático"
msgid "Abuse Reports"
-msgstr ""
+msgstr "Relatórios de abuso"
msgid "Access Tokens"
-msgstr ""
+msgstr "Tokens de acesso"
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
-msgstr ""
+msgstr "Os acessos à storages com defeito foram temporariamente desabilitados para permitir a sua remontagem. Redefina as informações de armazenamento depois que o problema foi resolvido para permitir o acesso de novo."
msgid "Account"
-msgstr ""
+msgstr "Conta"
msgid "Active"
msgstr "Ativo"
@@ -90,7 +101,7 @@ msgid "Activity"
msgstr "Atividade"
msgid "Add"
-msgstr ""
+msgstr "Adicionar"
msgid "Add Changelog"
msgstr "Adicionar registro de mudanças"
@@ -99,7 +110,7 @@ msgid "Add Contribution guide"
msgstr "Adicionar Guia de contribuição"
msgid "Add Group Webhooks and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Adicione o grupo de Webhooks e GitLab Enterprise Edition."
msgid "Add License"
msgstr "Adicionar Licença"
@@ -110,14 +121,23 @@ msgstr "Adicionar chave SSH ao seu perfil para fazer pull ou push via SSH."
msgid "Add new directory"
msgstr "Adicionar novo diretório"
+msgid "AdminHealthPageLink|health page"
+msgstr "página de saúde"
+
+msgid "Advanced settings"
+msgstr "Configurações avançadas"
+
msgid "All"
-msgstr ""
+msgstr "Todos"
+
+msgid "An error occurred. Please try again."
+msgstr "Ocorreu um erro. Tente novamente."
msgid "Appearance"
-msgstr ""
+msgstr "Aparência"
msgid "Applications"
-msgstr ""
+msgstr "Aplicações"
msgid "Archived project! Repository is read-only"
msgstr "Projeto arquivado! O repositório é somente leitura"
@@ -126,115 +146,124 @@ msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Tem certeza que deseja excluir este agendamento de pipeline?"
msgid "Are you sure you want to discard your changes?"
-msgstr ""
+msgstr "Você tem certeza que deseja descartar suas alterações?"
+
+msgid "Are you sure you want to leave this group?"
+msgstr "Tem certeza que quer sair desse grupo?"
msgid "Are you sure you want to reset registration token?"
-msgstr ""
+msgstr "Você tem certeza que quer recriar o token de registro?"
msgid "Are you sure you want to reset the health check token?"
-msgstr ""
+msgstr "Você tem certeza que quer reiniciar o token de status de saúde?"
msgid "Are you sure?"
-msgstr ""
+msgstr "Você tem certeza?"
msgid "Artifacts"
-msgstr ""
+msgstr "Artefatos"
msgid "Attach a file by drag & drop or %{upload_link}"
msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}"
msgid "Authentication Log"
-msgstr ""
+msgstr "Log de autenticação"
msgid "Author"
-msgstr ""
+msgstr "Autor"
msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Apps de revisão automática e Auto Deploy precisam de um nome de domínio e o %{kubernetes} para que funcione corretamente."
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
-msgstr ""
+msgstr "Apps de revisão automática e Auto Deploy precisam de um nome de domínio para que funcione corretamente."
msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Apps de revisão automática e Auto Deploy precisam do %{kubernetes} para que funcione corretamente."
msgid "AutoDevOps|Auto DevOps (Beta)"
-msgstr ""
-
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
+msgstr "Auto DevOps (Beta)"
msgid "AutoDevOps|Auto DevOps documentation"
-msgstr ""
+msgstr "Documentação de auto DevOps"
msgid "AutoDevOps|Enable in settings"
-msgstr ""
+msgstr "Habilitar nas configurações"
+
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr "Ele gerará a build, testará e fará deploy de sua aplicação automaticamente com base em uma configuração predefinida do CI/CD."
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
-msgstr ""
+msgstr "Saiba mais em %{link_to_documentation}"
+
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr "Você pode ativar %{link_to_settings} para esse projeto."
msgid "Billing"
-msgstr ""
+msgstr "Cobrança"
msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
-msgstr ""
+msgstr "Grupo %{group_name} está atualmente no plano %{plan_link}."
msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
-msgstr ""
+msgstr "Downgrade e upgrade automático para alguns planos ainda não está disponível."
msgid "BillingPlans|Current plan"
-msgstr ""
+msgstr "Plano atual"
msgid "BillingPlans|Customer Support"
-msgstr ""
+msgstr "Suporte ao cliente"
msgid "BillingPlans|Downgrade"
-msgstr ""
+msgstr "Downgrade"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
-msgstr ""
+msgstr "Aprenda mais sobre cada plano lendo nossa %{faq_link}."
msgid "BillingPlans|Manage plan"
-msgstr ""
+msgstr "Gerenciar plano"
msgid "BillingPlans|Please contact %{customer_support_link} in that case."
-msgstr ""
+msgstr "Por favor contacte o %{customer_support_link} para resolver seu caso."
msgid "BillingPlans|See all %{plan_name} features"
-msgstr ""
+msgstr "Veja todas as funcionalidades do seu plano %{plan_name}"
msgid "BillingPlans|This group uses the plan associated with its parent group."
-msgstr ""
+msgstr "Esse grupo utiliza o plano associado ao seu grupo pai."
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
-msgstr ""
+msgstr "Para gerenciar o plano para esse grupo, visite a sessão de cobrança de %{parent_billing_page_link}."
msgid "BillingPlans|Upgrade"
-msgstr ""
+msgstr "Atualizar"
msgid "BillingPlans|You are currently on the %{plan_link} plan."
-msgstr ""
+msgstr "Vocês está utilizando o plano %{plan_link}."
msgid "BillingPlans|frequently asked questions"
-msgstr ""
+msgstr "perguntas frequentes"
msgid "BillingPlans|monthly"
-msgstr ""
+msgstr "mensalmente"
msgid "BillingPlans|paid annually at %{price_per_year}"
-msgstr ""
+msgstr "pago %{price_per_year} anualmente"
msgid "BillingPlans|per user"
-msgstr ""
+msgstr "por usuário"
msgid "Branch"
msgid_plural "Branches"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Branch"
+msgstr[1] "Branches"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "O branch %{branch_name} foi criado. Para configurar o deploy automático, selecione um modelo de Yaml do GitLab CI e commit suas mudanças. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr "Branch foi alterado"
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Procurar por branches"
@@ -242,91 +271,91 @@ msgid "BranchSwitcherTitle|Switch branch"
msgstr "Mudar de branch"
msgid "Branches"
-msgstr ""
+msgstr "Branches"
msgid "Branches|Cant find HEAD commit for this branch"
-msgstr ""
+msgstr "Não foi possível encontrar o commit HEAD para essa branch"
msgid "Branches|Compare"
-msgstr ""
+msgstr "Comparar"
msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
-msgstr ""
+msgstr "Apagar todas as branches que foi feito merge em '%{default_branch}'"
msgid "Branches|Delete branch"
-msgstr ""
+msgstr "Apagar branch"
msgid "Branches|Delete merged branches"
-msgstr ""
+msgstr "Apagar branches que foram feito merge"
msgid "Branches|Delete protected branch"
-msgstr ""
+msgstr "Apagar branch protegida"
msgid "Branches|Delete protected branch '%{branch_name}'?"
-msgstr ""
+msgstr "Apagar branch protegida '%{branch_name}'?"
msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Apagar a branch '%{branch_name}' não pode ser desfeito. Você tem certeza?"
msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Apagar branches que foram feito merge não pode ser desfeito. Você tem certeza?"
msgid "Branches|Filter by branch name"
-msgstr ""
+msgstr "Filtrar por nome de branch"
msgid "Branches|Merged into %{default_branch}"
-msgstr ""
+msgstr "Merge feito na branch '%{default_branch}'"
msgid "Branches|New branch"
-msgstr ""
+msgstr "Nova branch"
msgid "Branches|No branches to show"
-msgstr ""
+msgstr "Nenhuma branch para mostrar"
msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Uma vez que você confirmar e pressionar %{delete_protected_branch}, não pode ser desfeito ou recuperado."
msgid "Branches|Only a project master or owner can delete a protected branch"
-msgstr ""
+msgstr "Somente alguém master ou dono do projeto poderá apagar branches protegidas"
msgid "Branches|Protected branches can be managed in %{project_settings_link}"
-msgstr ""
+msgstr "Ramos protegidos podem ser gerenciados em %{project_settings_link}"
msgid "Branches|Sort by"
-msgstr ""
+msgstr "Ordernar por"
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
-msgstr ""
+msgstr "A branch não pode ser atualizada automaticamente porque diverge do seu upstream."
msgid "Branches|The default branch cannot be deleted"
-msgstr ""
+msgstr "A branch padrão não pode ser apagada"
msgid "Branches|This branch hasn’t been merged into %{default_branch}."
-msgstr ""
+msgstr "Essa branch não teve o merge realizado na '%{default_branch}'."
msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
-msgstr ""
+msgstr "Para evitar perda de dados, considere fazer um merge dessa branch antes de apagá-la."
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
-msgstr ""
+msgstr "Para confirmar, digite %{branch_name_confirmation}:"
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
-msgstr ""
+msgstr "Para descartar as mudanças locais e sobrescrever a branch com a versão de upstream, apague-o aqui e escolha 'Atualizar agora', acima."
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
-msgstr ""
+msgstr "Você irá apagar irreparavelmente a branch protegida '%{branch_name}'."
msgid "Branches|diverged from upstream"
-msgstr ""
+msgstr "divergiu do upstream"
msgid "Branches|merged"
-msgstr ""
+msgstr "merge realizado"
msgid "Branches|project settings"
-msgstr ""
+msgstr "configurações do projeto"
msgid "Branches|protected"
-msgstr ""
+msgstr "protegido"
msgid "Browse Directory"
msgstr "Navegar no Diretório"
@@ -344,22 +373,22 @@ msgid "ByAuthor|by"
msgstr "por"
msgid "CI / CD"
-msgstr ""
+msgstr "CI / CD"
msgid "CI configuration"
msgstr "Configuração da IC"
msgid "CICD|Jobs"
-msgstr ""
+msgstr "Jobs"
msgid "Cancel"
msgstr "Cancelar"
msgid "Cancel edit"
-msgstr ""
+msgstr "Cancelar edição"
msgid "Change Weight"
-msgstr ""
+msgstr "Mudar peso"
msgid "ChangeTypeActionLabel|Pick into branch"
msgstr "Pick para um branch"
@@ -380,7 +409,7 @@ msgid "Charts"
msgstr "Gráficos"
msgid "Chat"
-msgstr ""
+msgstr "Bate-papo"
msgid "Cherry-pick this commit"
msgstr "Cherry-pick esse commit"
@@ -389,7 +418,7 @@ msgid "Cherry-pick this merge request"
msgstr "Cherry-pick esse merge request"
msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all."
-msgstr ""
+msgstr "Escolha quais os grupos que você deseja replicar para este nó secundário. Deixe em branco para replicar todos."
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -445,145 +474,162 @@ msgstr "ignorado"
msgid "CiStatus|running"
msgstr "executando"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr "interruptor da api"
+
msgid "Clone repository"
-msgstr ""
+msgstr "Clonar repositório"
msgid "Close"
-msgstr ""
+msgstr "Fechar"
+
+msgid "Cluster"
+msgstr "Cluster"
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
-msgstr ""
+msgstr "Um %{link_to_container_project} deve ter sido criado com essa conta"
+
+msgid "ClusterIntegration|Cluster details"
+msgstr "Detalhes do cluster"
msgid "ClusterIntegration|Cluster integration"
-msgstr ""
+msgstr "Integração do cluster"
msgid "ClusterIntegration|Cluster integration is disabled for this project."
-msgstr ""
+msgstr "Integração do cluster está desabilitada para esse projeto."
msgid "ClusterIntegration|Cluster integration is enabled for this project."
-msgstr ""
+msgstr "Integração do cluster está ativada nesse projeto."
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "Integração do cluster está ativada para esse projeto. Desabilitar a integração não afetará seu cluster, mas desligará temporariamente a conexão do Gitlab com ele."
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
-msgstr ""
+msgstr "O cluster está sendo criado no Google Container Engine..."
msgid "ClusterIntegration|Cluster name"
-msgstr ""
+msgstr "Nome do cluster"
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
-msgstr ""
+msgstr "O cluster foi criado com sucesso no Google Container Engine"
msgid "ClusterIntegration|Copy cluster name"
-msgstr ""
+msgstr "Copiar nome do cluster"
msgid "ClusterIntegration|Create cluster"
-msgstr ""
+msgstr "Criar cluster"
msgid "ClusterIntegration|Create new cluster on Google Container Engine"
-msgstr ""
+msgstr "Criar novo cluster no Google Container Engine"
msgid "ClusterIntegration|Enable cluster integration"
-msgstr ""
+msgstr "Ativar integração com o cluster"
msgid "ClusterIntegration|Google Cloud Platform project ID"
-msgstr ""
+msgstr "ID do projeto no Google Cloud Platform"
msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine"
msgid "ClusterIntegration|Google Container Engine project"
-msgstr ""
-
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Projeto no Google Container Engine"
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
-msgstr ""
+msgstr "Leia mais sobre %{link_to_documentation}"
-msgid "ClusterIntegration|See machine types"
-msgstr ""
+msgid "ClusterIntegration|Machine type"
+msgstr "Tipo de máquina"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
-msgstr ""
+msgstr "Confira se sua conta %{link_to_requirements} para criar clusters"
+
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr "Gerenciar integração de cluster com o projeto no GitLab"
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
-msgstr ""
+msgstr "Gerencie seu cluster visitando %{link_gke}"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
-
-msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
-
-msgid "ClusterIntegration|Remove cluster integration"
-msgstr ""
-
-msgid "ClusterIntegration|Remove integration"
-msgstr ""
-
-msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
-msgstr ""
-
-msgid "ClusterIntegration|Save changes"
-msgstr ""
-
-msgid "ClusterIntegration|See your projects"
-msgstr ""
-
-msgid "ClusterIntegration|See zones"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
+msgstr "Número de nós"
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "Por favor, tenha certeza que sua conta no Google cumpre com os requisitos:"
-msgid "ClusterIntegration|Toggle Cluster"
-msgstr ""
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr "Namespace do projeto (opcional, único)"
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
+msgstr "Ler nossa %{link_to_help_page} na integração com cluster."
+
+msgid "ClusterIntegration|Remove cluster integration"
+msgstr "Remover integração com cluster"
+
+msgid "ClusterIntegration|Remove integration"
+msgstr "Remover integração"
+
+msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
+msgstr "Remover integração com o cluster irá apagar a configuração de cluster que você adicionou à esse projeto. Não excluirá seu projeto."
+
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr "Ver e editar os detalhes para seu cluster"
+
+msgid "ClusterIntegration|See machine types"
+msgstr "Ver tipos de máquina"
+
+msgid "ClusterIntegration|See your projects"
+msgstr "Ver seus projetos"
+
+msgid "ClusterIntegration|See zones"
+msgstr "Ver zonas"
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr "Alguma coisa deu errado do nosso lado."
+
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
+msgstr "Algo deu errado ao criar seu cluster no Google Container Engine"
+
+msgid "ClusterIntegration|Toggle Cluster"
+msgstr "Alternar cluster"
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "Com um cluster associado à esse projeto, você pode usar revisão de apps, fazer deploy de suas aplicações, rodar suas pipelines e muito mais de um jeito simples."
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
-msgstr ""
+msgstr "Sua conta precisa ter %{link_to_container_engine}"
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "Zona"
msgid "ClusterIntegration|access to Google Container Engine"
-msgstr ""
+msgstr "Acesso ao Google Container Engine"
msgid "ClusterIntegration|cluster"
-msgstr ""
+msgstr "cluster"
msgid "ClusterIntegration|help page"
-msgstr ""
+msgstr "ajuda"
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "atende aos requisitos"
msgid "ClusterIntegration|properly configured"
-msgstr ""
+msgstr "configurado corretamente"
msgid "Comments"
-msgstr ""
+msgstr "Comentários"
msgid "Commit"
msgid_plural "Commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Commit"
+msgstr[1] "Commits"
+
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] "Commit %d arquivo"
+msgstr[1] "Commit %d arquivos"
msgid "Commit Message"
-msgstr ""
+msgstr "Mensagem de Commit"
msgid "Commit duration in minutes for last 30 commits"
msgstr "Duração do commit em minutos para os últimos 30 commits"
@@ -598,7 +644,7 @@ msgid "CommitMessage|Add %{file_name}"
msgstr "Adicionar %{file_name}"
msgid "Commits"
-msgstr ""
+msgstr "Commits"
msgid "Commits feed"
msgstr "Feed de commits"
@@ -613,49 +659,49 @@ msgid "Compare"
msgstr "Comparar"
msgid "Container Registry"
-msgstr ""
+msgstr "Container Registry"
msgid "ContainerRegistry|Created"
-msgstr ""
+msgstr "Criado"
msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "Primeiro faça login no Container Registry do Gitlab usando seu nome de usuário e senha. Se você tiver %{link_2fa}, será necessário usar um %{link_token}:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
-msgstr ""
+msgstr "Gitlab suporta até três níveis de nomes de imagens. Os exemplos a seguir são de imagens válidas para seu projeto:"
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr ""
+msgstr "Como usar o Container Registry"
msgid "ContainerRegistry|Learn more about"
-msgstr ""
+msgstr "Leia mais sobre"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "Sem tags no Container Registry para essa imagem."
msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "Uma vez que você autenticar, será possível criar e fazer upload de uma imagem usando os comandos comuns de %{build} e %{push}"
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "Apagar repositório"
msgid "ContainerRegistry|Remove tag"
-msgstr ""
+msgstr "Apagar tag"
msgid "ContainerRegistry|Size"
-msgstr ""
+msgstr "Tamanho"
msgid "ContainerRegistry|Tag"
-msgstr ""
+msgstr "Tag"
msgid "ContainerRegistry|Tag ID"
-msgstr ""
+msgstr "ID da Tag"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "Use nomes de imagem diferentes"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "Com o Container Registry do Docker integrado ao Gitlab, todo projeto pode ter seu próprio espaço para guardar suas imagens."
msgid "Contribution guide"
msgstr "Guia de contribuição"
@@ -663,8 +709,14 @@ msgstr "Guia de contribuição"
msgid "Contributors"
msgstr "Contribuidores"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Controle a concorrência máxima de LFS/preenchimento de anexos para o nó secundário"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Controle a concorrência máxima de preenchimento de repositórios para o nó secundário"
+
msgid "Copy SSH public key to clipboard"
-msgstr ""
+msgstr "Copiar chave SSH pública para área de transferência"
msgid "Copy URL to clipboard"
msgstr "Copiar URL para área de transferência"
@@ -684,9 +736,21 @@ msgstr "Criar diretório"
msgid "Create empty bare repository"
msgstr "Criar repositório bruto vazio"
+msgid "Create file"
+msgstr "Criar arquivo"
+
msgid "Create merge request"
msgstr "Criar merge request"
+msgid "Create new branch"
+msgstr "Criar novo branch"
+
+msgid "Create new directory"
+msgstr "Criar nova pasta"
+
+msgid "Create new file"
+msgstr "Criar novo arquivo"
+
msgid "Create new..."
msgstr "Criar novo..."
@@ -739,10 +803,10 @@ msgid "CycleAnalyticsStage|Test"
msgstr "Teste"
msgid "DashboardProjects|All"
-msgstr ""
+msgstr "Todos"
msgid "DashboardProjects|Personal"
-msgstr ""
+msgstr "Pessoal"
msgid "Define a custom pattern with cron syntax"
msgstr "Defina um padrão personalizado utilizando a sintaxe do cron"
@@ -756,25 +820,28 @@ msgstr[0] "Implantação"
msgstr[1] "Implantações"
msgid "Deploy Keys"
-msgstr ""
+msgstr "Chaves para deploy"
msgid "Description"
msgstr "Descrição"
msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
-msgstr ""
+msgstr "Modelos de descrição permitem que você defina modelos de contextos específicos para issue e descrição de merge requests para seu projeto."
msgid "Details"
-msgstr ""
+msgstr "Detalhes"
msgid "Directory name"
msgstr "Nome do diretório"
msgid "Discard changes"
-msgstr ""
+msgstr "Descartar alterações"
+
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr "Ignorar introdução do Cycle Analytics"
msgid "Dismiss Merge Request promotion"
-msgstr ""
+msgstr "Ignorar anúncio do merge request"
msgid "Don't show again"
msgstr "Não exibir novamente"
@@ -813,25 +880,25 @@ msgid "Edit Pipeline Schedule %{id}"
msgstr "Alterar Agendamento do Pipeline %{id}"
msgid "Emails"
-msgstr ""
+msgstr "Emails"
msgid "EventFilterBy|Filter by all"
-msgstr ""
+msgstr "EventFilterBy|Filtrar por tudo"
msgid "EventFilterBy|Filter by comments"
-msgstr ""
+msgstr "EventFilterBy|Filtrar por comentários"
msgid "EventFilterBy|Filter by issue events"
-msgstr ""
+msgstr "EventFilterBy|Filtrar por eventos de issue"
msgid "EventFilterBy|Filter by merge events"
-msgstr ""
+msgstr "EventFilterBy|Filtrar por eventos de merge"
msgid "EventFilterBy|Filter by push events"
-msgstr ""
+msgstr "EventFilterBy|Filtrar por eventos de push"
msgid "EventFilterBy|Filter by team"
-msgstr ""
+msgstr "EventFilterBy|Filtrar por equipe"
msgid "Every day (at 4:00am)"
msgstr "Todos os dias (às 4:00)"
@@ -843,7 +910,10 @@ msgid "Every week (Sundays at 4:00am)"
msgstr "Toda semana (domingos às 4:00)"
msgid "Explore projects"
-msgstr ""
+msgstr "Explorar projetos"
+
+msgid "Explore public groups"
+msgstr "Explorar grupos públicos"
msgid "Failed to change the owner"
msgstr "Erro ao alterar o proprietário"
@@ -851,6 +921,9 @@ msgstr "Erro ao alterar o proprietário"
msgid "Failed to remove the pipeline schedule"
msgstr "Erro ao excluir o agendamento do pipeline"
+msgid "File name"
+msgstr "Nome do arquivo"
+
msgid "Files"
msgstr "Arquivos"
@@ -871,17 +944,17 @@ msgstr "publicado por"
msgid "Fork"
msgid_plural "Forks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Fork"
+msgstr[1] "Forks"
msgid "ForkedFromProjectPath|Forked from"
msgstr "Fork criado a partir de"
msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)"
-msgstr ""
+msgstr "Fork a partir de %{project_name} (apagado)"
msgid "Format"
-msgstr ""
+msgstr "Formato"
msgid "From issue creation until deploy to production"
msgstr "Da abertura de tarefas até a implantação para a produção"
@@ -890,22 +963,28 @@ msgid "From merge request merge until deploy to production"
msgstr "Do merge request até a implantação em produção"
msgid "GPG Keys"
-msgstr ""
+msgstr "Chaves GPG"
msgid "Geo Nodes"
-msgstr ""
+msgstr "Nós de geo"
+
+msgid "Geo|File sync capacity"
+msgstr "Capacidade de sincronização de arquivo"
msgid "Geo|Groups to replicate"
-msgstr ""
+msgstr "Grupos para replicar"
+
+msgid "Geo|Repository sync capacity"
+msgstr "Capacidade de sincronização de repositório"
msgid "Geo|Select groups to replicate."
-msgstr ""
+msgstr "Selecione grupos para replicar."
msgid "Git storage health information has been reset"
-msgstr ""
+msgstr "Informações sobre o status de saúde do storage Git foram reiniciadas"
msgid "GitLab Runner section"
-msgstr ""
+msgstr "Seção GitLab Runner"
msgid "Go to your fork"
msgstr "Ir para seu fork"
@@ -914,52 +993,97 @@ msgid "GoToYourFork|Fork"
msgstr "Fork"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "Autenticação do Google não está %{link_to_documentation}. Peça ao administrador do Gitlab se você deseja usar esse serviço."
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr ""
+msgstr "Bloquear compartilhamento de projetos do grupo %{group} com outros grupos"
msgid "GroupSettings|Share with group lock"
-msgstr ""
+msgstr "Travar compartilhamento de grupo"
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "Essa configuração é aplicada no grupo %{ancestor_group} e foi sobrescrita nesse subgrupo."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Essa configuração é aplicada no grupo %{ancestor_group}. Para compartilhar projetos desse grupo com outro grupo, peça ao dono para alterar a configuração ou %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Essa configuração foi aplicada no grupo %{ancestor_group}. Você pode sobrescrevê-la ou %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
+msgstr "Essa configuração será aplicada à todos os subgrupos a menos que sejam sobrescritas pelo dono do grupo. Grupos que já tem acesso ao projeto continuarão a acessá-los até que sejam removidos manualmente."
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
-msgstr ""
+msgstr "não pode ser desativado quando a configuração \"Travar compartilhamento de grupo\" está ativada, a não ser pelo dono do grupo pai"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
-msgstr ""
+msgstr "retirar a trava de compartilhamento de grupo de %{ancestor_group_name}"
+
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "Um grupo é uma coleção de vários projetos."
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "Se você organizar seus projetos num grupo, será como uma pasta."
+
+msgid "GroupsEmptyState|No groups found"
+msgstr "Nenhum grupo encontrado"
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr "Você pode gerenciar permissões de membros e acesso do seu grupo para cada projeto no grupo."
+
+msgid "GroupsTreeRole|as"
+msgstr "como"
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr "Você tem certeza que deseja sair do grupo \"${this.group.fullName}\"?"
+
+msgid "GroupsTree|Create a project in this group."
+msgstr "Criar um projeto nesse grupo."
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr "Criar um subgrupo nesse grupo."
+
+msgid "GroupsTree|Edit group"
+msgstr "Editar grupo"
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr "Falha ao deixar o grupo. Por favor, verifique se você é o único dono."
+
+msgid "GroupsTree|Filter by name..."
+msgstr "Filtrar por nome..."
+
+msgid "GroupsTree|Leave this group"
+msgstr "Deixar o grupo"
+
+msgid "GroupsTree|Loading groups"
+msgstr "Carregando grupos"
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr "Desculpe, nenhum grupo corresponde à sua pesquisa"
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "Desculpe, nenhum grupo ou projeto correspondem à sua pesquisa"
msgid "Health Check"
-msgstr ""
+msgstr "Status de Saúde"
msgid "Health information can be retrieved from the following endpoints. More information is available"
-msgstr ""
+msgstr "Informações do status de saúde podem ser obtidas nos seguintes locais. Mais informação está disponível"
msgid "HealthCheck|Access token is"
-msgstr ""
+msgstr "O token de acesso é"
msgid "HealthCheck|Healthy"
-msgstr ""
+msgstr "Saudável"
msgid "HealthCheck|No Health Problems Detected"
-msgstr ""
+msgstr "Nenhum problema de saúde detectado"
msgid "HealthCheck|Unhealthy"
-msgstr ""
+msgstr "Não saudável"
msgid "History"
-msgstr ""
+msgstr "Histórico"
msgid "Housekeeping successfully started"
msgstr "Manutenção iniciada com sucesso"
@@ -968,21 +1092,27 @@ msgid "Import repository"
msgstr "Importar repositório"
msgid "Improve Issue boards with GitLab Enterprise Edition."
-msgstr ""
+msgstr "Melhorar issue boards com o GitLab Enterprise Edition."
msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Melhore gestão das issues com os pesos no GitLab Enterprise Edition."
msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Encontre o que precisa mais facilmente com a pesquisa global avançada com GitLab Enterprise Edition."
msgid "Install a Runner compatible with GitLab CI"
-msgstr ""
+msgstr "Instalar um Runner compatível com o GitLab CI"
msgid "Instance"
msgid_plural "Instances"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Instância"
+msgstr[1] "Instâncias"
+
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr "Interno - O grupo e projetos internos podem ser visualizados por qualquer usuário autenticado."
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr "Interno - O projeto pode ser acessado por qualquer usuário autenticado."
msgid "Interval Pattern"
msgstr "Padrão de intervalo"
@@ -991,22 +1121,22 @@ msgid "Introducing Cycle Analytics"
msgstr "Apresentando a Análise de Ciclo"
msgid "Issue board focus mode"
-msgstr ""
+msgstr "Modo de foco no issue board"
msgid "Issue boards with milestones"
-msgstr ""
+msgstr "Issue board com milestone"
msgid "Issue events"
-msgstr ""
+msgstr "Eventos de issue"
msgid "IssueBoards|Board"
-msgstr ""
+msgstr "Board"
msgid "IssueBoards|Boards"
-msgstr ""
+msgstr "Boards"
msgid "Issues"
-msgstr ""
+msgstr "Issues"
msgid "LFSStatus|Disabled"
msgstr "Desabilitado"
@@ -1015,7 +1145,7 @@ msgid "LFSStatus|Enabled"
msgstr "Habilitado"
msgid "Labels"
-msgstr ""
+msgstr "Etiquetas"
msgid "Last %d day"
msgid_plural "Last %d days"
@@ -1029,22 +1159,22 @@ msgid "Last commit"
msgstr "Último commit"
msgid "Last edited %{date}"
-msgstr ""
+msgstr "Última edição em %{date}"
msgid "Last edited by %{name}"
-msgstr ""
+msgstr "Última edição por %{name}"
msgid "Last update"
-msgstr ""
+msgstr "Última atualização"
msgid "Last updated"
-msgstr ""
+msgstr "Último atualizado"
msgid "LastPushEvent|You pushed to"
-msgstr ""
+msgstr "Você fez o push para"
msgid "LastPushEvent|at"
-msgstr ""
+msgstr "em"
msgid "Learn more in the"
msgstr "Saiba mais em"
@@ -1052,6 +1182,9 @@ msgstr "Saiba mais em"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "documentação de agendamento de pipeline"
+msgid "Leave"
+msgstr "Sair"
+
msgid "Leave group"
msgstr "Sair do grupo"
@@ -1059,7 +1192,7 @@ msgid "Leave project"
msgstr "Sair do projeto"
msgid "License"
-msgstr ""
+msgstr "Licença"
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
@@ -1067,43 +1200,52 @@ msgstr[0] "Limitado a mostrar %d evento, no máximo"
msgstr[1] "Limitado a mostrar %d eventos, no máximo"
msgid "Lock"
-msgstr ""
+msgstr "Bloquear"
msgid "Locked"
-msgstr ""
+msgstr "Bloqueado"
msgid "Locked Files"
-msgstr ""
+msgstr "Arquivos bloqueados"
+
+msgid "Login"
+msgstr "Entrar"
+
+msgid "Maximum git storage failures"
+msgstr "Máximo de falhas do git storage"
msgid "Median"
msgstr "Mediana"
msgid "Members"
-msgstr ""
+msgstr "Membros"
msgid "Merge Requests"
-msgstr ""
+msgstr "Merge Requests"
msgid "Merge events"
-msgstr ""
+msgstr "Eventos de merge"
msgid "Merge request"
-msgstr ""
+msgstr "Merge requests"
msgid "Messages"
-msgstr ""
+msgstr "Mensagens"
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "adicione uma chave SSH"
msgid "Monitoring"
-msgstr ""
+msgstr "Monitoramento"
msgid "More information is available|here"
-msgstr ""
+msgstr "Mais informações estão disponíveis|aqui"
msgid "Multiple issue boards"
-msgstr ""
+msgstr "Múltiplos issue boards"
+
+msgid "New Cluster"
+msgstr "Novo cluster"
msgid "New Issue"
msgid_plural "New Issues"
@@ -1122,23 +1264,32 @@ msgstr "Novo diretório"
msgid "New file"
msgstr "Novo arquivo"
+msgid "New group"
+msgstr "Novo grupo"
+
msgid "New issue"
msgstr "Nova issue"
msgid "New merge request"
msgstr "Novo merge request"
+msgid "New project"
+msgstr "Novo projeto"
+
msgid "New schedule"
msgstr "Novo agendamento"
msgid "New snippet"
msgstr "Novo snippet"
+msgid "New subgroup"
+msgstr "Novo subgrupo"
+
msgid "New tag"
msgstr "Nova tag"
msgid "No container images stored for this project. Add one by following the instructions above."
-msgstr ""
+msgstr "Nenhuma imagem gravada para esse projeto. Adiciona uma com as instruções a seguir."
msgid "No repository"
msgstr "Nenhum repositório"
@@ -1147,7 +1298,7 @@ msgid "No schedules"
msgstr "Nenhum agendamento"
msgid "None"
-msgstr ""
+msgstr "Nenhum"
msgid "Not available"
msgstr "Não disponível"
@@ -1210,49 +1361,55 @@ msgid "NotificationLevel|Watch"
msgstr "Observar"
msgid "Notifications"
+msgstr "Notificações"
+
+msgid "Number of access attempts"
+msgstr "Número de tentativas de acesso"
+
+msgid "Number of failures before backing off"
msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr "Filtrar"
msgid "Only project members can comment."
-msgstr ""
+msgstr "Somente membros do projeto podem comentar."
msgid "OpenedNDaysAgo|Opened"
msgstr "Aberto"
msgid "Opens in a new window"
-msgstr ""
+msgstr "Abrir em nova janela"
msgid "Options"
msgstr "Opções"
msgid "Overview"
-msgstr ""
+msgstr "Visão geral"
msgid "Owner"
msgstr "Proprietário"
msgid "Pagination|Last »"
-msgstr ""
+msgstr "Último >>"
msgid "Pagination|Next"
-msgstr ""
+msgstr "Próximo"
msgid "Pagination|Prev"
-msgstr ""
+msgstr "Anterior"
msgid "Pagination|« First"
-msgstr ""
+msgstr "<< Primeiro"
msgid "Password"
-msgstr ""
+msgstr "Senha"
msgid "People without permission will never get a notification and won\\'t be able to comment."
-msgstr ""
+msgstr "Pessoas sem permissão nunca receberão uma notificação e não serão capazes de comentar."
msgid "Pipeline"
-msgstr ""
+msgstr "Pipeline"
msgid "Pipeline Health"
msgstr "Saúde da Pipeline"
@@ -1264,7 +1421,7 @@ msgid "Pipeline Schedules"
msgstr "Agendamentos da Pipeline"
msgid "Pipeline quota"
-msgstr ""
+msgstr "Cota de pipeline"
msgid "PipelineCharts|Failed:"
msgstr "Falhou:"
@@ -1324,19 +1481,19 @@ msgid "PipelineSheduleIntervalPattern|Custom"
msgstr "Personalizado"
msgid "Pipelines"
-msgstr ""
+msgstr "Pipelines"
msgid "Pipelines charts"
msgstr "Gráficos de pipelines"
msgid "Pipelines for last month"
-msgstr ""
+msgstr "Pipelines para o último mês"
msgid "Pipelines for last week"
-msgstr ""
+msgstr "Pipelines para a última semana"
msgid "Pipelines for last year"
-msgstr ""
+msgstr "Pipelines para o último ano"
msgid "Pipeline|all"
msgstr "todos"
@@ -1351,10 +1508,55 @@ msgid "Pipeline|with stages"
msgstr "com etapas"
msgid "Preferences"
-msgstr ""
+msgstr "Preferências"
+
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr "Privado - O acesso ao projeto deve ser concedido explicitamente para cada usuário."
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr "Privado - O grupo e seus projetos só podem ser vistos por seus membros."
msgid "Profile"
-msgstr ""
+msgstr "Perfil"
+
+msgid "Profiles|Account scheduled for removal."
+msgstr "Conta agendada para remoção."
+
+msgid "Profiles|Delete Account"
+msgstr "Excluir conta"
+
+msgid "Profiles|Delete account"
+msgstr "Excluir conta"
+
+msgid "Profiles|Delete your account?"
+msgstr "Deseja apagar sua conta?"
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr "Apagando conta tem os seguintes efeitos:"
+
+msgid "Profiles|Invalid password"
+msgstr "Senha inválida"
+
+msgid "Profiles|Invalid username"
+msgstr "Nome de usuário inválido"
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr "Escreva %{confirmationValue} para confirmar:"
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr "Você não tem permissão para apagar esse usuário."
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr "Você precisa delegar outro usuário para ser dono ou apagar esses grupos antes de excluir sua conta."
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr "Sua conta é atualmente proprietária dos seguintes grupos:"
+
+msgid "Profiles|your account"
+msgstr "sua conta"
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr "O projeto '%{project_name}' está sendo excluído."
msgid "Project '%{project_name}' queued for deletion."
msgstr "Projeto'%{project_name}' marcado para exclusão."
@@ -1365,14 +1567,11 @@ msgstr "Projeto '%{project_name}' criado com sucesso."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Projeto '%{project_name}' atualizado com sucesso."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Projeto '%{project_name}' será excluído."
-
msgid "Project access must be granted explicitly to each user."
msgstr "Acesso ao projeto deve ser concedido explicitamente para cada usuário."
msgid "Project details"
-msgstr ""
+msgstr "Detalhes do projeto"
msgid "Project export could not be deleted."
msgstr "A exportação do projeto não pôde ser excluída."
@@ -1387,7 +1586,7 @@ msgid "Project export started. A download link will be sent by email."
msgstr "Exportação do projeto iniciada. Um link para baixá-la será enviado por email."
msgid "ProjectActivityRSS|Subscribe"
-msgstr ""
+msgstr "Inscreva-se"
msgid "ProjectFeature|Disabled"
msgstr "Desabilitado"
@@ -1411,46 +1610,61 @@ msgid "ProjectNetworkGraph|Graph"
msgstr "Árvore"
msgid "ProjectSettings|Contact an admin to change this setting."
-msgstr ""
+msgstr "Fale com um administrador para mudar essa configuração."
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
-msgstr ""
+msgstr "Esse repositório só aceita push de commits assinados."
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
-msgstr ""
+msgstr "Essa configuração está aplicada à nivel de servidor e pode ser sobrescrita por um adminstrador."
msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
-msgstr ""
+msgstr "Essa configuração está aplicada à nivel de servidor mas pode ser sobrescrita para esse projeto."
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
-msgstr ""
+msgstr "Essa configuração será aplicada à todos os projetos, a não ser que sejam sobrescritos pelo administrador."
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr "Nesse repositório, usuários só podem fazer push de commits verificados pelos seus e-mails."
+
+msgid "Projects"
+msgstr "Projetos"
msgid "ProjectsDropdown|Frequently visited"
-msgstr ""
+msgstr "Visitados frequentemente"
msgid "ProjectsDropdown|Loading projects"
-msgstr ""
+msgstr "Carregando projetos"
msgid "ProjectsDropdown|Projects you visit often will appear here"
-msgstr ""
+msgstr "Projetos que você visita frequentemente aparecerão aqui"
msgid "ProjectsDropdown|Search your projects"
-msgstr ""
+msgstr "Procure seus projetos"
msgid "ProjectsDropdown|Something went wrong on our end."
-msgstr ""
+msgstr "Algo deu errado do nosso lado."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
-msgstr ""
+msgstr "Desculpe, nenhum projeto corresponde a sua pesquisa"
msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr ""
+msgstr "Esta funcionalidade necessita de suporte à localStorage do navegador"
+
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr "Público - O grupo e seus projetos podem ser visualizados por todos sem autenticação."
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr "Público - O projeto pode ser acessado sem nenhuma autenticação."
msgid "Push Rules"
-msgstr ""
+msgstr "Regras de push"
msgid "Push events"
-msgstr ""
+msgstr "Eventos de push"
+
+msgid "PushRule|Committer restriction"
+msgstr "Restrição de commit"
msgid "Read more"
msgstr "Leia mais"
@@ -1465,7 +1679,7 @@ msgid "RefSwitcher|Tags"
msgstr "Tags"
msgid "Registry"
-msgstr ""
+msgstr "Registry"
msgid "Related Commits"
msgstr "Commits Relacionados"
@@ -1492,19 +1706,19 @@ msgid "Remove project"
msgstr "Remover projeto"
msgid "Repository"
-msgstr ""
+msgstr "Repositório"
msgid "Request Access"
msgstr "Solicitar acesso"
msgid "Reset git storage health information"
-msgstr ""
+msgstr "Reiniciar informações de status do storage Git"
msgid "Reset health check access token"
-msgstr ""
+msgstr "Recriar o token de status de saúde"
msgid "Reset runners registration token"
-msgstr ""
+msgstr "Recriar o token de registro de runners"
msgid "Revert this commit"
msgstr "Reverter este commit"
@@ -1513,10 +1727,13 @@ msgid "Revert this merge request"
msgstr "Reverter esse merge request"
msgid "SSH Keys"
-msgstr ""
+msgstr "Chaves SSH"
+
+msgid "Save"
+msgstr "Salvar"
msgid "Save changes"
-msgstr ""
+msgstr "Salvar alterações"
msgid "Save pipeline schedule"
msgstr "Salvar agendamento da pipeline"
@@ -1525,7 +1742,7 @@ msgid "Schedule a new pipeline"
msgstr "Agendar nova pipeline"
msgid "Schedules"
-msgstr ""
+msgstr "Agendamentos"
msgid "Scheduling Pipelines"
msgstr "Agendando pipelines"
@@ -1533,6 +1750,15 @@ msgstr "Agendando pipelines"
msgid "Search branches and tags"
msgstr "Procurar branch e tags"
+msgid "Seconds before reseting failure information"
+msgstr "Segundos antes de redefinir as informações de falha"
+
+msgid "Seconds to wait after a storage failure"
+msgstr "Segundos a esperar após uma falha de armazenamento"
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr "Segundo de espera para tentativa de acesso ao storage"
+
msgid "Select Archive Format"
msgstr "Selecionar Formato do Arquivo"
@@ -1543,7 +1769,7 @@ msgid "Select target branch"
msgstr "Selecionar branch de destino"
msgid "Service Templates"
-msgstr ""
+msgstr "Modelos de serviço"
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Defina uma senha para sua conta para aceitar ou entregar código via %{protocol}."
@@ -1561,13 +1787,13 @@ msgid "SetPasswordToCloneLink|set a password"
msgstr "defina uma senha"
msgid "Settings"
-msgstr ""
+msgstr "Configurações"
msgid "Show parent pages"
-msgstr ""
+msgstr "Mostrar páginas acima"
msgid "Show parent subgroups"
-msgstr ""
+msgstr "Mostrar subgrupos acima"
msgid "Showing %d event"
msgid_plural "Showing %d events"
@@ -1575,161 +1801,173 @@ msgstr[0] "Mostrando %d evento"
msgstr[1] "Mostrando %d eventos"
msgid "Snippets"
-msgstr ""
+msgstr "Snippets"
msgid "Something went wrong on our end."
-msgstr ""
-
-msgid "Something went wrong while fetching the projects."
-msgstr ""
-
-msgid "Something went wrong while fetching the registry list."
-msgstr ""
+msgstr "Algo deu errado do nosso lado."
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
-msgstr ""
+msgstr "Algo deu errado ao tentar mudar o estado de bloqueio de ${this.issuableDisplayName(this.issuableType)}"
+
+msgid "Something went wrong while fetching the projects."
+msgstr "Algo deu errado ao recuperar os projetos."
+
+msgid "Something went wrong while fetching the registry list."
+msgstr "Algo deu errado ao recuperar a lista de registro."
+
+msgid "Sort by"
+msgstr "Ordenar por"
msgid "SortOptions|Access level, ascending"
-msgstr ""
+msgstr "Nível de acesso, ascendente"
msgid "SortOptions|Access level, descending"
-msgstr ""
+msgstr "Nível de acesso, decrescente"
msgid "SortOptions|Created date"
-msgstr ""
+msgstr "Data de criação"
msgid "SortOptions|Due date"
-msgstr ""
+msgstr "Data de vencimento"
msgid "SortOptions|Due later"
-msgstr ""
+msgstr "Data de vencimento mais longe"
msgid "SortOptions|Due soon"
-msgstr ""
+msgstr "Data de vencimento mais próxima"
msgid "SortOptions|Label priority"
-msgstr ""
+msgstr "Prioridade de label"
msgid "SortOptions|Largest group"
-msgstr ""
+msgstr "Maior grupo"
msgid "SortOptions|Largest repository"
-msgstr ""
+msgstr "Maior repositório"
msgid "SortOptions|Last created"
-msgstr ""
+msgstr "Últimos criados"
msgid "SortOptions|Last joined"
-msgstr ""
+msgstr "Últimos associados"
msgid "SortOptions|Last updated"
-msgstr ""
+msgstr "Últimos atualizados"
msgid "SortOptions|Least popular"
-msgstr ""
+msgstr "Menos populares"
msgid "SortOptions|Less weight"
-msgstr ""
+msgstr "Menor peso"
msgid "SortOptions|Milestone"
-msgstr ""
+msgstr "Milestone"
msgid "SortOptions|Milestone due later"
-msgstr ""
+msgstr "Milestone de fim mais longo"
msgid "SortOptions|Milestone due soon"
-msgstr ""
+msgstr "Milestone de fim mais próximo"
msgid "SortOptions|More weight"
-msgstr ""
+msgstr "Mais peso"
msgid "SortOptions|Most popular"
-msgstr ""
+msgstr "Mais populares"
msgid "SortOptions|Name"
-msgstr ""
+msgstr "Nome"
msgid "SortOptions|Name, ascending"
-msgstr ""
+msgstr "Nome, ascendente"
msgid "SortOptions|Name, descending"
-msgstr ""
+msgstr "Nome, decrescente"
msgid "SortOptions|Oldest created"
-msgstr ""
+msgstr "Criação mais antiga"
msgid "SortOptions|Oldest joined"
-msgstr ""
+msgstr "Primeiros associados"
msgid "SortOptions|Oldest sign in"
-msgstr ""
+msgstr "Assinados mais antigos"
msgid "SortOptions|Oldest updated"
-msgstr ""
+msgstr "Atualização mais antiga"
msgid "SortOptions|Popularity"
-msgstr ""
+msgstr "Popularidade"
msgid "SortOptions|Priority"
-msgstr ""
+msgstr "Prioridade"
msgid "SortOptions|Recent sign in"
-msgstr ""
+msgstr "Assinados mais novos"
msgid "SortOptions|Start later"
-msgstr ""
+msgstr "Iniciar mais tarde"
msgid "SortOptions|Start soon"
-msgstr ""
+msgstr "Iniciar mais próximo"
msgid "SortOptions|Weight"
-msgstr ""
+msgstr "Peso"
msgid "Source code"
msgstr "Código-fonte"
msgid "Spam Logs"
-msgstr ""
+msgstr "Logs de spam"
msgid "Specify the following URL during the Runner setup:"
-msgstr ""
+msgstr "Especifique a seguinte URL durante a configuração do Runner:"
msgid "StarProject|Star"
msgstr "Marcar"
msgid "Starred projects"
-msgstr ""
+msgstr "Projetos favoritos"
msgid "Start a %{new_merge_request} with these changes"
msgstr "Iniciar um %{new_merge_request} a partir dessas alterações"
msgid "Start the Runner!"
-msgstr ""
+msgstr "Inicie o Runner!"
+
+msgid "Subgroups"
+msgstr "Subgrupos"
+
+msgid "Subscribe"
+msgstr "Assine"
msgid "Switch branch/tag"
msgstr "Trocar branch/tag"
msgid "System Hooks"
-msgstr ""
+msgstr "Hooks do sistema"
msgid "Tag"
msgid_plural "Tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tag"
+msgstr[1] "Tags"
msgid "Tags"
-msgstr ""
+msgstr "Tags"
msgid "Target Branch"
msgstr "Branch de destino"
msgid "Team"
-msgstr ""
+msgstr "Equipe"
msgid "Thanks! Don't show me this again"
-msgstr ""
+msgstr "Obrigado! Não mostrar novamente"
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr "A pesquisa global avançado no GitLab é um serviço poderoso de pesquisa que poupa seu tempo. Ao invés de criar código duplicado e perder seu tempo, você pode agora pesquisar por código de outros times que podem ajudar no seu próprio projeto."
+
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr ""
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
@@ -1744,6 +1982,15 @@ msgstr "O relacionamento como fork foi removido."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "A etapa de planejamento mostra o tempo que se leva desde a criação de uma issue até sua atribuição à um milestone, ou sua adição a uma lista no seu Issue Board. Comece a criar issues para ver dados para esta etapa."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr "O número de tentativas que gitlab fará para acessar um storage."
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr "O número de falhas até o GitLab começar a desabilitar temporariamente o acesso a um nó de storage em um host"
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr "O número de falhas para que o GitLab desabilite o acesso ao storage. O número de falhas pode ser redefinido na interface do administrador: %{link_to_health_page} ou %{api_documentation_link}."
+
msgid "The phase of the development lifecycle."
msgstr "A fase do ciclo de vida do desenvolvimento."
@@ -1774,6 +2021,12 @@ msgstr "A etapa de homologação mostra o tempo entre o aceite da solicitação
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "A etapa de testes mostra o tempo que o GitLab CI leva para executar cada pipeline para a solicitação de incorporação associada. Os dados serão automaticamente adicionados após a conclusão do primeiro pipeline."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr "Tempo em segundos para o GitLab manter as informações de falha. Se nenhuma falha ocorrer durante este tempo, a informação sobre o ponto de montagem será redefinida."
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr "Tempo em segundos que o GitLab tentará acessar o storage. Depois desse tempo, um erro de tempo excedido será disparado."
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "O tempo necessário por cada entrada de dados reunida por essa etapa."
@@ -1781,25 +2034,28 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet
msgstr "O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5+7)/2 = 6."
msgid "There are problems accessing Git storage: "
-msgstr ""
+msgstr "Há problemas para acessar o storage Git: "
+
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr "Esse branch mudou desde quando você começou sua edição. Você quer criar um novo branch?"
msgid "This is a confidential issue."
-msgstr ""
+msgstr "Essa issue é confidencial."
msgid "This is the author's first Merge Request to this project."
-msgstr ""
+msgstr "Esse é o autor do primeiro merge request desse projeto."
msgid "This issue is confidential and locked."
-msgstr ""
+msgstr "Essa issue é confidencial e está bloqueada."
msgid "This issue is locked."
-msgstr ""
+msgstr "Essa issue está bloqueada."
msgid "This means you can not push code until you create an empty repository or import existing one."
msgstr "Isto significa que você não pode entregar código até que crie um repositório vazio ou importe um existente."
msgid "This merge request is locked."
-msgstr ""
+msgstr "Esse merge request está bloqueado."
msgid "Time before an issue gets scheduled"
msgstr "Tempo até que uma issue seja agendada"
@@ -1931,7 +2187,7 @@ msgid "Timeago|in 1 year"
msgstr "em 1 ano"
msgid "Timeago|in a while"
-msgstr ""
+msgstr "há algum tempo"
msgid "Timeago|less than a minute ago"
msgstr "há menos de um minuto"
@@ -1956,31 +2212,34 @@ msgid "Total test time for all commits/merges"
msgstr "Tempo de teste total para todos os commits/merges"
msgid "Track activity with Contribution Analytics."
-msgstr ""
+msgstr "Acompanhar atividade com o Contribution Analytics."
msgid "Unlock"
-msgstr ""
+msgstr "Desbloquear"
msgid "Unlocked"
-msgstr ""
+msgstr "Desbloqueado"
msgid "Unstar"
msgstr "Desmarcar"
+msgid "Unsubscribe"
+msgstr "Desassinar"
+
msgid "Upgrade your plan to activate Advanced Global Search."
-msgstr ""
+msgstr "Atualize seu plano para ativar a pesquisa global avançada."
msgid "Upgrade your plan to activate Contribution Analytics."
-msgstr ""
+msgstr "Atualize seu plano para ativar o Contribution Analytics."
msgid "Upgrade your plan to activate Group Webhooks."
-msgstr ""
+msgstr "Atualize seu plano para ativar Webhooks de grupo."
msgid "Upgrade your plan to activate Issue weight."
-msgstr ""
+msgstr "Atualize seu plano para ativar peso nas issues."
msgid "Upgrade your plan to improve Issue boards."
-msgstr ""
+msgstr "Atualize seu plano para melhorar os issue boards."
msgid "Upload New File"
msgstr "Enviar Novo Arquivo"
@@ -1992,19 +2251,19 @@ msgid "UploadLink|click to upload"
msgstr "clique para fazer upload"
msgid "Use the following registration token during setup:"
-msgstr ""
+msgstr "Use o seguinte token de registro durante a configuração:"
msgid "Use your global notification setting"
msgstr "Utilizar configuração de notificação global"
msgid "View file @ "
-msgstr ""
+msgstr "Ver arquivo @ "
msgid "View open merge request"
msgstr "Ver merge request aberto"
msgid "View replaced file @ "
-msgstr ""
+msgstr "Ver arquivo substituído @ "
msgid "VisibilityLevel|Internal"
msgstr "Interno"
@@ -2025,115 +2284,118 @@ msgid "We don't have enough data to show this stage."
msgstr "Esta etapa não possui dados suficientes para exibição."
msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
-msgstr ""
+msgstr "Webhooks permitem que você acione uma URL se, por exemplo, um novo código for feito push ou uma nova issue criada. Você pode configurar os webhooks para escutar eventos específicos como push, issue ou merge request. Webhooks de grupo aplicarão para todos os projetos no grupo, permitindo você padronizar o funcionamento em todo o grupo."
msgid "Weight"
-msgstr ""
+msgstr "Peso"
+
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr "Falha ao acessar o storage. Gitlab impedirá o acesso ao storage pelo tempo especificado aqui. Isso permite que o sistema de arquivos se recupere. Repositórios que estiverem em nós com falha ficarão temporariamente indisponíveis"
msgid "Wiki"
-msgstr ""
+msgstr "Wiki"
msgid "WikiClone|Clone your wiki"
-msgstr ""
+msgstr "Clonar sua wiki"
msgid "WikiClone|Git Access"
-msgstr ""
+msgstr "Acesso Git"
msgid "WikiClone|Install Gollum"
-msgstr ""
+msgstr "Instalar Gollum"
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
-msgstr ""
+msgstr "É recomendado instalar %{markdown} para que as funções GFM sejam renderizadas localmente:"
msgid "WikiClone|Start Gollum and edit locally"
-msgstr ""
+msgstr "Inicie o Gollum e edite localmente"
msgid "WikiEmptyPageError|You are not allowed to create wiki pages"
-msgstr ""
+msgstr "Você não tem permissão para criar páginas web"
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "Essa é uma versão antiga dessa página."
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
-msgstr ""
+msgstr "Você pode ver o %{most_recent_link} ou navegar o %{history_link}."
msgid "WikiHistoricalPage|history"
-msgstr ""
+msgstr "histórico"
msgid "WikiHistoricalPage|most recent version"
-msgstr ""
+msgstr "versão mais recente"
msgid "WikiMarkdownDocs|More examples are in the %{docs_link}"
-msgstr ""
+msgstr "Mais exemplos em %{docs_link}"
msgid "WikiMarkdownDocs|documentation"
-msgstr ""
+msgstr "documentação"
msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
-msgstr ""
+msgstr "Para criar um link para uma (nova) página, é so digitar %{link_example}"
msgid "WikiNewPagePlaceholder|how-to-setup"
-msgstr ""
+msgstr "como instalar"
msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
-msgstr ""
+msgstr "Dica: Você pode especificar o caminho completo para o novo arquivo. Nós vamos criar automaticamente quaisquer diretórios ainda não existentes."
msgid "WikiNewPageTitle|New Wiki Page"
-msgstr ""
+msgstr "Nova página Wiki"
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
-msgstr ""
+msgstr "Quer mesmo apagar essa página?"
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "Alguém editou essa página ao mesmo tempo que você. Por favor olhe %{page_link} e tenha certeza de que suas mudanças não removerão as mudanças deles."
msgid "WikiPageConflictMessage|the page"
-msgstr ""
+msgstr "a página"
msgid "WikiPageCreate|Create %{page_title}"
-msgstr ""
+msgstr "Criar %{page_title}"
msgid "WikiPageEdit|Update %{page_title}"
-msgstr ""
+msgstr "Atualizar %{page_title}"
msgid "WikiPage|Page slug"
-msgstr ""
+msgstr "Nome amigável da página"
msgid "WikiPage|Write your content or drag files here..."
-msgstr ""
+msgstr "Escreve seu conteudo ou arraste arquivos aqui..."
msgid "Wiki|Create Page"
-msgstr ""
+msgstr "Criar página"
msgid "Wiki|Create page"
-msgstr ""
+msgstr "Criar página"
msgid "Wiki|Edit Page"
-msgstr ""
+msgstr "Ediar página"
msgid "Wiki|Empty page"
-msgstr ""
+msgstr "Página vazia"
msgid "Wiki|More Pages"
-msgstr ""
+msgstr "Mais páginas"
msgid "Wiki|New page"
-msgstr ""
+msgstr "Nova página"
msgid "Wiki|Page history"
-msgstr ""
+msgstr "Histórico da página"
msgid "Wiki|Page version"
-msgstr ""
+msgstr "Versão da página"
msgid "Wiki|Pages"
-msgstr ""
+msgstr "Páginas"
msgid "Wiki|Wiki Pages"
-msgstr ""
+msgstr "Páginas Wiki"
msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
-msgstr ""
+msgstr "Com o contribution analytics você pode ter uma visão geral da atividade em issue, merge request e evento de push para sua organização e seus membros."
msgid "Withdraw Access Request"
msgstr "Remover Requisição de Acesso"
@@ -2145,14 +2407,26 @@ msgid "You are going to remove %{project_name_with_namespace}. Removed project C
msgstr "Você irá remover %{project_name_with_namespace}. O projeto removido NÃO PODE ser restaurado! Tem certeza ABSOLUTA?"
msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?"
-msgstr ""
+msgstr "Você está prestes a remover a relação de fork do projeto original %{forked_from_project}. Você tem CERTEZA disso?"
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "Você irá transferir %{project_name_with_namespace} para outro proprietário. Tem certeza ABSOLUTA?"
+msgid "You are on a read-only GitLab instance."
+msgstr "Você está em uma instância somente-leitura do GitLab."
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr "Você está em uma instância somente-leitura do GitLab. Se você quiser fazer qualquer alteração visite %{link_to_primary_node}."
+
msgid "You can only add files when you are on a branch"
msgstr "Você somente pode adicionar arquivos quando estiver em um branch"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "Você não pode escrever numa instância secundária de somente leitura do GitLab Geo. Por favor use %{link_to_primary_node}."
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr "Você não pode escrever nesta instância somente-leitura do GitLab."
+
msgid "You have reached your project limit"
msgstr "Você atingiu o limite de seu projeto"
@@ -2184,16 +2458,19 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss
msgstr "Você não conseguirá fazer pull ou push no projeto via SSH até que adicione %{add_ssh_key_link} ao seu perfil"
msgid "Your comment will not be visible to the public."
-msgstr ""
+msgstr "Seu comentário não estará visível ao público."
+
+msgid "Your groups"
+msgstr "Seus grupos"
msgid "Your name"
msgstr "Seu nome"
msgid "Your projects"
-msgstr ""
+msgstr "Seus projetos"
msgid "commit"
-msgstr ""
+msgstr "commit"
msgid "day"
msgid_plural "days"
@@ -2211,9 +2488,15 @@ msgid_plural "parents"
msgstr[0] "pai"
msgstr[1] "pais"
-msgid "to help your contributors communicate effectively!"
-msgstr ""
+msgid "password"
+msgstr "senha"
msgid "personal access token"
-msgstr ""
+msgstr "token de acesso pessoal"
+
+msgid "to help your contributors communicate effectively!"
+msgstr "para ajudar seus contribuintes à se comunicar de maneira eficaz!"
+
+msgid "username"
+msgstr "nome do usuário"
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 7e1f23178b9..2f612f46799 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-05 14:39-0500\n"
"Last-Translator: gitlab \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -19,24 +19,30 @@ msgstr ""
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d коммит"
-msgstr[1] "%d коммитов"
+msgstr[1] "%d коммита"
msgstr[2] "%d коммитов"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d слой"
+msgstr[1] "%d слоя"
+msgstr[2] "%d слоёв"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s добавленный коммит был исключен для предотвращения проблем с производительностью."
-msgstr[1] "%s добавленные коммиты были исключены для предотвращения проблем с производительностью."
-msgstr[2] "%s добавленные коммиты были исключены для предотвращения проблем с производительностью."
+msgstr[1] "%s добавленных коммита были исключены для предотвращения проблем с производительностью."
+msgstr[2] "%s добавленных коммитов были исключены для предотвращения проблем с производительностью."
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} добавил коммит %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] "%{count} участник"
+msgstr[1] "%{count} участника"
+msgstr[2] "%{count} участников"
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "на %{number_commits_behind} коммитов позади %{default_branch}, на %{number_commits_ahead} коммитов впереди"
@@ -58,20 +64,26 @@ msgstr[2] "%{storage_name}: %{failed_attempts} - неудачные попытк
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(перейдите по ссылке %{link} для получения информации об установке)."
+msgid "+ %{moreCount} more"
+msgstr "+ ещё %{moreCount}"
+
+msgid "- show less"
+msgstr "- свернуть"
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "1 сборочная линия"
-msgstr[1] "%d сборочных линий"
+msgstr[1] "%d сборочных линии"
msgstr[2] "%d сборочных линий"
msgid "1st contribution!"
msgstr "Первый вклад!"
msgid "2FA enabled"
-msgstr ""
+msgstr "Двухфакторная авторизация включена"
msgid "A collection of graphs regarding Continuous Integration"
-msgstr "Графики относительно непрерывной интеграции (Ci)"
+msgstr "Графики непрерывной интеграции (CI)"
msgid "About auto deploy"
msgstr "Об автоматическом развёртывании"
@@ -115,9 +127,18 @@ msgstr "Добавьте ключ SSH в свой профиль, чтобы о
msgid "Add new directory"
msgstr "Добавить новый каталог"
+msgid "AdminHealthPageLink|health page"
+msgstr "страница работоспособности"
+
+msgid "Advanced settings"
+msgstr "Расширенные настройки"
+
msgid "All"
msgstr "Все"
+msgid "An error occurred. Please try again."
+msgstr "Произошла ошибка. Пожалуйста, попробуйте снова."
+
msgid "Appearance"
msgstr "Оформление"
@@ -131,13 +152,16 @@ msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Вы действительно хотите удалить это расписание сборочной линии?"
msgid "Are you sure you want to discard your changes?"
-msgstr "Вы уверены, что Вы хотите отменить Ваши изменения?"
+msgstr "Вы уверены, что хотите отменить ваши изменения?"
+
+msgid "Are you sure you want to leave this group?"
+msgstr "Вы уверены, что хотите покинуть эту группу?"
msgid "Are you sure you want to reset registration token?"
-msgstr ""
+msgstr "Вы уверены, что хотите сбросить этот регистрационный токен?"
msgid "Are you sure you want to reset the health check token?"
-msgstr ""
+msgstr "Вы уверены, что хотите сбросить этот токен проверки работоспособности?"
msgid "Are you sure?"
msgstr "Вы уверены?"
@@ -166,59 +190,62 @@ msgstr "Приложения для автоматического ревью и
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr "Включить в настройках"
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr "Для этого проекта может быть активирован автоматический DevOps. Он будет автоматически собирать, тестировать и разворачивать ваши приложения на основе предопределенной конфигурации CI/CD."
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
-msgstr ""
+msgstr "Подробнее по ссылке %{link_to_documentation}"
+
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr "Вы можете активировать %{link_to_settings} для этого проекта."
msgid "Billing"
-msgstr ""
+msgstr "Тариф"
msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
-msgstr ""
+msgstr "%{group_name} использует тарифный план %{plan_link}."
msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
-msgstr ""
+msgstr "Автоматическое повышение или понижение недоступно для некоторых тарифных планов в настоящее время."
msgid "BillingPlans|Current plan"
-msgstr ""
+msgstr "Текущий тарифный план"
msgid "BillingPlans|Customer Support"
-msgstr ""
+msgstr "Поддержка Клиентов"
msgid "BillingPlans|Downgrade"
-msgstr ""
+msgstr "Понижение"
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
-msgstr ""
+msgstr "Узнайте больше о каждом тарифном плане прочитав наш %{faq_link}."
msgid "BillingPlans|Manage plan"
-msgstr ""
+msgstr "Управление тарифным планом"
msgid "BillingPlans|Please contact %{customer_support_link} in that case."
-msgstr ""
+msgstr "Пожалуйста, в этом случае обратитесь в %{customer_support_link}."
msgid "BillingPlans|See all %{plan_name} features"
-msgstr ""
+msgstr "Посмотреть возможности %{plan_name} полностью"
msgid "BillingPlans|This group uses the plan associated with its parent group."
-msgstr ""
+msgstr "Эта группа использует тарифный план связанный с родительской группой."
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
-msgstr ""
+msgstr "Для управления тарифным планом этой группы посетите раздел тарификации %{parent_billing_page_link}."
msgid "BillingPlans|Upgrade"
-msgstr ""
+msgstr "Повышение"
msgid "BillingPlans|You are currently on the %{plan_link} plan."
-msgstr ""
+msgstr "В настоящее время вы используете тарифный план %{plan_link}."
msgid "BillingPlans|frequently asked questions"
msgstr "Часто задаваемые вопросы"
@@ -227,7 +254,7 @@ msgid "BillingPlans|monthly"
msgstr "ежемесячно"
msgid "BillingPlans|paid annually at %{price_per_year}"
-msgstr ""
+msgstr "оплачивается ежегодно в размере %{price_per_year}"
msgid "BillingPlans|per user"
msgstr "за пользователя"
@@ -239,7 +266,10 @@ msgstr[1] "Ветки"
msgstr[2] "Ветки"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
-msgstr "Ветка %{branch_name} создана. Для настройки автоматического развертывания выберите Yaml-шаблон для GitLab CI и зафиксируйте свои изменения. %{link_to_autodeploy_doc}"
+msgstr "Ветка %{branch_name} создана. Для настройки автоматического развертывания выберите YAML-шаблон для GitLab CI и зафиксируйте свои изменения. %{link_to_autodeploy_doc}"
+
+msgid "Branch has changed"
+msgstr "Ветка была изменена"
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Поиск веток"
@@ -365,7 +395,7 @@ msgid "Cancel edit"
msgstr "Отменить редактирование"
msgid "Change Weight"
-msgstr ""
+msgstr "Изменить Вес"
msgid "ChangeTypeActionLabel|Pick into branch"
msgstr "Выбрать в ветке"
@@ -392,10 +422,10 @@ msgid "Cherry-pick this commit"
msgstr "Подобрать в этом коммите"
msgid "Cherry-pick this merge request"
-msgstr "Побрать в этом запросе на слияние"
+msgstr "Подобрать этот запрос на слияние"
msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all."
-msgstr ""
+msgstr "Выберите группы, которые хотите скопировать на вторичный узел. Оставьте пустым для копирование всего."
msgid "CiStatusLabel|canceled"
msgstr "отменено"
@@ -451,134 +481,146 @@ msgstr "пропущено"
msgid "CiStatus|running"
msgstr "выполняется"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr "CircuitBreaker API"
+
msgid "Clone repository"
-msgstr ""
+msgstr "Клонировать репозиторий"
msgid "Close"
msgstr "Закрыть"
+msgid "Cluster"
+msgstr "Кластер"
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
-msgstr ""
+msgstr "%{link_to_container_project} должен быть создан под этой учетной записью"
+
+msgid "ClusterIntegration|Cluster details"
+msgstr "Параметры кластера"
msgid "ClusterIntegration|Cluster integration"
-msgstr ""
+msgstr "Интеграция кластеров"
msgid "ClusterIntegration|Cluster integration is disabled for this project."
-msgstr ""
+msgstr "Интеграция кластеров отключена для этого проекта."
msgid "ClusterIntegration|Cluster integration is enabled for this project."
-msgstr ""
+msgstr "Интеграция кластеров включена для этого проекта."
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "Для этого проекта включена интеграция кластеров. Отключение интеграции не повлияет на кластер, но соединение с GitLab будет временно отключено."
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
-msgstr ""
+msgstr "Создается кластер в Google Container Engine..."
msgid "ClusterIntegration|Cluster name"
-msgstr ""
+msgstr "Название кластера"
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
-msgstr ""
+msgstr "Кластер был успешно создан в Google Container Engine"
msgid "ClusterIntegration|Copy cluster name"
-msgstr ""
+msgstr "Копировать название кластера"
msgid "ClusterIntegration|Create cluster"
-msgstr ""
+msgstr "Создать кластер"
msgid "ClusterIntegration|Create new cluster on Google Container Engine"
-msgstr ""
+msgstr "Создать новый кластер в Google Container Engine"
msgid "ClusterIntegration|Enable cluster integration"
-msgstr ""
+msgstr "Включить интеграцию с кластерами"
msgid "ClusterIntegration|Google Cloud Platform project ID"
-msgstr ""
+msgstr "Идентификатор проекта в Google Cloud Platform"
msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine"
msgid "ClusterIntegration|Google Container Engine project"
-msgstr ""
-
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Проект Google Container Engine"
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
-msgstr ""
+msgstr "Узнайте больше на %{link_to_documentation}"
-msgid "ClusterIntegration|See machine types"
-msgstr ""
+msgid "ClusterIntegration|Machine type"
+msgstr "Тип машины"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
-msgstr ""
+msgstr "Убедитесь, что ваша учетная запись %{link_to_requirements} для создания кластеров"
+
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr "Управление интеграцией кластера на вашем проекте Gitlab"
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
-msgstr ""
+msgstr "Управляйте кластером, перейдя по ссылке %{link_gke}"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
-
-msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
-
-msgid "ClusterIntegration|Remove cluster integration"
-msgstr ""
-
-msgid "ClusterIntegration|Remove integration"
-msgstr ""
-
-msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
-msgstr ""
-
-msgid "ClusterIntegration|Save changes"
-msgstr ""
-
-msgid "ClusterIntegration|See your projects"
-msgstr ""
-
-msgid "ClusterIntegration|See zones"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
+msgstr "Количество узлов"
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "Пожалуйста, убедитесь, что ваш аккаунт Google отвечает следующим требованиям:"
-msgid "ClusterIntegration|Toggle Cluster"
-msgstr ""
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr "Пространство имен проекта (необязательное, уникальное)"
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
+msgstr "Прочтите нашу документацию %{link_to_help_page} по интеграции кластера."
+
+msgid "ClusterIntegration|Remove cluster integration"
+msgstr "Удалить интеграцию с кластером"
+
+msgid "ClusterIntegration|Remove integration"
+msgstr "Удалить интеграцию"
+
+msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
+msgstr "При удалении интеграции с кластером будет удалена конфигурация кластера, которую вы добавили в этот проект. Данное действие не удалит сам проект."
+
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr "Просмотреть и отредактировать параметры для вашего кластера"
+
+msgid "ClusterIntegration|See machine types"
+msgstr "См. типы машин"
+
+msgid "ClusterIntegration|See your projects"
+msgstr "См. ваши проекты"
+
+msgid "ClusterIntegration|See zones"
+msgstr "См. зоны"
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr " У нас что-то пошло не так."
+
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
+msgstr "Что-то пошло не так во время создания кластера в Google Container Engine"
+
+msgid "ClusterIntegration|Toggle Cluster"
+msgstr "Переключить Кластер"
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "Если привязать кластер к этому проекту, вы с лёгкостью сможете использовать приложения для ревью, развертывать ваши приложения, запускать сборочные линии и многое другое."
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
-msgstr ""
+msgstr "Ваша учетная запись должна иметь %{link_to_container_engine}"
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "Зона"
msgid "ClusterIntegration|access to Google Container Engine"
-msgstr ""
+msgstr "доступ к Google Container Engine"
msgid "ClusterIntegration|cluster"
-msgstr ""
+msgstr "кластер"
msgid "ClusterIntegration|help page"
-msgstr ""
+msgstr "страница справки"
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "отвечает требованиям"
msgid "ClusterIntegration|properly configured"
-msgstr ""
+msgstr "правильно настроен"
msgid "Comments"
msgstr "Комментарии"
@@ -589,8 +631,14 @@ msgstr[0] "Коммит"
msgstr[1] "Коммиты"
msgstr[2] "Коммиты"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] "Зафиксировать %d файл"
+msgstr[1] "Зафиксировать %d файла"
+msgstr[2] "Зафиксировать %d файлов"
+
msgid "Commit Message"
-msgstr ""
+msgstr "Описание Коммита"
msgid "Commit duration in minutes for last 30 commits"
msgstr "Продолжительность последних 30 коммитов в минутах"
@@ -602,7 +650,7 @@ msgid "CommitBoxTitle|Commit"
msgstr "Коммит"
msgid "CommitMessage|Add %{file_name}"
-msgstr "Добавлен %{file_name}"
+msgstr "Добавить %{file_name}"
msgid "Commits"
msgstr "Коммиты"
@@ -620,49 +668,49 @@ msgid "Compare"
msgstr "Сравнить"
msgid "Container Registry"
-msgstr ""
+msgstr "Реестр Контейнеров"
msgid "ContainerRegistry|Created"
-msgstr ""
+msgstr "Создан"
msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "Сначала авторизуйтесь в реестре контейнеров GitLab, используя свои имя пользователя и пароль. Если у вас есть %{link_2fa}, вам необходимо использовать %{link_token}:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
-msgstr ""
+msgstr "GitLab поддерживает до трех уровней имён образов. Следующие примеры имён образов подходят для вашего проекта:"
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr ""
+msgstr "Как использовать Реестр Контейнеров"
msgid "ContainerRegistry|Learn more about"
-msgstr ""
+msgstr "Узнайте больше"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "В реестре контейнеров нет тегов для этого образа."
msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "После того, как вы вошли в систему, вы можете создать или загрузить образ контейнера, используя общие команды %{build} и %{push}"
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "Удалить репозиторий"
msgid "ContainerRegistry|Remove tag"
-msgstr ""
+msgstr "Удалить тег"
msgid "ContainerRegistry|Size"
-msgstr ""
+msgstr "Размер"
msgid "ContainerRegistry|Tag"
-msgstr ""
+msgstr "Тег"
msgid "ContainerRegistry|Tag ID"
-msgstr ""
+msgstr "Идентификатор Тега"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "Использовать различные имена образов"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "Когда реестр контейнеров Docker интегрирован с GitLab, каждый проект может иметь свое собственное пространство для хранения его Docker образов."
msgid "Contribution guide"
msgstr "Руководство участника"
@@ -670,6 +718,12 @@ msgstr "Руководство участника"
msgid "Contributors"
msgstr "Участники"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Контролировать максимальное количество потоков фоновой загрузки LFS/вложений для этого вторичного узла"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Контролировать максимальное количество потоков фоновой загрузки хранилища для этого вторичного узла"
+
msgid "Copy SSH public key to clipboard"
msgstr "Скопировать публичный ключ SSH в буфер обмена"
@@ -691,9 +745,21 @@ msgstr "Создать каталог"
msgid "Create empty bare repository"
msgstr "Создать пустой репозиторий"
+msgid "Create file"
+msgstr "Создать файл"
+
msgid "Create merge request"
msgstr "Создать запрос на слияние"
+msgid "Create new branch"
+msgstr "Создать новую ветку"
+
+msgid "Create new directory"
+msgstr "Создать новый каталог"
+
+msgid "Create new file"
+msgstr "Создать новый файл"
+
msgid "Create new..."
msgstr "Новый"
@@ -713,7 +779,7 @@ msgid "Cron syntax"
msgstr "Синтаксис Cron"
msgid "Custom notification events"
-msgstr " Настраиваемые уведомления о событиях"
+msgstr "События настраиваемых уведомлений"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "Настраиваемые уровни уведомлений аналогичны уровню уведомлений в соответствии с участием. С настраиваемыми уровнями уведомлений вы также будете получать уведомления о выбранных событиях. Чтобы узнать больше, посмотрите %{notification_link}."
@@ -746,10 +812,10 @@ msgid "CycleAnalyticsStage|Test"
msgstr "Тестирование"
msgid "DashboardProjects|All"
-msgstr ""
+msgstr "Все"
msgid "DashboardProjects|Personal"
-msgstr ""
+msgstr "Личные"
msgid "Define a custom pattern with cron syntax"
msgstr "Определить настраиваемый шаблон с синтаксисом cron"
@@ -781,8 +847,11 @@ msgstr "Имя каталога"
msgid "Discard changes"
msgstr "Отменить изменения"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr "Отключить блок введения в Аналитику Цикла"
+
msgid "Dismiss Merge Request promotion"
-msgstr ""
+msgstr "Отключить анонсы для Запросов на Слияние"
msgid "Don't show again"
msgstr "Не показывать снова"
@@ -848,17 +917,23 @@ msgid "Every month (on the 1st at 4:00am)"
msgstr "Ежемесячно (каждое 1-е число в 4:00)"
msgid "Every week (Sundays at 4:00am)"
-msgstr "Еженедельно (по воскресениями в 4:00)"
+msgstr "Еженедельно (по воскресениям в 4:00)"
msgid "Explore projects"
msgstr "Обзор проектов"
+msgid "Explore public groups"
+msgstr "Исследовать публичные группы"
+
msgid "Failed to change the owner"
msgstr "Не удалось изменить владельца"
msgid "Failed to remove the pipeline schedule"
msgstr "Не удалось удалить расписание сборочной линии"
+msgid "File name"
+msgstr "Имя файла"
+
msgid "Files"
msgstr "Файлы"
@@ -875,7 +950,7 @@ msgid "FirstPushedBy|First"
msgstr "Первый"
msgid "FirstPushedBy|pushed by"
-msgstr ""
+msgstr "отправлено автором"
msgid "Fork"
msgid_plural "Forks"
@@ -890,7 +965,7 @@ msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)"
msgstr "Ответвление от %{project_name} (удалено)"
msgid "Format"
-msgstr ""
+msgstr "Формат"
msgid "From issue creation until deploy to production"
msgstr "От создания обсуждения до развертывания реализации в рабочей среде"
@@ -902,13 +977,19 @@ msgid "GPG Keys"
msgstr "GPG Ключи"
msgid "Geo Nodes"
-msgstr ""
+msgstr "Географические Узлы"
+
+msgid "Geo|File sync capacity"
+msgstr "Объем хранилища для синхронизации файлов"
msgid "Geo|Groups to replicate"
-msgstr ""
+msgstr "Группы для репликации"
+
+msgid "Geo|Repository sync capacity"
+msgstr "Объем хранилища для синхронизации репозитория"
msgid "Geo|Select groups to replicate."
-msgstr ""
+msgstr "Выберите группы для репликации."
msgid "Git storage health information has been reset"
msgstr "Информация о стабильности Git хранилища была сброшена"
@@ -923,31 +1004,76 @@ msgid "GoToYourFork|Fork"
msgstr "Ответвление"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "Аутентификация Google не %{link_to_documentation}. Попросите своего администратора GitLab, если вы хотите воспользоваться этим сервисом."
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr ""
+msgstr "Запретить публикацию проектов из %{group} в других группах"
msgid "GroupSettings|Share with group lock"
-msgstr ""
+msgstr "Опубликовать с групповой блокировкой"
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "Эта настройка применена в %{ancestor_group} и была переопределена в этой подгруппе."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Эта настройка применена в %{ancestor_group}. Чтобы поделиться проектами из этой группы с другими группами, запросите у владельца переопределить эту настройку или %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Эта настройка применена в %{ancestor_group}. Вы можете переопределить эту настройку или %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
+msgstr "Эта настройка будет применена для всех подгрупп если не будет переопределена владельцем группы. Группы которые уже имеют доступ к проекту, будут иметь его и дальше пока не будут удалены вручную."
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
-msgstr ""
+msgstr "не может быть отменена до тех пор пока группа \"Поделиться с групповой блокировкой\" включена, за исключением владельца группы родителя"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
-msgstr ""
+msgstr "удалить возможность поделиться с групповой блокировкой из %{ancestor_group_name}"
+
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "Группа - это набор из нескольких проектов."
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "При размещении проектов в группе, группа выполняет функции папки."
+
+msgid "GroupsEmptyState|No groups found"
+msgstr "Группы не найдены"
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr "Вы можете управлять правами и доступом участников вашей группы к каждому проекту в группе."
+
+msgid "GroupsTreeRole|as"
+msgstr "как"
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr "Вы уверены, что вы хотите покинуть группу \"${this.group.fullName}\"?"
+
+msgid "GroupsTree|Create a project in this group."
+msgstr "Создать проект в этой группе."
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr "Создать подгруппу в этой группе."
+
+msgid "GroupsTree|Edit group"
+msgstr "Редактировать группу"
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr "Не удалось покинуть группу. Пожалуйста, убедитесь, что вы не единственный владелец."
+
+msgid "GroupsTree|Filter by name..."
+msgstr "Фильтр по имени..."
+
+msgid "GroupsTree|Leave this group"
+msgstr "Покинуть эту группу"
+
+msgid "GroupsTree|Loading groups"
+msgstr "Загрузка групп"
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr "К сожалению, по вашему запросу групп не найдено"
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "К сожалению, по вашему запросу групп или проектов не найдено"
msgid "Health Check"
msgstr "Проверка работоспособности"
@@ -968,7 +1094,7 @@ msgid "HealthCheck|Unhealthy"
msgstr "Нестабильный"
msgid "History"
-msgstr ""
+msgstr "История"
msgid "Housekeeping successfully started"
msgstr "Очистка успешно запущена"
@@ -980,7 +1106,7 @@ msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "Улучшить доски обсуждений с помощью версии GitLab Enterprise Edition."
msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Улучшить управление обсуждениями с возможностью определения веса обсуждения при помощи GitLab Enterprise Edition."
msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
msgstr "Улучшить поиск при помощи Расширенного Глобального Поиска в версии GitLab Enterprise Edition."
@@ -994,6 +1120,12 @@ msgstr[0] "Экземпляр"
msgstr[1] "Экземпляры"
msgstr[2] "Экземпляры"
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr "Внутренний - Группу и включённые в неё проекты может видеть любой зарегистрированный пользователь."
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr "Внутренний - Проект доступен любому зарегистрированному пользователю."
+
msgid "Interval Pattern"
msgstr "Шаблон интервала"
@@ -1040,16 +1172,16 @@ msgid "Last commit"
msgstr "Последний коммит"
msgid "Last edited %{date}"
-msgstr ""
+msgstr "Дата последнего изменения: %{date}"
msgid "Last edited by %{name}"
-msgstr ""
+msgstr "Автор последнего изменения: %{name}"
msgid "Last update"
-msgstr ""
+msgstr "Последнее обновление"
msgid "Last updated"
-msgstr ""
+msgstr "Последний раз обновлено"
msgid "LastPushEvent|You pushed to"
msgstr "Вы отправили в"
@@ -1063,6 +1195,9 @@ msgstr "Узнайте больше в"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "Подробнее в|документации по расписаниям сборочных линий"
+msgid "Leave"
+msgstr "Покинуть"
+
msgid "Leave group"
msgstr "Покинуть группу"
@@ -1074,21 +1209,27 @@ msgstr "Лицензия"
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Показывать %d событие максимум"
+msgstr[1] "Показывать %d события максимум"
+msgstr[2] "Показывать %d событий максимум"
msgid "Lock"
-msgstr ""
+msgstr "Блокировка"
msgid "Locked"
-msgstr ""
+msgstr "Заблокировано"
msgid "Locked Files"
msgstr "Заблокированные Файлы"
+msgid "Login"
+msgstr "Войти"
+
+msgid "Maximum git storage failures"
+msgstr "Максимальное количество сбоев хранилища git"
+
msgid "Median"
-msgstr ""
+msgstr "Среднее"
msgid "Members"
msgstr "Участники"
@@ -1117,11 +1258,14 @@ msgstr "Больше информации доступно|тут"
msgid "Multiple issue boards"
msgstr "Сводные доски задач"
+msgid "New Cluster"
+msgstr "Новый Кластер"
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Новое Обсуждение"
-msgstr[1] "Новые Обращения"
-msgstr[2] "Новые Обращения"
+msgstr[1] "Новых Обсуждения"
+msgstr[2] "Новых Обсуждений"
msgid "New Pipeline Schedule"
msgstr "Новое Расписание Сборочной Линии"
@@ -1135,23 +1279,32 @@ msgstr "Новый каталог"
msgid "New file"
msgstr "Новый файл"
+msgid "New group"
+msgstr "Новая группа"
+
msgid "New issue"
msgstr "Новое обсуждение"
msgid "New merge request"
msgstr "Новый запрос на слияние"
+msgid "New project"
+msgstr "Новый проект"
+
msgid "New schedule"
msgstr "Новое расписание"
msgid "New snippet"
-msgstr ""
+msgstr "Новый фрагмент"
+
+msgid "New subgroup"
+msgstr "Новая подгруппа"
msgid "New tag"
msgstr "Новый тег"
msgid "No container images stored for this project. Add one by following the instructions above."
-msgstr ""
+msgstr "Нет образов контейнеров для этого проекта. Добавьте образ, следуя инструкциям выше."
msgid "No repository"
msgstr "Нет репозитория"
@@ -1160,7 +1313,7 @@ msgid "No schedules"
msgstr "Нет расписаний"
msgid "None"
-msgstr ""
+msgstr "Пусто"
msgid "Not available"
msgstr "Недоступно"
@@ -1181,7 +1334,7 @@ msgid "NotificationEvent|Failed pipeline"
msgstr "Неудача в сборочной линии"
msgid "NotificationEvent|Merge merge request"
-msgstr ""
+msgstr "Влит запрос на слияние"
msgid "NotificationEvent|New issue"
msgstr "Новое обсуждение"
@@ -1196,7 +1349,7 @@ msgid "NotificationEvent|Reassign issue"
msgstr "Переназначить обсуждение"
msgid "NotificationEvent|Reassign merge request"
-msgstr "Переназначить запрос на слияние"
+msgstr "Переназначен запрос на слияние"
msgid "NotificationEvent|Reopen issue"
msgstr "Переоткрыть обсуждение"
@@ -1225,17 +1378,23 @@ msgstr "Отслеживать"
msgid "Notifications"
msgstr "Уведомления"
+msgid "Number of access attempts"
+msgstr "Количество попыток доступа"
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Фильтр"
msgid "Only project members can comment."
-msgstr ""
+msgstr "Только участники проекта могут оставлять комментарии."
msgid "OpenedNDaysAgo|Opened"
msgstr "Открыто"
msgid "Opens in a new window"
-msgstr ""
+msgstr "Откроется в новом окне"
msgid "Options"
msgstr "Настройки"
@@ -1247,28 +1406,28 @@ msgid "Owner"
msgstr "Владелец"
msgid "Pagination|Last »"
-msgstr ""
+msgstr "Последняя »"
msgid "Pagination|Next"
-msgstr ""
+msgstr "Следующая"
msgid "Pagination|Prev"
-msgstr ""
+msgstr "Предыдущая"
msgid "Pagination|« First"
-msgstr ""
+msgstr "« Первая"
msgid "Password"
msgstr "Пароль"
msgid "People without permission will never get a notification and won\\'t be able to comment."
-msgstr ""
+msgstr "Люди без разрешений не получат уведомление и не смогут комментировать."
msgid "Pipeline"
msgstr "Сборочная линия"
msgid "Pipeline Health"
-msgstr "Жизненный цикл конвейера"
+msgstr "Работоспособность Сборочной Линии"
msgid "Pipeline Schedule"
msgstr "Расписание Сборочной Линии"
@@ -1366,9 +1525,54 @@ msgstr "со стадиями"
msgid "Preferences"
msgstr "Предпочтения"
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr "Приватный - Доступ к проекту должен предоставляться явно каждому пользователю."
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr "Приватная - Группу и включённые в неё проекты могут видеть только члены группы."
+
msgid "Profile"
msgstr "Профиль"
+msgid "Profiles|Account scheduled for removal."
+msgstr "Учетная запись запланирована к удалению."
+
+msgid "Profiles|Delete Account"
+msgstr "Удалить Учетную запись"
+
+msgid "Profiles|Delete account"
+msgstr "Удалить учетную запись"
+
+msgid "Profiles|Delete your account?"
+msgstr "Удалить свою учетную запись?"
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr "Удаление учетной записи приведет к следующим последствиям:"
+
+msgid "Profiles|Invalid password"
+msgstr "Неверный пароль"
+
+msgid "Profiles|Invalid username"
+msgstr "Неверное имя пользователя"
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr "Введите значение %{confirmationValue} для подтверждения:"
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr "У вас нет прав на удаление этого пользователя."
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr "Перед удалением учётной записи, вам необходимо передать право владения или удалить эти группы."
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr "Ваша учетная запись в настоящее время является владельцем следующих групп:"
+
+msgid "Profiles|your account"
+msgstr "ваша учетная запись"
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr "Проект '%{project_name}' находится в процессе удаления."
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Проект '%{project_name}' добавлен в очередь на удаление."
@@ -1378,9 +1582,6 @@ msgstr "Проект '%{project_name}' успешно создан."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Проект '%{project_name}' успешно обновлен."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Проект '%{project_name}' удален."
-
msgid "Project access must be granted explicitly to each user."
msgstr "Доступ к проекту должен предоставляться явно каждому пользователю."
@@ -1424,22 +1625,28 @@ msgid "ProjectNetworkGraph|Graph"
msgstr "Граф"
msgid "ProjectSettings|Contact an admin to change this setting."
-msgstr ""
+msgstr "Обратитесь к администратору для изменения этой настройки."
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
-msgstr ""
+msgstr "Только подписанные коммиты могут быть помещены в этот репозиторий."
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
-msgstr ""
+msgstr "Эта настройка применяется на уровне сервера и может быть переопределена администратором."
msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
-msgstr ""
+msgstr "Эта настройка применяется на уровне сервера, но была переопределена для этого проекта."
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr "Эта настройка будет применена для всех проектов, если иное поведение не переопределено администратором."
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
+msgid "Projects"
+msgstr "Проекты"
+
msgid "ProjectsDropdown|Frequently visited"
-msgstr ""
+msgstr "Часто посещаемые"
msgid "ProjectsDropdown|Loading projects"
msgstr "Загрузка проектов"
@@ -1451,7 +1658,7 @@ msgid "ProjectsDropdown|Search your projects"
msgstr "Поиск по вашим проектам"
msgid "ProjectsDropdown|Something went wrong on our end."
-msgstr ""
+msgstr "У нас что-то пошло не так."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "К сожалению, по вашему запросу проекты не найдены"
@@ -1459,12 +1666,21 @@ msgstr "К сожалению, по вашему запросу проекты
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr "Эта функциональность требует поддержки localStorage в вашем браузере"
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr "Публичный - Группу и включённые в неё проекты могут видеть все, без какой-либо проверки подлинности."
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr "Публичный - Доступ к проекту возможен без какой-либо проверки подлинности."
+
msgid "Push Rules"
-msgstr ""
+msgstr "Правила Отправки"
msgid "Push events"
msgstr "События отправки"
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "Подробнее"
@@ -1478,7 +1694,7 @@ msgid "RefSwitcher|Tags"
msgstr "Теги"
msgid "Registry"
-msgstr ""
+msgstr "Реестр"
msgid "Related Commits"
msgstr "Связанные коммиты"
@@ -1493,10 +1709,10 @@ msgid "Related Jobs"
msgstr "Связанные задачи"
msgid "Related Merge Requests"
-msgstr "Связанные запросы на слияние"
+msgstr "Связанные Запросы на Слияние"
msgid "Related Merged Requests"
-msgstr "Связанные объединенные запросы"
+msgstr "Связанные Влитые Запросы"
msgid "Remind later"
msgstr "Напомнить позже"
@@ -1520,7 +1736,7 @@ msgid "Reset runners registration token"
msgstr "Сбросить ключ регистрации Gitlab Runners"
msgid "Revert this commit"
-msgstr "Отменить это изменение"
+msgstr "Отменить это коммит"
msgid "Revert this merge request"
msgstr "Отменить этот запрос на слияние"
@@ -1528,8 +1744,11 @@ msgstr "Отменить этот запрос на слияние"
msgid "SSH Keys"
msgstr "SSH Ключи"
+msgid "Save"
+msgstr "Сохранить"
+
msgid "Save changes"
-msgstr ""
+msgstr "Сохранить изменения"
msgid "Save pipeline schedule"
msgstr "Сохранить расписание сборочной лини"
@@ -1538,7 +1757,7 @@ msgid "Schedule a new pipeline"
msgstr "Расписание новой сборочной линии"
msgid "Schedules"
-msgstr ""
+msgstr "Расписания"
msgid "Scheduling Pipelines"
msgstr "Планирование Сборочных Линий"
@@ -1546,6 +1765,15 @@ msgstr "Планирование Сборочных Линий"
msgid "Search branches and tags"
msgstr "Найти ветки и теги"
+msgid "Seconds before reseting failure information"
+msgstr "Секунд до очистки информации о сбоях"
+
+msgid "Seconds to wait after a storage failure"
+msgstr "Секунд задержки после сбоя в хранилище"
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr "Секунд задержки между попытками доступа к хранилищу"
+
msgid "Select Archive Format"
msgstr "Выбрать формат архива"
@@ -1571,16 +1799,16 @@ msgid "Set up auto deploy"
msgstr "Настройка автоматического развертывания"
msgid "SetPasswordToCloneLink|set a password"
-msgstr "установить пароль"
+msgstr "установите пароль"
msgid "Settings"
msgstr "Настройки"
msgid "Show parent pages"
-msgstr ""
+msgstr "Показать родительские страницы"
msgid "Show parent subgroups"
-msgstr ""
+msgstr "Показать родительские подгруппы"
msgid "Showing %d event"
msgid_plural "Showing %d events"
@@ -1592,16 +1820,19 @@ msgid "Snippets"
msgstr "Сниппеты"
msgid "Something went wrong on our end."
-msgstr ""
-
-msgid "Something went wrong while fetching the projects."
-msgstr ""
-
-msgid "Something went wrong while fetching the registry list."
-msgstr ""
+msgstr "У нас что-то пошло не так."
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
-msgstr ""
+msgstr "Что-то пошло не так при попытке изменения заблокированного состояния этого ${this.issuableDisplayName(this.issuableType)}"
+
+msgid "Something went wrong while fetching the projects."
+msgstr "Что-то пошло не так при получении проектов."
+
+msgid "Something went wrong while fetching the registry list."
+msgstr "Что-то пошло не так при получении списка реестров."
+
+msgid "Sort by"
+msgstr "Сортировать по"
msgid "SortOptions|Access level, ascending"
msgstr "Уровень доступа, по возрастанию"
@@ -1679,7 +1910,7 @@ msgid "SortOptions|Oldest sign in"
msgstr "Старейшие из заходивших"
msgid "SortOptions|Oldest updated"
-msgstr ""
+msgstr "Старейших из обновленных"
msgid "SortOptions|Popularity"
msgstr "Популяронсть"
@@ -1712,7 +1943,7 @@ msgid "StarProject|Star"
msgstr "Отметить"
msgid "Starred projects"
-msgstr ""
+msgstr "Отмеченные проекты"
msgid "Start a %{new_merge_request} with these changes"
msgstr "Начать %{new_merge_request} с этих изменений"
@@ -1720,11 +1951,17 @@ msgstr "Начать %{new_merge_request} с этих изменений"
msgid "Start the Runner!"
msgstr "Запустить GitLab Runner!"
+msgid "Subgroups"
+msgstr "Подгруппы"
+
+msgid "Subscribe"
+msgstr "Подписаться"
+
msgid "Switch branch/tag"
msgstr "Переключить ветка/тег"
msgid "System Hooks"
-msgstr ""
+msgstr "Системные Обработчики"
msgid "Tag"
msgid_plural "Tags"
@@ -1742,13 +1979,16 @@ msgid "Team"
msgstr "Команда"
msgid "Thanks! Don't show me this again"
-msgstr ""
+msgstr "Спасибо! Больше не показывайте мне это сообщение"
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
-msgstr ""
+msgstr "Расширенный глобальный поиск в GitLab - это серьезный инструмент который сокращает ваше время. Вместо создания дублирующего кода и траты времени, вы можете искать код внутри других команд, который поможет вам в вашем проекте."
+
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr "Порог срабатывания для СircuitBreaker должен быть меньше, чем порог срабатывания для определения сбоя"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "На этапе написания кода показывает время первого коммита до создания запроса на слияние. Данные автоматически добавятся после того, как вы создать свой первый запрос на слияние."
+msgstr "Этап написания кода показывает время с первого коммита до создания запроса на слияние. Данные автоматически добавятся сюда после того, как вы создать свой первый запрос на слияние."
msgid "The collection of events added to the data gathered for that stage."
msgstr "Коллекция событий добавленных в данные собранные для этого этапа."
@@ -1759,6 +1999,15 @@ msgstr "Связь с ответвлением удалена."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "Стадия обсуждения показывает время, которое потребуется с момента создания обсуждения до назначения обсуждению вехи, или добавления обсуждения на вашу доску задач. Начните создавать обсуждения, чтобы увидеть сведения для этой стадии."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr "Количество попыток, которые GitLab будет предпринимать для доступа к хранилищу."
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr "Количество ошибок, после которого GitLab начнёт временно отключать доступ к шарду хранилища на хосте"
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr "Количество сбоев, после которого Gitlab полностью прекратит доступ к хранилищу. Изменение счётчика \"количество сбоев\" может быть произведено через административный интерфейс: %{link_to_health_page} или при помощи API %{api_documentation_link}."
+
msgid "The phase of the development lifecycle."
msgstr "Фаза жизненного цикла разработки."
@@ -1766,7 +2015,7 @@ msgid "The pipelines schedule runs pipelines in the future, repeatedly, for spec
msgstr "Расписание сборочных линий регулярно запускает сборочные линии для определенных ветвей или тегов. Запланированные сборочные линии наследуют ограничения на доступ к проекту на основе связанного с ними пользователя."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "На этапе планирования показывает время от предыдущего шага до проталкивания первого коммита. Добавляется автоматически, как только проталкиваете свой первый коммит."
+msgstr "Этап планирования показывает время от предыдущего шага до отправки первого коммита. Добавляется автоматически, как только отправите свой первый коммит."
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "Производственный этап показывает общее время между созданием обсуждения и развертыванием кода в продуктивной среде. Данные будут автоматически добавлены после полного завершения идеи."
@@ -1789,6 +2038,12 @@ msgstr "Этап постановки показывает время между
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "Этап тестирования показывает время, которое GitLab CI занимает для запуска каждой сборочной линии для соответствующего запроса на слияние. Данные будут автоматически добавлены после завершения работы вашей первой сборочной линии."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr "Время в секундах, в течение которого GitLab будет хранить информацию о сбоях. Если в течение этого времени не было сбоев, информация о монтировании очищается."
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr "Время в секундах в течении которого GitLab будет пытаться получить доступ к хранилищу. После этого времени будет зафиксирована ошибка превышения времени ожидания."
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "Время, затраченное каждым элементом, собранным на этом этапе."
@@ -1798,11 +2053,14 @@ msgstr "Среднее значение в ряду. Пример: между 3,
msgid "There are problems accessing Git storage: "
msgstr "Проблемы с доступом к Git хранилищу: "
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr "Эта ветка была изменена, пока вы её редактировали. Вы хотите создать новую ветку?"
+
msgid "This is a confidential issue."
msgstr "Это конфиденциальное обсуждение."
msgid "This is the author's first Merge Request to this project."
-msgstr ""
+msgstr "Это первый Запрос на слияние от автора в этот проект."
msgid "This issue is confidential and locked."
msgstr "Это обсуждение конфиденциально и заблокировано."
@@ -1814,7 +2072,7 @@ msgid "This means you can not push code until you create an empty repository or
msgstr "Это означает, что вы не можете отправить код, пока не создадите пустой репозиторий или не импортируете существующий."
msgid "This merge request is locked."
-msgstr ""
+msgstr "Запрос на слияние заблокирован."
msgid "Time before an issue gets scheduled"
msgstr "Время до начала попадания обсуждения в планировщик"
@@ -1946,7 +2204,7 @@ msgid "Timeago|in 1 year"
msgstr "через год"
msgid "Timeago|in a while"
-msgstr ""
+msgstr "через некоторое время"
msgid "Timeago|less than a minute ago"
msgstr "менее чем минуту назад"
@@ -1973,25 +2231,28 @@ msgid "Total test time for all commits/merges"
msgstr "Общее время тестирования фиксаций/слияний"
msgid "Track activity with Contribution Analytics."
-msgstr ""
+msgstr "Отслеживать активность с помощью Аналитики Участников."
msgid "Unlock"
-msgstr ""
+msgstr "Разблокировать"
msgid "Unlocked"
-msgstr ""
+msgstr "Разблокировано"
msgid "Unstar"
msgstr "Снять отметку"
+msgid "Unsubscribe"
+msgstr "Отписаться"
+
msgid "Upgrade your plan to activate Advanced Global Search."
-msgstr ""
+msgstr "Повысьте ваш тарифный план, чтобы активировать Улучшенный Глобальный Поиск."
msgid "Upgrade your plan to activate Contribution Analytics."
-msgstr ""
+msgstr "Повысьте ваш тарифный план, чтобы активировать Аналитики Участников."
msgid "Upgrade your plan to activate Group Webhooks."
-msgstr ""
+msgstr "Повысьте ваш тарифный план, чтобы активировать Групповые Веб-Обработчики."
msgid "Upgrade your plan to activate Issue weight."
msgstr "Обновите ваш тарифный план для появления веса у обсуждений."
@@ -2015,13 +2276,13 @@ msgid "Use your global notification setting"
msgstr "Используются глобальный настройки уведомлений"
msgid "View file @ "
-msgstr ""
+msgstr "Просмотр файла @ "
msgid "View open merge request"
msgstr "Просмотреть открытый запрос на слияние"
msgid "View replaced file @ "
-msgstr ""
+msgstr "Просмотр заменённого файла @ "
msgid "VisibilityLevel|Internal"
msgstr "Ограниченный"
@@ -2045,34 +2306,37 @@ msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed o
msgstr "Веб-обработчики позволяют вам вызывать адрес URL если, например, отправлен новый код или создано новое обсуждение. Вы можете настроить веб-обработчики так, чтобы они реагировали на определённые события, такие как отправки кода, обсуждения или запросы на слияние. Групповые веб-обработчики применяются ко всем проектам в группе и позволяют вам стандартизовать функциональность веб-обработчиков для всей вашей группы."
msgid "Weight"
-msgstr ""
+msgstr "Вес"
+
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr "Когда доступ к хранилищу получить не удалось, GitLab приостановит доступ к хранилищу на время, указанное здесь. Это позволит файловой системе восстановиться. Репозитории на сбойных \"шардах\" будут временно недоступны"
msgid "Wiki"
msgstr "Wiki"
msgid "WikiClone|Clone your wiki"
-msgstr ""
+msgstr "Клонировать wiki"
msgid "WikiClone|Git Access"
-msgstr ""
+msgstr "Доступ через Git"
msgid "WikiClone|Install Gollum"
-msgstr ""
+msgstr "Установка Gollum"
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
-msgstr ""
+msgstr "Рекомендуется установить %{markdown}, чтобы возможности GFM отображались локально:"
msgid "WikiClone|Start Gollum and edit locally"
-msgstr ""
+msgstr "Запустите Gollum и редактируете локально"
msgid "WikiEmptyPageError|You are not allowed to create wiki pages"
-msgstr ""
+msgstr "Вы не можете создавать вики-страницы"
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "Это устаревшая версия этой страницы."
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
-msgstr ""
+msgstr "Вы можете увидеть %{most_recent_link} либо просмотреть %{history_link}."
msgid "WikiHistoricalPage|history"
msgstr "история"
@@ -2114,7 +2378,7 @@ msgid "WikiPageEdit|Update %{page_title}"
msgstr "Обновить %{page_title}"
msgid "WikiPage|Page slug"
-msgstr ""
+msgstr "Семантический Url для страницы"
msgid "WikiPage|Write your content or drag files here..."
msgstr "Напишите ваше содержимое или перетащите сюда файлы..."
@@ -2150,7 +2414,7 @@ msgid "Wiki|Wiki Pages"
msgstr "Вики Страницы"
msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
-msgstr ""
+msgstr "С аналитикой участников вы можете изучать активность в обсуждениях, запросах на слияние и событий отправки кода для вашей организации и её участников."
msgid "Withdraw Access Request"
msgstr "Отменить запрос доступа"
@@ -2167,9 +2431,21 @@ msgstr "Вы собираетесь удалить связь ответвлен
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "Вы собираетесь передать проект %{project_name_with_namespace} другому владельцу. Вы АБСОЛЮТНО уверены?"
+msgid "You are on a read-only GitLab instance."
+msgstr "Вы находитесь на экземпляре \"только для чтения\" кластера GitLab."
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr "Вы находитесь на экземпляре \"только для чтения\" кластера GitLab. Если вы хотите произвести любые изменения, вы должны перейти на \"основной\" экземпляр по ссылке %{link_to_primary_node}."
+
msgid "You can only add files when you are on a branch"
msgstr "Вы можете добавлять только файлы, когда находитесь в ветке"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "Вы не можете записывать на подчиненные экземпляры \"только для чтения\" кластера GitLab Geo. Используйте вместо этого %{link_to_primary_node}."
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr "Вы не можете записывать на этот экземпляр \"только для чтения\" кластера GitLab."
+
msgid "You have reached your project limit"
msgstr "Вы достигли ограничения в вашем проекте"
@@ -2195,13 +2471,16 @@ msgid "You will receive notifications only for comments in which you were @menti
msgstr "Вы будете получать уведомления только для комментариев, в которых вы были @упомянуты"
msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account"
-msgstr "Вы не сможете получать и отправлять код проекта через %{protocol} пока %{set_password_link} в ваш аккаунт"
+msgstr "Вы не сможете получать и отправлять код в данный проект через %{protocol} пока не %{set_password_link} в вашей учетной записи"
msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile"
msgstr "Вы не сможете получать и отправлять код проекта через SSH пока %{add_ssh_key_link} в ваш профиль."
msgid "Your comment will not be visible to the public."
-msgstr ""
+msgstr "Ваш комментарий не будет виден всем."
+
+msgid "Your groups"
+msgstr "Ваши группы"
msgid "Your name"
msgstr "Ваше имя"
@@ -2210,7 +2489,7 @@ msgid "Your projects"
msgstr "Ваши проекты"
msgid "commit"
-msgstr ""
+msgstr "коммит"
msgid "day"
msgid_plural "days"
@@ -2230,9 +2509,15 @@ msgstr[0] "источник"
msgstr[1] "источники"
msgstr[2] "источники"
-msgid "to help your contributors communicate effectively!"
-msgstr ""
+msgid "password"
+msgstr "пароль"
msgid "personal access token"
-msgstr ""
+msgstr "токен для персонального доступа"
+
+msgid "to help your contributors communicate effectively!"
+msgstr "чтобы помочь вашим участникам взаимодействовать эффективнее!"
+
+msgid "username"
+msgstr "имя пользователя"
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index 62f4d4cbf2e..cf51f8ec689 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:37-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-05 08:38-0500\n"
"Last-Translator: gitlab \n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
@@ -24,9 +24,9 @@ msgstr[2] "%d коммітів"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d шар"
+msgstr[1] "%d шари"
+msgstr[2] "%d шарів"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -37,6 +37,12 @@ msgstr[2] "%s доданих коммітів були виключені для
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} комміт %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "на %{number_commits_behind} коммітів позаду %{default_branch}, на %{number_commits_ahead} коммітів попереду"
@@ -58,6 +64,12 @@ msgstr[2] "%{storage_name}: %{failed_attempts} невдалих спроб до
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(перейдіть за посиланням %{link} для отримання інформації стосовно встановлення)."
+msgid "+ %{moreCount} more"
+msgstr "+ ще %{moreCount}"
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "1 конвеєр"
@@ -68,7 +80,7 @@ msgid "1st contribution!"
msgstr "Перший внесок!"
msgid "2FA enabled"
-msgstr ""
+msgstr "Двоетапна аутентифікація увімкнена"
msgid "A collection of graphs regarding Continuous Integration"
msgstr "Це набір графічних елементів для безперервної інтеграції"
@@ -113,11 +125,20 @@ msgid "Add an SSH key to your profile to pull or push via SSH."
msgstr "Додати SSH ключа в свій профіль, щоб мати можливість завантажити чи надіслати зміни через SSH."
msgid "Add new directory"
-msgstr ""
+msgstr "Додати новий каталог"
+
+msgid "AdminHealthPageLink|health page"
+msgstr "сторінка статусу"
+
+msgid "Advanced settings"
+msgstr "Додаткові параметри"
msgid "All"
msgstr "Всі"
+msgid "An error occurred. Please try again."
+msgstr "Сталась помилка. Спробуйте ще раз."
+
msgid "Appearance"
msgstr "Зовнішній вигляд"
@@ -133,6 +154,9 @@ msgstr "Ви впевнені, що хочете видалити цей роз
msgid "Are you sure you want to discard your changes?"
msgstr "Ви впевнені, що бажаєте скасувати ваші зміни?"
+msgid "Are you sure you want to leave this group?"
+msgstr "Ви впевнені що хочете залишити цю групу?"
+
msgid "Are you sure you want to reset registration token?"
msgstr "Ви впевнені, що бажаєте скинути реєстраційний токен?"
@@ -155,29 +179,32 @@ msgid "Author"
msgstr "Автор"
msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Для коректної роботи Auto Review Apps та Auto Deploy необхідно вказати доменне ім’я та %{kubernetes}."
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
-msgstr ""
+msgstr "Для коректної роботи Auto Review Apps та Auto Deploy необхідно вказати доменне ім’я."
msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Для коректної роботи Auto Review Apps та Auto Deploy необхіден %{kubernetes}."
msgid "AutoDevOps|Auto DevOps (Beta)"
-msgstr ""
-
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr "Auto DevOps може бути активований для цього проекту. Він буде автоматично створювати, тестувати і розгортати ваш додаток на основі налаштованої конфігурації CI / CD."
+msgstr "Auto DevOps (бета)"
msgid "AutoDevOps|Auto DevOps documentation"
-msgstr ""
+msgstr "Auto DevOps документація"
msgid "AutoDevOps|Enable in settings"
msgstr "Включити в налаштуваннях"
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr "AutoDevOps буде автоматично збирати, тестувати та розгортати вашу програму на основі визначеної CI/CD конфігурації."
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr "Дізнайтеся більше в %{link_to_documentation}"
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr "Ви можете активувати %{link_to_settings} для цього проекту."
+
msgid "Billing"
msgstr "Білінг"
@@ -185,7 +212,7 @@ msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
msgstr "%{group_name} зараз має план %{plan_link}."
msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
-msgstr ""
+msgstr "Автоматичні пониження та підвищення до деяких планів зараз не доступні."
msgid "BillingPlans|Current plan"
msgstr "Поточний план"
@@ -221,7 +248,7 @@ msgid "BillingPlans|You are currently on the %{plan_link} plan."
msgstr "Зараз ви використовуєте план %{plan_link}."
msgid "BillingPlans|frequently asked questions"
-msgstr ""
+msgstr "Часті питання"
msgid "BillingPlans|monthly"
msgstr "щомісяця"
@@ -241,6 +268,9 @@ msgstr[2] "Гілок"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "Гілка %{branch_name} створена. Для настройки автоматичного розгортання виберіть GitLab CI Yaml-шаблон і закоммітьте зміни. %{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr "Гілка змінилась"
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "Пошук гілок"
@@ -272,28 +302,28 @@ msgid "Branches|Delete protected branch '%{branch_name}'?"
msgstr "Видалити захищену гілку \"%{branch_name}\"?"
msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Видалення гілки '%{branch_name}' неможливо буде скасувати. Ви впевнені?"
msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Видалення злитих гілок неможливо буде скасувати. Ви впевнені?"
msgid "Branches|Filter by branch name"
-msgstr ""
+msgstr "Фільтрувати за назвою гілки"
msgid "Branches|Merged into %{default_branch}"
-msgstr ""
+msgstr "Злито в %{default_branch}"
msgid "Branches|New branch"
-msgstr ""
+msgstr "Нова гілка"
msgid "Branches|No branches to show"
-msgstr ""
+msgstr "Немає гілок для відображення"
msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered."
msgstr "Як тільки ви підтвердите і натиснете %{delete_protected_branch}, дані будуть втрачені, і їх не можливо буде відновити."
msgid "Branches|Only a project master or owner can delete a protected branch"
-msgstr ""
+msgstr "Тільки керівник або власник проекту може видалити захищену гілку"
msgid "Branches|Protected branches can be managed in %{project_settings_link}"
msgstr "Управляти захищеними гілками можливо в %{project_settings_link}"
@@ -302,13 +332,13 @@ msgid "Branches|Sort by"
msgstr "Сортувати за"
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
-msgstr ""
+msgstr "Гілка не може бути оновлена автоматично, тому що вона має розбіжності із upstream."
msgid "Branches|The default branch cannot be deleted"
msgstr "Гілка \"за замовчуванням\" не може бути видалена"
msgid "Branches|This branch hasn’t been merged into %{default_branch}."
-msgstr ""
+msgstr "Ця гілка не була злита в %{default_branch}."
msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
msgstr "Щоб уникнути втрати даних, розгляньте можливість злиття цієї гілки перед її видаленням."
@@ -317,16 +347,16 @@ msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Для підтвердження, введіть %{branch_name_confirmation}:"
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
-msgstr ""
+msgstr "Щоб відхилити локальні зміни і перезаписати гілку версією з upstream, видаліть її тут і виберіть \"Оновити зараз\" вище."
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
-msgstr ""
+msgstr "Ви збираєтеся видалити захищену гілку %{branch_name}."
msgid "Branches|diverged from upstream"
-msgstr ""
+msgstr "розходиться з upstream"
msgid "Branches|merged"
-msgstr ""
+msgstr "злита"
msgid "Branches|project settings"
msgstr "Настройки проекту"
@@ -356,7 +386,7 @@ msgid "CI configuration"
msgstr "Налаштування CI"
msgid "CICD|Jobs"
-msgstr ""
+msgstr "Завдання"
msgid "Cancel"
msgstr "Скасувати"
@@ -365,7 +395,7 @@ msgid "Cancel edit"
msgstr "Відмінити правку"
msgid "Change Weight"
-msgstr ""
+msgstr "Вага зміни"
msgid "ChangeTypeActionLabel|Pick into branch"
msgstr "Вибрати в гілці"
@@ -395,7 +425,7 @@ msgid "Cherry-pick this merge request"
msgstr "Cherry-pick в цьому запиті на злиття"
msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all."
-msgstr ""
+msgstr "Виберіть, які групи ви хочете реплікувати на цю вторинну ноду. Залиште порожнім, щоб реплікувати все."
msgid "CiStatusLabel|canceled"
msgstr "скасовано"
@@ -451,134 +481,146 @@ msgstr "пропущено"
msgid "CiStatus|running"
msgstr "виконується"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr "circuitbreaker api"
+
msgid "Clone repository"
-msgstr ""
+msgstr "Клонувати репозиторій"
msgid "Close"
msgstr "Закрити"
+msgid "Cluster"
+msgstr "Кластер"
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
-msgstr ""
+msgstr "%{link_to_container_project} напевно було створено під цим обліковим записом"
+
+msgid "ClusterIntegration|Cluster details"
+msgstr "Параметри кластера"
msgid "ClusterIntegration|Cluster integration"
-msgstr ""
+msgstr "Інтеграція із кластером"
msgid "ClusterIntegration|Cluster integration is disabled for this project."
-msgstr ""
+msgstr "Інтеграція із кластером вимкнена для цього проекту."
msgid "ClusterIntegration|Cluster integration is enabled for this project."
-msgstr ""
+msgstr "Інтеграція із кластером увімкнена для цього проекту."
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "Для цього проекту увімкнена інтеграція із кластером. Викнення інтеграції не вплине на кластер, але з'єднання GitLab з ним буде тимчасово розірване."
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
-msgstr ""
+msgstr "Створюється кластер в Google Container Engine..."
msgid "ClusterIntegration|Cluster name"
-msgstr ""
+msgstr "Ім'я кластера"
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
-msgstr ""
+msgstr "Кластер був успішно створений в Google Container Engine"
msgid "ClusterIntegration|Copy cluster name"
-msgstr ""
+msgstr "Копіювати назву кластера"
msgid "ClusterIntegration|Create cluster"
-msgstr ""
+msgstr "Створити кластер"
msgid "ClusterIntegration|Create new cluster on Google Container Engine"
-msgstr ""
+msgstr "Створити новий кластер в Google Container Engine"
msgid "ClusterIntegration|Enable cluster integration"
-msgstr ""
+msgstr "Увімкнути інтеграцію із кластерами"
msgid "ClusterIntegration|Google Cloud Platform project ID"
-msgstr ""
+msgstr "Ідентифікатор проекту в Google Cloud Platform"
msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine"
msgid "ClusterIntegration|Google Container Engine project"
-msgstr ""
-
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Проект Google Container Engine"
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
-msgstr ""
+msgstr "Дізнайтеся більше про %{link_to_documentation}"
-msgid "ClusterIntegration|See machine types"
-msgstr ""
+msgid "ClusterIntegration|Machine type"
+msgstr "Тип машини"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
-msgstr ""
+msgstr "Переконайтеся, що ваш обліковий запис %{link_to_requirements} для створення кластерів"
+
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr "Управління інтеграцією із кластером у вашому Gitlab-проекті."
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
-msgstr ""
+msgstr "Для керування своїм кластером перейдіть на %{link_gke}"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
-
-msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
-
-msgid "ClusterIntegration|Remove cluster integration"
-msgstr ""
-
-msgid "ClusterIntegration|Remove integration"
-msgstr ""
-
-msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
-msgstr ""
-
-msgid "ClusterIntegration|Save changes"
-msgstr ""
-
-msgid "ClusterIntegration|See your projects"
-msgstr ""
-
-msgid "ClusterIntegration|See zones"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
+msgstr "Кількість вузлів"
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "Будь-ласка впевніться, що ваш Google-аккаунт задовольняє наступним вимогам:"
-msgid "ClusterIntegration|Toggle Cluster"
-msgstr ""
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr "Namespace проекту (не обов’язковий, унікальний)"
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
+msgstr "Прочитайте нашу документацію %{link_to_help_page} по інтеграції із кластером."
+
+msgid "ClusterIntegration|Remove cluster integration"
+msgstr "Видалити інтеграцію з кластером"
+
+msgid "ClusterIntegration|Remove integration"
+msgstr "Видалити інтеграцію"
+
+msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
+msgstr "При видаленні інтеграції з кластером буде видалена конфігурація кластера, яку ви додали в цей проект. Дана дія не видалить сам проект."
+
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr "Переглянути та редагувати параметри вашого кластера"
+
+msgid "ClusterIntegration|See machine types"
+msgstr "Переглянути типи машин"
+
+msgid "ClusterIntegration|See your projects"
+msgstr "Переглянути ваші проекти"
+
+msgid "ClusterIntegration|See zones"
+msgstr "Переглянути зони"
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr "Щось пішло не так з нашого боку."
+
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
+msgstr "Щось пішло не так під час створення кластера в Google Container Engine"
+
+msgid "ClusterIntegration|Toggle Cluster"
+msgstr "Переключити Кластер"
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "За допомогою підключеного до цього проекту кластера, ви можете використовувати Review Apps, розгортати ваші проекти, запускати конвеєри збірки та багато іншого."
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
-msgstr ""
+msgstr "Ваш обліковий запис повинен мати %{link_to_container_engine}"
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "Зона"
msgid "ClusterIntegration|access to Google Container Engine"
-msgstr ""
+msgstr "доступ до Google Container Engine"
msgid "ClusterIntegration|cluster"
-msgstr ""
+msgstr "кластер"
msgid "ClusterIntegration|help page"
-msgstr ""
+msgstr "сторінка допомоги"
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "задовольняє вимогам"
msgid "ClusterIntegration|properly configured"
-msgstr ""
+msgstr "правильно налаштований"
msgid "Comments"
msgstr "Коментарі"
@@ -589,8 +631,14 @@ msgstr[0] "Комміт"
msgstr[1] "Комміта"
msgstr[2] "Коммітів"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Commit Message"
-msgstr ""
+msgstr "Повідомлення для комміту"
msgid "Commit duration in minutes for last 30 commits"
msgstr "Тривалість останніх 30 коммітів у хвилинах"
@@ -620,49 +668,49 @@ msgid "Compare"
msgstr "Порівняти"
msgid "Container Registry"
-msgstr ""
+msgstr "Реєстр Контейнерів"
msgid "ContainerRegistry|Created"
-msgstr ""
+msgstr "Створений"
msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "Спочатку увійдіть до реєстру контейнерів GitLab, використовуючи логін та пароль. Якщо у вас %{link_2fa}, треба використовувати %{link_token}:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
-msgstr ""
+msgstr "GitLab підтримує до 3 рівнів імен образів. Наступні приклади образів є правильними для вашого проекту:"
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr ""
+msgstr "Як використовувати Реєстр Контейнерів"
msgid "ContainerRegistry|Learn more about"
-msgstr ""
+msgstr "Дізнайтеся більше про"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "В Реєстрі Контейнерів немає тегів для цього образу."
msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "Після входу ви можете створювати та завантажувати образи контейнерів, використовуючи звичайні %{build} та %{push} команди"
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "Видалити репозиторій"
msgid "ContainerRegistry|Remove tag"
-msgstr ""
+msgstr "Видалити тег"
msgid "ContainerRegistry|Size"
-msgstr ""
+msgstr "Розмір"
msgid "ContainerRegistry|Tag"
-msgstr ""
+msgstr "Тег"
msgid "ContainerRegistry|Tag ID"
-msgstr ""
+msgstr "Тег ID"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "Використовуйте різні імена образів"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "За допомогою вбудованого в GitLab реєстру Docker контейнерів кожен проект може мати власне місце для зберігання Docker образів."
msgid "Contribution guide"
msgstr "Керівництво контриб’юторів"
@@ -670,6 +718,12 @@ msgstr "Керівництво контриб’юторів"
msgid "Contributors"
msgstr "Контриб’ютори"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Задати максимальну кількість потоків для фонового завантаження LFS/вкладень для цього вторинного вузла"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Задати максимальну кількість потоків для фонового завантаження репозиторіїв для цього вторинного вузла"
+
msgid "Copy SSH public key to clipboard"
msgstr "Скопіюйте відкритий SSH-ключ в буфер обміну"
@@ -691,9 +745,21 @@ msgstr "Створити каталог"
msgid "Create empty bare repository"
msgstr "Створити порожній репозиторій"
+msgid "Create file"
+msgstr "Створити файл"
+
msgid "Create merge request"
msgstr "Створити запит на злиття"
+msgid "Create new branch"
+msgstr "Створити нову гілку"
+
+msgid "Create new directory"
+msgstr "Створити новий каталог"
+
+msgid "Create new file"
+msgstr "Створити новий файл"
+
msgid "Create new..."
msgstr "Створити..."
@@ -781,6 +847,9 @@ msgstr "Ім'я каталогу"
msgid "Discard changes"
msgstr "Скасувати зміни"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr "Відмінити блок вступу до Аналитики Циклу"
+
msgid "Dismiss Merge Request promotion"
msgstr "Не показувати промоушн запитів на злиття"
@@ -824,22 +893,22 @@ msgid "Emails"
msgstr "Адреси електронної пошти"
msgid "EventFilterBy|Filter by all"
-msgstr "Всі"
+msgstr "Фільтрувати по всім"
msgid "EventFilterBy|Filter by comments"
-msgstr "Коментарю"
+msgstr "Фільтрувати по коментарям"
msgid "EventFilterBy|Filter by issue events"
-msgstr "Проблеми"
+msgstr "Фільтрувати по проблемах"
msgid "EventFilterBy|Filter by merge events"
-msgstr "Запити на злиття"
+msgstr "Фільтрувати по запитам на злиття"
msgid "EventFilterBy|Filter by push events"
-msgstr "По відправленні комміту"
+msgstr "Фільтрувати по push-подіях"
msgid "EventFilterBy|Filter by team"
-msgstr "За командою"
+msgstr "Фільтрувати по команді"
msgid "Every day (at 4:00am)"
msgstr "Кожен день (в 4:00 ранку)"
@@ -853,12 +922,18 @@ msgstr "Щотижня (в неділю о 4:00 ранку)"
msgid "Explore projects"
msgstr "Огляд проектів"
+msgid "Explore public groups"
+msgstr "Переглянути публічні групи"
+
msgid "Failed to change the owner"
msgstr "Не вдалося змінити власника"
msgid "Failed to remove the pipeline schedule"
msgstr "Не вдалося видалити розклад Конвеєра"
+msgid "File name"
+msgstr "Ім'я файлу"
+
msgid "Files"
msgstr "Файли"
@@ -904,9 +979,15 @@ msgstr "GPG ключі"
msgid "Geo Nodes"
msgstr "Гео-Вузли"
+msgid "Geo|File sync capacity"
+msgstr "Пропускна здатність синхронізації файлів"
+
msgid "Geo|Groups to replicate"
msgstr "Групи для реплікації"
+msgid "Geo|Repository sync capacity"
+msgstr "Пропускна здатність синхронізації репозиторіїв"
+
msgid "Geo|Select groups to replicate."
msgstr "Виберіть групи для реплікації."
@@ -923,7 +1004,7 @@ msgid "GoToYourFork|Fork"
msgstr "Форк"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "Аутентифікація Google не %{link_to_documentation}. Попросіть свого адміністратора GitLab, якщо ви хочете скористатися цим сервісом."
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Заборонити спільний доступ до проекту в рамках %{group} з іншими групами"
@@ -932,13 +1013,13 @@ msgid "GroupSettings|Share with group lock"
msgstr "Блокування спільного доступу з іншими групами"
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "Цей параметр застосовано до %{ancestor_group} і його було перевизначено в цій підгрупі."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Цей параметр застосовано до %{ancestor_group}. Щоб поділитися проектами з цієї групи з іншою групою, попросіть власника перевизначити параметр або %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Цей параметр застосовано до %{ancestor_group}. Ви можете перевизначити налаштування або %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Цей параметр буде застосовано до всіх підгруп, якщо тільки не буде перевизначено власником групи. Групи, які вже мають доступ до проекту, будуть мати доступ, якщо вони не будуть вилучені вручну."
@@ -949,6 +1030,51 @@ msgstr "не може бути скасовано поки \"Блокуванн
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "Видалити блокування спільного доступу з іншими групами з %{ancestor_group_name}"
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "Група — набір із декількох проектів."
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "Розміщення проектів у групі схоже на розміщення в папці."
+
+msgid "GroupsEmptyState|No groups found"
+msgstr "Групи не знайдені"
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr "Ви можете керувати правами доступу членів групи мати доступ до кожного проекту в ній."
+
+msgid "GroupsTreeRole|as"
+msgstr "як"
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr "Ви впевнені, що хочете залишити групу \"${this.group.fullName}\"?"
+
+msgid "GroupsTree|Create a project in this group."
+msgstr "Створити проект у групі."
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr "Створити підгрупи у цій групі."
+
+msgid "GroupsTree|Edit group"
+msgstr "Редагувати групу"
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr "Не вдалося залишити групу. Будь-ласка впевніться, що ви не єдитий власник."
+
+msgid "GroupsTree|Filter by name..."
+msgstr "Фільтрувати за іменем…"
+
+msgid "GroupsTree|Leave this group"
+msgstr "Залишити цю группу"
+
+msgid "GroupsTree|Loading groups"
+msgstr "Завантаження груп"
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr "На жаль жодна группа не задовольняє параметрам вашого запиту"
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "На жаль жодна группа чи проект не задовольняє параметрам вашого запиту"
+
msgid "Health Check"
msgstr "Перевірки працездатності"
@@ -994,6 +1120,12 @@ msgstr[0] "Інстанс"
msgstr[1] "Інстанса"
msgstr[2] "Інстансів"
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr "Внутрішня — будь-який автентифікований користувач має доступ до цієї групи та усіх її внутрішніх проектів."
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr "Внутрішній — будь-який автентифікований користувач має доступ до цього проекту."
+
msgid "Interval Pattern"
msgstr "Шаблон інтервалу"
@@ -1007,7 +1139,7 @@ msgid "Issue boards with milestones"
msgstr "Дошка обговорень із етапами"
msgid "Issue events"
-msgstr "Події проблем"
+msgstr "Проблеми"
msgid "IssueBoards|Board"
msgstr "Дошка"
@@ -1049,7 +1181,7 @@ msgid "Last update"
msgstr "Останнє оновлення"
msgid "Last updated"
-msgstr ""
+msgstr "Востаннє оновленно"
msgid "LastPushEvent|You pushed to"
msgstr "Ви надіслали зміни до"
@@ -1063,6 +1195,9 @@ msgstr "Дізнайтесь більше"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "Детальніше в документації по розкладами конвеєрів"
+msgid "Leave"
+msgstr "Вийти"
+
msgid "Leave group"
msgstr "Залишити групу"
@@ -1087,6 +1222,12 @@ msgstr "Заблоковано"
msgid "Locked Files"
msgstr "Заблоковані файли"
+msgid "Login"
+msgstr "Вхід"
+
+msgid "Maximum git storage failures"
+msgstr "Максимальна кількість невдач в сховищі даних git"
+
msgid "Median"
msgstr "Медіана"
@@ -1094,10 +1235,10 @@ msgid "Members"
msgstr "Користувачі"
msgid "Merge Requests"
-msgstr "Запит на злиття"
+msgstr "Запити на злиття"
msgid "Merge events"
-msgstr "Події запит на злиття"
+msgstr "Запити на злиття"
msgid "Merge request"
msgstr "Запит на злиття"
@@ -1117,6 +1258,9 @@ msgstr "тут"
msgid "Multiple issue boards"
msgstr "Зведені дошки обговорення"
+msgid "New Cluster"
+msgstr "Новий кластер"
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Нова проблема"
@@ -1135,23 +1279,32 @@ msgstr "Новий каталог"
msgid "New file"
msgstr "Новий файл"
+msgid "New group"
+msgstr "Нова група"
+
msgid "New issue"
msgstr "Нова проблема"
msgid "New merge request"
msgstr "Новий запит на злиття"
+msgid "New project"
+msgstr "Новий проект"
+
msgid "New schedule"
msgstr "Новий Розклад"
msgid "New snippet"
msgstr "Новий сніппет"
+msgid "New subgroup"
+msgstr "Нова підгрупа"
+
msgid "New tag"
msgstr "Новий тег"
msgid "No container images stored for this project. Add one by following the instructions above."
-msgstr ""
+msgstr "В цьому проекті немає жодного образа контейнера. Додайте його за інструкціями вище."
msgid "No repository"
msgstr "Немає репозеторія"
@@ -1225,6 +1378,12 @@ msgstr "Відстежувати"
msgid "Notifications"
msgstr "Сповіщення"
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "Фільтр"
@@ -1277,7 +1436,7 @@ msgid "Pipeline Schedules"
msgstr "Розклади Конвеєрів"
msgid "Pipeline quota"
-msgstr ""
+msgstr "Квота на конвеєри"
msgid "PipelineCharts|Failed:"
msgstr "Не вдалося:"
@@ -1366,9 +1525,54 @@ msgstr "зі стадіями"
msgid "Preferences"
msgstr "Налаштування"
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr "Приватний — доступ до проекту повинен надаватися кожному користувачеві."
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr "Приватна — цю групу та її проекти можуть бачити тільки її користувачі."
+
msgid "Profile"
msgstr "Профіль"
+msgid "Profiles|Account scheduled for removal."
+msgstr "Обліковий запис запланований для видалення."
+
+msgid "Profiles|Delete Account"
+msgstr "Видалити обліковий запис"
+
+msgid "Profiles|Delete account"
+msgstr "Видалити обліковий запис"
+
+msgid "Profiles|Delete your account?"
+msgstr "Видалити ваш обліковий запис?"
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr "Видалення облікового запису несе наступні наслідки:"
+
+msgid "Profiles|Invalid password"
+msgstr "Неправильний пароль"
+
+msgid "Profiles|Invalid username"
+msgstr "Неправильне ім'я користувача"
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr "Введіть ваш %{confirmationValue} для підтвердження:"
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr "У вас немає доступу для видалення цього користувача."
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr "Вам необхідно змінити власника або видалити ці групи перед тим як видалити ваш обліковий запис."
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr "Ваш обліковий запис є власником в цих групах:"
+
+msgid "Profiles|your account"
+msgstr "ваш обліковий запис"
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr "Проект '%{project_name}' перебуває в процесі видалення."
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "Проект '%{project_name}' доданий в чергу на видалення."
@@ -1378,9 +1582,6 @@ msgstr "Проект '%{project_name}' успішно створений."
msgid "Project '%{project_name}' was successfully updated."
msgstr "Проект '%{project_name}' успішно оновлено."
-msgid "Project '%{project_name}' will be deleted."
-msgstr "Проект '%{project_name}' видалений."
-
msgid "Project access must be granted explicitly to each user."
msgstr "Доступ до проекту повинен надаватися кожному користувачеві."
@@ -1424,7 +1625,7 @@ msgid "ProjectNetworkGraph|Graph"
msgstr "Історія"
msgid "ProjectSettings|Contact an admin to change this setting."
-msgstr ""
+msgstr "Зверніться до адміністратора, щоб змінити це налаштування."
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Тільки підписані комміти можуть бути надіслані в цей репозиторій."
@@ -1436,10 +1637,16 @@ msgid "ProjectSettings|This setting is applied on the server level but has been
msgstr "Цей параметр застосовується на рівні сервера, але його було перевизначено для цього проекту."
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr "Цей параметр буде застосовано до всіх проектів, якщо адміністратор не змінить його."
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
+msgid "Projects"
+msgstr "Проекти"
+
msgid "ProjectsDropdown|Frequently visited"
-msgstr ""
+msgstr "Часто відвідувані"
msgid "ProjectsDropdown|Loading projects"
msgstr "Завантаження проектів"
@@ -1459,11 +1666,20 @@ msgstr "На жаль, по вашоу запиту проектів не зна
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr "Ця функція потребує підтримки localStorage вашим браузером"
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr "Публічна — група та всі публічні проекти можуть переглядатися без автентифікації."
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr "Публічний — проект может переглядатися без автентифікації."
+
msgid "Push Rules"
msgstr "Push-правила"
msgid "Push events"
-msgstr "Push події"
+msgstr "Push-події"
+
+msgid "PushRule|Committer restriction"
+msgstr ""
msgid "Read more"
msgstr "Докладніше"
@@ -1528,6 +1744,9 @@ msgstr "Скасувати цей запит на злиття"
msgid "SSH Keys"
msgstr "Ключі SSH"
+msgid "Save"
+msgstr "Зберегти"
+
msgid "Save changes"
msgstr "Зберегти зміни"
@@ -1546,6 +1765,15 @@ msgstr "Планування конвеєрів"
msgid "Search branches and tags"
msgstr "Пошук гілок та тегів"
+msgid "Seconds before reseting failure information"
+msgstr "Кількість секунд до скидання інформації про збої"
+
+msgid "Seconds to wait after a storage failure"
+msgstr "Скільки секунд очікувати після збою в сховищі даних"
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr "Кількість секунд очікування перед повторною спробою доступу до сховища даних"
+
msgid "Select Archive Format"
msgstr "Виберіть формат архіву"
@@ -1592,17 +1820,20 @@ msgid "Snippets"
msgstr "Фрагменти"
msgid "Something went wrong on our end."
-msgstr ""
-
-msgid "Something went wrong while fetching the projects."
-msgstr ""
-
-msgid "Something went wrong while fetching the registry list."
-msgstr ""
+msgstr "Щось пішло не так з нашого боку"
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
msgstr "Щось пішло не так, намагаючись змінити статус блокування цього ${this.issuableDisplayName(this.issuableType)}"
+msgid "Something went wrong while fetching the projects."
+msgstr "Щось пішло не так під час отримання проектів"
+
+msgid "Something went wrong while fetching the registry list."
+msgstr "Щось пішло не так при отриманні списку із реєстру."
+
+msgid "Sort by"
+msgstr "Сортувати за"
+
msgid "SortOptions|Access level, ascending"
msgstr "Рівень доступу, в порядку зростання"
@@ -1720,6 +1951,12 @@ msgstr "Почати %{new_merge_request} з цих змін"
msgid "Start the Runner!"
msgstr "Запустіть Runner!"
+msgid "Subgroups"
+msgstr "Підгрупи"
+
+msgid "Subscribe"
+msgstr "Підписатися"
+
msgid "Switch branch/tag"
msgstr "тег"
@@ -1747,6 +1984,9 @@ msgstr "Дякую! Більше не показувати це повідомл
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr "Розширений глобальний пошук в GitLab - це потужний інструмент який заощаджує ваш час. Замість дублювання коду і витрати часу, ви можете шукати код всередині інших команд, який може допомогти у вашому проекті."
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "На стадії написання коду, показує час першого комміту до створення запиту на об'єднання. Дані будуть автоматично додані після створення вашого першого запиту на об'єднання."
@@ -1759,6 +1999,15 @@ msgstr "Зв'язок форка видалена."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "Етап випуску показує, скільки часу потрібно від створення проблеми до присвоєння випуску, або додавання проблеми в вашу дошку проблем. Почніть створювати проблеми, щоб переглядати дані для цього етапу."
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr "Кількість збоїв після якої Gitlab повністю заблокує доступ до сховища данних. Лічильник кількості збоїв може бути скинутий в інтерфейсі адміністратора (%{link_to_health_page}), або через %{api_documentation_link}."
+
msgid "The phase of the development lifecycle."
msgstr "Фаза життєвого циклу розробки."
@@ -1789,6 +2038,12 @@ msgstr "Стадія ДЕВ показує час між злиттям \"MR\"
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "Стадія тестування показує час, який GitLab CI виконує для запуску кожного конвеєра для відповідного запиту злиття. Дані будуть автоматично додані після завершення першого конвеєра."
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr "Кількість секунд, протягом якої GitLab зберігає інформацію про збої. Якщо протягом цього періоду жодних збоїв не відбувається, інформація про точку монтування скидається."
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr "Кількість секунд, протягом якої GitLab намагатиметься отримати доступ до сховища даних. По завершенню цього періоду буде згенерована помилка про перевищення ліміту часу."
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "Час, витрачений на кожен елемент, зібраний на цьому етапі."
@@ -1798,6 +2053,9 @@ msgstr "Середнє значення в рядку. Приклад: між 3,
msgid "There are problems accessing Git storage: "
msgstr "Є проблеми з доступом до сховища: "
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr "Ця гілка була змінена після того моменту, коли ви почали її редагувати. Ви хотіли б створити нову?"
+
msgid "This is a confidential issue."
msgstr "Це конфіденційна проблема."
@@ -1984,6 +2242,9 @@ msgstr "Розблоковано"
msgid "Unstar"
msgstr "Відписатись"
+msgid "Unsubscribe"
+msgstr "Відписатися"
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr "Перейдіть на вищий тарифний план щоб активувати Покращений Глобальний Пошук."
@@ -1991,13 +2252,13 @@ msgid "Upgrade your plan to activate Contribution Analytics."
msgstr "Перейдіть на вищий тарифний план для активації Аналітики контриб’юторів."
msgid "Upgrade your plan to activate Group Webhooks."
-msgstr ""
+msgstr "Перейдіть на вищий тарифний план щоб активувати Групові Webhook’и."
msgid "Upgrade your plan to activate Issue weight."
-msgstr ""
+msgstr "Підвищіть план щоб активувати вагу обговорень."
msgid "Upgrade your plan to improve Issue boards."
-msgstr ""
+msgstr "Підвищіть свій план, щоб покращити дошки обговорень."
msgid "Upload New File"
msgstr "Завантажити новий файл"
@@ -2047,6 +2308,9 @@ msgstr "Webhook дозволяють вам викликати адресу URL
msgid "Weight"
msgstr "Вага"
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr "Коли відбувається збій при доступі до сховища даних, GitLab блокує досуп до нього протягом періоду часу, заданому тут. Це дає можливість файловій системі відновитися. Репозиторії на шардах (shards) зі збоями тимчасово не доступні"
+
msgid "Wiki"
msgstr "Wiki"
@@ -2054,103 +2318,103 @@ msgid "WikiClone|Clone your wiki"
msgstr "Клонувати ваш wiki"
msgid "WikiClone|Git Access"
-msgstr ""
+msgstr "Git доступ"
msgid "WikiClone|Install Gollum"
-msgstr ""
+msgstr "Встановити Gollum"
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
-msgstr ""
+msgstr "Рекомендується встановити %{markdown}, з тим щоб GFM функції візуалізувалися локально:"
msgid "WikiClone|Start Gollum and edit locally"
-msgstr ""
+msgstr "Запустіть Gollum і редагуйте локально"
msgid "WikiEmptyPageError|You are not allowed to create wiki pages"
-msgstr ""
+msgstr "Ви не можете створювати вікі-сторінки"
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "Це — стара версія сторінки."
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
-msgstr ""
+msgstr "Ви можете переглянути %{most_recent_link} або перейти на %{history_link}."
msgid "WikiHistoricalPage|history"
-msgstr ""
+msgstr "історія"
msgid "WikiHistoricalPage|most recent version"
-msgstr ""
+msgstr "остання версія"
msgid "WikiMarkdownDocs|More examples are in the %{docs_link}"
-msgstr ""
+msgstr "Більше прикладів знаходиться в %{docs_link}"
msgid "WikiMarkdownDocs|documentation"
-msgstr ""
+msgstr "документація"
msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
-msgstr ""
+msgstr "Для створення посилання на (нову) сторінку, просто введіть %{link_example}"
msgid "WikiNewPagePlaceholder|how-to-setup"
-msgstr ""
+msgstr "Інструкція"
msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
-msgstr ""
+msgstr "Порада: можна вказати повний шлях до нового файлу. Ми автоматично створимо всі відсутні каталоги."
msgid "WikiNewPageTitle|New Wiki Page"
-msgstr ""
+msgstr "Нова Вікі-сторінка"
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
-msgstr ""
+msgstr "Ви дійсно бажаєте видалити цю сторінку?"
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "Хтось редагував сторінку в той же час, що і ви. Будь ласка, ознайомтеся з %{page_link} і переконайтеся, ваші зміни не затруть зміни інших."
msgid "WikiPageConflictMessage|the page"
-msgstr ""
+msgstr "сторінка"
msgid "WikiPageCreate|Create %{page_title}"
-msgstr ""
+msgstr "Створити %{page_title}"
msgid "WikiPageEdit|Update %{page_title}"
-msgstr ""
+msgstr "Оновити %{page_title}"
msgid "WikiPage|Page slug"
-msgstr ""
+msgstr "Шлях сторінки"
msgid "WikiPage|Write your content or drag files here..."
-msgstr ""
+msgstr "Напишіть текст або перетягніть файли сюди..."
msgid "Wiki|Create Page"
-msgstr ""
+msgstr "Створити сторінку"
msgid "Wiki|Create page"
-msgstr ""
+msgstr "Створити сторінку"
msgid "Wiki|Edit Page"
msgstr "Редагувати сторінку"
msgid "Wiki|Empty page"
-msgstr ""
+msgstr "Порожня сторінка"
msgid "Wiki|More Pages"
-msgstr ""
+msgstr "Більше сторінок"
msgid "Wiki|New page"
-msgstr ""
+msgstr "Нова сторінка"
msgid "Wiki|Page history"
-msgstr ""
+msgstr "Історія сторінки"
msgid "Wiki|Page version"
-msgstr ""
+msgstr "Версія сторінки"
msgid "Wiki|Pages"
-msgstr ""
+msgstr "Сторінки"
msgid "Wiki|Wiki Pages"
-msgstr ""
+msgstr "Вікі-сторінки"
msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
-msgstr ""
+msgstr "З аналітикою контриб’юторів ви може вивчати активність в обговореннях, запитах на злиття і подій відправки коду для вашої організації і її учасників."
msgid "Withdraw Access Request"
msgstr "Скасувати запит доступу"
@@ -2167,9 +2431,21 @@ msgstr "Ви збираєтеся видалити зв'язок з форка
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "Ви збираєтеся передати проект %{project_name_with_namespace} іншому власнику. Ви АБСОЛЮТНО впевнені?"
+msgid "You are on a read-only GitLab instance."
+msgstr "Ви знаходитеся на інстансі Gitlab \"тільки для читання\"."
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr "Ви знаходитеся на інстансі Gitlab \"тільки для читання\". Якщо ви хочете внести зміни, вам необхідно перейти на %{link_to_primary_node}."
+
msgid "You can only add files when you are on a branch"
msgstr "Ви можете додавати тільки файли, коли перебуваєте в гілці"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "Ви не можете записувати на вторинні інстанси \"тільки для читання\" GitLab Geo. Будь ласка використовуйте %{link_to_primary_node}."
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr "Ви не можете записувати на цей \"тільки для читання\" інстанс GitLab."
+
msgid "You have reached your project limit"
msgstr "Ви досягли обмеження в вашому проекті"
@@ -2201,13 +2477,16 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss
msgstr "Ви не зможете отримувати і відправляти код проекту через SSH поки %{add_ssh_key_link} в ваш профіль."
msgid "Your comment will not be visible to the public."
-msgstr ""
+msgstr "Ваш коментар не буде видимим для всіх."
+
+msgid "Your groups"
+msgstr "Ваші групи"
msgid "Your name"
msgstr "Ваше ім'я"
msgid "Your projects"
-msgstr ""
+msgstr "Ваші проекти"
msgid "commit"
msgstr "комміт"
@@ -2230,9 +2509,15 @@ msgstr[0] "джерело"
msgstr[1] "джерела"
msgstr[2] "джерел"
-msgid "to help your contributors communicate effectively!"
-msgstr ""
+msgid "password"
+msgstr "пароль"
msgid "personal access token"
-msgstr ""
+msgstr "особистий токен доступу"
+
+msgid "to help your contributors communicate effectively!"
+msgstr "щоб допомогти вашим контриб’юторам ефективно спілкуватися!"
+
+msgid "username"
+msgstr "ім'я користувача"
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index caccb246e0b..0d6f0d201c2 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:35-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-06 01:25-0500\n"
"Last-Translator: gitlab \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -22,7 +22,7 @@ msgstr[0] "%d 次提交"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
+msgstr[0] "%d 层"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -31,6 +31,10 @@ msgstr[0] "为提高页面加载速度及性能,已省略了 %s 次提交。"
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "由 %{commit_author_link} 提交于 %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] "%{count} 位参与者"
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} 个落后 %{default_branch} 分支的提交, %{number_commits_ahead} 早超前的提交"
@@ -50,6 +54,12 @@ msgstr[0] "%{storage_name}:已 %{failed_attempts} 次尝试访问存储失败
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(如需了解更多的安装信息,请查看 %{link})"
+msgid "+ %{moreCount} more"
+msgstr "+ 还有 %{moreCount} 条"
+
+msgid "- show less"
+msgstr "- 显示较少"
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "%d 条流水线"
@@ -58,7 +68,7 @@ msgid "1st contribution!"
msgstr "最高贡献"
msgid "2FA enabled"
-msgstr ""
+msgstr "启用两步验证"
msgid "A collection of graphs regarding Continuous Integration"
msgstr "持续集成数据图"
@@ -105,9 +115,18 @@ msgstr "新建一个用于推送或拉取的 SSH 秘钥到账号中。"
msgid "Add new directory"
msgstr "添加目录"
+msgid "AdminHealthPageLink|health page"
+msgstr "健康页面"
+
+msgid "Advanced settings"
+msgstr "高级设置"
+
msgid "All"
msgstr "全部"
+msgid "An error occurred. Please try again."
+msgstr "发生了错误,请再试一次。"
+
msgid "Appearance"
msgstr "外观"
@@ -123,6 +142,9 @@ msgstr "确定要删除此流水线计划吗?"
msgid "Are you sure you want to discard your changes?"
msgstr "确定要放弃修改吗?"
+msgid "Are you sure you want to leave this group?"
+msgstr "确定要离开这个群组吗?"
+
msgid "Are you sure you want to reset registration token?"
msgstr "确定要重置注册令牌吗?"
@@ -156,18 +178,21 @@ msgstr "自动审查程序和自动部署程序需要 %{kubernetes} 才能正常
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr "DevOps 自动化(测试版)"
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr "可以为此项目启用 DevOps 自动化。它将根据预定义的 CI/CD配置自动构建、测试和部署应用程序。"
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr "DevOps 自动化文档"
msgid "AutoDevOps|Enable in settings"
msgstr "在设置中启用"
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr "将根据预定义的 CI/CD 配置自动构建、测试和部署应用程序。"
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr "想了解更多请访问 %{link_to_documentation}"
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr "您可以为此项目激活 %{link_to_settings}。"
+
msgid "Billing"
msgstr "账单"
@@ -229,6 +254,9 @@ msgstr[0] "分支"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "已创建分支 %{branch_name} 。如需设置自动部署, 请选择合适的 GitLab CI Yaml 模板并提交更改。%{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr "分支已有新变更"
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "搜索分支"
@@ -439,134 +467,146 @@ msgstr "已跳过"
msgid "CiStatus|running"
msgstr "运行中"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr "断路器 API"
+
msgid "Clone repository"
msgstr "克隆存储库"
msgid "Close"
msgstr "关闭"
+msgid "Cluster"
+msgstr "集群"
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
-msgstr ""
+msgstr "必须在此帐户下创建 %{link_to_container_project}"
+
+msgid "ClusterIntegration|Cluster details"
+msgstr "集群详情"
msgid "ClusterIntegration|Cluster integration"
-msgstr ""
+msgstr "集群集成"
msgid "ClusterIntegration|Cluster integration is disabled for this project."
-msgstr ""
+msgstr "此项目已禁用集群集成。"
msgid "ClusterIntegration|Cluster integration is enabled for this project."
-msgstr ""
+msgstr "此项目已启用集群集成。"
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "此项目已启用集群集成。禁用此集成不会影响您的集群,它只会暂时关闭 GitLab 的连接。"
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
-msgstr ""
+msgstr "集群正在 Google Container Engine 上创建..."
msgid "ClusterIntegration|Cluster name"
-msgstr ""
+msgstr "集群名称"
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
-msgstr ""
+msgstr "集群已在 Google Container Engine 上成功创建"
msgid "ClusterIntegration|Copy cluster name"
-msgstr ""
+msgstr "复制集群名称"
msgid "ClusterIntegration|Create cluster"
-msgstr ""
+msgstr "创建集群"
msgid "ClusterIntegration|Create new cluster on Google Container Engine"
-msgstr ""
+msgstr "在 Google Container Engine 上创建新集群"
msgid "ClusterIntegration|Enable cluster integration"
-msgstr ""
+msgstr "启用集群集成"
msgid "ClusterIntegration|Google Cloud Platform project ID"
-msgstr ""
+msgstr "Google 云平台项目ID"
msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine"
msgid "ClusterIntegration|Google Container Engine project"
-msgstr ""
-
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
+msgstr "Google Container Engine 项目"
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
-msgstr ""
+msgstr "了解详细%{link_to_documentation}"
-msgid "ClusterIntegration|See machine types"
-msgstr ""
+msgid "ClusterIntegration|Machine type"
+msgstr "机器类型"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
-msgstr ""
+msgstr "确保您的帐户符合创建集群的%{link_to_requirements}"
+
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr "管理您的 GitLab 项目集群集成"
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
-msgstr ""
+msgstr "访问%{link_gke}来管理您的集群"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
-
-msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
-
-msgid "ClusterIntegration|Remove cluster integration"
-msgstr ""
-
-msgid "ClusterIntegration|Remove integration"
-msgstr ""
-
-msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
-msgstr ""
-
-msgid "ClusterIntegration|Save changes"
-msgstr ""
-
-msgid "ClusterIntegration|See your projects"
-msgstr ""
-
-msgid "ClusterIntegration|See zones"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
+msgstr "节点数量"
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "请确保您的 Google 帐户符合以下要求:"
-msgid "ClusterIntegration|Toggle Cluster"
-msgstr ""
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr "项目命名空间(可选,唯一)"
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
+msgstr "请阅读关于集群集成的%{link_to_help_page}。"
+
+msgid "ClusterIntegration|Remove cluster integration"
+msgstr "删除集群集成"
+
+msgid "ClusterIntegration|Remove integration"
+msgstr "删除集成"
+
+msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
+msgstr "删除集群集成将删除您添加到此项目的集群配置。它不会删除您的项目。"
+
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr "查看并编辑集群的详细信息"
+
+msgid "ClusterIntegration|See machine types"
+msgstr "参见机器类型"
+
+msgid "ClusterIntegration|See your projects"
+msgstr "看到您的项目"
+
+msgid "ClusterIntegration|See zones"
+msgstr "查看区域"
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr "发生了内部错误"
+
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
+msgstr "在 Google Container Engine 上创建集群时发生错误"
+
+msgid "ClusterIntegration|Toggle Cluster"
+msgstr "切换集群"
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "使用与此项目关联的集群,您可以使用审阅应用程序,部署应用程序,运行流水线等等。"
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
-msgstr ""
+msgstr "您的帐户必须有%{link_to_container_engine}"
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "区域"
msgid "ClusterIntegration|access to Google Container Engine"
-msgstr ""
+msgstr "访问 Google Container Engine"
msgid "ClusterIntegration|cluster"
-msgstr ""
+msgstr "集群"
msgid "ClusterIntegration|help page"
-msgstr ""
+msgstr "帮助页面"
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "符合要求"
msgid "ClusterIntegration|properly configured"
-msgstr ""
+msgstr "正确配置"
msgid "Comments"
msgstr "评论"
@@ -575,6 +615,10 @@ msgid "Commit"
msgid_plural "Commits"
msgstr[0] "提交"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] "提交 %d 个文件"
+
msgid "Commit Message"
msgstr "提交消息"
@@ -606,49 +650,49 @@ msgid "Compare"
msgstr "比较"
msgid "Container Registry"
-msgstr ""
+msgstr "容器注册"
msgid "ContainerRegistry|Created"
-msgstr ""
+msgstr "已创建"
msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "首先使用您的 GitLab 用户名和密码登录 GitLab 的容器注册表。如果您有%{link_2fa},您需要使用%{link_token}:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
-msgstr ""
+msgstr "GitLab 最多支持3个级别的镜像名称。以下镜像示例对您的项目有效:"
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr ""
+msgstr "如何使用容器注册表"
msgid "ContainerRegistry|Learn more about"
-msgstr ""
+msgstr "关于更多"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "容器注册表中没有此容器镜像的标签。"
msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "登录后您可以使用通用的%{build}和%{push}命令自由创建和上传容器映像"
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "删除存储库"
msgid "ContainerRegistry|Remove tag"
-msgstr ""
+msgstr "删除标签"
msgid "ContainerRegistry|Size"
-msgstr ""
+msgstr "大小"
msgid "ContainerRegistry|Tag"
-msgstr ""
+msgstr "标签"
msgid "ContainerRegistry|Tag ID"
-msgstr ""
+msgstr "标签 ID"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "使用不同的镜像名称"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "将 Docker 容器注册表集成到 GitLab 中,每个项目都可以有自己的空间来存储 Docker 的图像。"
msgid "Contribution guide"
msgstr "贡献指南"
@@ -656,6 +700,12 @@ msgstr "贡献指南"
msgid "Contributors"
msgstr "贡献者"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "控制此次要节点的 LFS/attachment 的最大并发性"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "控制此次要节点的存储库的最大并发"
+
msgid "Copy SSH public key to clipboard"
msgstr "复制 SSH 公钥到剪贴板"
@@ -677,9 +727,21 @@ msgstr "创建目录"
msgid "Create empty bare repository"
msgstr "创建空的存储库"
+msgid "Create file"
+msgstr "创建文件"
+
msgid "Create merge request"
msgstr "创建合并请求"
+msgid "Create new branch"
+msgstr "创建新分支"
+
+msgid "Create new directory"
+msgstr "创建新目录"
+
+msgid "Create new file"
+msgstr "创建新文件"
+
msgid "Create new..."
msgstr "创建..."
@@ -765,6 +827,9 @@ msgstr "目录名称"
msgid "Discard changes"
msgstr "放弃更改"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr "关闭循环分析介绍框"
+
msgid "Dismiss Merge Request promotion"
msgstr "关闭合并请求中的促销广告"
@@ -837,12 +902,18 @@ msgstr "每周执行(周日凌晨 4 点)"
msgid "Explore projects"
msgstr "查看项目"
+msgid "Explore public groups"
+msgstr "搜索公共群组"
+
msgid "Failed to change the owner"
msgstr "无法变更所有者"
msgid "Failed to remove the pipeline schedule"
msgstr "无法删除流水线计划"
+msgid "File name"
+msgstr "文件名"
+
msgid "Files"
msgstr "文件"
@@ -886,9 +957,15 @@ msgstr "GPG 密钥"
msgid "Geo Nodes"
msgstr "Geo 节点"
+msgid "Geo|File sync capacity"
+msgstr "文件同步容量"
+
msgid "Geo|Groups to replicate"
msgstr "要复制的群组"
+msgid "Geo|Repository sync capacity"
+msgstr "存储库同步容量"
+
msgid "Geo|Select groups to replicate."
msgstr "选择要复制的群组。"
@@ -905,7 +982,7 @@ msgid "GoToYourFork|Fork"
msgstr "跳转到派生项目"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "Google 身份验证不是%{link_to_documentation}。如果您想使用此服务,请咨询您的 GitLab 管理员。"
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "禁止与其他群组共享 %{group} 中的项目"
@@ -931,6 +1008,51 @@ msgstr "无法禁用父组的“共享群组锁”,只有父群组的所有者
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "从 %{ancestor_group_name} 中删除共享群组锁"
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "群组是几个项目的集合。"
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "如果您在一个群组下组织项目,它的工作方式就像一个文件夹。"
+
+msgid "GroupsEmptyState|No groups found"
+msgstr "找不到群组"
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr "您可以管理群组成员的权限并访问群组中的每个项目。"
+
+msgid "GroupsTreeRole|as"
+msgstr "的"
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr "您确定要离开群组“${this.group.fullName}”吗?"
+
+msgid "GroupsTree|Create a project in this group."
+msgstr "在此群组中创建一个项目。"
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr "在此群组中创建一个子群组。"
+
+msgid "GroupsTree|Edit group"
+msgstr "编辑群组"
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr "无法离开群组。请确保您不是唯一的所有者。"
+
+msgid "GroupsTree|Filter by name..."
+msgstr "按名称过滤..."
+
+msgid "GroupsTree|Leave this group"
+msgstr "离开这个群组"
+
+msgid "GroupsTree|Loading groups"
+msgstr "加载群组中"
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr "对不起,没有搜索到任何符合的群组"
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "对不起,没有任何群组或项目符合您的搜索"
+
msgid "Health Check"
msgstr "健康检查"
@@ -974,6 +1096,12 @@ msgid "Instance"
msgid_plural "Instances"
msgstr[0] "例子"
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr "内部 - 任何登录的用户都可以查看该群组和任何内部项目。"
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr "内部 - 可以通过任何登录用户访问该项目。"
+
msgid "Interval Pattern"
msgstr "循环周期"
@@ -1041,6 +1169,9 @@ msgstr "了解更多"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "流水线计划文档"
+msgid "Leave"
+msgstr "离开"
+
msgid "Leave group"
msgstr "退出群组"
@@ -1063,6 +1194,12 @@ msgstr "已锁定"
msgid "Locked Files"
msgstr "已锁定文件"
+msgid "Login"
+msgstr "登录"
+
+msgid "Maximum git storage failures"
+msgstr "最大 git 存储失败"
+
msgid "Median"
msgstr "中位数"
@@ -1093,6 +1230,9 @@ msgstr "帮助文档"
msgid "Multiple issue boards"
msgstr "多个议题看板"
+msgid "New Cluster"
+msgstr "新集群"
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "新建议题"
@@ -1109,23 +1249,32 @@ msgstr "新建目录"
msgid "New file"
msgstr "新建文件"
+msgid "New group"
+msgstr "新群组"
+
msgid "New issue"
msgstr "新建议题"
msgid "New merge request"
msgstr "新建合并请求"
+msgid "New project"
+msgstr "新项目"
+
msgid "New schedule"
msgstr "新建计划"
msgid "New snippet"
msgstr "新建代码片段"
+msgid "New subgroup"
+msgstr "新子群组"
+
msgid "New tag"
msgstr "新建标签"
msgid "No container images stored for this project. Add one by following the instructions above."
-msgstr ""
+msgstr "没有为此项目存储容器镜像。请按照上述说明添加一个。"
msgid "No repository"
msgstr "没有存储库"
@@ -1199,6 +1348,12 @@ msgstr "关注"
msgid "Notifications"
msgstr "通知"
+msgid "Number of access attempts"
+msgstr "尝试访问次数"
+
+msgid "Number of failures before backing off"
+msgstr "退出前的失败次数"
+
msgid "OfSearchInADropdown|Filter"
msgstr "筛选"
@@ -1340,9 +1495,54 @@ msgstr "于阶段"
msgid "Preferences"
msgstr "偏好设置"
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr "私人 - 必须向每个用户明确授予项目访问权限。"
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr "私人 - 群组及其项目只能由成员查看。"
+
msgid "Profile"
msgstr "用户信息"
+msgid "Profiles|Account scheduled for removal."
+msgstr "帐户删除计划。"
+
+msgid "Profiles|Delete Account"
+msgstr "删除帐户"
+
+msgid "Profiles|Delete account"
+msgstr "删除帐户"
+
+msgid "Profiles|Delete your account?"
+msgstr "删除您的帐户?"
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr "删除帐户具有以下效果:"
+
+msgid "Profiles|Invalid password"
+msgstr "密码无效"
+
+msgid "Profiles|Invalid username"
+msgstr "用户名无效"
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr "键入您的 %{confirmationValue} 以确认:"
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr "您无权删除此用户。"
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr "您必须转移所有权或删除这些群组,然后才能删除您的帐户。"
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr "您的帐户目前是这些群组的所有者:"
+
+msgid "Profiles|your account"
+msgstr "您的帐户"
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr "项目 “%{project_name}” 正在被删除。"
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "项目 '%{project_name}' 已进入删除队列。"
@@ -1352,9 +1552,6 @@ msgstr "项目 '%{project_name}' 已创建成功。"
msgid "Project '%{project_name}' was successfully updated."
msgstr "项目 '%{project_name}' 已更新完成。"
-msgid "Project '%{project_name}' will be deleted."
-msgstr "项目 '%{project_name}' 将被删除。"
-
msgid "Project access must be granted explicitly to each user."
msgstr "项目访问权限必须明确授权给每个用户。"
@@ -1412,6 +1609,12 @@ msgstr "此设置应用于服务器级别,但已被该项目覆盖。"
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "此设置将应用于所有项目,除非被管理员覆盖。"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr "用户只能通过自己已验证的电子邮件地址将提交到此存储库中。"
+
+msgid "Projects"
+msgstr "项目"
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "经常访问"
@@ -1433,12 +1636,21 @@ msgstr "对不起,没有搜索到符合条件的项目"
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr "此功能需要浏览器支持 localStorage"
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr "公开 - 群组和任何公共项目可以在没有任何身份验证的情况下查看。"
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr "公开 - 无需任何身份验证即可访问该项目。"
+
msgid "Push Rules"
msgstr "推送规则"
msgid "Push events"
msgstr "推送事件"
+msgid "PushRule|Committer restriction"
+msgstr "提交限制"
+
msgid "Read more"
msgstr "了解更多"
@@ -1502,6 +1714,9 @@ msgstr "还原此合并请求"
msgid "SSH Keys"
msgstr "SSH 密钥"
+msgid "Save"
+msgstr "保存"
+
msgid "Save changes"
msgstr "保存修改"
@@ -1520,6 +1735,15 @@ msgstr "流水线计划"
msgid "Search branches and tags"
msgstr "搜索分支和标签"
+msgid "Seconds before reseting failure information"
+msgstr "重置失败信息等待时间(秒)"
+
+msgid "Seconds to wait after a storage failure"
+msgstr "存储失败后等待时间(秒)"
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr "等待存储访问尝试时间(秒)"
+
msgid "Select Archive Format"
msgstr "选择下载格式"
@@ -1564,17 +1788,20 @@ msgid "Snippets"
msgstr "代码片段"
msgid "Something went wrong on our end."
-msgstr ""
-
-msgid "Something went wrong while fetching the projects."
-msgstr ""
-
-msgid "Something went wrong while fetching the registry list."
-msgstr ""
+msgstr "发生了错误。"
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
msgstr "尝试更改 ${this.issuableDisplayName(this.issuableType)} 的锁定状态时发生错误"
+msgid "Something went wrong while fetching the projects."
+msgstr "拉取项目时发生错误。"
+
+msgid "Something went wrong while fetching the registry list."
+msgstr "拉取注册表列表时发生错误。"
+
+msgid "Sort by"
+msgstr "排序"
+
msgid "SortOptions|Access level, ascending"
msgstr "访问级别,升序排列"
@@ -1692,6 +1919,12 @@ msgstr "由此更改 %{new_merge_request}"
msgid "Start the Runner!"
msgstr "启动 Runner!"
+msgid "Subgroups"
+msgstr "子群组"
+
+msgid "Subscribe"
+msgstr "订阅"
+
msgid "Switch branch/tag"
msgstr "切换分支/标签"
@@ -1715,7 +1948,10 @@ msgid "Thanks! Don't show me this again"
msgstr "谢谢 ! 请不要再显示"
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
-msgstr "GitLab 中的高级全局搜索功能是非常强大的搜索服务。您可以搜索其他团队的代码以帮助您完善自己的项目中的代码。从而避免创建重复的代码或浪费时间。"
+msgstr "GitLab 中的高级全局搜索功能是非常强大的搜索服务。您可以搜索其他团队的代码以帮助您完善自己项目中的代码。从而避免创建重复的代码或浪费时间。"
+
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr "断路器关闭阈值应该低于故障计数阈值"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "编码阶段概述了从第一次提交到创建合并请求的时间。创建第一个合并请求后,数据将自动添加到此处。"
@@ -1729,6 +1965,15 @@ msgstr "派生关系已被删除。"
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "议题阶段概述了从创建议题到将议题添加到里程碑或议题看板所花费的时间。创建第一个议题后,数据将自动添加到此处.。"
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr "GitLab 访问存储的次数。"
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr "GitLab 将临时禁用对主存储分片的访问"
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr "GitLab 将完全阻止访问存储的故障次数。可以在管理界面%{link_to_health_page}或使用%{api_documentation_link}重置故障次数。"
+
msgid "The phase of the development lifecycle."
msgstr "项目生命周期中的各个阶段。"
@@ -1759,6 +2004,12 @@ msgstr "预发布阶段概述了从合并请求被合并到部署至生产环境
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "测试阶段概述了 GitLab CI 为相关合并请求运行每个流水线所需的时间。当第一个流水线运行完成后,数据将自动添加到此处。"
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr "GitLab 将保持失败信息的时间(秒)。在此期间不发生故障时,有关安装的信息将重置。"
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr "GitLab 将尝试访问存储的时间(秒)。在此时间之后将引发超时错误。"
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "该阶段每条数据所花的时间"
@@ -1768,6 +2019,9 @@ msgstr "中位数是一个数列中最中间的值。例如在 3、5、9 之间
msgid "There are problems accessing Git storage: "
msgstr "访问 Git 存储时出现问题:"
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr "自您开始编辑后, 此分支已更改。您想创建一个新的分支吗?"
+
msgid "This is a confidential issue."
msgstr "这是一个机密议题。"
@@ -1950,6 +2204,9 @@ msgstr "已解锁"
msgid "Unstar"
msgstr "取消星标"
+msgid "Unsubscribe"
+msgstr "退订"
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr "升级您的方案以启用高级全局搜索。"
@@ -2013,6 +2270,9 @@ msgstr "如果有新的推送或新的议题,Webhook将自动触发您设置UR
msgid "Weight"
msgstr "权重"
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr "访问存储失败时。 GitLab 将在此处指定的时间内阻止对存储的访问。这允许文件系统恢复。故障分片上的存储库暂时无法使用"
+
msgid "Wiki"
msgstr "Wiki"
@@ -2133,9 +2393,21 @@ msgstr "即将删除与源项目 %{forked_from_project} 的派生关系。确定
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "即将 %{project_name_with_namespace} 转移给另一个所有者。确定继续吗?"
+msgid "You are on a read-only GitLab instance."
+msgstr "您在一个只读 GitLab 实例上。"
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr "您在一个只读的 GitLab 实例上。如果您想进行任何更改,您必须访问%{link_to_primary_node}。"
+
msgid "You can only add files when you are on a branch"
msgstr "只能在分支上添加文件"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "您不能写入只读的辅助 GitLab Geo 实例。请改用%{link_to_primary_node}。"
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr "您不能写入这个只读的 GitLab 实例。"
+
msgid "You have reached your project limit"
msgstr "您已达到项目数量限制"
@@ -2169,6 +2441,9 @@ msgstr "在账号中 %{add_ssh_key_link} 之前将无法通过 SSH 拉取或推
msgid "Your comment will not be visible to the public."
msgstr "您的评论将不会公开显示。"
+msgid "Your groups"
+msgstr "您的群组"
+
msgid "Your name"
msgstr "您的名字"
@@ -2192,9 +2467,15 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "父级"
+msgid "password"
+msgstr "密码"
+
+msgid "personal access token"
+msgstr "个人访问令牌"
+
msgid "to help your contributors communicate effectively!"
msgstr "帮助您的贡献者进行有效沟通!"
-msgid "personal access token"
-msgstr ""
+msgid "username"
+msgstr "用户名"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 1ae511b4d6d..afb40e8b75f 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 05:36-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:30-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Chinese Traditional, Hong Kong\n"
"Language: zh_HK\n"
@@ -31,6 +31,10 @@ msgstr[0] "為提高頁面加載速度及性能,已省略了 %s 次提交。"
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "由 %{commit_author_link} 提交於 %{commit_timeago}"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
@@ -50,6 +54,12 @@ msgstr[0] "%{storage_name}:已訪問此主機失敗 %{failed_attempts} 次"
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(想了解更多的安裝訊息請查看 %{link})"
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "%d 條流水線"
@@ -105,9 +115,18 @@ msgstr "新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"
msgid "Add new directory"
msgstr "添加新目錄"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr "全部"
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr ""
@@ -123,6 +142,9 @@ msgstr "確定要刪除此流水線計劃嗎?"
msgid "Are you sure you want to discard your changes?"
msgstr "確定要放棄修改嗎?"
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr "確定要重置註冊令牌嗎?"
@@ -156,18 +178,21 @@ msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr ""
@@ -229,6 +254,9 @@ msgstr[0] "分支"
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "搜索分支"
@@ -439,15 +467,24 @@ msgstr "已跳過"
msgid "CiStatus|running"
msgstr "運行中"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -490,27 +527,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -520,7 +563,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -532,18 +578,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -575,6 +615,10 @@ msgid "Commit"
msgid_plural "Commits"
msgstr[0] "提交"
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+
msgid "Commit Message"
msgstr ""
@@ -656,6 +700,12 @@ msgstr "貢獻指南"
msgid "Contributors"
msgstr "貢獻者"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr ""
@@ -677,9 +727,21 @@ msgstr "創建目錄"
msgid "Create empty bare repository"
msgstr "創建空的存儲庫"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "創建合併請求"
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "創建..."
@@ -765,6 +827,9 @@ msgstr "目錄名稱"
msgid "Discard changes"
msgstr "放棄更改"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr ""
@@ -837,12 +902,18 @@ msgstr "每週執行(周日淩晨 4 點)"
msgid "Explore projects"
msgstr ""
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "無法變更所有者"
msgid "Failed to remove the pipeline schedule"
msgstr "無法刪除流水線計劃"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "文件"
@@ -886,9 +957,15 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr ""
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr ""
@@ -931,6 +1008,51 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr "健康檢查 (Health Check)"
@@ -974,6 +1096,12 @@ msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "循環週期"
@@ -1041,6 +1169,9 @@ msgstr "了解更多"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "流水線計劃文檔"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "退出群組"
@@ -1063,6 +1194,12 @@ msgstr ""
msgid "Locked Files"
msgstr ""
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "中位數"
@@ -1093,6 +1230,9 @@ msgstr "幫助文檔"
msgid "Multiple issue boards"
msgstr ""
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "新建議題"
@@ -1109,18 +1249,27 @@ msgstr "新增目錄"
msgid "New file"
msgstr "新增文件"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "新議題"
msgid "New merge request"
msgstr "新增合併請求"
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "新增计划"
msgid "New snippet"
msgstr "新代碼片段"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "新增標籤"
@@ -1199,6 +1348,12 @@ msgstr "關注"
msgid "Notifications"
msgstr ""
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "篩選"
@@ -1340,9 +1495,54 @@ msgstr "於階段"
msgid "Preferences"
msgstr ""
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr ""
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "項目 '%{project_name}' 已進入刪除隊列。"
@@ -1352,9 +1552,6 @@ msgstr "項目 '%{project_name}' 已創建成功。"
msgid "Project '%{project_name}' was successfully updated."
msgstr "項目 '%{project_name}' 已更新完成。"
-msgid "Project '%{project_name}' will be deleted."
-msgstr "項目 '%{project_name}' 將被刪除。"
-
msgid "Project access must be granted explicitly to each user."
msgstr "項目訪問權限必須明確授權給每個用戶。"
@@ -1412,6 +1609,12 @@ msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -1433,12 +1636,21 @@ msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr "推送事件 (push event) "
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "了解更多"
@@ -1502,6 +1714,9 @@ msgstr "還原此合併請求"
msgid "SSH Keys"
msgstr ""
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -1520,6 +1735,15 @@ msgstr "流水線計劃"
msgid "Search branches and tags"
msgstr "搜索分支和標籤"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "選擇下載格式"
@@ -1566,13 +1790,16 @@ msgstr ""
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
@@ -1692,6 +1919,12 @@ msgstr "由此更改 %{new_merge_request}"
msgid "Start the Runner!"
msgstr "運作 Runner!"
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "切換分支/標籤"
@@ -1717,6 +1950,9 @@ msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"
@@ -1729,6 +1965,15 @@ msgstr "派生關係已被刪除。"
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "議題階段概述了從創建議題到將議題添加到裏程碑或議題看板所花費的時間。創建第壹個議題後,數據將自動添加到此處.。"
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "項目生命週期中的各個階段。"
@@ -1759,6 +2004,12 @@ msgstr "預發布階段概述了合併請求的合併到部署代碼到生產環
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "該階段每條數據所花的時間"
@@ -1768,6 +2019,9 @@ msgstr "中位數是壹個數列中最中間的值。例如在 3、5、9 之間
msgid "There are problems accessing Git storage: "
msgstr "訪問 Git 存儲時出現問題:"
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr ""
@@ -1950,6 +2204,9 @@ msgstr ""
msgid "Unstar"
msgstr "取消星標"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
@@ -2013,6 +2270,9 @@ msgstr ""
msgid "Weight"
msgstr ""
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -2133,9 +2393,21 @@ msgstr "即將刪除與源項目 %{forked_from_project} 的派生關系。確定
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "只能在分支上添加文件"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "您已達到項目數量限制"
@@ -2169,6 +2441,9 @@ msgstr "在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推
msgid "Your comment will not be visible to the public."
msgstr ""
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "您的名字"
@@ -2192,9 +2467,15 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "父級"
-msgid "to help your contributors communicate effectively!"
+msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index d0c852f35ff..efef86671f0 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-06 22:39+0200\n"
-"PO-Revision-Date: 2017-10-17 13:01-0400\n"
+"POT-Creation-Date: 2017-11-02 14:42+0100\n"
+"PO-Revision-Date: 2017-11-03 12:30-0400\n"
"Last-Translator: gitlab \n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
@@ -22,7 +22,7 @@ msgstr[0] "%d 個更動 (commit)"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
+msgstr[0] "%d 個圖層"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -31,6 +31,10 @@ msgstr[0] "因效能考量,不顯示 %s 個更動 (commit)。"
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} 在 %{commit_timeago} 送交"
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} 個落後 %{default_branch} 分支的修訂版提交,%{number_commits_ahead} 個超前的修訂版提交"
@@ -50,6 +54,12 @@ msgstr[0] "%{storage_name}:已存取此主機失敗 %{failed_attempts} 次"
msgid "(checkout the %{link} for information on how to install it)."
msgstr "(如何安裝請參閱 %{link})"
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] "%d 條流水線"
@@ -58,7 +68,7 @@ msgid "1st contribution!"
msgstr "第一次協作"
msgid "2FA enabled"
-msgstr ""
+msgstr "已啟用雙重認證"
msgid "A collection of graphs regarding Continuous Integration"
msgstr "持續整合 (CI) 相關的圖表"
@@ -105,9 +115,18 @@ msgstr "請先新增 SSH 金鑰到您的個人帳號,才能使用 SSH 來上
msgid "Add new directory"
msgstr "新增目錄"
+msgid "AdminHealthPageLink|health page"
+msgstr ""
+
+msgid "Advanced settings"
+msgstr ""
+
msgid "All"
msgstr "全部"
+msgid "An error occurred. Please try again."
+msgstr ""
+
msgid "Appearance"
msgstr "外觀"
@@ -123,6 +142,9 @@ msgstr "確定要刪除此流水線 (pipeline) 排程嗎?"
msgid "Are you sure you want to discard your changes?"
msgstr "確定要放棄修改嗎?"
+msgid "Are you sure you want to leave this group?"
+msgstr ""
+
msgid "Are you sure you want to reset registration token?"
msgstr "確定要重置註冊憑證 (registration token) 嗎?"
@@ -156,18 +178,21 @@ msgstr "自動審查程序 & 自動部屬程序需要 %{kubernetes} 才能正常
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr "DevOps 自動化 (測試版)"
-msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr "為此專案啟用 「DevOps 自動化」。 它將依據預設的 CI/CD 配置自動構建、測試、部屬應用程式。"
-
msgid "AutoDevOps|Auto DevOps documentation"
msgstr "「DevOps 自動化」 文件"
msgid "AutoDevOps|Enable in settings"
msgstr "在設定中啟用"
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr "了解更多於 %{link_to_documentation}"
+msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
+msgstr ""
+
msgid "Billing"
msgstr "方案"
@@ -229,6 +254,9 @@ msgstr[0] "分支 (branch) "
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "已建立分支 (branch) %{branch_name} 。如要設定自動部署, 請選擇合適的 GitLab CI Yaml 模板,然後記得要送交 (commit) 您的編輯內容。%{link_to_autodeploy_doc}\n"
+msgid "Branch has changed"
+msgstr ""
+
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "搜尋分支 (branches)"
@@ -439,15 +467,24 @@ msgstr "已跳過"
msgid "CiStatus|running"
msgstr "執行中"
+msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr ""
+
msgid "Clone repository"
msgstr "克隆倉庫"
msgid "Close"
msgstr "關閉"
+msgid "Cluster"
+msgstr ""
+
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
+msgid "ClusterIntegration|Cluster details"
+msgstr ""
+
msgid "ClusterIntegration|Cluster integration"
msgstr ""
@@ -490,27 +527,33 @@ msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
-msgid "ClusterIntegration|Google Container Engine"
-msgstr ""
-
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
-msgid "ClusterIntegration|See machine types"
+msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
+msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
+msgstr ""
+
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
+msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
+msgstr ""
+
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
@@ -520,7 +563,10 @@ msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
-msgid "ClusterIntegration|Save changes"
+msgid "ClusterIntegration|See and edit the details for your cluster"
+msgstr ""
+
+msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
@@ -532,18 +578,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
-msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
@@ -575,6 +615,10 @@ msgid "Commit"
msgid_plural "Commits"
msgstr[0] "更動記錄 (commit) "
+msgid "Commit %d file"
+msgid_plural "Commit %d files"
+msgstr[0] ""
+
msgid "Commit Message"
msgstr "更動訊息"
@@ -656,6 +700,12 @@ msgstr "協作指南"
msgid "Contributors"
msgstr "協作者"
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
msgid "Copy SSH public key to clipboard"
msgstr "複製 SSH 公鑰到剪貼簿"
@@ -677,9 +727,21 @@ msgstr "建立目錄"
msgid "Create empty bare repository"
msgstr "建立一個新的 bare repository"
+msgid "Create file"
+msgstr ""
+
msgid "Create merge request"
msgstr "發出合併請求 (merge request) "
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
msgid "Create new..."
msgstr "建立..."
@@ -765,6 +827,9 @@ msgstr "目錄名稱"
msgid "Discard changes"
msgstr "放棄修改"
+msgid "Dismiss Cycle Analytics introduction box"
+msgstr ""
+
msgid "Dismiss Merge Request promotion"
msgstr "關閉合併請求中的促銷廣告"
@@ -837,12 +902,18 @@ msgstr "每週執行(週日淩晨 四點)"
msgid "Explore projects"
msgstr "瀏覽項目"
+msgid "Explore public groups"
+msgstr ""
+
msgid "Failed to change the owner"
msgstr "無法變更所有權"
msgid "Failed to remove the pipeline schedule"
msgstr "無法刪除流水線 (pipeline) 排程"
+msgid "File name"
+msgstr ""
+
msgid "Files"
msgstr "檔案"
@@ -886,9 +957,15 @@ msgstr "GPG 金鑰"
msgid "Geo Nodes"
msgstr "Geo 節點"
+msgid "Geo|File sync capacity"
+msgstr ""
+
msgid "Geo|Groups to replicate"
msgstr "要複製的群組"
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
msgid "Geo|Select groups to replicate."
msgstr "選擇欲複製之群組。"
@@ -931,6 +1008,51 @@ msgstr "無法調用父組的 \"共享群組鎖\",僅父群組的所有者才
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "從 %{ancestor_group_name} 中移除共享群組鎖"
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsTreeRole|as"
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Create a project in this group."
+msgstr ""
+
+msgid "GroupsTree|Create a subgroup in this group."
+msgstr ""
+
+msgid "GroupsTree|Edit group"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Filter by name..."
+msgstr ""
+
+msgid "GroupsTree|Leave this group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr ""
+
msgid "Health Check"
msgstr "健康檢查"
@@ -974,6 +1096,12 @@ msgid "Instance"
msgid_plural "Instances"
msgstr[0] "實例"
+msgid "Internal - The group and any internal projects can be viewed by any logged in user."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user."
+msgstr ""
+
msgid "Interval Pattern"
msgstr "循環週期"
@@ -1041,6 +1169,9 @@ msgstr "了解更多"
msgid "Learn more in the|pipeline schedules documentation"
msgstr "流水線 (pipeline) 排程說明文件"
+msgid "Leave"
+msgstr ""
+
msgid "Leave group"
msgstr "退出群組"
@@ -1063,6 +1194,12 @@ msgstr "鎖定"
msgid "Locked Files"
msgstr "被鎖定檔案"
+msgid "Login"
+msgstr ""
+
+msgid "Maximum git storage failures"
+msgstr ""
+
msgid "Median"
msgstr "中位數"
@@ -1093,6 +1230,9 @@ msgstr "健康檢查"
msgid "Multiple issue boards"
msgstr "多個問題看板"
+msgid "New Cluster"
+msgstr ""
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "建立議題 (issue) "
@@ -1109,18 +1249,27 @@ msgstr "新增目錄"
msgid "New file"
msgstr "新增檔案"
+msgid "New group"
+msgstr ""
+
msgid "New issue"
msgstr "新增議題 (issue) "
msgid "New merge request"
msgstr "新增合併請求 (merge request) "
+msgid "New project"
+msgstr ""
+
msgid "New schedule"
msgstr "新增排程"
msgid "New snippet"
msgstr "新文字片段"
+msgid "New subgroup"
+msgstr ""
+
msgid "New tag"
msgstr "新增標籤"
@@ -1199,6 +1348,12 @@ msgstr "關注"
msgid "Notifications"
msgstr "通知"
+msgid "Number of access attempts"
+msgstr ""
+
+msgid "Number of failures before backing off"
+msgstr ""
+
msgid "OfSearchInADropdown|Filter"
msgstr "篩選"
@@ -1340,9 +1495,54 @@ msgstr "於階段"
msgid "Preferences"
msgstr "偏好設定"
+msgid "Private - Project access must be granted explicitly to each user."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
msgid "Profile"
msgstr "個人資料"
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Delete Account"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Delete your account?"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
msgid "Project '%{project_name}' queued for deletion."
msgstr "專案 '%{project_name}' 已加入刪除佇列。"
@@ -1352,9 +1552,6 @@ msgstr "專案 '%{project_name}' 建立完成。"
msgid "Project '%{project_name}' was successfully updated."
msgstr "專案 '%{project_name}' 更新完成。"
-msgid "Project '%{project_name}' will be deleted."
-msgstr "專案 '%{project_name}' 將被刪除。"
-
msgid "Project access must be granted explicitly to each user."
msgstr "專案權限必須一一指派給每個使用者。"
@@ -1412,6 +1609,12 @@ msgstr "此設定已經套用於伺服器級別,但已經在這個專案被覆
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "此設定將套用於所有專案,除非被管理員覆寫。"
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "經常使用"
@@ -1433,12 +1636,21 @@ msgstr "抱歉,沒有符合搜尋條件的專案"
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr "此功能需要瀏覽器支援 localStorage"
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
msgid "Push Rules"
msgstr "推送 [Push] 規則"
msgid "Push events"
msgstr "推送 (push) 事件"
+msgid "PushRule|Committer restriction"
+msgstr ""
+
msgid "Read more"
msgstr "瞭解更多"
@@ -1502,6 +1714,9 @@ msgstr "還原此合併請求 (merge request) "
msgid "SSH Keys"
msgstr "SSH 金鑰"
+msgid "Save"
+msgstr ""
+
msgid "Save changes"
msgstr "儲存變更"
@@ -1520,6 +1735,15 @@ msgstr "流水線 (pipeline) 排程"
msgid "Search branches and tags"
msgstr "搜尋分支 (branch) 和標籤"
+msgid "Seconds before reseting failure information"
+msgstr ""
+
+msgid "Seconds to wait after a storage failure"
+msgstr ""
+
+msgid "Seconds to wait for a storage access attempt"
+msgstr ""
+
msgid "Select Archive Format"
msgstr "選擇下載格式"
@@ -1566,14 +1790,17 @@ msgstr "文字片段"
msgid "Something went wrong on our end."
msgstr ""
+msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
+msgstr "有個地方出錯了,因為他嘗試去變更 ${this.issuableDisplayName(this.issuableType)} 的鎖定狀態。"
+
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
-msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
-msgstr "有個地方出錯了,因為他嘗試去變更 ${this.issuableDisplayName(this.issuableType)} 的鎖定狀態。"
+msgid "Sort by"
+msgstr ""
msgid "SortOptions|Access level, ascending"
msgstr "訪問級別、升冪排列"
@@ -1692,6 +1919,12 @@ msgstr "以這些改動建立一個新的 %{new_merge_request} "
msgid "Start the Runner!"
msgstr "啟動 Runner!"
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
msgid "Switch branch/tag"
msgstr "切換分支 (branch) 或標籤"
@@ -1717,6 +1950,9 @@ msgstr "感謝!請不要再次顯示"
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr "GitLab 的進階全局搜尋功能是非常強大的搜尋服務。您可以搜尋其他團隊的代碼以幫助您完善自己項目中的代碼。從而避免建立重複的代碼浪費時間。"
+msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "程式開發階段顯示從第一次更動記錄 (commit) 到建立合併請求 (merge request) 的時間。建立第一個合併請求後,資料將自動填入。"
@@ -1729,6 +1965,15 @@ msgstr "分支與主幹間的關聯 (fork relationship) 已被刪除。"
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr "議題 (issue) 階段顯示從議題建立到設定里程碑所花的時間,或是議題被分類到議題看板 (issue board) 中所花的時間。建立第一個議題後,資料將自動填入。"
+msgid "The number of attempts GitLab will make to access a storage."
+msgstr ""
+
+msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
+msgstr ""
+
+msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
msgid "The phase of the development lifecycle."
msgstr "專案開發週期的各個階段。"
@@ -1759,6 +2004,12 @@ msgstr "試營運段顯示從合併請求 (merge request) 被合併後至部署
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr "測試階段顯示相關合併請求 (merge request) 的流水線 (pipeline) 所花的時間。當第一個流水線 (pipeline) 執行完畢後,資料將自動填入。"
+msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
+msgstr ""
+
+msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
+msgstr ""
+
msgid "The time taken by each data entry gathered by that stage."
msgstr "該階段中每一個資料項目所花的時間。"
@@ -1768,6 +2019,9 @@ msgstr "中位數是一個數列中最中間的值。例如在 3、5、9 之間
msgid "There are problems accessing Git storage: "
msgstr "存取 Git 儲存空間時出現問題:"
+msgid "This branch has changed since you started editing. Would you like to create a new branch?"
+msgstr ""
+
msgid "This is a confidential issue."
msgstr "這是個隱密問題。"
@@ -1950,6 +2204,9 @@ msgstr "已解鎖"
msgid "Unstar"
msgstr "取消收藏"
+msgid "Unsubscribe"
+msgstr ""
+
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr "升級您的方案以啟用進階全局搜尋。"
@@ -2013,6 +2270,9 @@ msgstr "如果有新的推送或新的议题,Webhook 将自动触发您设置
msgid "Weight"
msgstr "權重"
+msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
@@ -2133,9 +2393,21 @@ msgstr "將要刪除本分支專案與主幹 %{forked_from_project} 的所有關
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr "將要把 %{project_name_with_namespace} 的所有權轉移給另一個人。真的「確定」要這麼做嗎?"
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
+msgstr ""
+
msgid "You can only add files when you are on a branch"
msgstr "只能在分支 (branch) 上建立檔案"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
msgid "You have reached your project limit"
msgstr "您已達到專案數量限制"
@@ -2169,6 +2441,9 @@ msgstr "在個人帳號中 %{add_ssh_key_link} 之前, 將無法使用 SSH 上
msgid "Your comment will not be visible to the public."
msgstr "你的留言將不會被公開。"
+msgid "Your groups"
+msgstr ""
+
msgid "Your name"
msgstr "您的名字"
@@ -2192,9 +2467,15 @@ msgid "parent"
msgid_plural "parents"
msgstr[0] "上層"
-msgid "to help your contributors communicate effectively!"
-msgstr "幫助你的貢獻者進行有效的溝通!"
+msgid "password"
+msgstr ""
msgid "personal access token"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr "幫助你的貢獻者進行有效的溝通!"
+
+msgid "username"
+msgstr ""
+
diff --git a/qa/qa/scenario/test/integration/mattermost.rb b/qa/qa/scenario/test/integration/mattermost.rb
index 9a84e5c8fd8..59d7dcd3d23 100644
--- a/qa/qa/scenario/test/integration/mattermost.rb
+++ b/qa/qa/scenario/test/integration/mattermost.rb
@@ -7,7 +7,7 @@ module QA
# including staging and on-premises installation.
#
class Mattermost < Scenario::Entrypoint
- tags :core, :mattermost
+ tags :mattermost
def perform(address, mattermost, *files)
Runtime::Scenario.mattermost = mattermost
diff --git a/scripts/static-analysis b/scripts/static-analysis
index aeefb2bc96f..51a2fd81a79 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -11,31 +11,40 @@ tasks = [
%w[bundle exec rake brakeman],
%w[bundle exec license_finder],
%w[yarn run eslint],
- %w[bundle exec rubocop --require rubocop-rspec],
+ %w[bundle exec rubocop --parallel],
%w[scripts/lint-conflicts.sh],
%w[bundle exec rake gettext:lint],
%w[scripts/lint-changelog-yaml]
]
failed_tasks = tasks.reduce({}) do |failures, task|
- output, status = Gitlab::Popen.popen(task)
+ start = Time.now
+ puts
+ puts "$ #{task.join(' ')}"
- puts "Running: #{task.join(' ')}"
- puts output
+ output, status = Gitlab::Popen.popen(task)
+ puts "==> Finished in #{Time.now - start} seconds"
+ puts
failures[task.join(' ')] = output unless status.zero?
failures
end
+puts
+puts '==================================================='
+puts
+puts
+
if failed_tasks.empty?
puts 'All static analyses passed successfully.'
else
- puts "\n===================================================\n\n"
- puts "Some static analyses failed:"
+ puts 'Some static analyses failed:'
failed_tasks.each do |failed_task, output|
- puts "\n**** #{failed_task} failed with the following error:\n\n"
+ puts
+ puts "**** #{failed_task} failed with the following error:"
+ puts
puts output
end
diff --git a/spec/controllers/metrics_controller_spec.rb b/spec/controllers/metrics_controller_spec.rb
index 4aed2a25baa..9e8a37171ec 100644
--- a/spec/controllers/metrics_controller_spec.rb
+++ b/spec/controllers/metrics_controller_spec.rb
@@ -67,7 +67,8 @@ describe MetricsController do
it 'returns proper response' do
get :index
- expect(response.status).to eq(404)
+ expect(response.status).to eq(200)
+ expect(response.body).to eq("# Metrics are disabled, see: http://test.host/help/administration/monitoring/prometheus/gitlab_metrics#gitlab-prometheus-metrics\n")
end
end
end
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index f64b493c283..ca2bcb2b5ae 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -200,51 +200,6 @@ describe Projects::ClustersController do
expect(response).to redirect_to(project_cluster_path(project, project.cluster))
end
end
-
- # TODO: Activate in 10.3
- # context 'when adds a cluster manually' do
- # let(:params) do
- # {
- # cluster: {
- # name: 'new-cluster',
- # platform_type: :kubernetes,
- # provider_type: :user,
- # platform_kubernetes_attributes: {
- # namespace: 'custom-namespace',
- # api_url: 'https://111.111.111.111',
- # token: 'token'
- # }
- # }
- # }
- # end
-
- # it 'creates a new cluster' do
- # expect(ClusterProvisionWorker).to receive(:perform_async)
- # expect { go }.to change { Clusters::Cluster.count }
- # expect(response).to redirect_to(project_cluster_path(project, project.cluster))
- # end
- # end
-
- # TODO: We should fix this in 10.2
- # Maybe
- # - validates :provider_gcp, presence: true, if: :gcp?
- # - validates :provider_type, presence: true
- # are required in Clusters::Cluster
- # context 'when not all required parameters are set' do
- # let(:params) do
- # {
- # cluster: {
- # name: 'new-cluster'
- # }
- # }
- # end
-
- # it 'shows an error message' do
- # expect { go }.not_to change { Clusters::Cluster.count }
- # expect(assigns(:cluster).errors).not_to be_empty
- # expect(response).to render_template(:new)
- # end
- # end
end
context 'when access token is expired' do
@@ -397,42 +352,6 @@ describe Projects::ClustersController do
end
end
end
-
- # TODO: Activate in 10.3
- # context 'when update namespace' do
- # let(:namespace) { 'namespace-123' }
-
- # let(:params) do
- # {
- # cluster: {
- # platform_kubernetes_attributes: {
- # namespace: namespace
- # }
- # }
- # }
- # end
-
- # it "updates and redirects back to show page" do
- # go
-
- # cluster.reload
- # expect(response).to redirect_to(project_cluster_path(project, project.cluster))
- # expect(flash[:notice]).to eq('Cluster was successfully updated.')
- # expect(cluster.platform.namespace).to eq(namespace)
- # end
-
- # context 'when namespace is invalid' do
- # let(:namespace) { 'my Namespace 321321321 #' }
-
- # it "rejects changes" do
- # go
-
- # expect(response).to have_gitlab_http_status(:ok)
- # expect(response).to render_template(:show)
- # expect(cluster.platform.namespace).not_to eq(namespace)
- # end
- # end
- # end
end
describe 'security' do
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 8016176110e..4dbbaecdd6d 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -861,7 +861,7 @@ describe Projects::IssuesController do
end
it 'delegates the update of the todos count cache to TodoService' do
- expect_any_instance_of(TodoService).to receive(:destroy_issue).with(issue, owner).once
+ expect_any_instance_of(TodoService).to receive(:destroy_issuable).with(issue, owner).once
delete :destroy, namespace_id: project.namespace, project_id: project, id: issue.iid
end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 14021b8ca50..bfdad85c082 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -456,7 +456,7 @@ describe Projects::MergeRequestsController do
end
it 'delegates the update of the todos count cache to TodoService' do
- expect_any_instance_of(TodoService).to receive(:destroy_merge_request).with(merge_request, owner).once
+ expect_any_instance_of(TodoService).to receive(:destroy_issuable).with(merge_request, owner).once
delete :destroy, namespace_id: project.namespace, project_id: project, id: merge_request.iid
end
diff --git a/spec/factories/clusters/cluster.rb b/spec/factories/clusters/cluster.rb
index 802981d47a0..c4261178f2d 100644
--- a/spec/factories/clusters/cluster.rb
+++ b/spec/factories/clusters/cluster.rb
@@ -14,7 +14,7 @@ FactoryGirl.define do
platform_type :kubernetes
platform_kubernetes do
- create(:platform_kubernetes, :configured)
+ create(:cluster_platform_kubernetes, :configured)
end
end
@@ -23,8 +23,8 @@ FactoryGirl.define do
platform_type :kubernetes
before(:create) do |cluster, evaluator|
- cluster.platform_kubernetes = build(:platform_kubernetes, :configured)
- cluster.provider_gcp = build(:provider_gcp, :created)
+ cluster.platform_kubernetes = build(:cluster_platform_kubernetes, :configured)
+ cluster.provider_gcp = build(:cluster_provider_gcp, :created)
end
end
@@ -32,7 +32,7 @@ FactoryGirl.define do
provider_type :gcp
provider_gcp do
- create(:provider_gcp, :creating)
+ create(:cluster_provider_gcp, :creating)
end
end
end
diff --git a/spec/factories/clusters/platforms/kubernetes.rb b/spec/factories/clusters/platforms/kubernetes.rb
index 5d4e3e5cf5d..8b3e6ff35fa 100644
--- a/spec/factories/clusters/platforms/kubernetes.rb
+++ b/spec/factories/clusters/platforms/kubernetes.rb
@@ -1,5 +1,5 @@
FactoryGirl.define do
- factory :platform_kubernetes, class: Clusters::Platforms::Kubernetes do
+ factory :cluster_platform_kubernetes, class: Clusters::Platforms::Kubernetes do
cluster
namespace nil
api_url 'https://kubernetes.example.com'
diff --git a/spec/factories/clusters/providers/gcp.rb b/spec/factories/clusters/providers/gcp.rb
index 13bf50d7b7f..a815410512a 100644
--- a/spec/factories/clusters/providers/gcp.rb
+++ b/spec/factories/clusters/providers/gcp.rb
@@ -1,5 +1,5 @@
FactoryGirl.define do
- factory :provider_gcp, class: Clusters::Providers::Gcp do
+ factory :cluster_provider_gcp, class: Clusters::Providers::Gcp do
cluster
gcp_project_id 'test-gcp-project'
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index 7c4a22c94c2..cc6cef63b47 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -83,10 +83,10 @@ FactoryGirl.define do
target_project = merge_request.target_project
source_project = merge_request.source_project
- # Fake `write_ref` if we don't have repository
+ # Fake `fetch_ref!` if we don't have repository
# We have too many existing tests replying on this behaviour
unless [target_project, source_project].all?(&:repository_exists?)
- allow(merge_request).to receive(:write_ref)
+ allow(merge_request).to receive(:fetch_ref!)
end
end
diff --git a/spec/features/issues/create_branch_merge_request_spec.rb b/spec/features/issues/create_branch_merge_request_spec.rb
index 546dc7e8a49..edea95c6699 100644
--- a/spec/features/issues/create_branch_merge_request_spec.rb
+++ b/spec/features/issues/create_branch_merge_request_spec.rb
@@ -64,6 +64,19 @@ feature 'Create Branch/Merge Request Dropdown on issue page', :feature, :js do
end
end
+ context 'when merge requests are disabled' do
+ before do
+ project.project_feature.update(merge_requests_access_level: 0)
+
+ visit project_issue_path(project, issue)
+ end
+
+ it 'shows only create branch button' do
+ expect(page).not_to have_button('Create a merge request')
+ expect(page).to have_button('Create a branch')
+ end
+ end
+
context 'when issue is confidential' do
it 'disables the create branch button' do
issue = create(:issue, :confidential, project: project)
diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb
index d5536fcb22b..8a80b88da5d 100644
--- a/spec/helpers/events_helper_spec.rb
+++ b/spec/helpers/events_helper_spec.rb
@@ -1,96 +1,6 @@
require 'spec_helper'
describe EventsHelper do
- describe '#event_note' do
- let(:user) { build(:user) }
-
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
- it 'displays one line of plain text without alteration' do
- input = 'A short, plain note'
- expect(helper.event_note(input)).to match(input)
- expect(helper.event_note(input)).not_to match(/\.\.\.\z/)
- end
-
- it 'displays inline code' do
- input = 'A note with `inline code`'
- expected = 'A note with inline code'
-
- expect(helper.event_note(input)).to match(expected)
- end
-
- it 'truncates a note with multiple paragraphs' do
- input = "Paragraph 1\n\nParagraph 2"
- expected = 'Paragraph 1...'
-
- expect(helper.event_note(input)).to match(expected)
- end
-
- it 'displays the first line of a code block' do
- input = "```\nCode block\nwith two lines\n```"
- expected = %r{Code block\.\.\.\n}
-
- expect(helper.event_note(input)).to match(expected)
- end
-
- it 'truncates a single long line of text' do
- text = 'The quick brown fox jumped over the lazy dog twice' # 50 chars
- input = text * 4
- expected = (text * 2).sub(/.{3}/, '...')
-
- expect(helper.event_note(input)).to match(expected)
- end
-
- it 'preserves a link href when link text is truncated' do
- text = 'The quick brown fox jumped over the lazy dog' # 44 chars
- input = "#{text}#{text}#{text} " # 133 chars
- link_url = 'http://example.com/foo/bar/baz' # 30 chars
- input << link_url
- expected_link_text = 'http://example...'
-
- expect(helper.event_note(input)).to match(link_url)
- expect(helper.event_note(input)).to match(expected_link_text)
- end
-
- it 'preserves code color scheme' do
- input = "```ruby\ndef test\n 'hello world'\nend\n```"
- expected = "\n
" \
- "deftest...\n" \
- "
"
- expect(helper.event_note(input)).to eq(expected)
- end
-
- it 'preserves data-src for lazy images' do
- input = "![ImageTest](/uploads/test.png)"
- image_url = "data-src=\"/uploads/test.png\""
- expect(helper.event_note(input)).to match(image_url)
- end
-
- context 'labels formatting' do
- let(:input) { 'this should be ~label_1' }
-
- def format_event_note(project)
- create(:label, title: 'label_1', project: project)
-
- helper.event_note(input, { project: project })
- end
-
- it 'preserves style attribute for a label that can be accessed by current_user' do
- project = create(:project, :public)
-
- expect(format_event_note(project)).to match(/span class=.*style=.*/)
- end
-
- it 'does not style a label that can not be accessed by current_user' do
- project = create(:project, :private)
-
- expect(format_event_note(project)).to eq("
#{input}
")
- end
- end
- end
-
describe '#event_commit_title' do
let(:message) { "foo & bar " + "A" * 70 + "\n" + "B" * 80 }
subject { helper.event_commit_title(message) }
diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb
index 03d706062b7..62ea6d48542 100644
--- a/spec/helpers/markup_helper_spec.rb
+++ b/spec/helpers/markup_helper_spec.rb
@@ -67,7 +67,7 @@ describe MarkupHelper do
describe 'without redacted attribute' do
it 'renders the markdown value' do
- expect(Banzai).to receive(:render_field).with(commit, attribute).and_call_original
+ expect(Banzai).to receive(:render_field).with(commit, attribute, {}).and_call_original
helper.markdown_field(commit, attribute)
end
@@ -252,38 +252,141 @@ describe MarkupHelper do
end
describe '#first_line_in_markdown' do
- it 'truncates Markdown properly' do
- text = "@#{user.username}, can you look at this?\nHello world\n"
- actual = first_line_in_markdown(text, 100, project: project)
+ shared_examples_for 'common markdown examples' do
+ let(:project_base) { build(:project, :repository) }
- doc = Nokogiri::HTML.parse(actual)
+ it 'displays inline code' do
+ object = create_object('Text with `inline code`')
+ expected = 'Text with inline code'
- # Make sure we didn't create invalid markup
- expect(doc.errors).to be_empty
+ expect(first_line_in_markdown(object, attribute, 100, project: project)).to match(expected)
+ end
- # Leading user link
- expect(doc.css('a').length).to eq(1)
- expect(doc.css('a')[0].attr('href')).to eq user_path(user)
- expect(doc.css('a')[0].text).to eq "@#{user.username}"
+ it 'truncates the text with multiple paragraphs' do
+ object = create_object("Paragraph 1\n\nParagraph 2")
+ expected = 'Paragraph 1...'
- expect(doc.content).to eq "@#{user.username}, can you look at this?..."
+ expect(first_line_in_markdown(object, attribute, 100, project: project)).to match(expected)
+ end
+
+ it 'displays the first line of a code block' do
+ object = create_object("```\nCode block\nwith two lines\n```")
+ expected = %r{Code block\.\.\.\n}
+
+ expect(first_line_in_markdown(object, attribute, 100, project: project)).to match(expected)
+ end
+
+ it 'truncates a single long line of text' do
+ text = 'The quick brown fox jumped over the lazy dog twice' # 50 chars
+ object = create_object(text * 4)
+ expected = (text * 2).sub(/.{3}/, '...')
+
+ expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(expected)
+ end
+
+ it 'preserves a link href when link text is truncated' do
+ text = 'The quick brown fox jumped over the lazy dog' # 44 chars
+ input = "#{text}#{text}#{text} " # 133 chars
+ link_url = 'http://example.com/foo/bar/baz' # 30 chars
+ input << link_url
+ object = create_object(input)
+ expected_link_text = 'http://example...'
+
+ expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(link_url)
+ expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(expected_link_text)
+ end
+
+ it 'preserves code color scheme' do
+ object = create_object("```ruby\ndef test\n 'hello world'\nend\n```")
+ expected = "\n
" \
+ "deftest...\n" \
+ "
"
+
+ expect(first_line_in_markdown(object, attribute, 150, project: project)).to eq(expected)
+ end
+
+ it 'preserves data-src for lazy images' do
+ object = create_object("![ImageTest](/uploads/test.png)")
+ image_url = "data-src=\".*/uploads/test.png\""
+
+ expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(image_url)
+ end
+
+ context 'labels formatting' do
+ let(:label_title) { 'this should be ~label_1' }
+
+ def create_and_format_label(project)
+ create(:label, title: 'label_1', project: project)
+ object = create_object(label_title, project: project)
+
+ first_line_in_markdown(object, attribute, 150, project: project)
+ end
+
+ it 'preserves style attribute for a label that can be accessed by current_user' do
+ project = create(:project, :public)
+
+ expect(create_and_format_label(project)).to match(/span class=.*style=.*/)
+ end
+
+ it 'does not style a label that can not be accessed by current_user' do
+ project = create(:project, :private)
+
+ expect(create_and_format_label(project)).to eq("
#{label_title}
")
+ end
+ end
+
+ it 'truncates Markdown properly' do
+ object = create_object("@#{user.username}, can you look at this?\nHello world\n")
+ actual = first_line_in_markdown(object, attribute, 100, project: project)
+
+ doc = Nokogiri::HTML.parse(actual)
+
+ # Make sure we didn't create invalid markup
+ expect(doc.errors).to be_empty
+
+ # Leading user link
+ expect(doc.css('a').length).to eq(1)
+ expect(doc.css('a')[0].attr('href')).to eq user_path(user)
+ expect(doc.css('a')[0].text).to eq "@#{user.username}"
+
+ expect(doc.content).to eq "@#{user.username}, can you look at this?..."
+ end
+
+ it 'truncates Markdown with emoji properly' do
+ object = create_object("foo :wink:\nbar :grinning:")
+ actual = first_line_in_markdown(object, attribute, 100, project: project)
+
+ doc = Nokogiri::HTML.parse(actual)
+
+ # Make sure we didn't create invalid markup
+ # But also account for the 2 errors caused by the unknown `gl-emoji` elements
+ expect(doc.errors.length).to eq(2)
+
+ expect(doc.css('gl-emoji').length).to eq(2)
+ expect(doc.css('gl-emoji')[0].attr('data-name')).to eq 'wink'
+ expect(doc.css('gl-emoji')[1].attr('data-name')).to eq 'grinning'
+
+ expect(doc.content).to eq "foo 😉\nbar 😀"
+ end
end
- it 'truncates Markdown with emoji properly' do
- text = "foo :wink:\nbar :grinning:"
- actual = first_line_in_markdown(text, 100, project: project)
+ context 'when the asked attribute can be redacted' do
+ include_examples 'common markdown examples' do
+ let(:attribute) { :note }
+ def create_object(title, project: project_base)
+ build(:note, note: title, project: project)
+ end
+ end
+ end
- doc = Nokogiri::HTML.parse(actual)
-
- # Make sure we didn't create invalid markup
- # But also account for the 2 errors caused by the unknown `gl-emoji` elements
- expect(doc.errors.length).to eq(2)
-
- expect(doc.css('gl-emoji').length).to eq(2)
- expect(doc.css('gl-emoji')[0].attr('data-name')).to eq 'wink'
- expect(doc.css('gl-emoji')[1].attr('data-name')).to eq 'grinning'
-
- expect(doc.content).to eq "foo 😉\nbar 😀"
+ context 'when the asked attribute can not be redacted' do
+ include_examples 'common markdown examples' do
+ let(:attribute) { :body }
+ def create_object(title, project: project_base)
+ issue = build(:issue, title: title)
+ build(:todo, :done, project: project_base, author: user, target: issue)
+ end
+ end
end
end
diff --git a/spec/initializers/8_metrics_spec.rb b/spec/initializers/8_metrics_spec.rb
index 4e6052a9f80..80c77057065 100644
--- a/spec/initializers/8_metrics_spec.rb
+++ b/spec/initializers/8_metrics_spec.rb
@@ -3,7 +3,6 @@ require 'spec_helper'
describe 'instrument_classes' do
let(:config) { double(:config) }
- let(:unicorn_sampler) { double(:unicorn_sampler) }
let(:influx_sampler) { double(:influx_sampler) }
before do
@@ -11,9 +10,7 @@ describe 'instrument_classes' do
allow(config).to receive(:instrument_methods)
allow(config).to receive(:instrument_instance_method)
allow(config).to receive(:instrument_instance_methods)
- allow(Gitlab::Metrics::UnicornSampler).to receive(:initialize_instance).and_return(unicorn_sampler)
- allow(Gitlab::Metrics::InfluxSampler).to receive(:initialize_instance).and_return(influx_sampler)
- allow(unicorn_sampler).to receive(:start)
+ allow(Gitlab::Metrics::Samplers::InfluxSampler).to receive(:initialize_instance).and_return(influx_sampler)
allow(influx_sampler).to receive(:start)
allow(Gitlab::Application).to receive(:configure)
end
diff --git a/spec/javascripts/lib/utils/datefix_spec.js b/spec/javascripts/lib/utils/datefix_spec.js
index 0b9fde2be67..e58ac4300ba 100644
--- a/spec/javascripts/lib/utils/datefix_spec.js
+++ b/spec/javascripts/lib/utils/datefix_spec.js
@@ -1,4 +1,4 @@
-import { pad, parsePikadayDate, pikadayToString } from '~/lib/utils/datefix';
+import { pad, pikadayToString } from '~/lib/utils/datefix';
describe('datefix', () => {
describe('pad', () => {
@@ -16,9 +16,7 @@ describe('datefix', () => {
});
describe('parsePikadayDate', () => {
- it('should return a UTC date', () => {
- expect(parsePikadayDate('2020-01-29')).toEqual(new Date('2020-01-29'));
- });
+ // removed because of https://gitlab.com/gitlab-org/gitlab-ce/issues/39834
});
describe('pikadayToString', () => {
diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js
index d4e134583c7..fd7aa332d17 100644
--- a/spec/javascripts/test_bundle.js
+++ b/spec/javascripts/test_bundle.js
@@ -11,6 +11,12 @@ const isHeadlessChrome = /\bHeadlessChrome\//.test(navigator.userAgent);
Vue.config.devtools = !isHeadlessChrome;
Vue.config.productionTip = false;
+let hasVueWarnings = false;
+Vue.config.warnHandler = (msg, vm, trace) => {
+ hasVueWarnings = true;
+ fail(`${msg}${trace}`);
+};
+
Vue.use(VueResource);
// enable test fixtures
@@ -34,11 +40,6 @@ window.addEventListener('unhandledrejection', (event) => {
console.error(event.reason.stack || event.reason);
});
-const checkUnhandledPromiseRejections = (done) => {
- expect(hasUnhandledPromiseRejections).toBe(false);
- done();
-};
-
// HACK: Chrome 59 disconnects if there are too many synchronous tests in a row
// because it appears to lock up the thread that communicates to Karma's socket
// This async beforeEach gets called on every spec and releases the JS thread long
@@ -47,17 +48,6 @@ const checkUnhandledPromiseRejections = (done) => {
// to run our unit tests.
beforeEach(done => done());
-beforeAll(() => {
- const origError = console.error;
- spyOn(console, 'error').and.callFake((message) => {
- if (/^\[Vue warn\]/.test(message)) {
- fail(message);
- } else {
- origError(message);
- }
- });
-});
-
const builtinVueHttpInterceptors = Vue.http.interceptors.slice();
beforeEach(() => {
@@ -80,8 +70,22 @@ testsContext.keys().forEach(function (path) {
}
});
-it('has no unhandled Promise rejections', (done) => {
- setTimeout(checkUnhandledPromiseRejections(done), 1000);
+describe('test errors', () => {
+ beforeAll((done) => {
+ if (hasUnhandledPromiseRejections || hasVueWarnings) {
+ setTimeout(done, 1000);
+ } else {
+ done();
+ }
+ });
+
+ it('has no unhandled Promise rejections', () => {
+ expect(hasUnhandledPromiseRejections).toBe(false);
+ });
+
+ it('has no Vue warnings', () => {
+ expect(hasVueWarnings).toBe(false);
+ });
});
// if we're generating coverage reports, make sure to include all files so
diff --git a/spec/javascripts/vue_shared/components/markdown/field_spec.js b/spec/javascripts/vue_shared/components/markdown/field_spec.js
index 65c49b9f30b..24209be83fe 100644
--- a/spec/javascripts/vue_shared/components/markdown/field_spec.js
+++ b/spec/javascripts/vue_shared/components/markdown/field_spec.js
@@ -1,6 +1,12 @@
import Vue from 'vue';
import fieldComponent from '~/vue_shared/components/markdown/field.vue';
+function assertMarkdownTabs(isWrite, writeLink, previewLink, vm) {
+ expect(writeLink.parentNode.classList.contains('active')).toEqual(isWrite);
+ expect(previewLink.parentNode.classList.contains('active')).toEqual(!isWrite);
+ expect(vm.$el.querySelector('.md-preview').style.display).toEqual(isWrite ? 'none' : '');
+}
+
describe('Markdown field component', () => {
let vm;
@@ -39,6 +45,7 @@ describe('Markdown field component', () => {
describe('markdown preview', () => {
let previewLink;
+ let writeLink;
beforeEach(() => {
spyOn(Vue.http, 'post').and.callFake(() => new Promise((resolve) => {
@@ -53,7 +60,8 @@ describe('Markdown field component', () => {
});
}));
- previewLink = vm.$el.querySelector('.nav-links li:nth-child(2) a');
+ previewLink = vm.$el.querySelector('.nav-links .js-preview-link');
+ writeLink = vm.$el.querySelector('.nav-links .js-write-link');
});
it('sets preview link as active', (done) => {
@@ -105,6 +113,23 @@ describe('Markdown field component', () => {
done();
}, 0);
});
+
+ it('clicking already active write or preview link does nothing', (done) => {
+ writeLink.click();
+ Vue.nextTick()
+ .then(() => assertMarkdownTabs(true, writeLink, previewLink, vm))
+ .then(() => writeLink.click())
+ .then(() => Vue.nextTick())
+ .then(() => assertMarkdownTabs(true, writeLink, previewLink, vm))
+ .then(() => previewLink.click())
+ .then(() => Vue.nextTick())
+ .then(() => assertMarkdownTabs(false, writeLink, previewLink, vm))
+ .then(() => previewLink.click())
+ .then(() => Vue.nextTick())
+ .then(() => assertMarkdownTabs(false, writeLink, previewLink, vm))
+ .then(done)
+ .catch(done.fail);
+ });
});
describe('markdown buttons', () => {
diff --git a/spec/javascripts/vue_shared/components/markdown/header_spec.js b/spec/javascripts/vue_shared/components/markdown/header_spec.js
index 7110ff36937..edebd822295 100644
--- a/spec/javascripts/vue_shared/components/markdown/header_spec.js
+++ b/spec/javascripts/vue_shared/components/markdown/header_spec.js
@@ -43,11 +43,13 @@ describe('Markdown field header component', () => {
it('emits toggle markdown event when clicking preview', () => {
spyOn(vm, '$emit');
- vm.$el.querySelector('li:nth-child(2) a').click();
+ vm.$el.querySelector('.js-preview-link').click();
- expect(
- vm.$emit,
- ).toHaveBeenCalledWith('toggle-markdown');
+ expect(vm.$emit).toHaveBeenCalledWith('preview-markdown');
+
+ vm.$el.querySelector('.js-write-link').click();
+
+ expect(vm.$emit).toHaveBeenCalledWith('write-markdown');
});
it('blurs preview link after click', (done) => {
diff --git a/spec/lib/banzai/commit_renderer_spec.rb b/spec/lib/banzai/commit_renderer_spec.rb
index 049d025a5b9..84adaebdcbe 100644
--- a/spec/lib/banzai/commit_renderer_spec.rb
+++ b/spec/lib/banzai/commit_renderer_spec.rb
@@ -10,7 +10,7 @@ describe Banzai::CommitRenderer do
described_class::ATTRIBUTES.each do |attr|
expect_any_instance_of(Banzai::ObjectRenderer).to receive(:render).with([project.commit], attr).once.and_call_original
- expect(Banzai::Renderer).to receive(:cacheless_render_field).with(project.commit, attr)
+ expect(Banzai::Renderer).to receive(:cacheless_render_field).with(project.commit, attr, {})
end
described_class.render([project.commit], project, user)
diff --git a/spec/lib/banzai/filter/absolute_link_filter_spec.rb b/spec/lib/banzai/filter/absolute_link_filter_spec.rb
new file mode 100644
index 00000000000..a3ad056efcd
--- /dev/null
+++ b/spec/lib/banzai/filter/absolute_link_filter_spec.rb
@@ -0,0 +1,58 @@
+require 'spec_helper'
+
+describe Banzai::Filter::AbsoluteLinkFilter do
+ def filter(doc, context = {})
+ described_class.call(doc, context)
+ end
+
+ context 'with html links' do
+ context 'if only_path is false' do
+ let(:only_path_context) do
+ { only_path: false }
+ end
+ let(:fake_url) { 'http://www.example.com' }
+
+ before do
+ allow(Gitlab.config.gitlab).to receive(:url).and_return(fake_url)
+ end
+
+ context 'has the .gfm class' do
+ it 'converts a relative url into absolute' do
+ doc = filter(link('/foo', 'gfm'), only_path_context)
+ expect(doc.at_css('a')['href']).to eq "#{fake_url}/foo"
+ end
+
+ it 'does not change the url if it already absolute' do
+ doc = filter(link("#{fake_url}/foo", 'gfm'), only_path_context)
+ expect(doc.at_css('a')['href']).to eq "#{fake_url}/foo"
+ end
+
+ context 'if relative_url_root is set' do
+ it 'joins the url without without doubling the path' do
+ allow(Gitlab.config.gitlab).to receive(:url).and_return("#{fake_url}/gitlab/")
+ doc = filter(link("/gitlab/foo", 'gfm'), only_path_context)
+ expect(doc.at_css('a')['href']).to eq "#{fake_url}/gitlab/foo"
+ end
+ end
+ end
+
+ context 'has not the .gfm class' do
+ it 'does not convert a relative url into absolute' do
+ doc = filter(link('/foo'), only_path_context)
+ expect(doc.at_css('a')['href']).to eq '/foo'
+ end
+ end
+ end
+
+ context 'if only_path is not false' do
+ it 'does not convert a relative url into absolute' do
+ expect(filter(link('/foo', 'gfm')).at_css('a')['href']).to eq '/foo'
+ expect(filter(link('/foo')).at_css('a')['href']).to eq '/foo'
+ end
+ end
+ end
+
+ def link(path, css_class = '')
+ %(example)
+ end
+end
diff --git a/spec/lib/banzai/note_renderer_spec.rb b/spec/lib/banzai/note_renderer_spec.rb
deleted file mode 100644
index 32764bee5eb..00000000000
--- a/spec/lib/banzai/note_renderer_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-require 'spec_helper'
-
-describe Banzai::NoteRenderer do
- describe '.render' do
- it 'renders a Note' do
- note = double(:note)
- project = double(:project)
- wiki = double(:wiki)
- user = double(:user)
-
- expect(Banzai::ObjectRenderer).to receive(:new)
- .with(project, user,
- requested_path: 'foo',
- project_wiki: wiki,
- ref: 'bar')
- .and_call_original
-
- expect_any_instance_of(Banzai::ObjectRenderer)
- .to receive(:render).with([note], :note)
-
- described_class.render([note], project, user, 'foo', wiki, 'bar')
- end
- end
-end
diff --git a/spec/lib/banzai/object_renderer_spec.rb b/spec/lib/banzai/object_renderer_spec.rb
index b172a1b718c..074d521a5c6 100644
--- a/spec/lib/banzai/object_renderer_spec.rb
+++ b/spec/lib/banzai/object_renderer_spec.rb
@@ -22,7 +22,7 @@ describe Banzai::ObjectRenderer do
end
it 'retrieves field content using Banzai::Renderer.render_field' do
- expect(Banzai::Renderer).to receive(:render_field).with(object, :note).and_call_original
+ expect(Banzai::Renderer).to receive(:render_field).with(object, :note, {}).and_call_original
renderer.render([object], :note)
end
@@ -68,7 +68,7 @@ describe Banzai::ObjectRenderer do
end
it 'retrieves field content using Banzai::Renderer.cacheless_render_field' do
- expect(Banzai::Renderer).to receive(:cacheless_render_field).with(commit, :title).and_call_original
+ expect(Banzai::Renderer).to receive(:cacheless_render_field).with(commit, :title, {}).and_call_original
renderer.render([commit], :title)
end
diff --git a/spec/lib/banzai/renderer_spec.rb b/spec/lib/banzai/renderer_spec.rb
index 81a04a2d46d..650cecfc778 100644
--- a/spec/lib/banzai/renderer_spec.rb
+++ b/spec/lib/banzai/renderer_spec.rb
@@ -18,7 +18,7 @@ describe Banzai::Renderer do
let(:commit) { create(:project, :repository).commit }
it 'returns cacheless render field' do
- expect(renderer).to receive(:cacheless_render_field).with(commit, :title)
+ expect(renderer).to receive(:cacheless_render_field).with(commit, :title, {})
renderer.render_field(commit, :title)
end
diff --git a/spec/lib/gitlab/checks/change_access_spec.rb b/spec/lib/gitlab/checks/change_access_spec.rb
index 6c25b7349e1..74a24a4424b 100644
--- a/spec/lib/gitlab/checks/change_access_spec.rb
+++ b/spec/lib/gitlab/checks/change_access_spec.rb
@@ -11,13 +11,13 @@ describe Gitlab::Checks::ChangeAccess do
let(:changes) { { oldrev: oldrev, newrev: newrev, ref: ref } }
let(:protocol) { 'ssh' }
- subject do
+ subject(:change_access) do
described_class.new(
changes,
project: project,
user_access: user_access,
protocol: protocol
- ).exec
+ )
end
before do
@@ -26,7 +26,7 @@ describe Gitlab::Checks::ChangeAccess do
context 'without failed checks' do
it "doesn't raise an error" do
- expect { subject }.not_to raise_error
+ expect { subject.exec }.not_to raise_error
end
end
@@ -34,7 +34,7 @@ describe Gitlab::Checks::ChangeAccess do
it 'raises an error' do
expect(user_access).to receive(:can_do_action?).with(:push_code).and_return(false)
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to this project.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to this project.')
end
end
@@ -45,7 +45,7 @@ describe Gitlab::Checks::ChangeAccess do
allow(user_access).to receive(:can_do_action?).with(:push_code).and_return(true)
expect(user_access).to receive(:can_do_action?).with(:admin_project).and_return(false)
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to change existing tags on this project.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to change existing tags on this project.')
end
context 'with protected tag' do
@@ -61,7 +61,7 @@ describe Gitlab::Checks::ChangeAccess do
let(:newrev) { '0000000000000000000000000000000000000000' }
it 'is prevented' do
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be deleted/)
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be deleted/)
end
end
@@ -70,7 +70,7 @@ describe Gitlab::Checks::ChangeAccess do
let(:newrev) { '54fcc214b94e78d7a41a9a8fe6d87a5e59500e51' }
it 'is prevented' do
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be updated/)
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be updated/)
end
end
end
@@ -81,14 +81,14 @@ describe Gitlab::Checks::ChangeAccess do
let(:ref) { 'refs/tags/v9.1.0' }
it 'prevents creation below access level' do
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /allowed to create this tag as it is protected/)
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /allowed to create this tag as it is protected/)
end
context 'when user has access' do
let!(:protected_tag) { create(:protected_tag, :developers_can_create, project: project, name: 'v*') }
it 'allows tag creation' do
- expect { subject }.not_to raise_error
+ expect { subject.exec }.not_to raise_error
end
end
end
@@ -101,7 +101,7 @@ describe Gitlab::Checks::ChangeAccess do
let(:ref) { 'refs/heads/master' }
it 'raises an error' do
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'The default branch of a project cannot be deleted.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'The default branch of a project cannot be deleted.')
end
end
@@ -114,7 +114,7 @@ describe Gitlab::Checks::ChangeAccess do
it 'raises an error if the user is not allowed to do forced pushes to protected branches' do
expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to force push code to a protected branch on this project.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to force push code to a protected branch on this project.')
end
it 'raises an error if the user is not allowed to merge to protected branches' do
@@ -122,13 +122,13 @@ describe Gitlab::Checks::ChangeAccess do
expect(user_access).to receive(:can_merge_to_branch?).and_return(false)
expect(user_access).to receive(:can_push_to_branch?).and_return(false)
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to merge code into protected branches on this project.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to merge code into protected branches on this project.')
end
it 'raises an error if the user is not allowed to push to protected branches' do
expect(user_access).to receive(:can_push_to_branch?).and_return(false)
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to protected branches on this project.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to protected branches on this project.')
end
context 'branch deletion' do
@@ -137,7 +137,7 @@ describe Gitlab::Checks::ChangeAccess do
context 'if the user is not allowed to delete protected branches' do
it 'raises an error' do
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to delete protected branches from this project. Only a project master or owner can delete a protected branch.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to delete protected branches from this project. Only a project master or owner can delete a protected branch.')
end
end
@@ -150,18 +150,63 @@ describe Gitlab::Checks::ChangeAccess do
let(:protocol) { 'web' }
it 'allows branch deletion' do
- expect { subject }.not_to raise_error
+ expect { subject.exec }.not_to raise_error
end
end
context 'over SSH or HTTP' do
it 'raises an error' do
- expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You can only delete protected branches using the web interface.')
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You can only delete protected branches using the web interface.')
end
end
end
end
end
end
+
+ context 'LFS integrity check' do
+ let(:blob_object) { project.repository.blob_at_branch('lfs', 'files/lfs/lfs_object.iso') }
+
+ before do
+ allow_any_instance_of(Gitlab::Git::RevList).to receive(:new_objects) do |&lazy_block|
+ lazy_block.call([blob_object.id])
+ end
+ end
+
+ context 'with LFS not enabled' do
+ it 'skips integrity check' do
+ expect_any_instance_of(Gitlab::Git::RevList).not_to receive(:new_objects)
+
+ subject.exec
+ end
+ end
+
+ context 'with LFS enabled' do
+ before do
+ allow(project).to receive(:lfs_enabled?).and_return(true)
+ end
+
+ context 'deletion' do
+ let(:changes) { { oldrev: oldrev, ref: ref } }
+
+ it 'skips integrity check' do
+ expect_any_instance_of(Gitlab::Git::RevList).not_to receive(:new_objects)
+
+ subject.exec
+ end
+ end
+
+ it 'fails if any LFS blobs are missing' do
+ expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /LFS objects are missing/)
+ end
+
+ it 'succeeds if LFS objects have already been uploaded' do
+ lfs_object = create(:lfs_object, oid: blob_object.lfs_oid)
+ create(:lfs_objects_project, project: project, lfs_object: lfs_object)
+
+ expect { subject.exec }.not_to raise_error
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/git/lfs_changes_spec.rb b/spec/lib/gitlab/git/lfs_changes_spec.rb
index c2d2c6e1bc8..c9007d7d456 100644
--- a/spec/lib/gitlab/git/lfs_changes_spec.rb
+++ b/spec/lib/gitlab/git/lfs_changes_spec.rb
@@ -9,7 +9,7 @@ describe Gitlab::Git::LfsChanges do
describe 'new_pointers' do
before do
- allow_any_instance_of(Gitlab::Git::RevList).to receive(:new_objects).and_return([blob_object_id])
+ allow_any_instance_of(Gitlab::Git::RevList).to receive(:new_objects).and_yield([blob_object_id])
end
it 'uses rev-list to find new objects' do
@@ -38,7 +38,7 @@ describe Gitlab::Git::LfsChanges do
it 'uses rev-list to find all objects' do
rev_list = double
allow(Gitlab::Git::RevList).to receive(:new).and_return(rev_list)
- allow(rev_list).to receive(:all_objects).and_return([blob_object_id])
+ allow(rev_list).to receive(:all_objects).and_yield([blob_object_id])
expect(Gitlab::Git::Blob).to receive(:batch_lfs_pointers).with(project.repository, [blob_object_id])
diff --git a/spec/lib/gitlab/git/popen_spec.rb b/spec/lib/gitlab/git/popen_spec.rb
index 2b65bc1cf15..b033ede9062 100644
--- a/spec/lib/gitlab/git/popen_spec.rb
+++ b/spec/lib/gitlab/git/popen_spec.rb
@@ -53,6 +53,23 @@ describe 'Gitlab::Git::Popen' do
it { expect(status).to be_zero }
it { expect(output).to eq('hello') }
end
+
+ context 'with lazy block' do
+ it 'yields a lazy io' do
+ expect_lazy_io = lambda do |io|
+ expect(io).to be_a Enumerator::Lazy
+ expect(io.inspect).to include('#(io) {})
+ end
+ end
+ end
end
context 'popen_with_timeout' do
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 1d4d0c300eb..96e162ac087 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -1521,7 +1521,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
end
end
- describe '#fetch_source_branch' do
+ describe '#fetch_source_branch!' do
let(:local_ref) { 'refs/merge-requests/1/head' }
context 'when the branch exists' do
@@ -1530,11 +1530,11 @@ describe Gitlab::Git::Repository, seed_helper: true do
it 'writes the ref' do
expect(repository).to receive(:write_ref).with(local_ref, /\h{40}/)
- repository.fetch_source_branch(repository, source_branch, local_ref)
+ repository.fetch_source_branch!(repository, source_branch, local_ref)
end
it 'returns true' do
- expect(repository.fetch_source_branch(repository, source_branch, local_ref)).to eq(true)
+ expect(repository.fetch_source_branch!(repository, source_branch, local_ref)).to eq(true)
end
end
@@ -1544,11 +1544,11 @@ describe Gitlab::Git::Repository, seed_helper: true do
it 'does not write the ref' do
expect(repository).not_to receive(:write_ref)
- repository.fetch_source_branch(repository, source_branch, local_ref)
+ repository.fetch_source_branch!(repository, source_branch, local_ref)
end
it 'returns false' do
- expect(repository.fetch_source_branch(repository, source_branch, local_ref)).to eq(false)
+ expect(repository.fetch_source_branch!(repository, source_branch, local_ref)).to eq(false)
end
end
end
diff --git a/spec/lib/gitlab/git/rev_list_spec.rb b/spec/lib/gitlab/git/rev_list_spec.rb
index 643a4b2d03e..eaf74951b0e 100644
--- a/spec/lib/gitlab/git/rev_list_spec.rb
+++ b/spec/lib/gitlab/git/rev_list_spec.rb
@@ -3,26 +3,44 @@ require 'spec_helper'
describe Gitlab::Git::RevList do
let(:project) { create(:project, :repository) }
let(:rev_list) { described_class.new(newrev: 'newrev', path_to_repo: project.repository.path_to_repo) }
-
- before do
- allow(Gitlab::Git::Env).to receive(:all).and_return({
- GIT_OBJECT_DIRECTORY: 'foo',
- GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar'
- })
- end
-
- def stub_popen_rev_list(*additional_args, output:)
- expect(rev_list).to receive(:popen).with([
- Gitlab.config.git.bin_path,
- "--git-dir=#{project.repository.path_to_repo}",
- 'rev-list',
- *additional_args
- ],
- nil,
+ let(:env_hash) do
{
'GIT_OBJECT_DIRECTORY' => 'foo',
'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar'
- }).and_return([output, 0])
+ }
+ end
+
+ before do
+ allow(Gitlab::Git::Env).to receive(:all).and_return(env_hash.symbolize_keys)
+ end
+
+ def args_for_popen(args_list)
+ [
+ Gitlab.config.git.bin_path,
+ "--git-dir=#{project.repository.path_to_repo}",
+ 'rev-list',
+ *args_list
+ ]
+ end
+
+ def stub_popen_rev_list(*additional_args, output:)
+ args = args_for_popen(additional_args)
+
+ expect(rev_list).to receive(:popen).with(args, nil, env_hash)
+ .and_return([output, 0])
+ end
+
+ def stub_lazy_popen_rev_list(*additional_args, output:)
+ params = [
+ args_for_popen(additional_args),
+ nil,
+ env_hash,
+ hash_including(lazy_block: anything)
+ ]
+
+ expect(rev_list).to receive(:popen).with(*params) do |*_, lazy_block:|
+ lazy_block.call(output.split("\n").lazy)
+ end
end
context "#new_refs" do
@@ -46,10 +64,22 @@ describe Gitlab::Git::RevList do
expect(rev_list.new_objects(require_path: true)).to eq(%w[sha2])
end
- it 'can return a lazy enumerator' do
- stub_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2")
+ it 'can yield a lazy enumerator' do
+ stub_lazy_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2")
- expect(rev_list.new_objects(lazy: true)).to be_a Enumerator::Lazy
+ rev_list.new_objects do |object_ids|
+ expect(object_ids).to be_a Enumerator::Lazy
+ end
+ end
+
+ it 'returns the result of the block when given' do
+ stub_lazy_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2")
+
+ objects = rev_list.new_objects do |object_ids|
+ object_ids.first
+ end
+
+ expect(objects).to eq 'sha1'
end
it 'can accept list of references to exclude' do
@@ -69,7 +99,7 @@ describe Gitlab::Git::RevList do
it 'fetches list of all pushed objects using rev-list' do
stub_popen_rev_list('--all', '--objects', output: "sha1\nsha2")
- expect(rev_list.all_objects.force).to eq(%w[sha1 sha2])
+ expect(rev_list.all_objects).to eq(%w[sha1 sha2])
end
end
diff --git a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
index 92bf87bbad4..78475403f9e 100644
--- a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
@@ -26,7 +26,6 @@ describe Gitlab::HookData::MergeRequestBuilder do
merge_user_id
merge_when_pipeline_succeeds
milestone_id
- ref_fetched
source_branch
source_project_id
state
diff --git a/spec/lib/gitlab/import_export/fork_spec.rb b/spec/lib/gitlab/import_export/fork_spec.rb
index dd0ce0dae41..cfb15ee7e8b 100644
--- a/spec/lib/gitlab/import_export/fork_spec.rb
+++ b/spec/lib/gitlab/import_export/fork_spec.rb
@@ -46,7 +46,7 @@ describe 'forked project import' do
end
it 'can access the MR' do
- project.merge_requests.first.ensure_ref_fetched
+ project.merge_requests.first.fetch_ref!
expect(project.repository.ref_exists?('refs/merge-requests/1/head')).to be_truthy
end
diff --git a/spec/lib/gitlab/metrics/background_transaction_spec.rb b/spec/lib/gitlab/metrics/background_transaction_spec.rb
new file mode 100644
index 00000000000..96052b8dc2f
--- /dev/null
+++ b/spec/lib/gitlab/metrics/background_transaction_spec.rb
@@ -0,0 +1,13 @@
+require 'spec_helper'
+
+describe Gitlab::Metrics::BackgroundTransaction do
+ let(:test_worker_class) { double(:class, name: 'TestWorker') }
+
+ subject { described_class.new(test_worker_class) }
+
+ describe '#action' do
+ it 'returns transaction action name' do
+ expect(subject.action).to eq('TestWorker#perform')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/instrumentation_spec.rb b/spec/lib/gitlab/metrics/instrumentation_spec.rb
index 4b19ee19103..977bc250049 100644
--- a/spec/lib/gitlab/metrics/instrumentation_spec.rb
+++ b/spec/lib/gitlab/metrics/instrumentation_spec.rb
@@ -1,7 +1,8 @@
require 'spec_helper'
describe Gitlab::Metrics::Instrumentation do
- let(:transaction) { Gitlab::Metrics::Transaction.new }
+ let(:env) { {} }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
before do
@dummy = Class.new do
diff --git a/spec/lib/gitlab/metrics/method_call_spec.rb b/spec/lib/gitlab/metrics/method_call_spec.rb
index a247f03b2da..f1e9e414e0d 100644
--- a/spec/lib/gitlab/metrics/method_call_spec.rb
+++ b/spec/lib/gitlab/metrics/method_call_spec.rb
@@ -1,7 +1,8 @@
require 'spec_helper'
describe Gitlab::Metrics::MethodCall do
- let(:method_call) { described_class.new('Foo#bar', 'foo') }
+ let(:transaction) { double(:transaction, labels: {}) }
+ let(:method_call) { described_class.new('Foo#bar', :Foo, '#bar', transaction) }
describe '#measure' do
it 'measures the performance of the supplied block' do
@@ -11,6 +12,18 @@ describe Gitlab::Metrics::MethodCall do
expect(method_call.cpu_time).to be_a_kind_of(Numeric)
expect(method_call.call_count).to eq(1)
end
+
+ it 'observes the performance of the supplied block' do
+ expect(described_class.call_real_duration_histogram)
+ .to receive(:observe)
+ .with({ module: :Foo, method: '#bar' }, be_a_kind_of(Numeric))
+
+ expect(described_class.call_cpu_duration_histogram)
+ .to receive(:observe)
+ .with({ module: :Foo, method: '#bar' }, be_a_kind_of(Numeric))
+
+ method_call.measure { 'foo' }
+ end
end
describe '#to_metric' do
@@ -19,7 +32,7 @@ describe Gitlab::Metrics::MethodCall do
metric = method_call.to_metric
expect(metric).to be_an_instance_of(Gitlab::Metrics::Metric)
- expect(metric.series).to eq('foo')
+ expect(metric.series).to eq('rails_method_calls')
expect(metric.values[:duration]).to be_a_kind_of(Numeric)
expect(metric.values[:cpu_duration]).to be_a_kind_of(Numeric)
diff --git a/spec/lib/gitlab/metrics/rack_middleware_spec.rb b/spec/lib/gitlab/metrics/rack_middleware_spec.rb
index ec415f2bd85..b84387204ee 100644
--- a/spec/lib/gitlab/metrics/rack_middleware_spec.rb
+++ b/spec/lib/gitlab/metrics/rack_middleware_spec.rb
@@ -18,34 +18,6 @@ describe Gitlab::Metrics::RackMiddleware do
expect(middleware.call(env)).to eq('yay')
end
- it 'tags a transaction with the name and action of a controller' do
- klass = double(:klass, name: 'TestController', content_type: 'text/html')
- controller = double(:controller, class: klass, action_name: 'show')
-
- env['action_controller.instance'] = controller
-
- allow(app).to receive(:call).with(env)
-
- expect(middleware).to receive(:tag_controller)
- .with(an_instance_of(Gitlab::Metrics::Transaction), env)
-
- middleware.call(env)
- end
-
- it 'tags a transaction with the method and path of the route in the grape endpoint' do
- route = double(:route, request_method: "GET", path: "/:version/projects/:id/archive(.:format)")
- endpoint = double(:endpoint, route: route)
-
- env['api.endpoint'] = endpoint
-
- allow(app).to receive(:call).with(env)
-
- expect(middleware).to receive(:tag_endpoint)
- .with(an_instance_of(Gitlab::Metrics::Transaction), env)
-
- middleware.call(env)
- end
-
it 'tracks any raised exceptions' do
expect(app).to receive(:call).with(env).and_raise(RuntimeError)
@@ -60,7 +32,7 @@ describe Gitlab::Metrics::RackMiddleware do
let(:transaction) { middleware.transaction_from_env(env) }
it 'returns a Transaction' do
- expect(transaction).to be_an_instance_of(Gitlab::Metrics::Transaction)
+ expect(transaction).to be_an_instance_of(Gitlab::Metrics::WebTransaction)
end
it 'stores the request method and URI in the transaction as values' do
@@ -84,58 +56,4 @@ describe Gitlab::Metrics::RackMiddleware do
end
end
end
-
- describe '#tag_controller' do
- let(:transaction) { middleware.transaction_from_env(env) }
- let(:content_type) { 'text/html' }
-
- before do
- klass = double(:klass, name: 'TestController')
- controller = double(:controller, class: klass, action_name: 'show', content_type: content_type)
-
- env['action_controller.instance'] = controller
- end
-
- it 'tags a transaction with the name and action of a controller' do
- middleware.tag_controller(transaction, env)
-
- expect(transaction.action).to eq('TestController#show')
- end
-
- context 'when the response content type is not :html' do
- let(:content_type) { 'application/json' }
-
- it 'appends the mime type to the transaction action' do
- middleware.tag_controller(transaction, env)
-
- expect(transaction.action).to eq('TestController#show.json')
- end
- end
- end
-
- describe '#tag_endpoint' do
- let(:transaction) { middleware.transaction_from_env(env) }
-
- it 'tags a transaction with the method and path of the route in the grape endpount' do
- route = double(:route, request_method: "GET", path: "/:version/projects/:id/archive(.:format)")
- endpoint = double(:endpoint, route: route)
-
- env['api.endpoint'] = endpoint
-
- middleware.tag_endpoint(transaction, env)
-
- expect(transaction.action).to eq('Grape#GET /projects/:id/archive')
- end
-
- it 'does not tag a transaction if route infos are missing' do
- endpoint = double(:endpoint)
- allow(endpoint).to receive(:route).and_raise
-
- env['api.endpoint'] = endpoint
-
- middleware.tag_endpoint(transaction, env)
-
- expect(transaction.action).to be_nil
- end
- end
end
diff --git a/spec/lib/gitlab/metrics/influx_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/influx_sampler_spec.rb
similarity index 98%
rename from spec/lib/gitlab/metrics/influx_sampler_spec.rb
rename to spec/lib/gitlab/metrics/samplers/influx_sampler_spec.rb
index 999a9536d82..667e4747897 100644
--- a/spec/lib/gitlab/metrics/influx_sampler_spec.rb
+++ b/spec/lib/gitlab/metrics/samplers/influx_sampler_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Metrics::InfluxSampler do
+describe Gitlab::Metrics::Samplers::InfluxSampler do
let(:sampler) { described_class.new(5) }
after do
diff --git a/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb
new file mode 100644
index 00000000000..53699327da1
--- /dev/null
+++ b/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb
@@ -0,0 +1,90 @@
+require 'spec_helper'
+
+describe Gitlab::Metrics::Samplers::RubySampler do
+ let(:sampler) { described_class.new(5) }
+
+ after do
+ Allocations.stop if Gitlab::Metrics.mri?
+ end
+
+ describe '#sample' do
+ it 'samples various statistics' do
+ expect(Gitlab::Metrics::System).to receive(:memory_usage)
+ expect(Gitlab::Metrics::System).to receive(:file_descriptor_count)
+ expect(sampler).to receive(:sample_objects)
+ expect(sampler).to receive(:sample_gc)
+
+ sampler.sample
+ end
+
+ it 'adds a metric containing the memory usage' do
+ expect(Gitlab::Metrics::System).to receive(:memory_usage)
+ .and_return(9000)
+
+ expect(sampler.metrics[:memory_usage]).to receive(:set)
+ .with({}, 9000)
+ .and_call_original
+
+ sampler.sample
+ end
+
+ it 'adds a metric containing the amount of open file descriptors' do
+ expect(Gitlab::Metrics::System).to receive(:file_descriptor_count)
+ .and_return(4)
+
+ expect(sampler.metrics[:file_descriptors]).to receive(:set)
+ .with({}, 4)
+ .and_call_original
+
+ sampler.sample
+ end
+
+ it 'clears any GC profiles' do
+ expect(GC::Profiler).to receive(:clear)
+
+ sampler.sample
+ end
+ end
+
+ describe '#sample_gc' do
+ it 'adds a metric containing garbage collection time statistics' do
+ expect(GC::Profiler).to receive(:total_time).and_return(0.24)
+
+ expect(sampler.metrics[:total_time]).to receive(:set)
+ .with({}, 240)
+ .and_call_original
+
+ sampler.sample
+ end
+
+ it 'adds a metric containing garbage collection statistics' do
+ GC.stat.keys.each do |key|
+ expect(sampler.metrics[key]).to receive(:set).with({}, anything).and_call_original
+ end
+
+ sampler.sample
+ end
+ end
+
+ if Gitlab::Metrics.mri?
+ describe '#sample_objects' do
+ it 'adds a metric containing the amount of allocated objects' do
+ expect(sampler.metrics[:objects_total]).to receive(:set)
+ .with(include(class: anything), be > 0)
+ .at_least(:once)
+ .and_call_original
+
+ sampler.sample
+ end
+
+ it 'ignores classes without a name' do
+ expect(Allocations).to receive(:to_hash).and_return({ Class.new => 4 })
+
+ expect(sampler.metrics[:objects_total]).not_to receive(:set)
+ .with(include(class: 'object_counts'), anything)
+
+ sampler.sample
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/unicorn_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/unicorn_sampler_spec.rb
similarity index 98%
rename from spec/lib/gitlab/metrics/unicorn_sampler_spec.rb
rename to spec/lib/gitlab/metrics/samplers/unicorn_sampler_spec.rb
index dc0d1f2e940..771b633a2b9 100644
--- a/spec/lib/gitlab/metrics/unicorn_sampler_spec.rb
+++ b/spec/lib/gitlab/metrics/samplers/unicorn_sampler_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Metrics::UnicornSampler do
+describe Gitlab::Metrics::Samplers::UnicornSampler do
subject { described_class.new(1.second) }
describe '#sample' do
diff --git a/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb b/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb
index 0803ce42fac..6d69b5305d2 100644
--- a/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb
+++ b/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb
@@ -5,8 +5,8 @@ describe Gitlab::Metrics::SidekiqMiddleware do
let(:message) { { 'args' => ['test'], 'enqueued_at' => Time.new(2016, 6, 23, 6, 59).to_f } }
def run(worker, message)
- expect(Gitlab::Metrics::Transaction).to receive(:new)
- .with('TestWorker#perform')
+ expect(Gitlab::Metrics::BackgroundTransaction).to receive(:new)
+ .with(worker.class)
.and_call_original
expect_any_instance_of(Gitlab::Metrics::Transaction).to receive(:set)
@@ -18,21 +18,18 @@ describe Gitlab::Metrics::SidekiqMiddleware do
end
describe '#call' do
- it 'tracks the transaction' do
- worker = double(:worker, class: double(:class, name: 'TestWorker'))
+ let(:test_worker_class) { double(:class, name: 'TestWorker') }
+ let(:worker) { double(:worker, class: test_worker_class) }
+ it 'tracks the transaction' do
run(worker, message)
end
it 'tracks the transaction (for messages without `enqueued_at`)' do
- worker = double(:worker, class: double(:class, name: 'TestWorker'))
-
run(worker, {})
end
it 'tracks any raised exceptions' do
- worker = double(:worker, class: double(:class, name: 'TestWorker'))
-
expect_any_instance_of(Gitlab::Metrics::Transaction)
.to receive(:run).and_raise(RuntimeError)
@@ -45,18 +42,5 @@ describe Gitlab::Metrics::SidekiqMiddleware do
expect { middleware.call(worker, message, :test) }
.to raise_error(RuntimeError)
end
-
- it 'tags the metrics accordingly' do
- tags = { one: 1, two: 2 }
- worker = double(:worker, class: double(:class, name: 'TestWorker'))
- allow(worker).to receive(:metrics_tags).and_return(tags)
-
- tags.each do |tag, value|
- expect_any_instance_of(Gitlab::Metrics::Transaction).to receive(:add_tag)
- .with(tag, value)
- end
-
- run(worker, message)
- end
end
end
diff --git a/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb b/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb
index e7b595405a8..eca75a4fac1 100644
--- a/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb
@@ -1,7 +1,8 @@
require 'spec_helper'
describe Gitlab::Metrics::Subscribers::ActionView do
- let(:transaction) { Gitlab::Metrics::Transaction.new }
+ let(:env) { {} }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
let(:subscriber) { described_class.new }
@@ -29,5 +30,13 @@ describe Gitlab::Metrics::Subscribers::ActionView do
subscriber.render_template(event)
end
+
+ it 'observes view rendering time' do
+ expect(subscriber.send(:metric_view_rendering_duration_seconds))
+ .to receive(:observe)
+ .with({ view: 'app/views/x.html.haml' }, 2.1)
+
+ subscriber.render_template(event)
+ end
end
end
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index ce6587e993f..9b3698fb4a8 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -1,11 +1,12 @@
require 'spec_helper'
describe Gitlab::Metrics::Subscribers::ActiveRecord do
- let(:transaction) { Gitlab::Metrics::Transaction.new }
+ let(:env) { {} }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
let(:subscriber) { described_class.new }
let(:event) do
- double(:event, duration: 0.2,
+ double(:event, duration: 2,
payload: { sql: 'SELECT * FROM users WHERE id = 10' })
end
@@ -20,16 +21,24 @@ describe Gitlab::Metrics::Subscribers::ActiveRecord do
end
describe 'with a current transaction' do
+ it 'observes sql_duration metric' do
+ expect(subscriber).to receive(:current_transaction)
+ .at_least(:once)
+ .and_return(transaction)
+ expect(subscriber.send(:metric_sql_duration_seconds)).to receive(:observe).with({}, 0.002)
+ subscriber.sql(event)
+ end
+
it 'increments the :sql_duration value' do
expect(subscriber).to receive(:current_transaction)
.at_least(:once)
.and_return(transaction)
expect(transaction).to receive(:increment)
- .with(:sql_duration, 0.2)
+ .with(:sql_duration, 2, false)
expect(transaction).to receive(:increment)
- .with(:sql_count, 1)
+ .with(:sql_count, 1, false)
subscriber.sql(event)
end
diff --git a/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb b/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb
index f04dc8dcc02..58e28592cf9 100644
--- a/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb
@@ -1,15 +1,16 @@
require 'spec_helper'
describe Gitlab::Metrics::Subscribers::RailsCache do
- let(:transaction) { Gitlab::Metrics::Transaction.new }
+ let(:env) { {} }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
let(:subscriber) { described_class.new }
let(:event) { double(:event, duration: 15.2) }
describe '#cache_read' do
it 'increments the cache_read duration' do
- expect(subscriber).to receive(:increment)
- .with(:cache_read, event.duration)
+ expect(subscriber).to receive(:observe)
+ .with(:read, event.duration)
subscriber.cache_read(event)
end
@@ -17,7 +18,7 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
context 'with a transaction' do
before do
allow(subscriber).to receive(:current_transaction)
- .and_return(transaction)
+ .and_return(transaction)
end
context 'with hit event' do
@@ -25,9 +26,9 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
it 'increments the cache_read_hit count' do
expect(transaction).to receive(:increment)
- .with(:cache_read_hit_count, 1)
+ .with(:cache_read_hit_count, 1, false)
expect(transaction).to receive(:increment)
- .with(any_args).at_least(1) # Other calls
+ .with(any_args).at_least(1) # Other calls
subscriber.cache_read(event)
end
@@ -37,7 +38,7 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
it 'does not increment cache read miss' do
expect(transaction).not_to receive(:increment)
- .with(:cache_read_hit_count, 1)
+ .with(:cache_read_hit_count, 1)
subscriber.cache_read(event)
end
@@ -49,9 +50,15 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
it 'increments the cache_read_miss count' do
expect(transaction).to receive(:increment)
- .with(:cache_read_miss_count, 1)
+ .with(:cache_read_miss_count, 1, false)
expect(transaction).to receive(:increment)
- .with(any_args).at_least(1) # Other calls
+ .with(any_args).at_least(1) # Other calls
+
+ subscriber.cache_read(event)
+ end
+
+ it 'increments the cache_read_miss total' do
+ expect(subscriber.send(:metric_cache_misses_total)).to receive(:increment).with({})
subscriber.cache_read(event)
end
@@ -61,7 +68,13 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
it 'does not increment cache read miss' do
expect(transaction).not_to receive(:increment)
- .with(:cache_read_miss_count, 1)
+ .with(:cache_read_miss_count, 1)
+
+ subscriber.cache_read(event)
+ end
+
+ it 'does not increment cache_read_miss total' do
+ expect(subscriber.send(:metric_cache_misses_total)).not_to receive(:increment).with({})
subscriber.cache_read(event)
end
@@ -71,27 +84,27 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
end
describe '#cache_write' do
- it 'increments the cache_write duration' do
- expect(subscriber).to receive(:increment)
- .with(:cache_write, event.duration)
+ it 'observes write duration' do
+ expect(subscriber).to receive(:observe)
+ .with(:write, event.duration)
subscriber.cache_write(event)
end
end
describe '#cache_delete' do
- it 'increments the cache_delete duration' do
- expect(subscriber).to receive(:increment)
- .with(:cache_delete, event.duration)
+ it 'observes delete duration' do
+ expect(subscriber).to receive(:observe)
+ .with(:delete, event.duration)
subscriber.cache_delete(event)
end
end
describe '#cache_exist?' do
- it 'increments the cache_exists duration' do
- expect(subscriber).to receive(:increment)
- .with(:cache_exists, event.duration)
+ it 'observes the exists duration' do
+ expect(subscriber).to receive(:observe)
+ .with(:exists, event.duration)
subscriber.cache_exist?(event)
end
@@ -109,12 +122,12 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
context 'with a transaction' do
before do
allow(subscriber).to receive(:current_transaction)
- .and_return(transaction)
+ .and_return(transaction)
end
it 'increments the cache_read_hit count' do
expect(transaction).to receive(:increment)
- .with(:cache_read_hit_count, 1)
+ .with(:cache_read_hit_count, 1)
subscriber.cache_fetch_hit(event)
end
@@ -133,47 +146,61 @@ describe Gitlab::Metrics::Subscribers::RailsCache do
context 'with a transaction' do
before do
allow(subscriber).to receive(:current_transaction)
- .and_return(transaction)
+ .and_return(transaction)
end
it 'increments the cache_fetch_miss count' do
expect(transaction).to receive(:increment)
- .with(:cache_read_miss_count, 1)
+ .with(:cache_read_miss_count, 1)
+
+ subscriber.cache_generate(event)
+ end
+
+ it 'increments the cache_read_miss total' do
+ expect(subscriber.send(:metric_cache_misses_total)).to receive(:increment).with({})
subscriber.cache_generate(event)
end
end
end
- describe '#increment' do
+ describe '#observe' do
context 'without a transaction' do
it 'returns' do
expect(transaction).not_to receive(:increment)
- subscriber.increment(:foo, 15.2)
+ subscriber.observe(:foo, 15.2)
end
end
context 'with a transaction' do
before do
allow(subscriber).to receive(:current_transaction)
- .and_return(transaction)
+ .and_return(transaction)
end
it 'increments the total and specific cache duration' do
expect(transaction).to receive(:increment)
- .with(:cache_duration, event.duration)
+ .with(:cache_duration, event.duration, false)
expect(transaction).to receive(:increment)
- .with(:cache_count, 1)
+ .with(:cache_count, 1, false)
expect(transaction).to receive(:increment)
- .with(:cache_delete_duration, event.duration)
+ .with(:cache_delete_duration, event.duration, false)
expect(transaction).to receive(:increment)
- .with(:cache_delete_count, 1)
+ .with(:cache_delete_count, 1, false)
- subscriber.increment(:cache_delete, event.duration)
+ subscriber.observe(:delete, event.duration)
+ end
+
+ it 'observes cache metric' do
+ expect(subscriber.send(:metric_cache_operation_duration_seconds))
+ .to receive(:observe)
+ .with(transaction.labels.merge(operation: :delete), event.duration / 1000.0)
+
+ subscriber.observe(:delete, event.duration)
end
end
end
diff --git a/spec/lib/gitlab/metrics/transaction_spec.rb b/spec/lib/gitlab/metrics/web_transaction_spec.rb
similarity index 65%
rename from spec/lib/gitlab/metrics/transaction_spec.rb
rename to spec/lib/gitlab/metrics/web_transaction_spec.rb
index 3779af81512..1d162f53a13 100644
--- a/spec/lib/gitlab/metrics/transaction_spec.rb
+++ b/spec/lib/gitlab/metrics/web_transaction_spec.rb
@@ -1,7 +1,8 @@
require 'spec_helper'
-describe Gitlab::Metrics::Transaction do
- let(:transaction) { described_class.new }
+describe Gitlab::Metrics::WebTransaction do
+ let(:env) { {} }
+ let(:transaction) { described_class.new(env) }
describe '#duration' do
it 'returns the duration of a transaction in seconds' do
@@ -48,7 +49,7 @@ describe Gitlab::Metrics::Transaction do
describe '#method_call_for' do
it 'returns a MethodCall' do
- method = transaction.method_call_for('Foo#bar')
+ method = transaction.method_call_for('Foo#bar', :Foo, '#bar')
expect(method).to be_an_instance_of(Gitlab::Metrics::MethodCall)
end
@@ -85,14 +86,6 @@ describe Gitlab::Metrics::Transaction do
end
end
- describe '#add_tag' do
- it 'adds a tag' do
- transaction.add_tag(:foo, 'bar')
-
- expect(transaction.tags).to eq({ foo: 'bar' })
- end
- end
-
describe '#finish' do
it 'tracks the transaction details and submits them to Sidekiq' do
expect(transaction).to receive(:track_self)
@@ -127,7 +120,7 @@ describe Gitlab::Metrics::Transaction do
end
it 'adds the action as a tag for every metric' do
- transaction.action = 'Foo#bar'
+ allow(transaction).to receive(:labels).and_return(controller: 'Foo', action: 'bar')
transaction.track_self
hash = {
@@ -144,7 +137,8 @@ describe Gitlab::Metrics::Transaction do
end
it 'does not add an action tag for events' do
- transaction.action = 'Foo#bar'
+ allow(transaction).to receive(:labels).and_return(controller: 'Foo', action: 'bar')
+
transaction.add_event(:meow)
hash = {
@@ -161,6 +155,61 @@ describe Gitlab::Metrics::Transaction do
end
end
+ describe '#labels' do
+ context 'when request goes to Grape endpoint' do
+ before do
+ route = double(:route, request_method: 'GET', path: '/:version/projects/:id/archive(.:format)')
+ endpoint = double(:endpoint, route: route)
+
+ env['api.endpoint'] = endpoint
+ end
+ it 'provides labels with the method and path of the route in the grape endpoint' do
+ expect(transaction.labels).to eq({ controller: 'Grape', action: 'GET /projects/:id/archive' })
+ expect(transaction.action).to eq('Grape#GET /projects/:id/archive')
+ end
+
+ it 'does not provide labels if route infos are missing' do
+ endpoint = double(:endpoint)
+ allow(endpoint).to receive(:route).and_raise
+
+ env['api.endpoint'] = endpoint
+
+ expect(transaction.labels).to eq({})
+ expect(transaction.action).to be_nil
+ end
+ end
+
+ context 'when request goes to ActionController' do
+ let(:content_type) { 'text/html' }
+
+ before do
+ klass = double(:klass, name: 'TestController')
+ controller = double(:controller, class: klass, action_name: 'show', content_type: content_type)
+
+ env['action_controller.instance'] = controller
+ end
+
+ it 'tags a transaction with the name and action of a controller' do
+ expect(transaction.labels).to eq({ controller: 'TestController', action: 'show' })
+ expect(transaction.action).to eq('TestController#show')
+ end
+
+ context 'when the response content type is not :html' do
+ let(:content_type) { 'application/json' }
+
+ it 'appends the mime type to the transaction action' do
+ expect(transaction.labels).to eq({ controller: 'TestController', action: 'show.json' })
+ expect(transaction.action).to eq('TestController#show.json')
+ end
+ end
+ end
+
+ it 'returns no labels when no route information is present in env' do
+ expect(transaction.labels).to eq({})
+ expect(transaction.action).to eq(nil)
+ end
+ end
+
describe '#add_event' do
it 'adds a metric' do
transaction.add_event(:meow)
diff --git a/spec/lib/gitlab/metrics_spec.rb b/spec/lib/gitlab/metrics_spec.rb
index 599b8807d8d..1619fbd88b1 100644
--- a/spec/lib/gitlab/metrics_spec.rb
+++ b/spec/lib/gitlab/metrics_spec.rb
@@ -115,7 +115,7 @@ describe Gitlab::Metrics do
end
context 'with a transaction' do
- let(:transaction) { Gitlab::Metrics::Transaction.new }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new({}) }
before do
allow(described_class).to receive(:current_transaction)
@@ -124,13 +124,13 @@ describe Gitlab::Metrics do
it 'adds a metric to the current transaction' do
expect(transaction).to receive(:increment)
- .with('foo_real_time', a_kind_of(Numeric))
+ .with('foo_real_time', a_kind_of(Numeric), false)
expect(transaction).to receive(:increment)
- .with('foo_cpu_time', a_kind_of(Numeric))
+ .with('foo_cpu_time', a_kind_of(Numeric), false)
expect(transaction).to receive(:increment)
- .with('foo_call_count', 1)
+ .with('foo_call_count', 1, false)
described_class.measure(:foo) { 10 }
end
@@ -143,31 +143,6 @@ describe Gitlab::Metrics do
end
end
- describe '.tag_transaction' do
- context 'without a transaction' do
- it 'does nothing' do
- expect_any_instance_of(Gitlab::Metrics::Transaction)
- .not_to receive(:add_tag)
-
- described_class.tag_transaction(:foo, 'bar')
- end
- end
-
- context 'with a transaction' do
- let(:transaction) { Gitlab::Metrics::Transaction.new }
-
- it 'adds the tag to the transaction' do
- expect(described_class).to receive(:current_transaction)
- .and_return(transaction)
-
- expect(transaction).to receive(:add_tag)
- .with(:foo, 'bar')
-
- described_class.tag_transaction(:foo, 'bar')
- end
- end
- end
-
describe '.action=' do
context 'without a transaction' do
it 'does nothing' do
@@ -180,7 +155,7 @@ describe Gitlab::Metrics do
context 'with a transaction' do
it 'sets the action of a transaction' do
- trans = Gitlab::Metrics::Transaction.new
+ trans = Gitlab::Metrics::WebTransaction.new({})
expect(described_class).to receive(:current_transaction)
.and_return(trans)
@@ -210,7 +185,7 @@ describe Gitlab::Metrics do
context 'with a transaction' do
it 'adds an event' do
- transaction = Gitlab::Metrics::Transaction.new
+ transaction = Gitlab::Metrics::WebTransaction.new({})
expect(transaction).to receive(:add_event).with(:meow)
@@ -224,7 +199,7 @@ describe Gitlab::Metrics do
shared_examples 'prometheus metrics API' do
describe '#counter' do
- subject { described_class.counter(:couter, 'doc') }
+ subject { described_class.counter(:counter, 'doc') }
describe '#increment' do
it 'successfully calls #increment without arguments' do
@@ -280,7 +255,7 @@ describe Gitlab::Metrics do
it_behaves_like 'prometheus metrics API'
describe '#null_metric' do
- subject { described_class.provide_metric(:test) }
+ subject { described_class.send(:provide_metric, :test) }
it { is_expected.to be_a(Gitlab::Metrics::NullMetric) }
end
@@ -321,7 +296,7 @@ describe Gitlab::Metrics do
it_behaves_like 'prometheus metrics API'
describe '#null_metric' do
- subject { described_class.provide_metric(:test) }
+ subject { described_class.send(:provide_metric, :test) }
it { is_expected.to be_nil }
end
diff --git a/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb b/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb
index 88107536c9e..14f2c3cb86f 100644
--- a/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb
+++ b/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb
@@ -4,7 +4,7 @@ describe Gitlab::Middleware::RailsQueueDuration do
let(:app) { double(:app) }
let(:middleware) { described_class.new(app) }
let(:env) { {} }
- let(:transaction) { double(:transaction) }
+ let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
before do
expect(app).to receive(:call).with(env).and_return('yay')
@@ -30,6 +30,16 @@ describe Gitlab::Middleware::RailsQueueDuration do
expect(transaction).to receive(:set).with(:rails_queue_duration, an_instance_of(Float))
expect(middleware.call(env)).to eq('yay')
end
+
+ it 'observes rails queue duration metrics and calls the app when the header is present' do
+ env['HTTP_GITLAB_WORKHORSE_PROXY_START'] = '2000000000'
+
+ expect(middleware.send(:metric_rails_queue_duration_seconds)).to receive(:observe).with(transaction.labels, 1)
+
+ Timecop.freeze(Time.at(3)) do
+ expect(middleware.call(env)).to eq('yay')
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb
index f1f188cbfb5..ee63c9338c5 100644
--- a/spec/lib/gitlab/path_regex_spec.rb
+++ b/spec/lib/gitlab/path_regex_spec.rb
@@ -68,14 +68,27 @@ describe Gitlab::PathRegex do
message
end
- let(:all_routes) do
+ let(:all_non_legacy_routes) do
route_set = Rails.application.routes
routes_collection = route_set.routes
routes_array = routes_collection.routes
- routes_array.map { |route| route.path.spec.to_s }
+
+ non_legacy_routes = routes_array.reject do |route|
+ route.name.to_s =~ /legacy_(\w*)_redirect/
+ end
+
+ non_deprecated_redirect_routes = non_legacy_routes.reject do |route|
+ app = route.app
+ # `app.app` is either another app, or `self`. We want to find the final app.
+ app = app.app while app.try(:app) && app.app != app
+
+ app.is_a?(ActionDispatch::Routing::PathRedirect) && app.block.include?('/-/')
+ end
+
+ non_deprecated_redirect_routes.map { |route| route.path.spec.to_s }
end
- let(:routes_without_format) { all_routes.map { |path| without_format(path) } }
+ let(:routes_without_format) { all_non_legacy_routes.map { |path| without_format(path) } }
# Routes not starting with `/:` or `/*`
# all routes not starting with a param
diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb
index e6ebe079ceb..ed76be703a5 100644
--- a/spec/models/clusters/platforms/kubernetes_spec.rb
+++ b/spec/models/clusters/platforms/kubernetes_spec.rb
@@ -9,7 +9,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
describe 'before_validation' do
context 'when namespace includes upper case' do
- let(:kubernetes) { create(:platform_kubernetes, :configured, namespace: namespace) }
+ let(:kubernetes) { create(:cluster_platform_kubernetes, :configured, namespace: namespace) }
let(:namespace) { 'ABC' }
it 'converts to lower case' do
@@ -22,7 +22,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
subject { kubernetes.valid? }
context 'when validates namespace' do
- let(:kubernetes) { build(:platform_kubernetes, :configured, namespace: namespace) }
+ let(:kubernetes) { build(:cluster_platform_kubernetes, :configured, namespace: namespace) }
context 'when namespace is blank' do
let(:namespace) { '' }
@@ -50,7 +50,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
end
context 'when validates api_url' do
- let(:kubernetes) { build(:platform_kubernetes, :configured) }
+ let(:kubernetes) { build(:cluster_platform_kubernetes, :configured) }
before do
kubernetes.api_url = api_url
@@ -76,7 +76,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
end
context 'when validates token' do
- let(:kubernetes) { build(:platform_kubernetes, :configured) }
+ let(:kubernetes) { build(:cluster_platform_kubernetes, :configured) }
before do
kubernetes.token = token
@@ -95,8 +95,8 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
let(:enabled) { true }
let(:project) { create(:project) }
let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, enabled: enabled, projects: [project]) }
- let(:platform) { build(:platform_kubernetes, :configured) }
- let(:provider) { build(:provider_gcp) }
+ let(:platform) { build(:cluster_platform_kubernetes, :configured) }
+ let(:provider) { build(:cluster_provider_gcp) }
let(:kubernetes_service) { project.kubernetes_service }
it 'updates KubernetesService' do
@@ -126,8 +126,8 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
context 'when kubernetes_service has been configured without cluster integration' do
let!(:project) { create(:project) }
let(:cluster) { build(:cluster, provider_type: :gcp, platform_type: :kubernetes, platform_kubernetes: platform, provider_gcp: provider, projects: [project]) }
- let(:platform) { build(:platform_kubernetes, :configured, api_url: 'https://111.111.111.111') }
- let(:provider) { build(:provider_gcp) }
+ let(:platform) { build(:cluster_platform_kubernetes, :configured, api_url: 'https://111.111.111.111') }
+ let(:provider) { build(:cluster_provider_gcp) }
before do
create(:kubernetes_service, project: project)
@@ -144,7 +144,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) }
let(:project) { cluster.project }
- let(:kubernetes) { create(:platform_kubernetes, :configured, namespace: namespace) }
+ let(:kubernetes) { create(:cluster_platform_kubernetes, :configured, namespace: namespace) }
context 'when namespace is present' do
let(:namespace) { 'namespace-123' }
@@ -170,7 +170,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
describe '#default_namespace' do
subject { kubernetes.default_namespace }
- let(:kubernetes) { create(:platform_kubernetes, :configured) }
+ let(:kubernetes) { create(:cluster_platform_kubernetes, :configured) }
context 'when cluster belongs to a project' do
let!(:cluster) { create(:cluster, :project, platform_kubernetes: kubernetes) }
diff --git a/spec/models/clusters/providers/gcp_spec.rb b/spec/models/clusters/providers/gcp_spec.rb
index 99eb8c46e9a..ecd0a08c953 100644
--- a/spec/models/clusters/providers/gcp_spec.rb
+++ b/spec/models/clusters/providers/gcp_spec.rb
@@ -5,7 +5,7 @@ describe Clusters::Providers::Gcp do
it { is_expected.to validate_presence_of(:zone) }
describe 'default_value_for' do
- let(:gcp) { build(:provider_gcp) }
+ let(:gcp) { build(:cluster_provider_gcp) }
it "has default value" do
expect(gcp.zone).to eq('us-central1-a')
@@ -18,7 +18,7 @@ describe Clusters::Providers::Gcp do
subject { gcp.valid? }
context 'when validates gcp_project_id' do
- let(:gcp) { build(:provider_gcp, gcp_project_id: gcp_project_id) }
+ let(:gcp) { build(:cluster_provider_gcp, gcp_project_id: gcp_project_id) }
context 'when gcp_project_id is shorter than 1' do
let(:gcp_project_id) { '' }
@@ -46,7 +46,7 @@ describe Clusters::Providers::Gcp do
end
context 'when validates num_nodes' do
- let(:gcp) { build(:provider_gcp, num_nodes: num_nodes) }
+ let(:gcp) { build(:cluster_provider_gcp, num_nodes: num_nodes) }
context 'when num_nodes is string' do
let(:num_nodes) { 'A3' }
@@ -76,7 +76,7 @@ describe Clusters::Providers::Gcp do
describe '#state_machine' do
context 'when any => [:created]' do
- let(:gcp) { build(:provider_gcp, :creating) }
+ let(:gcp) { build(:cluster_provider_gcp, :creating) }
before do
gcp.make_created
@@ -90,7 +90,7 @@ describe Clusters::Providers::Gcp do
end
context 'when any => [:creating]' do
- let(:gcp) { build(:provider_gcp) }
+ let(:gcp) { build(:cluster_provider_gcp) }
context 'when operation_id is present' do
let(:operation_id) { 'operation-xxx' }
@@ -116,7 +116,7 @@ describe Clusters::Providers::Gcp do
end
context 'when any => [:errored]' do
- let(:gcp) { build(:provider_gcp, :creating) }
+ let(:gcp) { build(:cluster_provider_gcp, :creating) }
let(:status_reason) { 'err msg' }
it 'nullify access_token and operation_id' do
@@ -129,7 +129,7 @@ describe Clusters::Providers::Gcp do
end
context 'when status_reason is nil' do
- let(:gcp) { build(:provider_gcp, :errored) }
+ let(:gcp) { build(:cluster_provider_gcp, :errored) }
it 'does not set status_reason' do
gcp.make_errored(nil)
@@ -144,13 +144,13 @@ describe Clusters::Providers::Gcp do
subject { gcp.on_creation? }
context 'when status is creating' do
- let(:gcp) { create(:provider_gcp, :creating) }
+ let(:gcp) { create(:cluster_provider_gcp, :creating) }
it { is_expected.to be_truthy }
end
context 'when status is created' do
- let(:gcp) { create(:provider_gcp, :created) }
+ let(:gcp) { create(:cluster_provider_gcp, :created) }
it { is_expected.to be_falsey }
end
@@ -160,7 +160,7 @@ describe Clusters::Providers::Gcp do
subject { gcp.api_client }
context 'when status is creating' do
- let(:gcp) { build(:provider_gcp, :creating) }
+ let(:gcp) { build(:cluster_provider_gcp, :creating) }
it 'returns Cloud Platform API clinet' do
expect(subject).to be_an_instance_of(GoogleApi::CloudPlatform::Client)
@@ -169,13 +169,13 @@ describe Clusters::Providers::Gcp do
end
context 'when status is created' do
- let(:gcp) { build(:provider_gcp, :created) }
+ let(:gcp) { build(:cluster_provider_gcp, :created) }
it { is_expected.to be_nil }
end
context 'when status is errored' do
- let(:gcp) { build(:provider_gcp, :errored) }
+ let(:gcp) { build(:cluster_provider_gcp, :errored) }
it { is_expected.to be_nil }
end
diff --git a/spec/models/concerns/ignorable_column_spec.rb b/spec/models/concerns/ignorable_column_spec.rb
index dba9fe43327..b70f2331a0e 100644
--- a/spec/models/concerns/ignorable_column_spec.rb
+++ b/spec/models/concerns/ignorable_column_spec.rb
@@ -5,7 +5,11 @@ describe IgnorableColumn do
Class.new do
def self.columns
# This method does not have access to "double"
- [Struct.new(:name).new('id'), Struct.new(:name).new('title')]
+ [
+ Struct.new(:name).new('id'),
+ Struct.new(:name).new('title'),
+ Struct.new(:name).new('date')
+ ]
end
end
end
@@ -18,7 +22,7 @@ describe IgnorableColumn do
describe '.columns' do
it 'returns the columns, excluding the ignored ones' do
- model.ignore_column(:title)
+ model.ignore_column(:title, :date)
expect(model.columns.map(&:name)).to eq(%w(id))
end
@@ -30,9 +34,9 @@ describe IgnorableColumn do
end
it 'returns the names of the ignored columns' do
- model.ignore_column(:title)
+ model.ignore_column(:title, :date)
- expect(model.ignored_columns).to eq(Set.new(%w(title)))
+ expect(model.ignored_columns).to eq(Set.new(%w(title date)))
end
end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 476a2697605..d022dae3476 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -1755,39 +1755,12 @@ describe MergeRequest do
end
end
- describe '#fetch_ref' do
- it 'sets "ref_fetched" flag to true' do
- subject.update!(ref_fetched: nil)
+ describe '#fetch_ref!' do
+ it 'fetches the ref correctly' do
+ expect { subject.target_project.repository.delete_refs(subject.ref_path) }.not_to raise_error
- subject.fetch_ref
-
- expect(subject.reload.ref_fetched).to be_truthy
- end
- end
-
- describe '#ref_fetched?' do
- it 'does not perform git operation when value is cached' do
- subject.ref_fetched = true
-
- expect_any_instance_of(Repository).not_to receive(:ref_exists?)
- expect(subject.ref_fetched?).to be_truthy
- end
-
- it 'caches the value when ref exists but value is not cached' do
- subject.update!(ref_fetched: nil)
- allow_any_instance_of(Repository).to receive(:ref_exists?)
- .and_return(true)
-
- expect(subject.ref_fetched?).to be_truthy
- expect(subject.reload.ref_fetched).to be_truthy
- end
-
- it 'returns false when ref does not exist' do
- subject.update!(ref_fetched: nil)
- allow_any_instance_of(Repository).to receive(:ref_exists?)
- .and_return(false)
-
- expect(subject.ref_fetched?).to be_falsey
+ subject.fetch_ref!
+ expect(subject.target_project.repository.ref_exists?(subject.ref_path)).to be_truthy
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index e8588975118..0e50909988b 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -276,6 +276,12 @@ describe Project do
expect(project).to be_valid
end
+
+ it 'allows a path ending in a period' do
+ project = build(:project, path: 'foo.')
+
+ expect(project).to be_valid
+ end
end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index e0896d64c8f..d2f97009ad9 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -788,14 +788,16 @@ describe User do
end
it "creates external user by default" do
- user = build(:user)
+ user = create(:user)
expect(user.external).to be_truthy
+ expect(user.can_create_group).to be_falsey
+ expect(user.projects_limit).to be 0
end
describe 'with default overrides' do
it "creates a non-external user" do
- user = build(:user, external: false)
+ user = create(:user, external: false)
expect(user.external).to be_falsey
end
diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb
index 3b7b9c889e7..1765907c1b4 100644
--- a/spec/requests/api/jobs_spec.rb
+++ b/spec/requests/api/jobs_spec.rb
@@ -165,7 +165,17 @@ describe API::Jobs do
context 'authorized user' do
it 'returns specific job data' do
expect(response).to have_gitlab_http_status(200)
- expect(json_response['name']).to eq('test')
+ expect(json_response['id']).to eq(job.id)
+ expect(json_response['status']).to eq(job.status)
+ expect(json_response['stage']).to eq(job.stage)
+ expect(json_response['name']).to eq(job.name)
+ expect(json_response['ref']).to eq(job.ref)
+ expect(json_response['tag']).to eq(job.tag)
+ expect(json_response['coverage']).to eq(job.coverage)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(job.created_at)
+ expect(Time.parse(json_response['started_at'])).to be_like_time(job.started_at)
+ expect(Time.parse(json_response['finished_at'])).to be_like_time(job.finished_at)
+ expect(json_response['duration']).to eq(job.duration)
end
it 'returns pipeline data' do
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 024cfe8b372..e16be3c46e1 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -623,8 +623,6 @@ describe API::MergeRequests do
before do
forked_project.add_reporter(user2)
-
- allow_any_instance_of(MergeRequest).to receive(:write_ref)
end
it "returns merge_request" do
diff --git a/spec/requests/api/v3/merge_requests_spec.rb b/spec/requests/api/v3/merge_requests_spec.rb
index 26251b95680..91897e5ee01 100644
--- a/spec/requests/api/v3/merge_requests_spec.rb
+++ b/spec/requests/api/v3/merge_requests_spec.rb
@@ -319,8 +319,6 @@ describe API::MergeRequests do
before do
forked_project.add_reporter(user2)
-
- allow_any_instance_of(MergeRequest).to receive(:write_ref)
end
it "returns merge_request" do
diff --git a/spec/serializers/cluster_entity_spec.rb b/spec/serializers/cluster_entity_spec.rb
index 7b132a1b84d..72f02131211 100644
--- a/spec/serializers/cluster_entity_spec.rb
+++ b/spec/serializers/cluster_entity_spec.rb
@@ -8,7 +8,7 @@ describe ClusterEntity do
let(:cluster) { create(:cluster, provider_type: :gcp, provider_gcp: provider) }
context 'when status is creating' do
- let(:provider) { create(:provider_gcp, :creating) }
+ let(:provider) { create(:cluster_provider_gcp, :creating) }
it 'has corresponded data' do
expect(subject[:status]).to eq(:creating)
@@ -17,7 +17,7 @@ describe ClusterEntity do
end
context 'when status is errored' do
- let(:provider) { create(:provider_gcp, :errored) }
+ let(:provider) { create(:cluster_provider_gcp, :errored) }
it 'has corresponded data' do
expect(subject[:status]).to eq(:errored)
diff --git a/spec/serializers/cluster_serializer_spec.rb b/spec/serializers/cluster_serializer_spec.rb
index e5da92a451e..ff7d1789149 100644
--- a/spec/serializers/cluster_serializer_spec.rb
+++ b/spec/serializers/cluster_serializer_spec.rb
@@ -6,7 +6,7 @@ describe ClusterSerializer do
context 'when provider type is gcp' do
let(:cluster) { create(:cluster, provider_type: :gcp, provider_gcp: provider) }
- let(:provider) { create(:provider_gcp, :errored) }
+ let(:provider) { create(:cluster_provider_gcp, :errored) }
it 'serializes only status' do
expect(subject.keys).to contain_exactly(:status, :status_reason)
diff --git a/spec/services/clusters/create_service_spec.rb b/spec/services/clusters/create_service_spec.rb
index 9c2c288a2fa..5b6edb73beb 100644
--- a/spec/services/clusters/create_service_spec.rb
+++ b/spec/services/clusters/create_service_spec.rb
@@ -61,57 +61,4 @@ describe Clusters::CreateService do
end
end
end
-
- # TODO: This will be active in 10.3
- # context 'when provider is user' do
- # context 'when correct params' do
- # let(:params) do
- # {
- # name: 'test-cluster',
- # platform_type: :kubernetes,
- # provider_type: :user,
- # platform_kubernetes_attributes: {
- # namespace: 'custom-namespace',
- # api_url: 'https://111.111.111.111',
- # token: 'token'
- # }
- # }
- # end
-
- # it 'creates a cluster object and performs a worker' do
- # expect(ClusterProvisionWorker).to receive(:perform_async)
-
- # expect { result }
- # .to change { Clusters::Cluster.count }.by(1)
- # .and change { Clusters::Platforms::Kubernetes.count }.by(1)
-
- # expect(result.name).to eq('test-cluster')
- # expect(result.user).to eq(user)
- # expect(result.project).to eq(project)
- # expect(result.provider).to be_nil
- # expect(result.platform.namespace).to eq('custom-namespace')
- # end
- # end
-
- # context 'when invalid params' do
- # let(:params) do
- # {
- # name: 'test-cluster',
- # platform_type: :kubernetes,
- # provider_type: :user,
- # platform_kubernetes_attributes: {
- # namespace: 'custom-namespace',
- # api_url: '!!!!!',
- # token: 'token'
- # }
- # }
- # end
-
- # it 'returns an error' do
- # # expect(ClusterProvisionWorker).not_to receive(:perform_async)
- # expect { result }.to change { Clusters::Cluster.count }.by(0)
- # expect(result.errors[:"platform_kubernetes.api_url"]).to be_present
- # end
- # end
- # end
end
diff --git a/spec/services/clusters/gcp/fetch_operation_service_spec.rb b/spec/services/clusters/gcp/fetch_operation_service_spec.rb
index 20d46608033..e2fa93904c5 100644
--- a/spec/services/clusters/gcp/fetch_operation_service_spec.rb
+++ b/spec/services/clusters/gcp/fetch_operation_service_spec.rb
@@ -4,7 +4,7 @@ describe Clusters::Gcp::FetchOperationService do
include GoogleApi::CloudPlatformHelpers
describe '#execute' do
- let(:provider) { create(:provider_gcp, :creating) }
+ let(:provider) { create(:cluster_provider_gcp, :creating) }
let(:gcp_project_id) { provider.gcp_project_id }
let(:zone) { provider.zone }
let(:operation_id) { provider.operation_id }
diff --git a/spec/services/clusters/gcp/provision_service_spec.rb b/spec/services/clusters/gcp/provision_service_spec.rb
index f5f9d4800fd..f48afdc83b2 100644
--- a/spec/services/clusters/gcp/provision_service_spec.rb
+++ b/spec/services/clusters/gcp/provision_service_spec.rb
@@ -4,7 +4,7 @@ describe Clusters::Gcp::ProvisionService do
include GoogleApi::CloudPlatformHelpers
describe '#execute' do
- let(:provider) { create(:provider_gcp, :scheduled) }
+ let(:provider) { create(:cluster_provider_gcp, :scheduled) }
let(:gcp_project_id) { provider.gcp_project_id }
let(:zone) { provider.zone }
diff --git a/spec/services/clusters/gcp/verify_provision_status_service_spec.rb b/spec/services/clusters/gcp/verify_provision_status_service_spec.rb
index 666fcf13cac..2ee2fa51f63 100644
--- a/spec/services/clusters/gcp/verify_provision_status_service_spec.rb
+++ b/spec/services/clusters/gcp/verify_provision_status_service_spec.rb
@@ -4,7 +4,7 @@ describe Clusters::Gcp::VerifyProvisionStatusService do
include GoogleApi::CloudPlatformHelpers
describe '#execute' do
- let(:provider) { create(:provider_gcp, :creating) }
+ let(:provider) { create(:cluster_provider_gcp, :creating) }
let(:gcp_project_id) { provider.gcp_project_id }
let(:zone) { provider.zone }
let(:operation_id) { provider.operation_id }
diff --git a/spec/services/events/render_service_spec.rb b/spec/services/events/render_service_spec.rb
new file mode 100644
index 00000000000..b4a4a44d07b
--- /dev/null
+++ b/spec/services/events/render_service_spec.rb
@@ -0,0 +1,37 @@
+require 'spec_helper'
+
+describe Events::RenderService do
+ describe '#execute' do
+ let!(:note) { build(:note) }
+ let!(:event) { build(:event, target: note, project: note.project) }
+ let!(:user) { build(:user) }
+
+ context 'when the request format is atom' do
+ it 'renders the note inside events' do
+ expect(Banzai::ObjectRenderer).to receive(:new)
+ .with(event.project, user,
+ only_path: false,
+ xhtml: true)
+ .and_call_original
+
+ expect_any_instance_of(Banzai::ObjectRenderer)
+ .to receive(:render).with([note], :note)
+
+ described_class.new(user).execute([event], atom_request: true)
+ end
+ end
+
+ context 'when the request format is not atom' do
+ it 'renders the note inside events' do
+ expect(Banzai::ObjectRenderer).to receive(:new)
+ .with(event.project, user, {})
+ .and_call_original
+
+ expect_any_instance_of(Banzai::ObjectRenderer)
+ .to receive(:render).with([note], :note)
+
+ described_class.new(user).execute([event], atom_request: false)
+ end
+ end
+ end
+end
diff --git a/spec/services/notes/render_service_spec.rb b/spec/services/notes/render_service_spec.rb
new file mode 100644
index 00000000000..faac498037f
--- /dev/null
+++ b/spec/services/notes/render_service_spec.rb
@@ -0,0 +1,31 @@
+require 'spec_helper'
+
+describe Notes::RenderService do
+ describe '#execute' do
+ it 'renders a Note' do
+ note = double(:note)
+ project = double(:project)
+ wiki = double(:wiki)
+ user = double(:user)
+
+ expect(Banzai::ObjectRenderer).to receive(:new)
+ .with(project, user,
+ requested_path: 'foo',
+ project_wiki: wiki,
+ ref: 'bar',
+ only_path: nil,
+ xhtml: false)
+ .and_call_original
+
+ expect_any_instance_of(Banzai::ObjectRenderer)
+ .to receive(:render).with([note], :note)
+
+ described_class.new(user).execute([note], project,
+ requested_path: 'foo',
+ project_wiki: wiki,
+ ref: 'bar',
+ only_path: nil,
+ xhtml: false)
+ end
+ end
+end
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index a9b34a5258a..dc2673abc73 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -248,11 +248,11 @@ describe TodoService do
end
end
- describe '#destroy_issue' do
+ describe '#destroy_issuable' do
it 'refresh the todos count cache for the user' do
expect(john_doe).to receive(:update_todos_count_cache).and_call_original
- service.destroy_issue(issue, john_doe)
+ service.destroy_issuable(issue, john_doe)
end
end
@@ -643,14 +643,6 @@ describe TodoService do
end
end
- describe '#destroy_merge_request' do
- it 'refresh the todos count cache for the user' do
- expect(john_doe).to receive(:update_todos_count_cache).and_call_original
-
- service.destroy_merge_request(mr_assigned, john_doe)
- end
- end
-
describe '#reassigned_merge_request' do
it 'creates a pending todo for new assignee' do
mr_unassigned.update_attribute(:assignee, john_doe)
diff --git a/spec/support/google_api/cloud_platform_helpers.rb b/spec/support/google_api/cloud_platform_helpers.rb
index 4b785611ab5..dabf0db7666 100644
--- a/spec/support/google_api/cloud_platform_helpers.rb
+++ b/spec/support/google_api/cloud_platform_helpers.rb
@@ -71,15 +71,9 @@ module GoogleApi
"name": options[:name] || 'string',
"description": options[:description] || 'string',
"initialNodeCount": options[:initialNodeCount] || 'number',
- # "nodeConfig": {,
- # object(NodeConfig),
- # },,
"masterAuth": {
"username": options[:username] || 'string',
"password": options[:password] || 'string',
- # "clientCertificateConfig": {
- # object(ClientCertificateConfig)
- # },
"clusterCaCertificate": options[:clusterCaCertificate] || load_sample_cert,
"clientCertificate": options[:clientCertificate] || 'string',
"clientKey": options[:clientKey] || 'string'
@@ -88,36 +82,9 @@ module GoogleApi
"monitoringService": options[:monitoringService] || 'string',
"network": options[:network] || 'string',
"clusterIpv4Cidr": options[:clusterIpv4Cidr] || 'string',
- # "addonsConfig": {,
- # object(AddonsConfig),
- # },,
"subnetwork": options[:subnetwork] || 'string',
- # "nodePools": [,
- # {,
- # object(NodePool),
- # },
- # ],,
- # "locations": [,
- # string,
- # ],,
"enableKubernetesAlpha": options[:enableKubernetesAlpha] || 'boolean',
- # "resourceLabels": {,
- # string: string,,
- # ...,
- # },,
"labelFingerprint": options[:labelFingerprint] || 'string',
- # "legacyAbac": {,
- # object(LegacyAbac),
- # },
- # "networkPolicy": {,
- # object(NetworkPolicy),
- # },
- # "ipAllocationPolicy": {,
- # object(IPAllocationPolicy),
- # },
- # "masterAuthorizedNetworksConfig": {,
- # object(MasterAuthorizedNetworksConfig),
- # },
"selfLink": options[:selfLink] || 'string',
"zone": options[:zone] || 'string',
"endpoint": options[:endpoint] || 'string',
@@ -129,9 +96,6 @@ module GoogleApi
"statusMessage": options[:statusMessage] || 'string',
"nodeIpv4CidrSize": options[:nodeIpv4CidrSize] || 'number',
"servicesIpv4Cidr": options[:servicesIpv4Cidr] || 'string',
- # "instanceGroupUrls": [,
- # string,
- # ],,
"currentNodeCount": options[:currentNodeCount] || 'number',
"expireTime": options[:expireTime] || 'string'
}
diff --git a/spec/validators/dynamic_path_validator_spec.rb b/spec/validators/dynamic_path_validator_spec.rb
deleted file mode 100644
index 08e1c5a728a..00000000000
--- a/spec/validators/dynamic_path_validator_spec.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-require 'spec_helper'
-
-describe DynamicPathValidator do
- let(:validator) { described_class.new(attributes: [:path]) }
-
- def expect_handles_invalid_utf8
- expect { yield('\255invalid') }.to be_falsey
- end
-
- describe '.valid_user_path' do
- it 'handles invalid utf8' do
- expect(described_class.valid_user_path?("a\0weird\255path")).to be_falsey
- end
- end
-
- describe '.valid_group_path' do
- it 'handles invalid utf8' do
- expect(described_class.valid_group_path?("a\0weird\255path")).to be_falsey
- end
- end
-
- describe '.valid_project_path' do
- it 'handles invalid utf8' do
- expect(described_class.valid_project_path?("a\0weird\255path")).to be_falsey
- end
- end
-
- describe '#path_valid_for_record?' do
- context 'for project' do
- it 'calls valid_project_path?' do
- project = build(:project, path: 'activity')
-
- expect(described_class).to receive(:valid_project_path?).with(project.full_path).and_call_original
-
- expect(validator.path_valid_for_record?(project, 'activity')).to be_truthy
- end
- end
-
- context 'for group' do
- it 'calls valid_group_path?' do
- group = build(:group, :nested, path: 'activity')
-
- expect(described_class).to receive(:valid_group_path?).with(group.full_path).and_call_original
-
- expect(validator.path_valid_for_record?(group, 'activity')).to be_falsey
- end
- end
-
- context 'for user' do
- it 'calls valid_user_path?' do
- user = build(:user, username: 'activity')
-
- expect(described_class).to receive(:valid_user_path?).with(user.full_path).and_call_original
-
- expect(validator.path_valid_for_record?(user, 'activity')).to be_truthy
- end
- end
-
- context 'for user namespace' do
- it 'calls valid_user_path?' do
- user = create(:user, username: 'activity')
- namespace = user.namespace
-
- expect(described_class).to receive(:valid_user_path?).with(namespace.full_path).and_call_original
-
- expect(validator.path_valid_for_record?(namespace, 'activity')).to be_truthy
- end
- end
- end
-
- describe '#validates_each' do
- it 'adds a message when the path is not in the correct format' do
- group = build(:group)
-
- validator.validate_each(group, :path, "Path with spaces, and comma's!")
-
- expect(group.errors[:path]).to include(Gitlab::PathRegex.namespace_format_message)
- end
-
- it 'adds a message when the path is not in the correct format' do
- group = build(:group, path: 'users')
-
- validator.validate_each(group, :path, 'users')
-
- expect(group.errors[:path]).to include('users is a reserved name')
- end
-
- it 'updating to an invalid path is not allowed' do
- project = create(:project)
- project.path = 'update'
-
- validator.validate_each(project, :path, 'update')
-
- expect(project.errors[:path]).to include('update is a reserved name')
- end
- end
-end
diff --git a/spec/validators/namespace_path_validator_spec.rb b/spec/validators/namespace_path_validator_spec.rb
new file mode 100644
index 00000000000..61e2845f35f
--- /dev/null
+++ b/spec/validators/namespace_path_validator_spec.rb
@@ -0,0 +1,38 @@
+require 'spec_helper'
+
+describe NamespacePathValidator do
+ let(:validator) { described_class.new(attributes: [:path]) }
+
+ describe '.valid_path?' do
+ it 'handles invalid utf8' do
+ expect(described_class.valid_path?("a\0weird\255path")).to be_falsey
+ end
+ end
+
+ describe '#validates_each' do
+ it 'adds a message when the path is not in the correct format' do
+ group = build(:group)
+
+ validator.validate_each(group, :path, "Path with spaces, and comma's!")
+
+ expect(group.errors[:path]).to include(Gitlab::PathRegex.namespace_format_message)
+ end
+
+ it 'adds a message when the path is reserved when creating' do
+ group = build(:group, path: 'help')
+
+ validator.validate_each(group, :path, 'help')
+
+ expect(group.errors[:path]).to include('help is a reserved name')
+ end
+
+ it 'adds a message when the path is reserved when updating' do
+ group = create(:group)
+ group.path = 'help'
+
+ validator.validate_each(group, :path, 'help')
+
+ expect(group.errors[:path]).to include('help is a reserved name')
+ end
+ end
+end
diff --git a/spec/validators/project_path_validator_spec.rb b/spec/validators/project_path_validator_spec.rb
new file mode 100644
index 00000000000..8bb5e72dc22
--- /dev/null
+++ b/spec/validators/project_path_validator_spec.rb
@@ -0,0 +1,38 @@
+require 'spec_helper'
+
+describe ProjectPathValidator do
+ let(:validator) { described_class.new(attributes: [:path]) }
+
+ describe '.valid_path?' do
+ it 'handles invalid utf8' do
+ expect(described_class.valid_path?("a\0weird\255path")).to be_falsey
+ end
+ end
+
+ describe '#validates_each' do
+ it 'adds a message when the path is not in the correct format' do
+ project = build(:project)
+
+ validator.validate_each(project, :path, "Path with spaces, and comma's!")
+
+ expect(project.errors[:path]).to include(Gitlab::PathRegex.project_path_format_message)
+ end
+
+ it 'adds a message when the path is reserved when creating' do
+ project = build(:project, path: 'blob')
+
+ validator.validate_each(project, :path, 'blob')
+
+ expect(project.errors[:path]).to include('blob is a reserved name')
+ end
+
+ it 'adds a message when the path is reserved when updating' do
+ project = create(:project)
+ project.path = 'blob'
+
+ validator.validate_each(project, :path, 'blob')
+
+ expect(project.errors[:path]).to include('blob is a reserved name')
+ end
+ end
+end
diff --git a/spec/validators/user_path_validator_spec.rb b/spec/validators/user_path_validator_spec.rb
new file mode 100644
index 00000000000..a46089cc24f
--- /dev/null
+++ b/spec/validators/user_path_validator_spec.rb
@@ -0,0 +1,38 @@
+require 'spec_helper'
+
+describe UserPathValidator do
+ let(:validator) { described_class.new(attributes: [:username]) }
+
+ describe '.valid_path?' do
+ it 'handles invalid utf8' do
+ expect(described_class.valid_path?("a\0weird\255path")).to be_falsey
+ end
+ end
+
+ describe '#validates_each' do
+ it 'adds a message when the path is not in the correct format' do
+ user = build(:user)
+
+ validator.validate_each(user, :username, "Path with spaces, and comma's!")
+
+ expect(user.errors[:username]).to include(Gitlab::PathRegex.namespace_format_message)
+ end
+
+ it 'adds a message when the path is reserved when creating' do
+ user = build(:user, username: 'help')
+
+ validator.validate_each(user, :username, 'help')
+
+ expect(user.errors[:username]).to include('help is a reserved name')
+ end
+
+ it 'adds a message when the path is reserved when updating' do
+ user = create(:user)
+ user.username = 'help'
+
+ validator.validate_each(user, :username, 'help')
+
+ expect(user.errors[:username]).to include('help is a reserved name')
+ end
+ end
+end
diff --git a/spec/workers/cluster_provision_worker_spec.rb b/spec/workers/cluster_provision_worker_spec.rb
index 85c7dc20ede..8054ec11a48 100644
--- a/spec/workers/cluster_provision_worker_spec.rb
+++ b/spec/workers/cluster_provision_worker_spec.rb
@@ -4,7 +4,7 @@ describe ClusterProvisionWorker do
describe '#perform' do
context 'when provider type is gcp' do
let(:cluster) { create(:cluster, provider_type: :gcp, provider_gcp: provider) }
- let(:provider) { create(:provider_gcp, :scheduled) }
+ let(:provider) { create(:cluster_provider_gcp, :scheduled) }
it 'provision a cluster' do
expect_any_instance_of(Clusters::Gcp::ProvisionService).to receive(:execute)
diff --git a/spec/workers/wait_for_cluster_creation_worker_spec.rb b/spec/workers/wait_for_cluster_creation_worker_spec.rb
index 29812408396..0e92b298178 100644
--- a/spec/workers/wait_for_cluster_creation_worker_spec.rb
+++ b/spec/workers/wait_for_cluster_creation_worker_spec.rb
@@ -4,7 +4,7 @@ describe WaitForClusterCreationWorker do
describe '#perform' do
context 'when provider type is gcp' do
let(:cluster) { create(:cluster, provider_type: :gcp, provider_gcp: provider) }
- let(:provider) { create(:provider_gcp, :creating) }
+ let(:provider) { create(:cluster_provider_gcp, :creating) }
it 'provision a cluster' do
expect_any_instance_of(Clusters::Gcp::VerifyProvisionStatusService).to receive(:execute)
diff --git a/yarn.lock b/yarn.lock
index ee00c1f4f3e..bf92370d44f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2722,7 +2722,7 @@ getpass@^0.1.1:
"gitlab-svgs@https://gitlab.com/gitlab-org/gitlab-svgs.git":
version "1.0.4"
- resolved "https://gitlab.com/gitlab-org/gitlab-svgs.git#46c0a49cd43639948dfcc77a0f94d59deaad1e85"
+ resolved "https://gitlab.com/gitlab-org/gitlab-svgs.git#0442503549e6d74a4e22e1641e1d2ab0ae09884b"
glob-base@^0.3.0:
version "0.3.0"