summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue59
-rw-r--r--app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js3
-rw-r--r--app/assets/javascripts/jobs/components/stages_dropdown.vue11
-rw-r--r--app/assets/javascripts/pipelines/components/header_component.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_url.vue13
-rw-r--r--app/assets/javascripts/registry/components/table_registry.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_pipeline_link.vue32
-rw-r--r--app/assets/javascripts/vue_shared/components/header_ci_component.vue20
-rw-r--r--app/assets/stylesheets/framework/forms.scss16
-rw-r--r--app/controllers/projects/registry/tags_controller.rb2
-rw-r--r--app/graphql/types/issue_type.rb2
-rw-r--r--app/graphql/types/merge_request_type.rb2
-rw-r--r--app/graphql/types/task_completion_status.rb11
-rw-r--r--app/models/lfs_object.rb2
-rw-r--r--app/models/lfs_objects_project.rb8
-rw-r--r--app/models/project.rb20
-rw-r--r--app/models/project_services/data_fields.rb10
-rw-r--r--app/models/project_services/issue_tracker_data.rb25
-rw-r--r--app/models/project_services/jira_tracker_data.rb30
-rw-r--r--app/models/service.rb1
-rw-r--r--app/policies/base_policy.rb4
-rw-r--r--app/policies/global_policy.rb4
-rw-r--r--app/policies/project_policy.rb5
-rw-r--r--app/serializers/pipeline_entity.rb1
-rw-r--r--app/services/files/create_service.rb2
-rw-r--r--app/services/files/multi_service.rb2
-rw-r--r--app/services/lfs/file_transformer.rb16
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml2
-rw-r--r--app/views/projects/ci/builds/_build.html.haml5
-rw-r--r--app/views/projects/commit/_commit_box.html.haml2
-rw-r--r--changelogs/unreleased/30138-display-cycle-analytics-issue-logic-fixes.yml5
-rw-r--r--changelogs/unreleased/35428-docker-registry-date-not-accurate.yml6
-rw-r--r--changelogs/unreleased/57414-show-pipeline-iid.yml5
-rw-r--r--changelogs/unreleased/62910-task-completion-status-gql-pderichs.yml5
-rw-r--r--changelogs/unreleased/container-registry-api-perms-58271.yml5
-rw-r--r--changelogs/unreleased/error-pipelines-for-blocked-users.yml5
-rw-r--r--changelogs/unreleased/issue-58747.yml5
-rw-r--r--changelogs/unreleased/sh-fix-issue-63158.yml5
-rw-r--r--db/migrate/20190430131225_create_issue_tracker_data.rb23
-rw-r--r--db/migrate/20190430142025_create_jira_tracker_data.rb26
-rw-r--r--db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb11
-rw-r--r--db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb17
-rw-r--r--db/schema.rb33
-rw-r--r--doc/ci/merge_request_pipelines/img/merge_train_cancel.pngbin0 -> 19577 bytes
-rw-r--r--doc/ci/merge_request_pipelines/img/merge_train_config.pngbin0 -> 24267 bytes
-rw-r--r--doc/ci/merge_request_pipelines/img/merge_train_start.pngbin0 -> 8365 bytes
-rw-r--r--doc/ci/merge_request_pipelines/img/merge_train_start_when_pipeline_succeeds.pngbin0 -> 10323 bytes
-rw-r--r--doc/ci/merge_request_pipelines/index.md73
-rw-r--r--doc/development/testing_guide/end_to_end/quick_start_guide.md18
-rw-r--r--doc/user/project/clusters/serverless/index.md9
-rw-r--r--doc/user/project/web_ide/img/terminal_status.pngbin0 -> 8129 bytes
-rw-r--r--doc/user/project/web_ide/index.md59
-rw-r--r--lib/api/container_registry.rb6
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/matches.rb16
-rw-r--r--lib/gitlab/cycle_analytics/builds_event_helper.rb36
-rw-r--r--lib/gitlab/cycle_analytics/code_event_fetcher.rb2
-rw-r--r--lib/gitlab/cycle_analytics/code_helper.rb11
-rw-r--r--lib/gitlab/cycle_analytics/code_stage.rb2
-rw-r--r--lib/gitlab/cycle_analytics/issue_event_fetcher.rb2
-rw-r--r--lib/gitlab/cycle_analytics/issue_helper.rb17
-rw-r--r--lib/gitlab/cycle_analytics/issue_stage.rb2
-rw-r--r--lib/gitlab/cycle_analytics/plan_event_fetcher.rb54
-rw-r--r--lib/gitlab/cycle_analytics/plan_helper.rb18
-rw-r--r--lib/gitlab/cycle_analytics/plan_stage.rb4
-rw-r--r--lib/gitlab/cycle_analytics/production_event_fetcher.rb23
-rw-r--r--lib/gitlab/cycle_analytics/review_event_fetcher.rb2
-rw-r--r--lib/gitlab/cycle_analytics/review_helper.rb11
-rw-r--r--lib/gitlab/cycle_analytics/review_stage.rb2
-rw-r--r--lib/gitlab/cycle_analytics/staging_event_fetcher.rb30
-rw-r--r--lib/gitlab/cycle_analytics/staging_stage.rb1
-rw-r--r--lib/gitlab/cycle_analytics/test_event_fetcher.rb4
-rw-r--r--lib/gitlab/cycle_analytics/test_helper.rb21
-rw-r--r--lib/gitlab/cycle_analytics/test_stage.rb10
-rw-r--r--lib/gitlab/gpg/commit.rb19
-rw-r--r--lib/gitlab/visibility_level.rb13
-rw-r--r--locale/ar_SA/gitlab.po35
-rw-r--r--locale/bg/gitlab.po35
-rw-r--r--locale/bn_BD/gitlab.po35
-rw-r--r--locale/bn_IN/gitlab.po35
-rw-r--r--locale/ca_ES/gitlab.po35
-rw-r--r--locale/cs_CZ/gitlab.po35
-rw-r--r--locale/cy_GB/gitlab.po35
-rw-r--r--locale/da_DK/gitlab.po35
-rw-r--r--locale/de/gitlab.po35
-rw-r--r--locale/el_GR/gitlab.po35
-rw-r--r--locale/eo/gitlab.po35
-rw-r--r--locale/es/gitlab.po35
-rw-r--r--locale/et_EE/gitlab.po35
-rw-r--r--locale/fil_PH/gitlab.po35
-rw-r--r--locale/fr/gitlab.po35
-rw-r--r--locale/gitlab.pot18
-rw-r--r--locale/gl_ES/gitlab.po35
-rw-r--r--locale/he_IL/gitlab.po35
-rw-r--r--locale/hi_IN/gitlab.po35
-rw-r--r--locale/hr_HR/gitlab.po35
-rw-r--r--locale/hu_HU/gitlab.po35
-rw-r--r--locale/id_ID/gitlab.po35
-rw-r--r--locale/it/gitlab.po35
-rw-r--r--locale/ja/gitlab.po57
-rw-r--r--locale/ka_GE/gitlab.po35
-rw-r--r--locale/ko/gitlab.po35
-rw-r--r--locale/mn_MN/gitlab.po35
-rw-r--r--locale/nb_NO/gitlab.po35
-rw-r--r--locale/nl_NL/gitlab.po35
-rw-r--r--locale/pa_IN/gitlab.po35
-rw-r--r--locale/pl_PL/gitlab.po35
-rw-r--r--locale/pt_BR/gitlab.po35
-rw-r--r--locale/pt_PT/gitlab.po35
-rw-r--r--locale/ro_RO/gitlab.po35
-rw-r--r--locale/ru/gitlab.po35
-rw-r--r--locale/sk_SK/gitlab.po35
-rw-r--r--locale/sq_AL/gitlab.po35
-rw-r--r--locale/sr_CS/gitlab.po35
-rw-r--r--locale/sr_SP/gitlab.po35
-rw-r--r--locale/sv_SE/gitlab.po35
-rw-r--r--locale/sw_KE/gitlab.po35
-rw-r--r--locale/tr_TR/gitlab.po35
-rw-r--r--locale/uk/gitlab.po65
-rw-r--r--locale/zh_CN/gitlab.po35
-rw-r--r--locale/zh_HK/gitlab.po35
-rw-r--r--locale/zh_TW/gitlab.po35
-rw-r--r--spec/db/schema_spec.rb1
-rw-r--r--spec/factories/lfs_objects_projects.rb1
-rw-r--r--spec/factories/services_data.rb18
-rw-r--r--spec/factories/users.rb10
-rw-r--r--spec/features/commits_spec.rb6
-rw-r--r--spec/features/cycle_analytics_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb10
-rw-r--r--spec/features/projects/commits/user_browses_commits_spec.rb2
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb6
-rw-r--r--spec/features/projects/jobs_spec.rb2
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb39
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb2
-rw-r--r--spec/finders/pipelines_finder_spec.rb5
-rw-r--r--spec/javascripts/fixtures/pipelines.rb2
-rw-r--r--spec/javascripts/jobs/components/stages_dropdown_spec.js21
-rw-r--r--spec/javascripts/jobs/mock_data.js1
-rw-r--r--spec/javascripts/pipelines/mock_data.js1
-rw-r--r--spec/javascripts/pipelines/pipeline_url_spec.js5
-rw-r--r--spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js28
-rw-r--r--spec/javascripts/vue_mr_widget/mock_data.js5
-rw-r--r--spec/javascripts/vue_mr_widget/mr_widget_options_spec.js2
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/build_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb57
-rw-r--r--spec/lib/gitlab/cycle_analytics/code_stage_spec.rb36
-rw-r--r--spec/lib/gitlab/cycle_analytics/events_spec.rb31
-rw-r--r--spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb31
-rw-r--r--spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb31
-rw-r--r--spec/lib/gitlab/cycle_analytics/review_stage_spec.rb37
-rw-r--r--spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb2
-rw-r--r--spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb41
-rw-r--r--spec/lib/gitlab/gpg/commit_spec.rb83
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml2
-rw-r--r--spec/models/ci/pipeline_spec.rb2
-rw-r--r--spec/models/lfs_object_spec.rb14
-rw-r--r--spec/models/lfs_objects_project_spec.rb4
-rw-r--r--spec/models/project_services/hipchat_service_spec.rb2
-rw-r--r--spec/models/project_services/issue_tracker_data_spec.rb35
-rw-r--r--spec/models/project_services/jira_tracker_data_spec.rb42
-rw-r--r--spec/models/project_spec.rb31
-rw-r--r--spec/models/service_spec.rb2
-rw-r--r--spec/policies/project_policy_spec.rb2
-rw-r--r--spec/requests/api/container_registry_spec.rb6
-rw-r--r--spec/requests/api/graphql/tasks/task_completion_status_spec.rb60
-rw-r--r--spec/requests/projects/cycle_analytics_events_spec.rb4
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb12
-rw-r--r--spec/services/ci/play_build_service_spec.rb37
-rw-r--r--spec/services/lfs/file_transformer_spec.rb60
-rw-r--r--spec/services/notification_service_spec.rb6
-rw-r--r--spec/services/projects/create_service_spec.rb27
-rw-r--r--spec/support/helpers/graphql_helpers.rb2
-rw-r--r--spec/support/helpers/query_recorder.rb2
-rw-r--r--spec/views/notify/pipeline_failed_email.html.haml_spec.rb2
-rw-r--r--spec/views/notify/pipeline_failed_email.text.erb_spec.rb2
-rw-r--r--spec/views/notify/pipeline_success_email.html.haml_spec.rb2
-rw-r--r--spec/views/projects/commit/_commit_box.html.haml_spec.rb4
-rw-r--r--spec/views/projects/jobs/_build.html.haml_spec.rb10
-rw-r--r--spec/workers/auto_devops/disable_worker_spec.rb3
181 files changed, 2960 insertions, 537 deletions
diff --git a/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue b/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue
deleted file mode 100644
index 6c256fa6736..00000000000
--- a/app/assets/javascripts/cycle_analytics/components/stage_plan_component.vue
+++ /dev/null
@@ -1,59 +0,0 @@
-<script>
-import userAvatarImage from '../../vue_shared/components/user_avatar/user_avatar_image.vue';
-import iconCommit from '../svg/icon_commit.svg';
-import limitWarning from './limit_warning_component.vue';
-import totalTime from './total_time_component.vue';
-
-export default {
- components: {
- userAvatarImage,
- totalTime,
- limitWarning,
- },
- props: {
- items: {
- type: Array,
- default: () => [],
- },
- stage: {
- type: Object,
- default: () => ({}),
- },
- },
- computed: {
- iconCommit() {
- return iconCommit;
- },
- },
-};
-</script>
-<template>
- <div>
- <div class="events-description">
- {{ stage.description }}
- <limit-warning :count="items.length" />
- </div>
- <ul class="stage-event-list">
- <li v-for="(commit, i) in items" :key="i" class="stage-event-item">
- <div class="item-details item-conmmit-component">
- <!-- FIXME: Pass an alt attribute here for accessibility -->
- <user-avatar-image :img-src="commit.author.avatarUrl" />
- <h5 class="item-title commit-title">
- <a :href="commit.commitUrl"> {{ commit.title }} </a>
- </h5>
- <span>
- {{ s__('FirstPushedBy|First') }} <span class="commit-icon" v-html="iconCommit"> </span>
- <a :href="commit.commitUrl" class="commit-hash-link commit-sha">{{
- commit.shortSha
- }}</a>
- {{ s__('FirstPushedBy|pushed by') }}
- <a :href="commit.author.webUrl" class="commit-author-link">
- {{ commit.author.name }}
- </a>
- </span>
- </div>
- <div class="item-time"><total-time :time="commit.totalTime" /></div>
- </li>
- </ul>
- </div>
-</template>
diff --git a/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js b/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js
index 3f0a9f2602c..b56e08175cc 100644
--- a/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js
+++ b/app/assets/javascripts/cycle_analytics/cycle_analytics_bundle.js
@@ -5,7 +5,6 @@ import Flash from '../flash';
import Translate from '../vue_shared/translate';
import banner from './components/banner.vue';
import stageCodeComponent from './components/stage_code_component.vue';
-import stagePlanComponent from './components/stage_plan_component.vue';
import stageComponent from './components/stage_component.vue';
import stageReviewComponent from './components/stage_review_component.vue';
import stageStagingComponent from './components/stage_staging_component.vue';
@@ -26,7 +25,7 @@ export default () => {
components: {
banner,
'stage-issue-component': stageComponent,
- 'stage-plan-component': stagePlanComponent,
+ 'stage-plan-component': stageComponent,
'stage-code-component': stageCodeComponent,
'stage-test-component': stageTestComponent,
'stage-review-component': stageReviewComponent,
diff --git a/app/assets/javascripts/jobs/components/stages_dropdown.vue b/app/assets/javascripts/jobs/components/stages_dropdown.vue
index cb073a9b04d..6e92b599b0a 100644
--- a/app/assets/javascripts/jobs/components/stages_dropdown.vue
+++ b/app/assets/javascripts/jobs/components/stages_dropdown.vue
@@ -2,7 +2,6 @@
import _ from 'underscore';
import { GlLink } from '@gitlab/ui';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import PipelineLink from '~/vue_shared/components/ci_pipeline_link.vue';
import Icon from '~/vue_shared/components/icon.vue';
export default {
@@ -10,7 +9,6 @@ export default {
CiIcon,
Icon,
GlLink,
- PipelineLink,
},
props: {
pipeline: {
@@ -50,12 +48,9 @@ export default {
<ci-icon :status="pipeline.details.status" class="vertical-align-middle" />
<span class="font-weight-bold">{{ s__('Job|Pipeline') }}</span>
- <pipeline-link
- :href="pipeline.path"
- :pipeline-id="pipeline.id"
- :pipeline-iid="pipeline.iid"
- class="js-pipeline-path link-commit qa-pipeline-path"
- />
+ <gl-link :href="pipeline.path" class="js-pipeline-path link-commit qa-pipeline-path"
+ >#{{ pipeline.id }}</gl-link
+ >
<template v-if="hasRef">
{{ s__('Job|for') }}
diff --git a/app/assets/javascripts/pipelines/components/header_component.vue b/app/assets/javascripts/pipelines/components/header_component.vue
index f3a71ee434c..b2e365e5cde 100644
--- a/app/assets/javascripts/pipelines/components/header_component.vue
+++ b/app/assets/javascripts/pipelines/components/header_component.vue
@@ -83,8 +83,6 @@ export default {
v-if="shouldRenderContent"
:status="status"
:item-id="pipeline.id"
- :item-iid="pipeline.iid"
- :item-id-tooltip="__('Pipeline ID (IID)')"
:time="pipeline.created_at"
:user="pipeline.user"
:actions="actions"
diff --git a/app/assets/javascripts/pipelines/components/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipeline_url.vue
index 00c02e15562..c41ecab1294 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_url.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_url.vue
@@ -2,7 +2,6 @@
import { GlLink, GlTooltipDirective } from '@gitlab/ui';
import _ from 'underscore';
import { __, sprintf } from '~/locale';
-import PipelineLink from '~/vue_shared/components/ci_pipeline_link.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import popover from '~/vue_shared/directives/popover';
@@ -20,7 +19,6 @@ export default {
components: {
UserAvatarLink,
GlLink,
- PipelineLink,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -61,13 +59,10 @@ export default {
};
</script>
<template>
- <div class="table-section section-10 d-none d-sm-none d-md-block pipeline-tags section-wrap">
- <pipeline-link
- :href="pipeline.path"
- :pipeline-id="pipeline.id"
- :pipeline-iid="pipeline.iid"
- class="js-pipeline-url-link"
- />
+ <div class="table-section section-10 d-none d-sm-none d-md-block pipeline-tags">
+ <gl-link :href="pipeline.path" class="js-pipeline-url-link">
+ <span class="pipeline-id">#{{ pipeline.id }}</span>
+ </gl-link>
<div class="label-container">
<span
v-if="pipeline.flags.latest"
diff --git a/app/assets/javascripts/registry/components/table_registry.vue b/app/assets/javascripts/registry/components/table_registry.vue
index 1e4dfe76b26..f535b2ae9f2 100644
--- a/app/assets/javascripts/registry/components/table_registry.vue
+++ b/app/assets/javascripts/registry/components/table_registry.vue
@@ -64,7 +64,7 @@ export default {
<th>{{ s__('ContainerRegistry|Tag') }}</th>
<th>{{ s__('ContainerRegistry|Tag ID') }}</th>
<th>{{ s__('ContainerRegistry|Size') }}</th>
- <th>{{ s__('ContainerRegistry|Created') }}</th>
+ <th>{{ s__('ContainerRegistry|Last Updated') }}</th>
<th></th>
</tr>
</thead>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
index c377c16fb13..f5fa68308bc 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
@@ -5,7 +5,6 @@ import { sprintf, __ } from '~/locale';
import PipelineStage from '~/pipelines/components/stage.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import Icon from '~/vue_shared/components/icon.vue';
-import PipelineLink from '~/vue_shared/components/ci_pipeline_link.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
import mrWidgetPipelineMixin from 'ee_else_ce/vue_merge_request_widget/mixins/mr_widget_pipeline';
@@ -17,7 +16,6 @@ export default {
Icon,
TooltipOnTruncate,
GlLink,
- PipelineLink,
LinkedPipelinesMiniList: () =>
import('ee_component/vue_shared/components/linked_pipelines_mini_list.vue'),
},
@@ -114,12 +112,9 @@ export default {
<div class="media-body">
<div class="font-weight-bold js-pipeline-info-container">
{{ s__('Pipeline|Pipeline') }}
- <pipeline-link
- :href="pipeline.path"
- :pipeline-id="pipeline.id"
- :pipeline-iid="pipeline.iid"
- class="pipeline-id pipeline-iid font-weight-normal"
- />
+ <gl-link :href="pipeline.path" class="pipeline-id font-weight-normal pipeline-number"
+ >#{{ pipeline.id }}</gl-link
+ >
{{ pipeline.details.status.label }}
<template v-if="hasCommitInfo">
{{ s__('Pipeline|for') }}
diff --git a/app/assets/javascripts/vue_shared/components/ci_pipeline_link.vue b/app/assets/javascripts/vue_shared/components/ci_pipeline_link.vue
deleted file mode 100644
index eae4c06467c..00000000000
--- a/app/assets/javascripts/vue_shared/components/ci_pipeline_link.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-<script>
-import { GlLink, GlTooltipDirective } from '@gitlab/ui';
-
-export default {
- components: {
- GlLink,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- props: {
- href: {
- type: String,
- required: true,
- },
- pipelineId: {
- type: Number,
- required: true,
- },
- pipelineIid: {
- type: Number,
- required: true,
- },
- },
-};
-</script>
-<template>
- <gl-link v-gl-tooltip :href="href" :title="__('Pipeline ID (IID)')">
- <span class="pipeline-id">#{{ pipelineId }}</span>
- <span class="pipeline-iid">(#{{ pipelineIid }})</span>
- </gl-link>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/header_ci_component.vue b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
index 0bac63b1062..3f45dc7853b 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -37,16 +37,6 @@ export default {
type: Number,
required: true,
},
- itemIid: {
- type: Number,
- required: false,
- default: null,
- },
- itemIdTooltip: {
- type: String,
- required: false,
- default: '',
- },
time: {
type: String,
required: true,
@@ -95,12 +85,7 @@ export default {
<section class="header-main-content">
<ci-icon-badge :status="status" />
- <strong v-gl-tooltip :title="itemIdTooltip">
- {{ itemName }} #{{ itemId }}
- <template v-if="itemIid"
- >(#{{ itemIid }})</template
- >
- </strong>
+ <strong> {{ itemName }} #{{ itemId }} </strong>
<template v-if="shouldRenderTriggeredLabel">
triggered
@@ -111,8 +96,9 @@ export default {
<timeago-tooltip :time="time" />
+ by
+
<template v-if="user">
- by
<gl-link
v-gl-tooltip
:href="user.path"
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index 2a601afff53..821e6691fe4 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -248,14 +248,24 @@ label {
.gl-form-checkbox {
align-items: baseline;
+ margin-right: 1rem;
+ margin-bottom: 0.25rem;
+
+ .form-check-input {
+ margin-right: 0;
+ }
+
+ .form-check-label {
+ padding-left: $gl-padding-8;
+ }
&.form-check-inline .form-check-input {
align-self: flex-start;
- margin-right: $gl-padding-8;
height: 1.5 * $gl-font-size;
}
- .help-text {
- margin-bottom: 0;
+ .form-check-input:disabled,
+ .form-check-input:disabled ~ .form-check-label {
+ cursor: not-allowed;
}
}
diff --git a/app/controllers/projects/registry/tags_controller.rb b/app/controllers/projects/registry/tags_controller.rb
index 567d750caae..bf1d8d8b5fc 100644
--- a/app/controllers/projects/registry/tags_controller.rb
+++ b/app/controllers/projects/registry/tags_controller.rb
@@ -3,7 +3,7 @@
module Projects
module Registry
class TagsController < ::Projects::Registry::ApplicationController
- before_action :authorize_update_container_image!, only: [:destroy]
+ before_action :authorize_destroy_container_image!, only: [:destroy]
def index
respond_to do |format|
diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb
index c762aa69e43..f2365499eee 100644
--- a/app/graphql/types/issue_type.rb
+++ b/app/graphql/types/issue_type.rb
@@ -51,5 +51,7 @@ module Types
field :created_at, Types::TimeType, null: false
field :updated_at, Types::TimeType, null: false
+
+ field :task_completion_status, Types::TaskCompletionStatus, null: false
end
end
diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb
index 662503d447b..dac4c24cf10 100644
--- a/app/graphql/types/merge_request_type.rb
+++ b/app/graphql/types/merge_request_type.rb
@@ -55,5 +55,7 @@ module Types
field :head_pipeline, Types::Ci::PipelineType, null: true, method: :actual_head_pipeline
field :pipelines, Types::Ci::PipelineType.connection_type,
resolver: Resolvers::MergeRequestPipelinesResolver
+
+ field :task_completion_status, Types::TaskCompletionStatus, null: false
end
end
diff --git a/app/graphql/types/task_completion_status.rb b/app/graphql/types/task_completion_status.rb
new file mode 100644
index 00000000000..c289802509d
--- /dev/null
+++ b/app/graphql/types/task_completion_status.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Types
+ class TaskCompletionStatus < BaseObject
+ graphql_name 'TaskCompletionStatus'
+ description 'Completion status of tasks'
+
+ field :count, GraphQL::INT_TYPE, null: false
+ field :completed_count, GraphQL::INT_TYPE, null: false
+ end
+end
diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb
index 5245dbc8d15..79a376ff0fd 100644
--- a/app/models/lfs_object.rb
+++ b/app/models/lfs_object.rb
@@ -5,7 +5,7 @@ class LfsObject < ApplicationRecord
include ObjectStorage::BackgroundMove
has_many :lfs_objects_projects, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
- has_many :projects, through: :lfs_objects_projects
+ has_many :projects, -> { distinct }, through: :lfs_objects_projects
scope :with_files_stored_locally, -> { where(file_store: LfsObjectUploader::Store::LOCAL) }
diff --git a/app/models/lfs_objects_project.rb b/app/models/lfs_objects_project.rb
index f9afb18c1d7..e45c56b6394 100644
--- a/app/models/lfs_objects_project.rb
+++ b/app/models/lfs_objects_project.rb
@@ -5,11 +5,17 @@ class LfsObjectsProject < ApplicationRecord
belongs_to :lfs_object
validates :lfs_object_id, presence: true
- validates :lfs_object_id, uniqueness: { scope: [:project_id], message: "already exists in project" }
+ validates :lfs_object_id, uniqueness: { scope: [:project_id, :repository_type], message: "already exists in repository" }
validates :project_id, presence: true
after_commit :update_project_statistics, on: [:create, :destroy]
+ enum repository_type: {
+ project: 0,
+ wiki: 1,
+ design: 2 ## EE-specific
+ }
+
private
def update_project_statistics
diff --git a/app/models/project.rb b/app/models/project.rb
index 9d17d68eee2..351d08eaf63 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -72,7 +72,6 @@ class Project < ApplicationRecord
delegate :no_import?, to: :import_state, allow_nil: true
default_value_for :archived, false
- default_value_for(:visibility_level) { Gitlab::CurrentSettings.default_project_visibility }
default_value_for :resolve_outdated_diff_discussions, false
default_value_for :container_registry_enabled, gitlab_config_features.container_registry
default_value_for(:repository_storage) { Gitlab::CurrentSettings.pick_repository_storage }
@@ -223,7 +222,7 @@ class Project < ApplicationRecord
has_many :starrers, through: :users_star_projects, source: :user
has_many :releases
has_many :lfs_objects_projects, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
- has_many :lfs_objects, through: :lfs_objects_projects
+ has_many :lfs_objects, -> { distinct }, through: :lfs_objects_projects
has_many :lfs_file_locks
has_many :project_group_links
has_many :invited_groups, through: :project_group_links, source: :group
@@ -613,6 +612,23 @@ class Project < ApplicationRecord
end
end
+ def initialize(attributes = {})
+ # We can't use default_value_for because the database has a default
+ # value of 0 for visibility_level. If someone attempts to create a
+ # private project, default_value_for will assume that the
+ # visibility_level hasn't changed and will use the application
+ # setting default, which could be internal or public. For projects
+ # inside a private group, those levels are invalid.
+ #
+ # To fix the problem, we assign the actual default in the application if
+ # no explicit visibility has been initialized.
+ unless visibility_attribute_present?(attributes)
+ attributes[:visibility_level] = Gitlab::CurrentSettings.default_project_visibility
+ end
+
+ super
+ end
+
def all_pipelines
if builds_enabled?
super
diff --git a/app/models/project_services/data_fields.rb b/app/models/project_services/data_fields.rb
new file mode 100644
index 00000000000..438d85098c8
--- /dev/null
+++ b/app/models/project_services/data_fields.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module DataFields
+ extend ActiveSupport::Concern
+
+ included do
+ has_one :issue_tracker_data
+ has_one :jira_tracker_data
+ end
+end
diff --git a/app/models/project_services/issue_tracker_data.rb b/app/models/project_services/issue_tracker_data.rb
new file mode 100644
index 00000000000..2c1d28ed421
--- /dev/null
+++ b/app/models/project_services/issue_tracker_data.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class IssueTrackerData < ApplicationRecord
+ belongs_to :service
+
+ delegate :activated?, to: :service, allow_nil: true
+
+ validates :service, presence: true
+ validates :project_url, presence: true, public_url: { enforce_sanitization: true }, if: :activated?
+ validates :issues_url, presence: true, public_url: { enforce_sanitization: true }, if: :activated?
+ validates :new_issue_url, public_url: { enforce_sanitization: true }, if: :activated?
+
+ def self.encryption_options
+ {
+ key: Settings.attr_encrypted_db_key_base_32,
+ encode: true,
+ mode: :per_attribute_iv,
+ algorithm: 'aes-256-gcm'
+ }
+ end
+
+ attr_encrypted :project_url, encryption_options
+ attr_encrypted :issues_url, encryption_options
+ attr_encrypted :new_issue_url, encryption_options
+end
diff --git a/app/models/project_services/jira_tracker_data.rb b/app/models/project_services/jira_tracker_data.rb
new file mode 100644
index 00000000000..4f528e3d81b
--- /dev/null
+++ b/app/models/project_services/jira_tracker_data.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class JiraTrackerData < ApplicationRecord
+ belongs_to :service
+
+ delegate :activated?, to: :service, allow_nil: true
+
+ validates :service, presence: true
+ validates :url, public_url: { enforce_sanitization: true }, presence: true, if: :activated?
+ validates :api_url, public_url: { enforce_sanitization: true }, allow_blank: true
+ validates :username, presence: true, if: :activated?
+ validates :password, presence: true, if: :activated?
+ validates :jira_issue_transition_id,
+ format: { with: Gitlab::Regex.jira_transition_id_regex, message: s_("JiraService|transition ids can have only numbers which can be split with , or ;") },
+ allow_blank: true
+
+ def self.encryption_options
+ {
+ key: Settings.attr_encrypted_db_key_base_32,
+ encode: true,
+ mode: :per_attribute_iv,
+ algorithm: 'aes-256-gcm'
+ }
+ end
+
+ attr_encrypted :url, encryption_options
+ attr_encrypted :api_url, encryption_options
+ attr_encrypted :username, encryption_options
+ attr_encrypted :password, encryption_options
+end
diff --git a/app/models/service.rb b/app/models/service.rb
index 9896aa12e90..16fbe6648cc 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -6,6 +6,7 @@ class Service < ApplicationRecord
include Sortable
include Importable
include ProjectServicesLoggable
+ include DataFields
serialize :properties, JSON # rubocop:disable Cop/ActiveRecordSerialize
diff --git a/app/policies/base_policy.rb b/app/policies/base_policy.rb
index 5dd2279ef99..82bf9bf8bf6 100644
--- a/app/policies/base_policy.rb
+++ b/app/policies/base_policy.rb
@@ -7,6 +7,10 @@ class BasePolicy < DeclarativePolicy::Base
with_options scope: :user, score: 0
condition(:admin) { @user&.admin? }
+ desc "User is blocked"
+ with_options scope: :user, score: 0
+ condition(:blocked) { @user&.blocked? }
+
desc "User has access to all private groups & projects"
with_options scope: :user, score: 0
condition(:full_private_access) { @user&.full_private_access? }
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index e85397422e6..134de1c9ace 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -1,10 +1,6 @@
# frozen_string_literal: true
class GlobalPolicy < BasePolicy
- desc "User is blocked"
- with_options scope: :user, score: 0
- condition(:blocked) { @user&.blocked? }
-
desc "User is an internal user"
with_options scope: :user, score: 0
condition(:internal) { @user&.internal? }
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 728a3040227..b3e29e775fc 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -258,6 +258,7 @@ class ProjectPolicy < BasePolicy
enable :resolve_note
enable :create_container_image
enable :update_container_image
+ enable :destroy_container_image
enable :create_environment
enable :create_deployment
enable :create_release
@@ -446,6 +447,10 @@ class ProjectPolicy < BasePolicy
prevent :owner_access
end
+ rule { blocked }.policy do
+ prevent :create_pipeline
+ end
+
private
def team_member?
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb
index ec2698ecbe3..9ef93b2387f 100644
--- a/app/serializers/pipeline_entity.rb
+++ b/app/serializers/pipeline_entity.rb
@@ -4,7 +4,6 @@ class PipelineEntity < Grape::Entity
include RequestAwareEntity
expose :id
- expose :iid
expose :user, using: UserEntity
expose :active?, as: :active
diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb
index fd5442a6c28..f2cd51ef4d0 100644
--- a/app/services/files/create_service.rb
+++ b/app/services/files/create_service.rb
@@ -3,7 +3,7 @@
module Files
class CreateService < Files::BaseService
def create_commit!
- transformer = Lfs::FileTransformer.new(project, @branch_name)
+ transformer = Lfs::FileTransformer.new(project, repository, @branch_name)
result = transformer.new_file(@file_path, @file_content)
diff --git a/app/services/files/multi_service.rb b/app/services/files/multi_service.rb
index c1bc26c330a..d8c4e5bc5e8 100644
--- a/app/services/files/multi_service.rb
+++ b/app/services/files/multi_service.rb
@@ -5,7 +5,7 @@ module Files
UPDATE_FILE_ACTIONS = %w(update move delete chmod).freeze
def create_commit!
- transformer = Lfs::FileTransformer.new(project, @branch_name)
+ transformer = Lfs::FileTransformer.new(project, repository, @branch_name)
actions = actions_after_lfs_transformation(transformer, params[:actions])
actions = transform_move_actions(actions)
diff --git a/app/services/lfs/file_transformer.rb b/app/services/lfs/file_transformer.rb
index 5239fe1b6e3..d1746399908 100644
--- a/app/services/lfs/file_transformer.rb
+++ b/app/services/lfs/file_transformer.rb
@@ -8,17 +8,17 @@ module Lfs
# pointer returned. If the file isn't in LFS the untransformed content
# is returned to save in the commit.
#
- # transformer = Lfs::FileTransformer.new(project, @branch_name)
+ # transformer = Lfs::FileTransformer.new(project, repository, @branch_name)
# content_or_lfs_pointer = transformer.new_file(file_path, content).content
# create_transformed_commit(content_or_lfs_pointer)
#
class FileTransformer
- attr_reader :project, :branch_name
+ attr_reader :project, :repository, :repository_type, :branch_name
- delegate :repository, to: :project
-
- def initialize(project, branch_name)
+ def initialize(project, repository, branch_name)
@project = project
+ @repository = repository
+ @repository_type = repository.repo_type.name
@branch_name = branch_name
end
@@ -64,7 +64,11 @@ module Lfs
# rubocop: enable CodeReuse/ActiveRecord
def link_lfs_object!(lfs_object)
- project.lfs_objects << lfs_object
+ LfsObjectsProject.safe_find_or_create_by!(
+ project: project,
+ lfs_object: lfs_object,
+ repository_type: repository_type
+ )
end
def parse_file_content(file_content, encoding: nil)
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index db24c9982f7..a2aa1687f80 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -13,6 +13,8 @@
.settings-content
= render 'ci_cd'
+= render_if_exists 'admin/application_settings/required_instance_ci_setting', expanded: expanded_by_default?
+
- if Gitlab.config.registry.enabled
%section.settings.as-registry.no-animate#js-registry-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml
index bdf7b933ab8..f4560404c03 100644
--- a/app/views/projects/ci/builds/_build.html.haml
+++ b/app/views/projects/ci/builds/_build.html.haml
@@ -53,10 +53,9 @@
%span.badge.badge-info= _('manual')
- if pipeline_link
- %td.pipeline-link
- = link_to pipeline_path(pipeline), class: 'has-tooltip', title: _('Pipeline ID (IID)') do
+ %td
+ = link_to pipeline_path(pipeline) do
%span.pipeline-id ##{pipeline.id}
- %span.pipeline-iid (##{pipeline.iid})
%span by
- if pipeline.user
= user_avatar(user: pipeline.user, size: 20)
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index 77ea2c04b28..a766dd51463 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -81,7 +81,7 @@
= link_to project_pipeline_path(@project, last_pipeline.id), class: "ci-status-icon-#{last_pipeline.status}" do
= ci_icon_for_status(last_pipeline.status)
#{ _('Pipeline') }
- = link_to "##{last_pipeline.id} (##{last_pipeline.iid})", project_pipeline_path(@project, last_pipeline.id), class: "has-tooltip", title: _('Pipeline ID (IID)')
+ = link_to "##{last_pipeline.id}", project_pipeline_path(@project, last_pipeline.id)
= ci_label_for_status(last_pipeline.status)
- if last_pipeline.stages_count.nonzero?
#{ n_(s_('Pipeline|with stage'), s_('Pipeline|with stages'), last_pipeline.stages_count) }
diff --git a/changelogs/unreleased/30138-display-cycle-analytics-issue-logic-fixes.yml b/changelogs/unreleased/30138-display-cycle-analytics-issue-logic-fixes.yml
new file mode 100644
index 00000000000..574995f20fa
--- /dev/null
+++ b/changelogs/unreleased/30138-display-cycle-analytics-issue-logic-fixes.yml
@@ -0,0 +1,5 @@
+---
+title: Change logic behind cycle analytics
+merge_request: 29018
+author:
+type: changed
diff --git a/changelogs/unreleased/35428-docker-registry-date-not-accurate.yml b/changelogs/unreleased/35428-docker-registry-date-not-accurate.yml
new file mode 100644
index 00000000000..f51ecdf83a6
--- /dev/null
+++ b/changelogs/unreleased/35428-docker-registry-date-not-accurate.yml
@@ -0,0 +1,6 @@
+---
+title: Changed the 'Created' label to 'Last Updated' on the container registry table
+ to more accurately reflect what the date represents.
+merge_request: 29464
+author:
+type: other
diff --git a/changelogs/unreleased/57414-show-pipeline-iid.yml b/changelogs/unreleased/57414-show-pipeline-iid.yml
deleted file mode 100644
index 596ae00e5a3..00000000000
--- a/changelogs/unreleased/57414-show-pipeline-iid.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Show Pipeline IID everywhere Pipeline ID is shown
-merge_request: 57414
-author: Mike Scott
-type: added
diff --git a/changelogs/unreleased/62910-task-completion-status-gql-pderichs.yml b/changelogs/unreleased/62910-task-completion-status-gql-pderichs.yml
new file mode 100644
index 00000000000..dcbfa7c185d
--- /dev/null
+++ b/changelogs/unreleased/62910-task-completion-status-gql-pderichs.yml
@@ -0,0 +1,5 @@
+---
+title: Make task completion status available via GraphQL
+merge_request:
+author:
+type: added
diff --git a/changelogs/unreleased/container-registry-api-perms-58271.yml b/changelogs/unreleased/container-registry-api-perms-58271.yml
new file mode 100644
index 00000000000..0d1036a7788
--- /dev/null
+++ b/changelogs/unreleased/container-registry-api-perms-58271.yml
@@ -0,0 +1,5 @@
+---
+title: Allow developer role to delete docker tags via container registry API
+merge_request: 29512
+author:
+type: fixed
diff --git a/changelogs/unreleased/error-pipelines-for-blocked-users.yml b/changelogs/unreleased/error-pipelines-for-blocked-users.yml
new file mode 100644
index 00000000000..3ace28b6cfd
--- /dev/null
+++ b/changelogs/unreleased/error-pipelines-for-blocked-users.yml
@@ -0,0 +1,5 @@
+---
+title: preventing blocked users and their PipelineSchdules from creating new Pipelines
+merge_request: 27318
+author:
+type: fixed
diff --git a/changelogs/unreleased/issue-58747.yml b/changelogs/unreleased/issue-58747.yml
new file mode 100644
index 00000000000..01b610576f7
--- /dev/null
+++ b/changelogs/unreleased/issue-58747.yml
@@ -0,0 +1,5 @@
+---
+title: Fix GPG signature verification with recent GnuPG versions
+merge_request: 29388
+author: David Palubin
+type: fixed
diff --git a/changelogs/unreleased/sh-fix-issue-63158.yml b/changelogs/unreleased/sh-fix-issue-63158.yml
new file mode 100644
index 00000000000..1a79166b6a2
--- /dev/null
+++ b/changelogs/unreleased/sh-fix-issue-63158.yml
@@ -0,0 +1,5 @@
+---
+title: Fix inability to set visibility_level on project via API
+merge_request: 29578
+author:
+type: fixed
diff --git a/db/migrate/20190430131225_create_issue_tracker_data.rb b/db/migrate/20190430131225_create_issue_tracker_data.rb
new file mode 100644
index 00000000000..7859bea9c22
--- /dev/null
+++ b/db/migrate/20190430131225_create_issue_tracker_data.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class CreateIssueTrackerData < ActiveRecord::Migration[5.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table :issue_tracker_data do |t|
+ t.references :service, foreign_key: { on_delete: :cascade }, type: :integer, index: true, null: false
+ t.timestamps_with_timezone
+ t.string :encrypted_project_url
+ t.string :encrypted_project_url_iv
+ t.string :encrypted_issues_url
+ t.string :encrypted_issues_url_iv
+ t.string :encrypted_new_issue_url
+ t.string :encrypted_new_issue_url_iv
+ end
+ end
+end
diff --git a/db/migrate/20190430142025_create_jira_tracker_data.rb b/db/migrate/20190430142025_create_jira_tracker_data.rb
new file mode 100644
index 00000000000..d328ad63854
--- /dev/null
+++ b/db/migrate/20190430142025_create_jira_tracker_data.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class CreateJiraTrackerData < ActiveRecord::Migration[5.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table :jira_tracker_data do |t|
+ t.references :service, foreign_key: { on_delete: :cascade }, type: :integer, index: true, null: false
+ t.timestamps_with_timezone
+ t.string :encrypted_url
+ t.string :encrypted_url_iv
+ t.string :encrypted_api_url
+ t.string :encrypted_api_url_iv
+ t.string :encrypted_username
+ t.string :encrypted_username_iv
+ t.string :encrypted_password
+ t.string :encrypted_password_iv
+ t.string :jira_issue_transition_id
+ end
+ end
+end
diff --git a/db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb b/db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb
new file mode 100644
index 00000000000..6ff64ba12a9
--- /dev/null
+++ b/db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddRepositoryTypeToLfsObjectsProject < ActiveRecord::Migration[5.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ add_column :lfs_objects_projects, :repository_type, :integer, limit: 2, null: true
+ end
+end
diff --git a/db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb b/db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb
new file mode 100644
index 00000000000..fc09fcfae0f
--- /dev/null
+++ b/db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddLfsObjectIdIndexToLfsObjectsProjects < ActiveRecord::Migration[5.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :lfs_objects_projects, :lfs_object_id
+ end
+
+ def down
+ remove_concurrent_index :lfs_objects_projects, :lfs_object_id
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 4ed7c0cb248..db1ef81ede6 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1068,6 +1068,19 @@ ActiveRecord::Schema.define(version: 20190611161641) do
t.index ["issue_id"], name: "index_issue_metrics", using: :btree
end
+ create_table "issue_tracker_data", force: :cascade do |t|
+ t.integer "service_id", null: false
+ t.datetime_with_timezone "created_at", null: false
+ t.datetime_with_timezone "updated_at", null: false
+ t.string "encrypted_project_url"
+ t.string "encrypted_project_url_iv"
+ t.string "encrypted_issues_url"
+ t.string "encrypted_issues_url_iv"
+ t.string "encrypted_new_issue_url"
+ t.string "encrypted_new_issue_url_iv"
+ t.index ["service_id"], name: "index_issue_tracker_data_on_service_id", using: :btree
+ end
+
create_table "issues", id: :serial, force: :cascade do |t|
t.string "title"
t.integer "author_id"
@@ -1111,6 +1124,22 @@ ActiveRecord::Schema.define(version: 20190611161641) do
t.index ["updated_by_id"], name: "index_issues_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree
end
+ create_table "jira_tracker_data", force: :cascade do |t|
+ t.integer "service_id", null: false
+ t.datetime_with_timezone "created_at", null: false
+ t.datetime_with_timezone "updated_at", null: false
+ t.string "encrypted_url"
+ t.string "encrypted_url_iv"
+ t.string "encrypted_api_url"
+ t.string "encrypted_api_url_iv"
+ t.string "encrypted_username"
+ t.string "encrypted_username_iv"
+ t.string "encrypted_password"
+ t.string "encrypted_password_iv"
+ t.string "jira_issue_transition_id"
+ t.index ["service_id"], name: "index_jira_tracker_data_on_service_id", using: :btree
+ end
+
create_table "keys", id: :serial, force: :cascade do |t|
t.integer "user_id"
t.datetime "created_at"
@@ -1190,6 +1219,8 @@ ActiveRecord::Schema.define(version: 20190611161641) do
t.integer "project_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
+ t.integer "repository_type", limit: 2
+ t.index ["lfs_object_id"], name: "index_lfs_objects_projects_on_lfs_object_id", using: :btree
t.index ["project_id"], name: "index_lfs_objects_projects_on_project_id", using: :btree
end
@@ -2537,12 +2568,14 @@ ActiveRecord::Schema.define(version: 20190611161641) do
add_foreign_key "issue_assignees", "issues", name: "fk_b7d881734a", on_delete: :cascade
add_foreign_key "issue_assignees", "users", name: "fk_5e0c8d9154", on_delete: :cascade
add_foreign_key "issue_metrics", "issues", on_delete: :cascade
+ add_foreign_key "issue_tracker_data", "services", on_delete: :cascade
add_foreign_key "issues", "issues", column: "moved_to_id", name: "fk_a194299be1", on_delete: :nullify
add_foreign_key "issues", "milestones", name: "fk_96b1dd429c", on_delete: :nullify
add_foreign_key "issues", "projects", name: "fk_899c8f3231", on_delete: :cascade
add_foreign_key "issues", "users", column: "author_id", name: "fk_05f1e72feb", on_delete: :nullify
add_foreign_key "issues", "users", column: "closed_by_id", name: "fk_c63cbf6c25", on_delete: :nullify
add_foreign_key "issues", "users", column: "updated_by_id", name: "fk_ffed080f01", on_delete: :nullify
+ add_foreign_key "jira_tracker_data", "services", on_delete: :cascade
add_foreign_key "label_links", "labels", name: "fk_d97dd08678", on_delete: :cascade
add_foreign_key "label_priorities", "labels", on_delete: :cascade
add_foreign_key "label_priorities", "projects", on_delete: :cascade
diff --git a/doc/ci/merge_request_pipelines/img/merge_train_cancel.png b/doc/ci/merge_request_pipelines/img/merge_train_cancel.png
new file mode 100644
index 00000000000..1561fdcc7a5
--- /dev/null
+++ b/doc/ci/merge_request_pipelines/img/merge_train_cancel.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/img/merge_train_config.png b/doc/ci/merge_request_pipelines/img/merge_train_config.png
new file mode 100644
index 00000000000..fb0af43556e
--- /dev/null
+++ b/doc/ci/merge_request_pipelines/img/merge_train_config.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/img/merge_train_start.png b/doc/ci/merge_request_pipelines/img/merge_train_start.png
new file mode 100644
index 00000000000..f20108157d2
--- /dev/null
+++ b/doc/ci/merge_request_pipelines/img/merge_train_start.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/img/merge_train_start_when_pipeline_succeeds.png b/doc/ci/merge_request_pipelines/img/merge_train_start_when_pipeline_succeeds.png
new file mode 100644
index 00000000000..62c2f2f5ff5
--- /dev/null
+++ b/doc/ci/merge_request_pipelines/img/merge_train_start_when_pipeline_succeeds.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/index.md b/doc/ci/merge_request_pipelines/index.md
index fe2fc790505..d8c1cefc8df 100644
--- a/doc/ci/merge_request_pipelines/index.md
+++ b/doc/ci/merge_request_pipelines/index.md
@@ -74,7 +74,7 @@ when a merge request was created or updated. For example:
## Pipelines for Merged Results **[PREMIUM]**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/7380) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10.
-> This feature is disabled by default until we resolve issues with [contention handling](https://gitlab.com/gitlab-org/gitlab-ee/issues/9186), but [can be enabled manually](#enabling-pipelines-for-merged-results).
+> This feature is disabled by default until we resolve issues with [contention handling](https://gitlab.com/gitlab-org/gitlab-ee/issues/11222), but [can be enabled manually](#enabling-pipelines-for-merged-results).
It's possible for your source and target branches to diverge, which can result
in the scenario that source branch's pipeline was green, the target's pipeline was green,
@@ -118,10 +118,79 @@ otherwise pipelines for merged results won't run and your merge requests will be
- This feature requires [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) 11.9 or newer.
- This feature requires [Gitaly](https://gitlab.com/gitlab-org/gitaly) 1.21.0 or newer.
-- After the merge request pipeline succeeds, if the target branch has moved forward, the result of the pipeline is stale and must be retried. In busy repos, this can become a problem as it is highly probable that the target branch will have moved ahead. Improvements are [planned](https://gitlab.com/gitlab-org/gitlab-ee/issues/9186) for future versions of GitLab.
- Forking/cross-repo workflows are not currently supported. To follow progress, see [#9713](https://gitlab.com/gitlab-org/gitlab-ee/issues/9713).
- This feature is not available for [fast forward merges](../../user/project/merge_requests/fast_forward_merge.md) yet. To follow progress, see [#58226](https://gitlab.com/gitlab-org/gitlab-ce/issues/58226).
+## Merge Trains **[PREMIUM]**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9186) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.0.
+> This feature is disabled by default until we resolve issues with [contention handling](https://gitlab.com/gitlab-org/gitlab-ee/issues/11222), but [can be enabled manually](#enabling-merge-trains).
+
+[Pipelines for merged results](#pipelines-for-merged-results-premium) introduces
+running a build on the result of the merged code prior to merging, as a way to keep master green.
+There's a scenario, however, for teams with a high number of changes in the target branch (typically master) where in many or even all cases,
+by the time the merged code is validated another commit has made it to master, invalidating the merged result.
+You'd need some kind of queuing, cancellation or retry mechanism for these scenarios
+in order to ensure an orderly flow of changes into the target branch.
+
+Each MR that joins a merge train joins as the last item in the train,
+just as it works in the current state. However, instead of queuing and waiting,
+each item takes the completed state of the previous (pending) merge ref, adds its own changes,
+and starts the pipeline immediately in parallel under the assumption that everything is going to pass.
+In this way, if all the pipelines in the train merge successfully, no pipeline time is wasted either queuing or retrying.
+If the button is subsequently pressed in a different MR, instead of creating a new pipeline for the target branch,
+it creates a new pipeline targeting the merge result of the previous MR plus the target branch.
+Pipelines invalidated through failures are immediately canceled and requeued.
+
+CAUTION: **Warning:**
+At this moment, each merge train can generate a merge ref and run a pipeline **one at a time** due to a technical challenge.
+We have [an issue](https://gitlab.com/gitlab-org/gitlab-ee/issues/11222) to tackle this problem to make the pipelines for merged results run in parallel.
+
+### Enabling Merge Trains
+
+To enable merge trains at the project level:
+
+1. Visit your project's **Settings > General** and expand **Merge requests**.
+1. Check **Allow merge trains**.
+1. Click **Save changes** button.
+
+![Merge request pipeline config](img/merge_train_config.png)
+
+CAUTION: **Warning:**
+This feature requires [Pipelines for merged results](#pipelines-for-merged-results-premium) to be **configured properly**.
+
+### How to add a merge request to a merge train
+
+To add a merge request to a merge train:
+
+1. Click "Start/Add merge train" button in a merge request
+
+![Start merge train](img/merge_train_start.png)
+
+### How to remove a merge request from a merge train
+
+1. Click "Remove from merge train" button in the merge request widget.
+
+![Cancel merge train](img/merge_train_cancel.png)
+
+### Tips: Start/Add to merge train when pipeline succeeds
+
+You can add a merge request to a merge train only when the latest pipeline in the
+merge request finished. While the pipeline is running or pending, you cannot add
+the merge request to a train because the current change of the merge request may
+be broken thus it could affect the following merge requests.
+
+In this case, you can schedule to add the merge request to a merge train **when the latest
+pipeline succeeds**. You can see the following button instead of the regular "Start/Add merge train"
+button while the latest pipeline is running.
+
+![Add to merge train when pipeline succeeds](img/merge_train_start_when_pipeline_succeeds.png)
+
+### Merge Train's limitations
+
+- At this moment, each merge train can generate a merge ref and run a pipeline **one at a time** due to a technical challenge.
+ We have [an issue](https://gitlab.com/gitlab-org/gitlab-ee/issues/11222) to tackle this problem to make the pipelines for merged results run in parallel.
+
## Excluding certain jobs
The behavior of the `only: merge_requests` parameter is such that _only_ jobs with
diff --git a/doc/development/testing_guide/end_to_end/quick_start_guide.md b/doc/development/testing_guide/end_to_end/quick_start_guide.md
index 11375b9b489..d33ef0fc229 100644
--- a/doc/development/testing_guide/end_to_end/quick_start_guide.md
+++ b/doc/development/testing_guide/end_to_end/quick_start_guide.md
@@ -548,15 +548,27 @@ Now let's change the view and the `dropdowns_helper` files to add the selectors
In the [app/views/shared/issuable/_sidebar.html.haml](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/app/views/shared/issuable/_sidebar.html.haml) file, on [line 105 ](https://gitlab.com/gitlab-org/gitlab-ee/blob/84043fa72ca7f83ae9cde48ad670e6d5d16501a3/app/views/shared/issuable/_sidebar.html.haml#L105), add an extra class `qa-edit-link-labels`.
-The code should look like this: `= link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right qa-edit-link-labels'`.
+The code should look like this:
+
+```haml
+= link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right qa-edit-link-labels'
+```
In the same file, on [line 121](https://gitlab.com/gitlab-org/gitlab-ee/blob/84043fa72ca7f83ae9cde48ad670e6d5d16501a3/app/views/shared/issuable/_sidebar.html.haml#L121), add an extra class `.qa-dropdown-menu-labels`.
-The code should look like this: `.dropdown-menu.dropdown-select.dropdown-menu-paging.dropdown-menu-labels.dropdown-menu-selectable.qa-dropdown-menu-labels`.
+The code should look like this:
+
+```haml
+.dropdown-menu.dropdown-select.dropdown-menu-paging.dropdown-menu-labels.dropdown-menu-selectable.qa-dropdown-menu-labels
+```
In the [`dropdowns_helper.rb`](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/app/helpers/dropdowns_helper.rb) file, on [line 94](https://gitlab.com/gitlab-org/gitlab-ee/blob/99e51a374f2c20bee0989cac802e4b5621f72714/app/helpers/dropdowns_helper.rb#L94), add an extra class `qa-dropdown-input-field`.
-The code should look like this: `filter_output = search_field_tag search_id, nil, class: "dropdown-input-field qa-dropdown-input-field", placeholder: placeholder, autocomplete: 'off'`.
+The code should look like this:
+
+```ruby
+filter_output = search_field_tag search_id, nil, class: "dropdown-input-field qa-dropdown-input-field", placeholder: placeholder, autocomplete: 'off'
+```
> Classes starting with `qa-` are used for testing purposes only, and by defining such classes in the elements we add **testability** in the application.
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index 2cda850f24e..0ab6d8e112f 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -83,6 +83,15 @@ NOTE: **Note:**
You can deploy either [functions](#deploying-functions) or [serverless applications](#deploying-serverless-applications)
on a given project but not both. The current implementation makes use of a `serverless.yml` file to signal a FaaS project.
+## Using an existing installation of Knative
+
+NOTE: **Note:**
+The "invocations" monitoring feature of GitLab serverless will not work when adding an existing installation of Knative.
+
+It is also possible to use GitLab Serverless with an existing Kubernetes cluster which already has Knative installed.
+Simply follow the steps to [add an existing Kubernetes cluster](../index.md#adding-an-existing-kubernetes-cluster)
+and then follow the steps to deploy [functions](#deploying-functions) or [serverless applications](#deploying-serverless-applications) onto your cluster.
+
## Deploying functions
> Introduced in GitLab 11.6.
diff --git a/doc/user/project/web_ide/img/terminal_status.png b/doc/user/project/web_ide/img/terminal_status.png
new file mode 100644
index 00000000000..c37aa02b07a
--- /dev/null
+++ b/doc/user/project/web_ide/img/terminal_status.png
Binary files differ
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index a634a8b2f54..ef4eb45de66 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -231,6 +231,65 @@ While the terminal is running, it can be stopped by clicking **Stop Terminal**.
This will disconnect the terminal and stop the runner's terminal job. From here,
click **Restart Terminal** to start a new terminal session.
+### File Syncing to Web Terminal
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/5276) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
+
+File changes in the Web IDE can be synced to a running Web Terminal.
+This enables users to test their code changes in a preconfigured terminal
+environment.
+
+NOTE: **Note:**
+Only file changes in the Web IDE are synced to the terminal.
+Changes made in the terminal are **not** synced to the Web IDE.
+
+Once you have [configured the Web Terminal for File Syncing](#configuring-file-syncing),
+then when the Web terminal is started, a **Terminal** status will be visible
+in the status bar.
+
+![Web IDE Client Side Evaluation](img/terminal_status.png)
+
+Changes made to your files via the Web IDE will sync to the running terminal
+when:
+
+- <kbd>Ctrl</kbd> + <kbd>S</kbd> (or <kbd>Cmd</kbd> + <kbd>S</kbd> on Mac)
+ is pressed while editing a file.
+- Anything outside the file editor is clicked after editing a file.
+- A file or folder is created, deleted, or renamed.
+
+### Configuring File Syncing
+
+NOTE: **Note:**
+This feature is only available for Kubernetes runners.
+
+To enable file syncing to the Web Terminal, the `.gitlab/.gitlab-webide.yml`
+file needs to have a `webide-file-sync` service configured. Here is an example
+configuration for a Node JS project which uses this service:
+
+```yaml
+terminal:
+ # This can be any image that has the necessary runtime environment for your project.
+ image:
+ name: node:10-alpine
+ services:
+ - name: registry.gitlab.com/gitlab-org/webide-file-sync:latest
+ alias: webide-file-sync
+ entrypoint: ["/bin/sh"]
+ command: ["-c", "sleep 5 && ./webide-file-sync -project-dir $CI_PROJECT_DIR"]
+ ports:
+ # The `webide-file-sync` executable defaults to port 3000.
+ - number: 3000
+```
+
+> **Notes:**
+> - For now, the `webide-file-sync` executable must start **after** the project
+> directory is available. This is why we need to add `sleep 5` to the `command`.
+> See [this issue](https://gitlab.com/gitlab-org/webide-file-sync/issues/7) for
+> more info.
+> - `$CI_PROJECT_DIR` is a
+> [predefined environment variable](../../../ci/variables/predefined_variables.md)
+> for GitLab Runners. This is where your project's repository will be.
+
### Limitations
Interactive Terminals is in a beta phase and will continue to be improved upon in upcoming
diff --git a/lib/api/container_registry.rb b/lib/api/container_registry.rb
index e4493910196..7d9b5e1a598 100644
--- a/lib/api/container_registry.rb
+++ b/lib/api/container_registry.rb
@@ -115,12 +115,8 @@ module API
authorize! :read_container_image, repository
end
- def authorize_update_container_image!
- authorize! :update_container_image, repository
- end
-
def authorize_destroy_container_image!
- authorize! :admin_container_image, repository
+ authorize! :destroy_container_image, repository
end
def authorize_admin_container_image!
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb b/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb
index d7f47c0e7e6..942e4e55323 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb
@@ -13,16 +13,6 @@ module Gitlab
regexp = @right.evaluate(variables)
regexp.scan(text.to_s).any?
-
- if ci_variables_complex_expressions?
- # return offset of first match, or nil if no matches
- if match = regexp.scan(text.to_s).first
- text.to_s.index(match)
- end
- else
- # return true or false
- regexp.scan(text.to_s).any?
- end
end
def self.build(_value, behind, ahead)
@@ -32,12 +22,6 @@ module Gitlab
def self.precedence
10 # See: https://ruby-doc.org/core-2.5.0/doc/syntax/precedence_rdoc.html
end
-
- private
-
- def ci_variables_complex_expressions?
- Feature.enabled?(:ci_variables_complex_expressions)
- end
end
end
end
diff --git a/lib/gitlab/cycle_analytics/builds_event_helper.rb b/lib/gitlab/cycle_analytics/builds_event_helper.rb
new file mode 100644
index 00000000000..0d6f32fdc6f
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/builds_event_helper.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module BuildsEventHelper
+ def initialize(*args)
+ @projections = [build_table[:id]]
+ @order = build_table[:created_at]
+
+ super(*args)
+ end
+
+ def fetch
+ Updater.update!(event_result, from: 'id', to: 'build', klass: ::Ci::Build)
+
+ super
+ end
+
+ def events_query
+ base_query.join(build_table).on(mr_metrics_table[:pipeline_id].eq(build_table[:commit_id]))
+
+ super
+ end
+
+ private
+
+ def allowed_ids
+ nil
+ end
+
+ def serialize(event)
+ AnalyticsBuildSerializer.new.represent(event['build'])
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/code_event_fetcher.rb b/lib/gitlab/cycle_analytics/code_event_fetcher.rb
index 591db3c35e6..6c348f1862d 100644
--- a/lib/gitlab/cycle_analytics/code_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/code_event_fetcher.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class CodeEventFetcher < BaseEventFetcher
+ include CodeHelper
+
def initialize(*args)
@projections = [mr_table[:title],
mr_table[:iid],
diff --git a/lib/gitlab/cycle_analytics/code_helper.rb b/lib/gitlab/cycle_analytics/code_helper.rb
new file mode 100644
index 00000000000..8f28bdd2502
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/code_helper.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module CodeHelper
+ def stage_query(project_ids)
+ super(project_ids).where(mr_table[:created_at].gteq(issue_metrics_table[:first_mentioned_in_commit_at]))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/code_stage.rb b/lib/gitlab/cycle_analytics/code_stage.rb
index 2e5f9ef5a40..89a6430221c 100644
--- a/lib/gitlab/cycle_analytics/code_stage.rb
+++ b/lib/gitlab/cycle_analytics/code_stage.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class CodeStage < BaseStage
+ include CodeHelper
+
def start_time_attrs
@start_time_attrs ||= issue_metrics_table[:first_mentioned_in_commit_at]
end
diff --git a/lib/gitlab/cycle_analytics/issue_event_fetcher.rb b/lib/gitlab/cycle_analytics/issue_event_fetcher.rb
index 30c6ead8968..8a870f2e2a3 100644
--- a/lib/gitlab/cycle_analytics/issue_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/issue_event_fetcher.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class IssueEventFetcher < BaseEventFetcher
+ include IssueHelper
+
def initialize(*args)
@projections = [issue_table[:title],
issue_table[:iid],
diff --git a/lib/gitlab/cycle_analytics/issue_helper.rb b/lib/gitlab/cycle_analytics/issue_helper.rb
new file mode 100644
index 00000000000..c9266341378
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/issue_helper.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module IssueHelper
+ def stage_query(project_ids)
+ query = issue_table.join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id]))
+ .project(issue_table[:project_id].as("project_id"))
+ .where(issue_table[:project_id].in(project_ids))
+ .where(issue_table[:created_at].gteq(@options[:from])) # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ .where(issue_metrics_table[:first_added_to_board_at].not_eq(nil).or(issue_metrics_table[:first_associated_with_milestone_at].not_eq(nil)))
+
+ query
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/issue_stage.rb b/lib/gitlab/cycle_analytics/issue_stage.rb
index 4eae2da512c..738cb3eba03 100644
--- a/lib/gitlab/cycle_analytics/issue_stage.rb
+++ b/lib/gitlab/cycle_analytics/issue_stage.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class IssueStage < BaseStage
+ include IssueHelper
+
def start_time_attrs
@start_time_attrs ||= issue_table[:created_at]
end
diff --git a/lib/gitlab/cycle_analytics/plan_event_fetcher.rb b/lib/gitlab/cycle_analytics/plan_event_fetcher.rb
index aeca9d00156..d924f956dcd 100644
--- a/lib/gitlab/cycle_analytics/plan_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/plan_event_fetcher.rb
@@ -3,60 +3,26 @@
module Gitlab
module CycleAnalytics
class PlanEventFetcher < BaseEventFetcher
+ include PlanHelper
+
def initialize(*args)
- @projections = [mr_diff_table[:id],
- issue_metrics_table[:first_mentioned_in_commit_at]]
+ @projections = [issue_table[:title],
+ issue_table[:iid],
+ issue_table[:id],
+ issue_table[:created_at],
+ issue_table[:author_id]]
super(*args)
end
- def events_query
- base_query
- .join(mr_diff_table)
- .on(mr_diff_table[:merge_request_id].eq(mr_table[:id]))
-
- super
- end
-
private
- def allowed_ids
- nil
- end
-
- def merge_request_diff_commits
- @merge_request_diff_commits ||=
- MergeRequestDiffCommit
- .where(merge_request_diff_id: event_result.map { |event| event['id'] })
- .group_by(&:merge_request_diff_id)
- end
-
def serialize(event)
- commit = first_time_reference_commit(event)
-
- return unless commit
-
- serialize_commit(event, commit, query)
- end
-
- def first_time_reference_commit(event)
- return unless event && merge_request_diff_commits
-
- commits = merge_request_diff_commits[event['id'].to_i]
-
- return if commits.blank?
-
- commits.find do |commit|
- next unless commit[:committed_date] && event['first_mentioned_in_commit_at']
-
- commit[:committed_date].to_i == DateTime.parse(event['first_mentioned_in_commit_at'].to_s).to_i
- end
+ AnalyticsIssueSerializer.new(project: @project).represent(event)
end
- def serialize_commit(event, commit, query)
- commit = Commit.from_hash(commit.to_hash, @project)
-
- AnalyticsCommitSerializer.new(project: @project, total_time: event['total_time']).represent(commit)
+ def allowed_ids_finder_class
+ IssuesFinder
end
end
end
diff --git a/lib/gitlab/cycle_analytics/plan_helper.rb b/lib/gitlab/cycle_analytics/plan_helper.rb
new file mode 100644
index 00000000000..30fc2ce6d40
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/plan_helper.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module PlanHelper
+ def stage_query(project_ids)
+ query = issue_table.join(issue_metrics_table).on(issue_table[:id].eq(issue_metrics_table[:issue_id]))
+ .project(issue_table[:project_id].as("project_id"))
+ .where(issue_table[:project_id].in(project_ids))
+ .where(issue_table[:created_at].gteq(@options[:from])) # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ .where(issue_metrics_table[:first_added_to_board_at].not_eq(nil).or(issue_metrics_table[:first_associated_with_milestone_at].not_eq(nil)))
+ .where(issue_metrics_table[:first_mentioned_in_commit_at].not_eq(nil))
+
+ query
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/plan_stage.rb b/lib/gitlab/cycle_analytics/plan_stage.rb
index 513e4575be0..0b27d114f52 100644
--- a/lib/gitlab/cycle_analytics/plan_stage.rb
+++ b/lib/gitlab/cycle_analytics/plan_stage.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class PlanStage < BaseStage
+ include PlanHelper
+
def start_time_attrs
@start_time_attrs ||= [issue_metrics_table[:first_associated_with_milestone_at],
issue_metrics_table[:first_added_to_board_at]]
@@ -21,7 +23,7 @@ module Gitlab
end
def legend
- _("Related Commits")
+ _("Related Issues")
end
def description
diff --git a/lib/gitlab/cycle_analytics/production_event_fetcher.rb b/lib/gitlab/cycle_analytics/production_event_fetcher.rb
index 6681cb42c90..6bcbe0412a9 100644
--- a/lib/gitlab/cycle_analytics/production_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/production_event_fetcher.rb
@@ -2,7 +2,28 @@
module Gitlab
module CycleAnalytics
- class ProductionEventFetcher < IssueEventFetcher
+ class ProductionEventFetcher < BaseEventFetcher
+ include ProductionHelper
+
+ def initialize(*args)
+ @projections = [issue_table[:title],
+ issue_table[:iid],
+ issue_table[:id],
+ issue_table[:created_at],
+ issue_table[:author_id]]
+
+ super(*args)
+ end
+
+ private
+
+ def serialize(event)
+ AnalyticsIssueSerializer.new(project: @project).represent(event)
+ end
+
+ def allowed_ids_finder_class
+ IssuesFinder
+ end
end
end
end
diff --git a/lib/gitlab/cycle_analytics/review_event_fetcher.rb b/lib/gitlab/cycle_analytics/review_event_fetcher.rb
index de100295281..b6354b5ffad 100644
--- a/lib/gitlab/cycle_analytics/review_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/review_event_fetcher.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class ReviewEventFetcher < BaseEventFetcher
+ include ReviewHelper
+
def initialize(*args)
@projections = [mr_table[:title],
mr_table[:iid],
diff --git a/lib/gitlab/cycle_analytics/review_helper.rb b/lib/gitlab/cycle_analytics/review_helper.rb
new file mode 100644
index 00000000000..c53249652b5
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/review_helper.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module ReviewHelper
+ def stage_query(project_ids)
+ super(project_ids).where(mr_metrics_table[:merged_at].not_eq(nil))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/review_stage.rb b/lib/gitlab/cycle_analytics/review_stage.rb
index 294b656bc55..e9df8cd5a05 100644
--- a/lib/gitlab/cycle_analytics/review_stage.rb
+++ b/lib/gitlab/cycle_analytics/review_stage.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class ReviewStage < BaseStage
+ include ReviewHelper
+
def start_time_attrs
@start_time_attrs ||= mr_table[:created_at]
end
diff --git a/lib/gitlab/cycle_analytics/staging_event_fetcher.rb b/lib/gitlab/cycle_analytics/staging_event_fetcher.rb
index 70ce82383b3..1454a1a33eb 100644
--- a/lib/gitlab/cycle_analytics/staging_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/staging_event_fetcher.rb
@@ -3,34 +3,8 @@
module Gitlab
module CycleAnalytics
class StagingEventFetcher < BaseEventFetcher
- def initialize(*args)
- @projections = [build_table[:id]]
- @order = build_table[:created_at]
-
- super(*args)
- end
-
- def fetch
- Updater.update!(event_result, from: 'id', to: 'build', klass: ::Ci::Build)
-
- super
- end
-
- def events_query
- base_query.join(build_table).on(mr_metrics_table[:pipeline_id].eq(build_table[:commit_id]))
-
- super
- end
-
- private
-
- def allowed_ids
- nil
- end
-
- def serialize(event)
- AnalyticsBuildSerializer.new.represent(event['build'])
- end
+ include ProductionHelper
+ include BuildsEventHelper
end
end
end
diff --git a/lib/gitlab/cycle_analytics/staging_stage.rb b/lib/gitlab/cycle_analytics/staging_stage.rb
index dbc2414ff66..e03627c6cd1 100644
--- a/lib/gitlab/cycle_analytics/staging_stage.rb
+++ b/lib/gitlab/cycle_analytics/staging_stage.rb
@@ -4,6 +4,7 @@ module Gitlab
module CycleAnalytics
class StagingStage < BaseStage
include ProductionHelper
+
def start_time_attrs
@start_time_attrs ||= mr_metrics_table[:merged_at]
end
diff --git a/lib/gitlab/cycle_analytics/test_event_fetcher.rb b/lib/gitlab/cycle_analytics/test_event_fetcher.rb
index 4d5ea5b7c34..2fa44b1b364 100644
--- a/lib/gitlab/cycle_analytics/test_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/test_event_fetcher.rb
@@ -2,7 +2,9 @@
module Gitlab
module CycleAnalytics
- class TestEventFetcher < StagingEventFetcher
+ class TestEventFetcher < BaseEventFetcher
+ include TestHelper
+ include BuildsEventHelper
end
end
end
diff --git a/lib/gitlab/cycle_analytics/test_helper.rb b/lib/gitlab/cycle_analytics/test_helper.rb
new file mode 100644
index 00000000000..32fca7fa898
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/test_helper.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module TestHelper
+ def stage_query(project_ids)
+ if branch
+ super(project_ids).where(build_table[:ref].eq(branch))
+ else
+ super(project_ids)
+ end
+ end
+
+ private
+
+ def branch
+ @branch ||= @options[:branch] # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/test_stage.rb b/lib/gitlab/cycle_analytics/test_stage.rb
index c31b664148b..4787a906c07 100644
--- a/lib/gitlab/cycle_analytics/test_stage.rb
+++ b/lib/gitlab/cycle_analytics/test_stage.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class TestStage < BaseStage
+ include TestHelper
+
def start_time_attrs
@start_time_attrs ||= mr_metrics_table[:latest_build_started_at]
end
@@ -26,14 +28,6 @@ module Gitlab
def description
_("Total test time for all commits/merges")
end
-
- def stage_query(project_ids)
- if @options[:branch]
- super(project_ids).where(build_table[:ref].eq(@options[:branch]))
- else
- super(project_ids)
- end
- end
end
end
end
diff --git a/lib/gitlab/gpg/commit.rb b/lib/gitlab/gpg/commit.rb
index 5ff415b6126..1d317c389d2 100644
--- a/lib/gitlab/gpg/commit.rb
+++ b/lib/gitlab/gpg/commit.rb
@@ -52,12 +52,13 @@ module Gitlab
def using_keychain
Gitlab::Gpg.using_tmp_keychain do
- # first we need to get the keyid from the signature to query the gpg
- # key belonging to the keyid.
+ # first we need to get the fingerprint from the signature to query the gpg
+ # key belonging to the fingerprint.
# This way we can add the key to the temporary keychain and extract
# the proper signature.
- # NOTE: the invoked method is #fingerprint but it's only returning
- # 16 characters (the format used by keyid) instead of 40.
+ # NOTE: the invoked method is #fingerprint but versions of GnuPG
+ # prior to 2.2.13 return 16 characters (the format used by keyid)
+ # instead of 40.
fingerprint = verified_signature&.fingerprint
break unless fingerprint
@@ -128,11 +129,13 @@ module Gitlab
gpg_key&.verified_user_infos&.first || gpg_key&.user_infos&.first || {}
end
- # rubocop: disable CodeReuse/ActiveRecord
- def find_gpg_key(keyid)
- GpgKey.find_by(primary_keyid: keyid) || GpgKeySubkey.find_by(keyid: keyid)
+ def find_gpg_key(fingerprint)
+ if fingerprint.length > 16
+ GpgKey.find_by_fingerprint(fingerprint) || GpgKeySubkey.find_by_fingerprint(fingerprint)
+ else
+ GpgKey.find_by_primary_keyid(fingerprint) || GpgKeySubkey.find_by_keyid(fingerprint)
+ end
end
- # rubocop: enable CodeReuse/ActiveRecord
end
end
end
diff --git a/lib/gitlab/visibility_level.rb b/lib/gitlab/visibility_level.rb
index 8f9d5cf1e63..e2787744f09 100644
--- a/lib/gitlab/visibility_level.rb
+++ b/lib/gitlab/visibility_level.rb
@@ -138,5 +138,18 @@ module Gitlab
def visibility=(level)
self[visibility_level_field] = Gitlab::VisibilityLevel.level_value(level)
end
+
+ def visibility_attribute_present?(attributes)
+ visibility_level_attributes.each do |attr|
+ return true if attributes[attr].present?
+ end
+
+ false
+ end
+
+ def visibility_level_attributes
+ [visibility_level_field, visibility_level_field.to_s,
+ :visibility, 'visibility']
+ end
end
end
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index bd69bc85978..e093612f1f7 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:21\n"
+"PO-Revision-Date: 2019-06-14 19:58\n"
msgid " Please sign in."
msgstr ""
@@ -6597,6 +6597,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -7080,6 +7083,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7680,6 +7686,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -8094,6 +8103,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8442,6 +8454,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8922,6 +8937,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9456,6 +9474,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12966,6 +12996,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index d94315d5c76..aea8f16e137 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:22\n"
+"PO-Revision-Date: 2019-06-14 19:59\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr "Нов етикет"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 8290a84180a..3096442dd44 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:21\n"
+"PO-Revision-Date: 2019-06-14 19:59\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index f4c87c8fc3b..8e220736054 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:22\n"
+"PO-Revision-Date: 2019-06-14 19:59\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index fcf7a6bc34e..7e7d6b18d6f 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:22\n"
+"PO-Revision-Date: 2019-06-14 19:59\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 60d3a1c3f48..0063738574c 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:24\n"
+"PO-Revision-Date: 2019-06-14 19:58\n"
msgid " Please sign in."
msgstr ""
@@ -6497,6 +6497,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6978,6 +6981,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7576,6 +7582,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7986,6 +7995,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8334,6 +8346,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8812,6 +8827,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9344,6 +9362,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12844,6 +12874,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index dd4e6d82647..3c65f30b0d6 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:27\n"
+"PO-Revision-Date: 2019-06-14 20:03\n"
msgid " Please sign in."
msgstr ""
@@ -6597,6 +6597,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -7080,6 +7083,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7680,6 +7686,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -8094,6 +8103,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8442,6 +8454,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8922,6 +8937,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9456,6 +9474,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12966,6 +12996,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 87b8715e114..7cca186e1af 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:11\n"
+"PO-Revision-Date: 2019-06-14 20:01\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index 5a611c60e8f..ca3bb88a10c 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:23\n"
+"PO-Revision-Date: 2019-06-14 20:03\n"
msgid " Please sign in."
msgstr " Bitte melde dich an."
@@ -6397,6 +6397,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google-Authentifizierung ist nicht %{link_to_documentation}. Frage deinen GitLab Administrator, wenn du diesen Service nutzen möchtest."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "Verstanden!"
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "Wenn diese Option deaktiviert ist, wird ein abweichender lokaler Branch nicht automatisch mit Commits von seinem remote Gegenstück aktualisiert, um lokalen Datenverlust zu verhindern. Wenn der Standardbranch (%{default_branch}) abweicht und nicht aktualisiert werden kann, schlägt die Spiegelung fehl. Andere abweichende Branches werden ohne Meldung ignoriert."
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "Juli"
@@ -7878,6 +7887,9 @@ msgstr "Sperren"
msgid "Lock %{issuableDisplayName}"
msgstr "Sperre %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "Sperrung nicht gefunden"
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}hat die Beschreibung %{descriptionChangedTimes} Mal %{timeDifferenceMinutes} geändert%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr "Neuer Tag"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Neu..."
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Letzte »"
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index 71834d27dde..538d5406c9b 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:19\n"
+"PO-Revision-Date: 2019-06-14 20:03\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 6cccd00890c..1747c758133 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:25\n"
+"PO-Revision-Date: 2019-06-14 20:01\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr "Nova etikedo"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index 2d61063f6a1..b6391526033 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:17\n"
+"PO-Revision-Date: 2019-06-14 19:56\n"
msgid " Please sign in."
msgstr " Por favor, inicie sesión."
@@ -6397,6 +6397,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "La autenticación de Google no se encuentra %{link_to_documentation}. Pregúntale a tu administrador de GitLab si quieres utilizar este servicio."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "¡Lo tengo!"
@@ -6876,6 +6879,9 @@ msgstr "Si algún trabajo supera este umbral de tiempo de espera, se marcará co
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr "Si está marcado, los propietarios de grupos pueden administrar enlaces de grupo LDAP y anular los miembros LDAP"
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr "en"
msgid "Job|with"
msgstr "con"
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "Jul"
@@ -7878,6 +7887,9 @@ msgstr "Bloquear"
msgid "Lock %{issuableDisplayName}"
msgstr "Bloquear %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "Bloqueo no encontrado"
@@ -8226,6 +8238,9 @@ msgstr "comenzó una discusión en el commit %{linkStart}%{commitId}%{linkEnd}"
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}cambió la descripción %{descriptionChangedTimes} veces %{timeDifferenceMinutes}%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Se ha producido un error al cargar el diff completo. Por favor, inténtalo de nuevo."
@@ -8702,6 +8717,9 @@ msgstr "Nueva etiqueta"
msgid "New users set to external"
msgstr "Nuevos usuarios configurados como externos"
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Nuevo..."
@@ -9232,6 +9250,18 @@ msgstr "Dominios de Pages"
msgid "Pages getting started guide"
msgstr "Guía de inicio de Pages"
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Último »"
@@ -12722,6 +12752,9 @@ msgstr "Desbloqueado con éxito"
msgid "Successfully unlocked"
msgstr "Desbloqueado con éxito"
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr "Cambio sugerido"
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index 0a15fa7ba8a..0733ebe4adf 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:25\n"
+"PO-Revision-Date: 2019-06-14 20:02\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 40d0545c177..c705b1680fe 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:19\n"
+"PO-Revision-Date: 2019-06-14 20:02\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 2c558704303..b1870856c52 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:26\n"
+"PO-Revision-Date: 2019-06-14 20:02\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "L’authentification Google n’est pas %{link_to_documentation}. Demandez à votre administrat·eur·rice GitLab si vous souhaitez utiliser ce service."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "Compris !"
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "Si cette option est désactivée, une branche locale divergente ne sera pas automatiquement mise à jour avec les commits de son homologue distant, afin d’éviter toute perte de données locales. Si la branche par défaut (%{default_branch}) a divergé et ne peut pas être mise à jour, la mise en miroir échouera. Les autres branches divergentes sont ignorées silencieusement."
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "juill."
@@ -7878,6 +7887,9 @@ msgstr "Verrouiller"
msgid "Lock %{issuableDisplayName}"
msgstr "Verrouiller %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "Verrou non trouvé"
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}a changé la description %{descriptionChangedTimes} fois %{timeDifferenceMinutes}%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr "Nouvelle étiquette"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Nouveau…"
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Dernière ⇥"
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 1abc20a1736..186c4cb2dba 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -2828,9 +2828,6 @@ msgstr ""
msgid "Container registry images"
msgstr ""
-msgid "ContainerRegistry|Created"
-msgstr ""
-
msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
msgstr ""
@@ -2840,6 +2837,9 @@ msgstr ""
msgid "ContainerRegistry|How to use the Container Registry"
msgstr ""
+msgid "ContainerRegistry|Last Updated"
+msgstr ""
+
msgid "ContainerRegistry|Learn more about"
msgstr ""
@@ -4500,12 +4500,6 @@ msgstr ""
msgid "First day of the week"
msgstr ""
-msgid "FirstPushedBy|First"
-msgstr ""
-
-msgid "FirstPushedBy|pushed by"
-msgstr ""
-
msgid "FlowdockService|Flowdock Git source token"
msgstr ""
@@ -7048,9 +7042,6 @@ msgstr ""
msgid "Pipeline"
msgstr ""
-msgid "Pipeline ID (IID)"
-msgstr ""
-
msgid "Pipeline Schedule"
msgstr ""
@@ -8316,9 +8307,6 @@ msgstr ""
msgid "Registry"
msgstr ""
-msgid "Related Commits"
-msgstr ""
-
msgid "Related Deployed Jobs"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 8dac79b6133..647ec18bd1e 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:26\n"
+"PO-Revision-Date: 2019-06-14 20:02\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 71f4068a5d9..5ae83a3e4d3 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:15\n"
+"PO-Revision-Date: 2019-06-14 20:01\n"
msgid " Please sign in."
msgstr ""
@@ -6497,6 +6497,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6978,6 +6981,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7576,6 +7582,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7986,6 +7995,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8334,6 +8346,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8812,6 +8827,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9344,6 +9362,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12844,6 +12874,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 3a647e7b861..f1c03c61435 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:18\n"
+"PO-Revision-Date: 2019-06-14 19:58\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 316cab67e8b..6d81a3b7447 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:24\n"
+"PO-Revision-Date: 2019-06-14 20:00\n"
msgid " Please sign in."
msgstr ""
@@ -6447,6 +6447,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6927,6 +6930,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7524,6 +7530,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7932,6 +7941,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8280,6 +8292,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8757,6 +8772,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9288,6 +9306,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12783,6 +12813,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index d6f224c306e..d2a8e28c75a 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:12\n"
+"PO-Revision-Date: 2019-06-14 19:54\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 2775a4148b7..5c7497673dd 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:12\n"
+"PO-Revision-Date: 2019-06-14 19:57\n"
msgid " Please sign in."
msgstr ""
@@ -6347,6 +6347,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6825,6 +6828,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7420,6 +7426,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7824,6 +7833,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8172,6 +8184,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8647,6 +8662,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9176,6 +9194,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12661,6 +12691,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index dc749104ecb..48902ba3969 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:12\n"
+"PO-Revision-Date: 2019-06-14 19:52\n"
msgid " Please sign in."
msgstr " Per favore effettua il login."
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "L'autenticazione Google non è %{link_to_documentation}. Richiedi al tuo amministratore Gitlab se desideri utilizzare il servizio."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "Se disabilitato, un ramo locale divergente non verrà automaticamente aggiornato con i commit dalla sua controparte remota, per prevenire la perdita locale dei dati. Se il ramo predefinito (%{default_branch}) è divergente e non può essere aggiornato, il mirroring fallirà. Altri rami divergenti vengono silenziosamente ignorati."
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "Lug"
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr "Nuovo tag"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Ultima »"
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 814f4ea85d2..a8bea017870 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:20\n"
+"PO-Revision-Date: 2019-06-14 19:52\n"
msgid " Please sign in."
msgstr " サインインしてください。"
@@ -347,11 +347,11 @@ msgstr[0] "%d 日"
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
-msgstr[0] ""
+msgstr[0] "%{issues}件のクローズされた課題"
msgid "1 closed merge request"
msgid_plural "%{merge_requests} closed merge requests"
-msgstr[0] ""
+msgstr[0] "%{merge_requests}件のクローズされたマージリクエスト"
msgid "1 day"
msgstr "1 日"
@@ -362,15 +362,15 @@ msgstr[0] "%dグループ"
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
-msgstr[0] ""
+msgstr[0] "%{merge_requests}件のマージされたマージリクエスト"
msgid "1 open issue"
msgid_plural "%{issues} open issues"
-msgstr[0] ""
+msgstr[0] "%{issues}件の課題"
msgid "1 open merge request"
msgid_plural "%{merge_requests} open merge requests"
-msgstr[0] ""
+msgstr[0] "%{merge_requests}件のマージリクエスト"
msgid "1 pipeline"
msgid_plural "%d pipelines"
@@ -1010,7 +1010,7 @@ msgid "Also called \"Relying party service URL\" or \"Reply URL\""
msgstr "\"Relying party service URL\" または \"Reply URL\" とも呼ばれます"
msgid "Alternate support URL for help page"
-msgstr ""
+msgstr "ヘルプページの別のサポートURL"
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
msgstr "あるいは、 %{personal_access_token_link} を使用することもできます。パーソナルアクセストークンを作成する際に、<code>repo</code> スコープを選択する必要があります。これにより、接続可能な公開リポジトリとプライベートリポジトリの一覧を表示することができます。"
@@ -1377,7 +1377,7 @@ msgid "ApprovalRule|Name"
msgstr "名前"
msgid "ApprovalRule|No. approvals required"
-msgstr ""
+msgstr "いいえ。承認が必要です。"
msgid "ApprovalRule|e.g. QA, Security, etc."
msgstr ""
@@ -1819,7 +1819,7 @@ msgid "BambooService|Bamboo root URL like https://bamboo.example.com"
msgstr "Bamboo のルートURL 例: https://bamboo.example.com"
msgid "BambooService|You must set up automatic revision labeling and a repository trigger in Bamboo."
-msgstr ""
+msgstr "Bambooで自動リビジョンラベリングとリポジトリトリガーを設定しなければなりません。"
msgid "BatchComments|Delete all pending comments"
msgstr "保留中のコメントをすべて削除"
@@ -6347,6 +6347,9 @@ msgstr "Google テイクアウト"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google 認証は %{link_to_documentation} ではありません。このサービスについては GitLab 管理者に問い合わせてください。"
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "入手しましょう!"
@@ -6825,6 +6828,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7420,6 +7426,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "7月"
@@ -7824,6 +7833,9 @@ msgstr "ロック"
msgid "Lock %{issuableDisplayName}"
msgstr "ロック %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "ロックが見つかりません"
@@ -8172,6 +8184,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8647,6 +8662,9 @@ msgstr "新規タグ"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "新規...\t"
@@ -9096,7 +9114,7 @@ msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "ダッシュボードにプロジェクトを追加"
msgid "OperationsDashboard|Add projects"
-msgstr ""
+msgstr "プロジェクトを追加"
msgid "OperationsDashboard|More information"
msgstr ""
@@ -9176,6 +9194,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "最後 »"
@@ -9273,7 +9303,7 @@ msgid "Personal Access Token"
msgstr "個人のアクセストークン"
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
-msgstr ""
+msgstr "個人的なプロジェクトの作成は許可されていません。質問がある場合はシステムの管理者に連絡してください"
msgid "Phabricator Server Import"
msgstr ""
@@ -12661,6 +12691,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
@@ -15492,7 +15525,7 @@ msgid "You will lose all the unstaged changes you've made in this project. This
msgstr ""
msgid "You will need to update your local repositories to point to the new location."
-msgstr ""
+msgstr "ローカルリポジトリが新しい場所を示すように更新する必要があります。"
msgid "You will not get any notifications via email"
msgstr "通知メールを送信しません"
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index 25d60cdf6d3..2fe4fbc9d55 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:26\n"
+"PO-Revision-Date: 2019-06-14 20:03\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index b36de3639cf..a9b1d2f2f40 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:13\n"
+"PO-Revision-Date: 2019-06-14 19:52\n"
msgid " Please sign in."
msgstr ""
@@ -6347,6 +6347,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google 인증을 사용할 수 없습니다. %{link_to_documentation} GitLab 관리자에게 문의하세요."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "확인!"
@@ -6825,6 +6828,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7420,6 +7426,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "7월"
@@ -7824,6 +7833,9 @@ msgstr "잠금"
msgid "Lock %{issuableDisplayName}"
msgstr "%{issuableDisplayName} 잠금"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "잠금을 찾을 수 없습니다."
@@ -8172,6 +8184,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8647,6 +8662,9 @@ msgstr "새 태그 "
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "새로 만들기..."
@@ -9176,6 +9194,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "마지막 »"
@@ -12661,6 +12691,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 07fea230372..ba9868f8fd2 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:13\n"
+"PO-Revision-Date: 2019-06-14 19:53\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 3ee90cd308f..b818109b50b 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:13\n"
+"PO-Revision-Date: 2019-06-14 19:53\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index cb608bb36e6..8a3a8cf3af6 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:24\n"
+"PO-Revision-Date: 2019-06-14 20:01\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 271a784632a..cf3724e3ad1 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:14\n"
+"PO-Revision-Date: 2019-06-14 19:52\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index ac3a92314ea..eee5d9cd8c3 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:14\n"
+"PO-Revision-Date: 2019-06-14 19:53\n"
msgid " Please sign in."
msgstr ""
@@ -6497,6 +6497,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6978,6 +6981,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7576,6 +7582,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7986,6 +7995,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8334,6 +8346,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8812,6 +8827,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9344,6 +9362,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12844,6 +12874,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index f73affc2cbc..54a81af63d9 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:11\n"
+"PO-Revision-Date: 2019-06-14 19:54\n"
msgid " Please sign in."
msgstr " Por favor, entre usando sua conta."
@@ -6397,6 +6397,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
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 "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "Entendi!"
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "Se desativada, um branch local divergente não será atualizada automaticamente com commits de sua contraparte remota, para evitar a perda de dados locais. Se o branch padrão (%{default_branch}) tiver divergido e não puder ser atualizado, o espelhamento falhará. Outras branches divergentes são silenciosamente ignoradas."
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "Jul"
@@ -7878,6 +7887,9 @@ msgstr "Bloquear"
msgid "Lock %{issuableDisplayName}"
msgstr "Bloquear %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "Bloqueio não encontrado"
@@ -8226,6 +8238,9 @@ msgstr "iniciou uma discussão no commit %{linkStart}%{commitId}%{linkEnd}"
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}alterou a descrição %{descriptionChangedTimes} vezes %{timeDifferenceMinutes}%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Erro ao carregar o diff completo. Por favor, tente novamente."
@@ -8702,6 +8717,9 @@ msgstr "Nova tag"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Novo..."
@@ -9232,6 +9250,18 @@ msgstr "Domínios de páginas"
msgid "Pages getting started guide"
msgstr "Guia de primeiros passos a Páginas"
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Último >>"
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index bc1732cd69a..aa680827bec 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:14\n"
+"PO-Revision-Date: 2019-06-14 19:54\n"
msgid " Please sign in."
msgstr " Por favor, inicia a sessão."
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index bd79e38ba94..4055a0fe933 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:15\n"
+"PO-Revision-Date: 2019-06-14 19:54\n"
msgid " Please sign in."
msgstr ""
@@ -6447,6 +6447,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6927,6 +6930,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7524,6 +7530,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7932,6 +7941,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8280,6 +8292,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8757,6 +8772,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9288,6 +9306,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12783,6 +12813,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 08836089f1d..68ce5b4d64d 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:15\n"
+"PO-Revision-Date: 2019-06-14 19:55\n"
msgid " Please sign in."
msgstr ""
@@ -6497,6 +6497,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Аутентификация Google не %{link_to_documentation}. Попросите своего администратора GitLab, если вы хотите воспользоваться этим сервисом."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "Понятно!"
@@ -6978,6 +6981,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7576,6 +7582,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "Июл."
@@ -7986,6 +7995,9 @@ msgstr "Блокировка"
msgid "Lock %{issuableDisplayName}"
msgstr "Заблокировать %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "Блокировка не найдена"
@@ -8334,6 +8346,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}изменил описание %{descriptionChangedTimes} раз, за последние %{timeDifferenceMinutes}%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8812,6 +8827,9 @@ msgstr "Новый тег"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Новый..."
@@ -9344,6 +9362,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Последняя »"
@@ -12844,6 +12874,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index 3e1d08ed59e..7bb9f36a887 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:17\n"
+"PO-Revision-Date: 2019-06-14 19:56\n"
msgid " Please sign in."
msgstr ""
@@ -6497,6 +6497,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6978,6 +6981,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7576,6 +7582,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7986,6 +7995,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8334,6 +8346,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8812,6 +8827,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9344,6 +9362,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12844,6 +12874,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index c3560018979..f9454822dc4 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:21\n"
+"PO-Revision-Date: 2019-06-14 19:51\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 1118681c99d..1156a705653 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:16\n"
+"PO-Revision-Date: 2019-06-14 19:55\n"
msgid " Please sign in."
msgstr ""
@@ -6447,6 +6447,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6927,6 +6930,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7524,6 +7530,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7932,6 +7941,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8280,6 +8292,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8757,6 +8772,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9288,6 +9306,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12783,6 +12813,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index f3ce29f397f..cdbb13acb65 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:16\n"
+"PO-Revision-Date: 2019-06-14 19:55\n"
msgid " Please sign in."
msgstr ""
@@ -6447,6 +6447,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6927,6 +6930,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7524,6 +7530,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7932,6 +7941,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8280,6 +8292,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8757,6 +8772,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9288,6 +9306,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12783,6 +12813,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 0bed58e7c61..059ac54c5b3 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:18\n"
+"PO-Revision-Date: 2019-06-14 19:56\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index 8c4ae06837d..8d2bfb693fc 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:17\n"
+"PO-Revision-Date: 2019-06-14 19:56\n"
msgid " Please sign in."
msgstr ""
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr ""
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8702,6 +8717,9 @@ msgstr ""
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index b976a7d9ed0..18def601116 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:18\n"
+"PO-Revision-Date: 2019-06-14 19:57\n"
msgid " Please sign in."
msgstr " Lütfen oturum açın."
@@ -6397,6 +6397,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6876,6 +6879,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7472,6 +7478,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "Tem"
@@ -7878,6 +7887,9 @@ msgstr ""
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8226,6 +8238,9 @@ msgstr "%{linkStart}%{commitId}%{linkEnd} işlemi ile ilgili bir tartışma baş
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}açıklama %{descriptionChangedTimes}sürelerini%{timeDifferenceMinutes} değiştirdi%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Tam değişiklik yüklenirken hata oluştu. Lütfen tekrar deneyin."
@@ -8702,6 +8717,9 @@ msgstr "Yeni etiket"
msgid "New users set to external"
msgstr "Yeni kullanıcılar harici olarak ayarlandı"
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Yeni..."
@@ -9232,6 +9250,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Son »"
@@ -12722,6 +12752,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index aac293d531e..21c49e5c6f9 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:20\n"
+"PO-Revision-Date: 2019-06-14 21:26\n"
msgid " Please sign in."
msgstr " Будь ласка, увійдіть."
@@ -132,10 +132,10 @@ msgstr[3] "%d запитів на злиття"
msgid "%d merge request that you don't have access to."
msgid_plural "%d merge requests that you don't have access to."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d запит на злиття, до якого ви не маєте доступу."
+msgstr[1] "%d запити на злиття, до яких ви не маєте доступу."
+msgstr[2] "%d запитів на злиття, до яких ви не маєте доступу."
+msgstr[3] "%d запитів на злиття, до яких ви не маєте доступу."
msgid "%d metric"
msgid_plural "%d metrics"
@@ -379,7 +379,7 @@ msgstr[2] ""
msgstr[3] ""
msgid "(%{mrCount} merged)"
-msgstr ""
+msgstr "(%{mrCount} злито)"
msgid "(No changes)"
msgstr "(Немає змін)"
@@ -1617,7 +1617,7 @@ msgid "Are you sure? Removing this GPG key does not affect already signed commit
msgstr ""
msgid "Are you sure? This will invalidate your registered applications and U2F devices."
-msgstr ""
+msgstr "Ви впевнені? Це призведе до анулювання зареєстрованих застосунків та U2F пристроїв."
msgid "Artifact ID"
msgstr "ID артефакту"
@@ -1626,7 +1626,7 @@ msgid "Artifacts"
msgstr "Артефакти"
msgid "As U2F devices are only supported by a few browsers, we require that you set up a two-factor authentication app before a U2F device. That way you'll always be able to log in - even when you're using an unsupported browser."
-msgstr ""
+msgstr "Оскільки пристрої U2F підтримуються лише кількома браузерами, ми вимагаємо, щоб ви налаштували застосунок для двофакторної автентифікації перед пристроєм U2F. Таким чином ви завжди зможете увійти, навіть при використанні непідтримуваного браузера."
msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):"
msgstr "%{user} відправив код в гілку %{branch} проекту %{project_name} (%{commit_url}):"
@@ -3336,7 +3336,7 @@ msgid "Code owners"
msgstr "Власники коду"
msgid "CodeOwner|Pattern"
-msgstr ""
+msgstr "Шаблон"
msgid "Cohorts"
msgstr "Когорти"
@@ -4850,7 +4850,7 @@ msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Введіть URL-адресу вашого Bitbucket Server і ключ доступу"
msgid "Enter in your Phabricator Server URL and personal access token below"
-msgstr ""
+msgstr "Введіть URL-адресу вашого сервера Phabricator і персональний ключ доступу"
msgid "Enter the issue description"
msgstr "Введіть опис задачі"
@@ -6060,7 +6060,7 @@ msgid "GeoNodes|Out of sync"
msgstr "Розсинхронізовані"
msgid "GeoNodes|Pausing replication stops the sync process."
-msgstr ""
+msgstr "Призупинення реплікації зупиняє процес синхронізації."
msgid "GeoNodes|Removing a primary node stops the sync process for all nodes. Syncing cannot be resumed without losing some data on all secondaries. In this case we would recommend setting up all nodes from scratch. Are you sure?"
msgstr "Видалення основного вузла зупиняє процес синхронізації для всіх вузлів. Синхронізацію неможливо буде відновити без втрати деяких даних на всіх вторинних вузлах. У цьому випадку рекомендовано налаштувати всі вузли з нуля. Ви впевнені?"
@@ -6186,7 +6186,7 @@ msgid "Geo|Could not remove tracking entry for an existing project."
msgstr "Не вдалося видалити запис відстеження для існуючого проекту."
msgid "Geo|Could not remove tracking entry for an existing upload."
-msgstr ""
+msgstr "Не вдалося видалити запис відстеження для існуючого завантаження."
msgid "Geo|Failed"
msgstr "Невдало"
@@ -6237,7 +6237,7 @@ msgid "Geo|Pending verification"
msgstr "Очікування перевірки"
msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
+msgstr "Будь ласка, перегляньте документацію з усунення неполадок Geo."
msgid "Geo|Project"
msgstr "Проект"
@@ -6291,19 +6291,19 @@ msgid "Geo|Status"
msgstr "Статус"
msgid "Geo|Sync"
-msgstr ""
+msgstr "Синхронізувати"
msgid "Geo|Synced"
msgstr "Синхронізовано"
msgid "Geo|Synced at"
-msgstr ""
+msgstr "Синхронізовано"
msgid "Geo|Synchronization failed - %{error}"
msgstr "Синхронізація невдала: %{error}"
msgid "Geo|The URL defined on the primary node that secondary nodes should use to contact it. Returns `url` if not set"
-msgstr ""
+msgstr "URL-адреса, визначена на основному вузлі, яку використовують вторинні вузли, щоб зв'язатися з ним. Повертає \"url\", якщо не встановлено"
msgid "Geo|The database is currently %{db_lag} behind the primary node."
msgstr ""
@@ -6497,6 +6497,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Автентифікація Google не %{link_to_documentation}. Попросіть свого адміністратора GitLab, якщо ви хочете скористатися цим сервісом."
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "Зрозуміло!"
@@ -6978,6 +6981,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr "Якщо увімкнено, тоді власники груп зможуть керувати зв'язками груп LDAP та перевизначенням членів LDAP"
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "Якщо вимкнено, локальна гілка зі змінами не буде автоматично підтягувати коміти з віддаленої гілки, щоб уникнути втрати локальних даних. Якщо гілка за замовчуванням (%{default_branch}) містить зміни і не може бути оновлена, тоді дзеркалювання буде неможливим. Інші гілки зі змінами автоматично ігноруються."
@@ -7576,6 +7582,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "лип."
@@ -7986,6 +7995,9 @@ msgstr "Блокувати"
msgid "Lock %{issuableDisplayName}"
msgstr "Заблокувати %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "Блокування не знайдено"
@@ -8334,6 +8346,9 @@ msgstr "розпочав (-ла) коміту %{linkStart}%{commitId}%{linkEnd}"
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart} опис змінено %{descriptionChangedTimes} раз(а,ів) %{timeDifferenceMinutes}%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "Помилка при заванаженні повного порівняння. Будь ласка, спробуйте знову."
@@ -8812,6 +8827,9 @@ msgstr "Новий тег"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "Новий..."
@@ -9344,6 +9362,18 @@ msgstr "Домени Pages"
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "Остання »"
@@ -12844,6 +12874,9 @@ msgstr "Успішно розблоковано"
msgid "Successfully unlocked"
msgstr "Успішно розблоковано"
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr "Пропонована зміна"
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index cd245f36bab..ae644040a5a 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:19\n"
+"PO-Revision-Date: 2019-06-14 20:00\n"
msgid " Please sign in."
msgstr " 请登录。"
@@ -6347,6 +6347,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google身份验证未%{link_to_documentation}。如需使用此服务,请咨询GitLab管理员。"
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "了解!"
@@ -6825,6 +6828,9 @@ msgstr "如果任何作业超过这个超时阈值,它将被标记为失败。
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr "如果选中,则群组所有者可以管理 LDAP 群组链接和 LDAP 成员覆盖"
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "如果禁用,则不会使用远程副本的提交自动更新分叉的本地分支,以防止本地数据丢失。如果默认分支 (%{default_branch}) 已分叉且无法更新,则镜像将失败。其他分叉的分支默默被忽略。"
@@ -7420,6 +7426,9 @@ msgstr "合并入"
msgid "Job|with"
msgstr "由"
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "7月"
@@ -7824,6 +7833,9 @@ msgstr "锁定"
msgid "Lock %{issuableDisplayName}"
msgstr "锁定 %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "未找到锁"
@@ -8172,6 +8184,9 @@ msgstr "开始讨论提交%{linkStart}%{commitId}%{linkEnd}"
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart}%{timeDifferenceMinutes}%{descriptionChangedTimes}次更改了描述%{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr "加载完整差异时出错。请再试一次。"
@@ -8647,6 +8662,9 @@ msgstr "新建标签"
msgid "New users set to external"
msgstr "新用户设置为外部"
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "新建..."
@@ -9176,6 +9194,18 @@ msgstr "Pages域名"
msgid "Pages getting started guide"
msgstr "Pages 入门指南"
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "尾页 »"
@@ -12661,6 +12691,9 @@ msgstr "成功解除禁用"
msgid "Successfully unlocked"
msgstr "成功解除禁用"
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr "变更建议"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 09c414249b3..af61b64ccb9 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:23\n"
+"PO-Revision-Date: 2019-06-14 20:00\n"
msgid " Please sign in."
msgstr "請登入您的帳戶"
@@ -6347,6 +6347,9 @@ msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr ""
@@ -6825,6 +6828,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -7420,6 +7426,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "七月"
@@ -7824,6 +7833,9 @@ msgstr "鎖定"
msgid "Lock %{issuableDisplayName}"
msgstr ""
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -8172,6 +8184,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr ""
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8647,6 +8662,9 @@ msgstr "新增標籤"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr ""
@@ -9176,6 +9194,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr ""
@@ -12661,6 +12691,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index 784d722e453..435c5979172 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -13,7 +13,7 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
-"PO-Revision-Date: 2019-06-14 10:23\n"
+"PO-Revision-Date: 2019-06-14 20:00\n"
msgid " Please sign in."
msgstr ""
@@ -6347,6 +6347,9 @@ msgstr "Google Takeout"
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google 身份驗證不是 %{link_to_documentation}。如果您想使用此服務,請諮詢 GitLab 管理員。"
+msgid "Got it"
+msgstr ""
+
msgid "Got it!"
msgstr "了解!"
@@ -6825,6 +6828,9 @@ msgstr ""
msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
msgstr ""
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr "如果停用,則不會使用遠端副本的提交自動更新分支的本機分支,以防止本機資料被刪除。如果預設分支 (%{default_branch}) 已被再分支且無法更新時,則鏡像將會失敗。其他再分支的分支自動被忽略。"
@@ -7420,6 +7426,9 @@ msgstr ""
msgid "Job|with"
msgstr ""
+msgid "Join Zoom meeting"
+msgstr ""
+
msgid "Jul"
msgstr "七月"
@@ -7824,6 +7833,9 @@ msgstr "鎖定"
msgid "Lock %{issuableDisplayName}"
msgstr "鎖定 %{issuableDisplayName}"
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
msgid "Lock not found"
msgstr "找不到鎖定的檔案"
@@ -8172,6 +8184,9 @@ msgstr ""
msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChangedTimes} times %{timeDifferenceMinutes}%{paragraphEnd}"
msgstr "%{paragraphStart} %{timeDifferenceMinutes} 修改了 %{descriptionChangedTimes} 次說明 %{paragraphEnd}"
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
msgid "MergeRequest|Error loading full diff. Please try again."
msgstr ""
@@ -8647,6 +8662,9 @@ msgstr "新增標籤"
msgid "New users set to external"
msgstr ""
+msgid "New! Suggest changes directly"
+msgstr ""
+
msgid "New..."
msgstr "新增…"
@@ -9176,6 +9194,18 @@ msgstr ""
msgid "Pages getting started guide"
msgstr ""
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
msgid "Pagination|Last »"
msgstr "最末頁 »"
@@ -12661,6 +12691,9 @@ msgstr ""
msgid "Successfully unlocked"
msgstr ""
+msgid "Suggest code changes which are immediately applied. Try it out!"
+msgstr ""
+
msgid "Suggested change"
msgstr ""
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 40c3a6d90d0..33254d607c9 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -26,6 +26,7 @@ describe 'Database schema' do
forked_project_links: %w[forked_from_project_id],
identities: %w[user_id],
issues: %w[last_edited_by_id state_id],
+ jira_tracker_data: %w[jira_issue_transition_id],
keys: %w[user_id],
label_links: %w[target_id],
lfs_objects_projects: %w[lfs_object_id project_id],
diff --git a/spec/factories/lfs_objects_projects.rb b/spec/factories/lfs_objects_projects.rb
index c225387a5de..4804d0bb884 100644
--- a/spec/factories/lfs_objects_projects.rb
+++ b/spec/factories/lfs_objects_projects.rb
@@ -2,5 +2,6 @@ FactoryBot.define do
factory :lfs_objects_project do
lfs_object
project
+ repository_type :project
end
end
diff --git a/spec/factories/services_data.rb b/spec/factories/services_data.rb
new file mode 100644
index 00000000000..387e130a743
--- /dev/null
+++ b/spec/factories/services_data.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :jira_tracker_data do
+ service
+ url 'http://jira.example.com'
+ api_url 'http://api-jira.example.com'
+ username 'jira_username'
+ password 'jira_password'
+ end
+
+ factory :issue_tracker_data do
+ service
+ project_url 'http://issuetracker.example.com'
+ issues_url 'http://issues.example.com'
+ new_issue_url 'http://new-issue.example.com'
+ end
+end
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
index 1d2b724a5e5..4f3392cdcbf 100644
--- a/spec/factories/users.rb
+++ b/spec/factories/users.rb
@@ -66,6 +66,16 @@ FactoryBot.define do
end
end
+ transient do
+ developer_projects []
+ end
+
+ after(:create) do |user, evaluator|
+ evaluator.developer_projects.each do |project|
+ project.add_developer(user)
+ end
+ end
+
factory :omniauth_user do
transient do
extern_uid '123456'
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index e6f44aa7d20..a2dd34e7f7c 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -10,8 +10,7 @@ describe 'Commits' do
stub_ci_pipeline_to_return_yaml_file
end
- let(:creator) { create(:user) }
-
+ let(:creator) { create(:user, developer_projects: [project]) }
let!(:pipeline) do
create(:ci_pipeline,
project: project,
@@ -77,10 +76,11 @@ describe 'Commits' do
describe 'Commit builds', :js do
before do
+ project.add_developer(user)
visit pipeline_path(pipeline)
end
- it 'shows pipeline`s data' do
+ it 'shows pipeline data' do
expect(page).to have_content pipeline.sha[0..7]
expect(page).to have_content pipeline.git_commit_message.gsub!(/\s+/, ' ')
expect(page).to have_content pipeline.user.name
diff --git a/spec/features/cycle_analytics_spec.rb b/spec/features/cycle_analytics_spec.rb
index 48edc764a8e..4108a0f370d 100644
--- a/spec/features/cycle_analytics_spec.rb
+++ b/spec/features/cycle_analytics_spec.rb
@@ -58,7 +58,7 @@ describe 'Cycle Analytics', :js do
expect_issue_to_be_present
click_stage('Plan')
- expect(find('.stage-events')).to have_content(mr.commits.last.title)
+ expect_issue_to_be_present
click_stage('Code')
expect_merge_request_to_be_present
diff --git a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
index 586b3ba170d..85c4d778fd0 100644
--- a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
+++ b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
@@ -52,7 +52,7 @@ describe 'Merge request > User merges when pipeline succeeds', :js do
# so we have to wait for asynchronous call to reload it
# and have_content expectation handles that.
#
- expect(page).to have_content "Pipeline ##{pipeline.id} (##{pipeline.iid}) running"
+ expect(page).to have_content "Pipeline ##{pipeline.id} running"
end
it_behaves_like 'Merge when pipeline succeeds activator'
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index 393077a916f..733e8aa3eba 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -160,7 +160,7 @@ describe 'Merge request > User sees merge widget', :js do
it 'shows head pipeline information' do
within '.ci-widget-content' do
- expect(page).to have_content("Pipeline ##{pipeline.id} (##{pipeline.iid}) pending " \
+ expect(page).to have_content("Pipeline ##{pipeline.id} pending " \
"for #{pipeline.short_sha} " \
"on #{pipeline.ref}")
end
@@ -189,7 +189,7 @@ describe 'Merge request > User sees merge widget', :js do
it 'shows head pipeline information' do
within '.ci-widget-content' do
- expect(page).to have_content("Pipeline ##{pipeline.id} (##{pipeline.iid}) pending " \
+ expect(page).to have_content("Pipeline ##{pipeline.id} pending " \
"for #{pipeline.short_sha} " \
"on #{merge_request.to_reference} " \
"with #{merge_request.source_branch}")
@@ -201,7 +201,7 @@ describe 'Merge request > User sees merge widget', :js do
it 'shows head pipeline information' do
within '.ci-widget-content' do
- expect(page).to have_content("Pipeline ##{pipeline.id} (##{pipeline.iid}) pending " \
+ expect(page).to have_content("Pipeline ##{pipeline.id} pending " \
"for #{pipeline.short_sha} " \
"on #{merge_request.to_reference} " \
"with #{merge_request.source_branch}")
@@ -234,7 +234,7 @@ describe 'Merge request > User sees merge widget', :js do
it 'shows head pipeline information' do
within '.ci-widget-content' do
- expect(page).to have_content("Pipeline ##{pipeline.id} (##{pipeline.iid}) pending " \
+ expect(page).to have_content("Pipeline ##{pipeline.id} pending " \
"for #{pipeline.short_sha} " \
"on #{merge_request.to_reference} " \
"with #{merge_request.source_branch} " \
@@ -248,7 +248,7 @@ describe 'Merge request > User sees merge widget', :js do
it 'shows head pipeline information' do
within '.ci-widget-content' do
- expect(page).to have_content("Pipeline ##{pipeline.id} (##{pipeline.iid}) pending " \
+ expect(page).to have_content("Pipeline ##{pipeline.id} pending " \
"for #{pipeline.short_sha} " \
"on #{merge_request.to_reference} " \
"with #{merge_request.source_branch} " \
diff --git a/spec/features/projects/commits/user_browses_commits_spec.rb b/spec/features/projects/commits/user_browses_commits_spec.rb
index a84fee34669..fc74a370e72 100644
--- a/spec/features/projects/commits/user_browses_commits_spec.rb
+++ b/spec/features/projects/commits/user_browses_commits_spec.rb
@@ -61,7 +61,7 @@ describe 'User browses commits' do
it 'renders commit ci info' do
visit project_commit_path(project, sample_commit.id)
- expect(page).to have_content "Pipeline ##{pipeline.id} (##{pipeline.iid}) pending"
+ expect(page).to have_content "Pipeline ##{pipeline.id} pending"
end
end
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index bd6c73f4b85..ebc20d15d67 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -16,12 +16,6 @@ describe 'User browses jobs' do
visit(project_jobs_path(project))
end
- it 'shows pipeline id and IID' do
- page.within('td.pipeline-link') do
- expect(page).to have_content("##{pipeline.id} (##{pipeline.iid})")
- end
- end
-
it 'shows the coverage' do
page.within('td.coverage') do
expect(page).to have_content('99.9%')
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index 03562bd382e..f4ed89adc0f 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -129,7 +129,7 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
visit project_job_path(project, job)
within '.js-pipeline-info' do
- expect(page).to have_content("Pipeline ##{pipeline.id} (##{pipeline.iid}) for #{pipeline.ref}")
+ expect(page).to have_content("Pipeline ##{pipeline.id} for #{pipeline.ref}")
end
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 77f0f237d0a..9759fd04ad2 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
describe 'Pipeline', :js do
include RoutesHelpers
include ProjectForksHelper
+ include ::ExclusiveLeaseHelpers
let(:project) { create(:project) }
let(:user) { create(:user) }
@@ -539,6 +540,44 @@ describe 'Pipeline', :js do
expect(page).to have_selector('.pipeline-visualization')
expect(page).to have_content('cross-build')
end
+
+ context 'when a scheduled pipeline is created by a blocked user' do
+ let(:project) { create(:project, :repository) }
+
+ let(:schedule) do
+ create(:ci_pipeline_schedule,
+ project: project,
+ owner: project.owner,
+ description: 'blocked user schedule'
+ ).tap do |schedule|
+ schedule.update_column(:next_run_at, 1.minute.ago)
+ end
+ end
+
+ before do
+ schedule.owner.block!
+
+ begin
+ PipelineScheduleWorker.new.perform
+ rescue Ci::CreatePipelineService::CreateError
+ # Do nothing, assert view code after the Pipeline failed to create.
+ end
+ end
+
+ it 'displays the PipelineSchedule in an active state' do
+ visit project_pipeline_schedules_path(project)
+ page.click_link('Active')
+
+ expect(page).to have_selector('table.ci-table > tbody > tr > td', text: 'blocked user schedule')
+ end
+
+ it 'does not create a new Pipeline' do
+ visit project_pipelines_path(project)
+
+ expect(page).not_to have_selector('.ci-table')
+ expect(schedule.last_pipeline).to be_nil
+ end
+ end
end
describe 'GET /:project/pipelines/:id/builds' do
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index de780f13681..885d5f85989 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -469,7 +469,7 @@ describe 'Pipelines', :js do
visit_project_pipelines
end
- it 'has artifats' do
+ it 'has artifacts' do
expect(page).to have_selector('.build-artifacts')
end
diff --git a/spec/finders/pipelines_finder_spec.rb b/spec/finders/pipelines_finder_spec.rb
index c2c304589c9..b23fd8ccdc6 100644
--- a/spec/finders/pipelines_finder_spec.rb
+++ b/spec/finders/pipelines_finder_spec.rb
@@ -170,8 +170,9 @@ describe PipelinesFinder do
context 'when order_by and sort are specified' do
context 'when order_by user_id' do
- let(:params) { { order_by: 'user_id', sort: 'asc' } }
- let!(:pipelines) { Array.new(2) { create(:ci_pipeline, project: project, user: create(:user)) } }
+ let(:params) { { order_by: 'user_id', sort: 'asc' } }
+ let(:users) { Array.new(2) { create(:user, developer_projects: [project]) } }
+ let!(:pipelines) { users.map { |user| create(:ci_pipeline, project: project, user: user) } }
it 'sorts as user_id: :asc' do
is_expected.to match_array(pipelines)
diff --git a/spec/javascripts/fixtures/pipelines.rb b/spec/javascripts/fixtures/pipelines.rb
index de6fcfe10f4..6b6b0eefab9 100644
--- a/spec/javascripts/fixtures/pipelines.rb
+++ b/spec/javascripts/fixtures/pipelines.rb
@@ -8,7 +8,7 @@ describe Projects::PipelinesController, '(JavaScript fixtures)', type: :controll
let(:project) { create(:project, :repository, namespace: namespace, path: 'pipelines-project') }
let(:commit) { create(:commit, project: project) }
let(:commit_without_author) { RepoHelpers.another_sample_commit }
- let!(:user) { create(:user, email: commit.author_email) }
+ let!(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
let!(:pipeline) { create(:ci_pipeline, project: project, sha: commit.id, user: user) }
let!(:pipeline_without_author) { create(:ci_pipeline, project: project, sha: commit_without_author.id) }
let!(:pipeline_without_commit) { create(:ci_pipeline, project: project, sha: '0000') }
diff --git a/spec/javascripts/jobs/components/stages_dropdown_spec.js b/spec/javascripts/jobs/components/stages_dropdown_spec.js
index e98639bf21e..52bb5161123 100644
--- a/spec/javascripts/jobs/components/stages_dropdown_spec.js
+++ b/spec/javascripts/jobs/components/stages_dropdown_spec.js
@@ -9,7 +9,6 @@ describe('Stages Dropdown', () => {
const mockPipelineData = {
id: 28029444,
- iid: 123,
details: {
status: {
details_path: '/gitlab-org/gitlab-ce/pipelines/28029444',
@@ -78,8 +77,8 @@ describe('Stages Dropdown', () => {
expect(vm.$el.querySelector('.dropdown .js-selected-stage').textContent).toContain('deploy');
});
- it(`renders the pipeline info text like "Pipeline #123 (#12) for source_branch"`, () => {
- const expected = `Pipeline #${pipeline.id} (#${pipeline.iid}) for ${pipeline.ref.name}`;
+ it(`renders the pipeline info text like "Pipeline #123 for source_branch"`, () => {
+ const expected = `Pipeline #${pipeline.id} for ${pipeline.ref.name}`;
const actual = trimText(vm.$el.querySelector('.js-pipeline-info').innerText);
expect(actual).toBe(expected);
@@ -101,10 +100,10 @@ describe('Stages Dropdown', () => {
});
});
- it(`renders the pipeline info text like "Pipeline #123 (#12) for !456 with source_branch into target_branch"`, () => {
- const expected = `Pipeline #${pipeline.id} (#${pipeline.iid}) for !${
- pipeline.merge_request.iid
- } with ${pipeline.merge_request.source_branch} into ${pipeline.merge_request.target_branch}`;
+ it(`renders the pipeline info text like "Pipeline #123 for !456 with source_branch into target_branch"`, () => {
+ const expected = `Pipeline #${pipeline.id} for !${pipeline.merge_request.iid} with ${
+ pipeline.merge_request.source_branch
+ } into ${pipeline.merge_request.target_branch}`;
const actual = trimText(vm.$el.querySelector('.js-pipeline-info').innerText);
expect(actual).toBe(expected);
@@ -144,10 +143,10 @@ describe('Stages Dropdown', () => {
});
});
- it(`renders the pipeline info like "Pipeline #123 (#12) for !456 with source_branch"`, () => {
- const expected = `Pipeline #${pipeline.id} (#${pipeline.iid}) for !${
- pipeline.merge_request.iid
- } with ${pipeline.merge_request.source_branch}`;
+ it(`renders the pipeline info like "Pipeline #123 for !456 with source_branch"`, () => {
+ const expected = `Pipeline #${pipeline.id} for !${pipeline.merge_request.iid} with ${
+ pipeline.merge_request.source_branch
+ }`;
const actual = trimText(vm.$el.querySelector('.js-pipeline-info').innerText);
expect(actual).toBe(expected);
diff --git a/spec/javascripts/jobs/mock_data.js b/spec/javascripts/jobs/mock_data.js
index 88b0bb206ee..3d40e94d219 100644
--- a/spec/javascripts/jobs/mock_data.js
+++ b/spec/javascripts/jobs/mock_data.js
@@ -960,7 +960,6 @@ export default {
},
pipeline: {
id: 140,
- iid: 13,
user: {
name: 'Root',
username: 'root',
diff --git a/spec/javascripts/pipelines/mock_data.js b/spec/javascripts/pipelines/mock_data.js
index 8eef9166b8d..03ead6cd8ba 100644
--- a/spec/javascripts/pipelines/mock_data.js
+++ b/spec/javascripts/pipelines/mock_data.js
@@ -1,6 +1,5 @@
export const pipelineWithStages = {
id: 20333396,
- iid: 304399,
user: {
id: 128633,
name: 'Rémy Coutable',
diff --git a/spec/javascripts/pipelines/pipeline_url_spec.js b/spec/javascripts/pipelines/pipeline_url_spec.js
index 88c0137dc58..aa196af2f33 100644
--- a/spec/javascripts/pipelines/pipeline_url_spec.js
+++ b/spec/javascripts/pipelines/pipeline_url_spec.js
@@ -13,7 +13,6 @@ describe('Pipeline Url Component', () => {
propsData: {
pipeline: {
id: 1,
- iid: 1,
path: 'foo',
flags: {},
},
@@ -29,7 +28,6 @@ describe('Pipeline Url Component', () => {
propsData: {
pipeline: {
id: 1,
- iid: 1,
path: 'foo',
flags: {},
},
@@ -49,7 +47,6 @@ describe('Pipeline Url Component', () => {
propsData: {
pipeline: {
id: 1,
- iid: 1,
path: 'foo',
flags: {
latest: true,
@@ -81,7 +78,6 @@ describe('Pipeline Url Component', () => {
propsData: {
pipeline: {
id: 1,
- iid: 1,
path: 'foo',
flags: {
latest: true,
@@ -104,7 +100,6 @@ describe('Pipeline Url Component', () => {
propsData: {
pipeline: {
id: 1,
- iid: 1,
path: 'foo',
flags: {
failure_reason: true,
diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js
index a2308b0dfdb..75017d20473 100644
--- a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js
+++ b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js
@@ -103,7 +103,7 @@ describe('MRWidgetPipeline', () => {
it('should render pipeline ID', () => {
expect(vm.$el.querySelector('.pipeline-id').textContent.trim()).toEqual(
- `#${mockData.pipeline.id} (#${mockData.pipeline.iid})`,
+ `#${mockData.pipeline.id}`,
);
});
@@ -150,7 +150,7 @@ describe('MRWidgetPipeline', () => {
it('should render pipeline ID', () => {
expect(vm.$el.querySelector('.pipeline-id').textContent.trim()).toEqual(
- `#${mockData.pipeline.id} (#${mockData.pipeline.iid})`,
+ `#${mockData.pipeline.id}`,
);
});
@@ -222,9 +222,9 @@ describe('MRWidgetPipeline', () => {
sourceBranchLink: mockCopy.source_branch_link,
});
- const expected = `Pipeline #${pipeline.id} (#${pipeline.iid}) ${
- pipeline.details.status.label
- } for ${pipeline.commit.short_id} on ${mockCopy.source_branch_link}`;
+ const expected = `Pipeline #${pipeline.id} ${pipeline.details.status.label} for ${
+ pipeline.commit.short_id
+ } on ${mockCopy.source_branch_link}`;
const actual = trimText(vm.$el.querySelector('.js-pipeline-info-container').innerText);
@@ -247,11 +247,11 @@ describe('MRWidgetPipeline', () => {
sourceBranchLink: mockCopy.source_branch_link,
});
- const expected = `Pipeline #${pipeline.id} (#${pipeline.iid}) ${
- pipeline.details.status.label
- } for ${pipeline.commit.short_id} on !${pipeline.merge_request.iid} with ${
- pipeline.merge_request.source_branch
- } into ${pipeline.merge_request.target_branch}`;
+ const expected = `Pipeline #${pipeline.id} ${pipeline.details.status.label} for ${
+ pipeline.commit.short_id
+ } on !${pipeline.merge_request.iid} with ${pipeline.merge_request.source_branch} into ${
+ pipeline.merge_request.target_branch
+ }`;
const actual = trimText(vm.$el.querySelector('.js-pipeline-info-container').innerText);
@@ -274,11 +274,9 @@ describe('MRWidgetPipeline', () => {
sourceBranchLink: mockCopy.source_branch_link,
});
- const expected = `Pipeline #${pipeline.id} (#${pipeline.iid}) ${
- pipeline.details.status.label
- } for ${pipeline.commit.short_id} on !${pipeline.merge_request.iid} with ${
- pipeline.merge_request.source_branch
- }`;
+ const expected = `Pipeline #${pipeline.id} ${pipeline.details.status.label} for ${
+ pipeline.commit.short_id
+ } on !${pipeline.merge_request.iid} with ${pipeline.merge_request.source_branch}`;
const actual = trimText(vm.$el.querySelector('.js-pipeline-info-container').innerText);
diff --git a/spec/javascripts/vue_mr_widget/mock_data.js b/spec/javascripts/vue_mr_widget/mock_data.js
index 3c9a5cece90..48f812f0db4 100644
--- a/spec/javascripts/vue_mr_widget/mock_data.js
+++ b/spec/javascripts/vue_mr_widget/mock_data.js
@@ -61,7 +61,6 @@ export default {
"Merge branch 'daaaa' into 'master'\n\nUpdate README.md\n\nSee merge request !22",
pipeline: {
id: 172,
- iid: 32,
user: {
name: 'Administrator',
username: 'root',
@@ -243,8 +242,6 @@ export default {
export const mockStore = {
pipeline: {
id: 0,
- iid: 0,
- path: '/root/acets-app/pipelines/0',
details: {
status: {
details_path: '/root/review-app-tester/pipelines/66',
@@ -262,8 +259,6 @@ export const mockStore = {
},
mergePipeline: {
id: 1,
- iid: 1,
- path: '/root/acets-app/pipelines/0',
details: {
status: {
details_path: '/root/review-app-tester/pipelines/66',
diff --git a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
index 08f7a17515e..ac2fb16bd10 100644
--- a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
+++ b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
@@ -544,7 +544,6 @@ describe('mrWidgetOptions', () => {
];
const deploymentMockData = {
id: 15,
- iid: 7,
name: 'review/diplo',
url: '/root/acets-review-apps/environments/15',
stop_url: '/root/acets-review-apps/environments/15/stop',
@@ -591,7 +590,6 @@ describe('mrWidgetOptions', () => {
vm.mr.state = 'merged';
vm.mr.mergePipeline = {
id: 127,
- iid: 35,
user: {
id: 1,
name: 'Administrator',
diff --git a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
index 3debd42ac65..50cb45c39d1 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Gitlab::Ci::Pipeline::Chain::Build do
set(:project) { create(:project, :repository) }
- set(:user) { create(:user) }
+ set(:user) { create(:user, developer_projects: [project]) }
let(:pipeline) { Ci::Pipeline.new }
let(:variables_attributes) do
diff --git a/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb
index 97da66d2bcc..a6fdec832a3 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb
@@ -50,21 +50,21 @@ describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
let(:left_value) { 'my-string' }
let(:right_value) { Gitlab::UntrustedRegexp.new('something') }
- it { is_expected.to eq(nil) }
+ it { is_expected.to eq(false) }
end
context 'when left and right match' do
let(:left_value) { 'my-awesome-string' }
let(:right_value) { Gitlab::UntrustedRegexp.new('awesome.string$') }
- it { is_expected.to eq(3) }
+ it { is_expected.to eq(true) }
end
context 'when left is nil' do
let(:left_value) { nil }
let(:right_value) { Gitlab::UntrustedRegexp.new('pattern') }
- it { is_expected.to eq(nil) }
+ it { is_expected.to eq(false) }
end
context 'when left is a multiline string and matches right' do
@@ -78,7 +78,7 @@ describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
let(:right_value) { Gitlab::UntrustedRegexp.new('text-string') }
- it { is_expected.to eq(24) }
+ it { is_expected.to eq(true) }
end
context 'when left is a multiline string and does not match right' do
@@ -92,7 +92,7 @@ describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
let(:right_value) { Gitlab::UntrustedRegexp.new('text-string') }
- it { is_expected.to eq(nil) }
+ it { is_expected.to eq(false) }
end
context 'when a matching pattern uses regex flags' do
@@ -104,7 +104,7 @@ describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
let(:right_value) { Gitlab::UntrustedRegexp.new('(?i)awesome') }
- it { is_expected.to eq(3) }
+ it { is_expected.to eq(true) }
end
context 'when a non-matching pattern uses regex flags' do
@@ -116,7 +116,7 @@ describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
let(:right_value) { Gitlab::UntrustedRegexp.new('(?i)terrible') }
- it { is_expected.to eq(nil) }
+ it { is_expected.to eq(false) }
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
index 057e2f3fbe8..a2c2e3653d5 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
@@ -41,17 +41,17 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
'null == $UNDEFINED_VARIABLE' | true
'$PRESENT_VARIABLE' | 'my variable'
'$UNDEFINED_VARIABLE' | nil
- "$PRESENT_VARIABLE =~ /var.*e$/" | 3
- '$PRESENT_VARIABLE =~ /va\r.*e$/' | nil
- '$PRESENT_VARIABLE =~ /va\/r.*e$/' | nil
- "$PRESENT_VARIABLE =~ /var.*e$/" | 3
- "$PRESENT_VARIABLE =~ /^var.*/" | nil
- "$EMPTY_VARIABLE =~ /var.*/" | nil
- "$UNDEFINED_VARIABLE =~ /var.*/" | nil
- "$PRESENT_VARIABLE =~ /VAR.*/i" | 3
- '$PATH_VARIABLE =~ /path\/variable/' | 2
- '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/' | 0
- '$FULL_PATH_VARIABLE =~ /\\/path\\/variable\\/value$/' | 7
+ "$PRESENT_VARIABLE =~ /var.*e$/" | true
+ '$PRESENT_VARIABLE =~ /va\r.*e$/' | false
+ '$PRESENT_VARIABLE =~ /va\/r.*e$/' | false
+ "$PRESENT_VARIABLE =~ /var.*e$/" | true
+ "$PRESENT_VARIABLE =~ /^var.*/" | false
+ "$EMPTY_VARIABLE =~ /var.*/" | false
+ "$UNDEFINED_VARIABLE =~ /var.*/" | false
+ "$PRESENT_VARIABLE =~ /VAR.*/i" | true
+ '$PATH_VARIABLE =~ /path\/variable/' | true
+ '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/' | true
+ '$FULL_PATH_VARIABLE =~ /\\/path\\/variable\\/value$/' | true
'$PRESENT_VARIABLE != "my variable"' | false
'"my variable" != $PRESENT_VARIABLE' | false
'$PRESENT_VARIABLE != null' | true
@@ -82,7 +82,7 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
'"string" && "string"' | 'string'
'null && null' | nil
- '$PRESENT_VARIABLE =~ /my var/ && $EMPTY_VARIABLE =~ /nope/' | nil
+ '$PRESENT_VARIABLE =~ /my var/ && $EMPTY_VARIABLE =~ /nope/' | false
'$EMPTY_VARIABLE == "" && $PRESENT_VARIABLE' | 'my variable'
'$EMPTY_VARIABLE == "" && $PRESENT_VARIABLE != "nope"' | true
'$PRESENT_VARIABLE && $EMPTY_VARIABLE' | ''
@@ -90,17 +90,17 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
'$UNDEFINED_VARIABLE && $EMPTY_VARIABLE' | nil
'$UNDEFINED_VARIABLE && $PRESENT_VARIABLE' | nil
- '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ && $PATH_VARIABLE =~ /path\/variable/' | 2
- '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ && $PATH_VARIABLE =~ /path\/variable/' | nil
- '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ && $PATH_VARIABLE =~ /bad\/path\/variable/' | nil
- '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ && $PATH_VARIABLE =~ /bad\/path\/variable/' | nil
+ '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ && $PATH_VARIABLE =~ /path\/variable/' | true
+ '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ && $PATH_VARIABLE =~ /path\/variable/' | false
+ '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ && $PATH_VARIABLE =~ /bad\/path\/variable/' | false
+ '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ && $PATH_VARIABLE =~ /bad\/path\/variable/' | false
- '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ || $PATH_VARIABLE =~ /path\/variable/' | 0
- '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ || $PATH_VARIABLE =~ /path\/variable/' | 2
- '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ || $PATH_VARIABLE =~ /bad\/path\/variable/' | 0
- '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ || $PATH_VARIABLE =~ /bad\/path\/variable/' | nil
+ '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ || $PATH_VARIABLE =~ /path\/variable/' | true
+ '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ || $PATH_VARIABLE =~ /path\/variable/' | true
+ '$FULL_PATH_VARIABLE =~ /^\/a\/full\/path\/variable\/value$/ || $PATH_VARIABLE =~ /bad\/path\/variable/' | true
+ '$FULL_PATH_VARIABLE =~ /^\/a\/bad\/path\/variable\/value$/ || $PATH_VARIABLE =~ /bad\/path\/variable/' | false
- '$PRESENT_VARIABLE =~ /my var/ || $EMPTY_VARIABLE =~ /nope/' | 0
+ '$PRESENT_VARIABLE =~ /my var/ || $EMPTY_VARIABLE =~ /nope/' | true
'$EMPTY_VARIABLE == "" || $PRESENT_VARIABLE' | true
'$PRESENT_VARIABLE != "nope" || $EMPTY_VARIABLE == ""' | true
@@ -117,21 +117,6 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
it "evaluates to `#{params[:value].inspect}`" do
expect(subject.evaluate).to eq(value)
end
-
- # This test is used to ensure that our parser
- # returns exactly the same results as if we
- # were evaluating using ruby's `eval`
- context 'when using Ruby eval' do
- let(:expression_ruby) do
- expression
- .gsub(/null/, 'nil')
- .gsub(/\$([a-zA-Z_][a-zA-Z0-9_]*)/) { "variables['#{Regexp.last_match(1)}']" }
- end
-
- it 'behaves exactly the same' do
- expect(instance_eval(expression_ruby)).to eq(subject.evaluate)
- end
- end
end
context 'with the ci_variables_complex_expressions feature flag disabled' do
diff --git a/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb
index e8fc67acf05..c738cc49c1f 100644
--- a/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/code_stage_spec.rb
@@ -4,5 +4,41 @@ require 'lib/gitlab/cycle_analytics/shared_stage_spec'
describe Gitlab::CycleAnalytics::CodeStage do
let(:stage_name) { :code }
+ let(:project) { create(:project) }
+ let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
+ let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:mr_1) { create(:merge_request, source_project: project, created_at: 15.minutes.ago) }
+ let!(:mr_2) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'A') }
+ let!(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
+ let(:stage) { described_class.new(project: project, options: { from: 2.days.ago, current_user: project.creator }) }
+
+ before do
+ issue_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 45.minutes.ago)
+ issue_2.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
+ issue_3.metrics.update!(first_added_to_board_at: 60.minutes.ago, first_mentioned_in_commit_at: 40.minutes.ago)
+ create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
+ create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
+ end
+
it_behaves_like 'base stage'
+
+ describe '#median' do
+ around do |example|
+ Timecop.freeze { example.run }
+ end
+
+ it 'counts median from issues with metrics' do
+ expect(stage.median).to eq(ISSUES_MEDIAN)
+ end
+ end
+
+ describe '#events' do
+ it 'exposes merge requests that closes issues' do
+ result = stage.events
+
+ expect(result.count).to eq(2)
+ expect(result.map { |event| event[:title] }).to contain_exactly(mr_1.title, mr_2.title)
+ end
+ end
end
diff --git a/spec/lib/gitlab/cycle_analytics/events_spec.rb b/spec/lib/gitlab/cycle_analytics/events_spec.rb
index 397dd4e5d2c..f8b103c0fab 100644
--- a/spec/lib/gitlab/cycle_analytics/events_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/events_spec.rb
@@ -53,20 +53,28 @@ describe 'cycle analytics events' do
describe '#plan_events' do
let(:stage) { :plan }
- it 'has a title' do
- expect(events.first[:title]).not_to be_nil
+ before do
+ create_commit_referencing_issue(context)
end
- it 'has a sha short ID' do
- expect(events.first[:short_sha]).not_to be_nil
+ it 'has the total time' do
+ expect(events.first[:total_time]).not_to be_empty
+ end
+
+ it 'has a title' do
+ expect(events.first[:title]).to eq(context.title)
end
it 'has the URL' do
- expect(events.first[:commit_url]).not_to be_nil
+ expect(events.first[:url]).not_to be_nil
end
- it 'has the total time' do
- expect(events.first[:total_time]).not_to be_empty
+ it 'has an iid' do
+ expect(events.first[:iid]).to eq(context.iid.to_s)
+ end
+
+ it 'has a created_at timestamp' do
+ expect(events.first[:created_at]).to end_with('ago')
end
it "has the author's URL" do
@@ -78,12 +86,13 @@ describe 'cycle analytics events' do
end
it "has the author's name" do
- expect(events.first[:author][:name]).not_to be_nil
+ expect(events.first[:author][:name]).to eq(context.author.name)
end
end
describe '#code_events' do
let(:stage) { :code }
+ let!(:merge_request) { MergeRequest.first }
before do
create_commit_referencing_issue(context)
@@ -122,6 +131,7 @@ describe 'cycle analytics events' do
let(:stage) { :test }
let(:merge_request) { MergeRequest.first }
+ let!(:context) { create(:issue, project: project, created_at: 2.days.ago) }
let!(:pipeline) do
create(:ci_pipeline,
@@ -137,6 +147,7 @@ describe 'cycle analytics events' do
pipeline.run!
pipeline.succeed!
+ merge_merge_requests_closing_issue(user, project, context)
end
it 'has the name' do
@@ -180,6 +191,10 @@ describe 'cycle analytics events' do
let(:stage) { :review }
let!(:context) { create(:issue, project: project, created_at: 2.days.ago) }
+ before do
+ merge_merge_requests_closing_issue(user, project, context)
+ end
+
it 'has the total time' do
expect(events.first[:total_time]).not_to be_empty
end
diff --git a/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb
index 3127f01989d..3b6af9cbaed 100644
--- a/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/issue_stage_spec.rb
@@ -3,6 +3,37 @@ require 'lib/gitlab/cycle_analytics/shared_stage_spec'
describe Gitlab::CycleAnalytics::IssueStage do
let(:stage_name) { :issue }
+ let(:project) { create(:project) }
+ let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
+ let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:issue_3) { create(:issue, project: project, created_at: 30.minutes.ago) }
+ let!(:issue_without_milestone) { create(:issue, project: project, created_at: 1.minute.ago) }
+ let(:stage) { described_class.new(project: project, options: { from: 2.days.ago, current_user: project.creator }) }
+
+ before do
+ issue_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago )
+ issue_2.metrics.update!(first_added_to_board_at: 30.minutes.ago)
+ issue_3.metrics.update!(first_added_to_board_at: 15.minutes.ago)
+ end
it_behaves_like 'base stage'
+
+ describe '#median' do
+ around do |example|
+ Timecop.freeze { example.run }
+ end
+
+ it 'counts median from issues with metrics' do
+ expect(stage.median).to eq(ISSUES_MEDIAN)
+ end
+ end
+
+ describe '#events' do
+ it 'exposes issues with metrics' do
+ result = stage.events
+
+ expect(result.count).to eq(3)
+ expect(result.map { |event| event[:title] }).to contain_exactly(issue_1.title, issue_2.title, issue_3.title)
+ end
+ end
end
diff --git a/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb
index 4c715921ad6..506a8160412 100644
--- a/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/plan_stage_spec.rb
@@ -3,6 +3,37 @@ require 'lib/gitlab/cycle_analytics/shared_stage_spec'
describe Gitlab::CycleAnalytics::PlanStage do
let(:stage_name) { :plan }
+ let(:project) { create(:project) }
+ let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
+ let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:issue_3) { create(:issue, project: project, created_at: 30.minutes.ago) }
+ let!(:issue_without_milestone) { create(:issue, project: project, created_at: 1.minute.ago) }
+ let(:stage) { described_class.new(project: project, options: { from: 2.days.ago, current_user: project.creator }) }
+
+ before do
+ issue_1.metrics.update!(first_associated_with_milestone_at: 60.minutes.ago, first_mentioned_in_commit_at: 10.minutes.ago)
+ issue_2.metrics.update!(first_added_to_board_at: 30.minutes.ago, first_mentioned_in_commit_at: 20.minutes.ago)
+ issue_3.metrics.update!(first_added_to_board_at: 15.minutes.ago)
+ end
it_behaves_like 'base stage'
+
+ describe '#median' do
+ around do |example|
+ Timecop.freeze { example.run }
+ end
+
+ it 'counts median from issues with metrics' do
+ expect(stage.median).to eq(ISSUES_MEDIAN)
+ end
+ end
+
+ describe '#events' do
+ it 'exposes issues with metrics' do
+ result = stage.events
+
+ expect(result.count).to eq(2)
+ expect(result.map { |event| event[:title] }).to contain_exactly(issue_1.title, issue_2.title)
+ end
+ end
end
diff --git a/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
index 1412c8dfa08..f072a9644e8 100644
--- a/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
@@ -3,6 +3,43 @@ require 'lib/gitlab/cycle_analytics/shared_stage_spec'
describe Gitlab::CycleAnalytics::ReviewStage do
let(:stage_name) { :review }
+ let(:project) { create(:project) }
+ let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
+ let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:mr_1) { create(:merge_request, :closed, source_project: project, created_at: 60.minutes.ago) }
+ let!(:mr_2) { create(:merge_request, :closed, source_project: project, created_at: 40.minutes.ago, source_branch: 'A') }
+ let!(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
+ let!(:mr_4) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'C') }
+ let(:stage) { described_class.new(project: project, options: { from: 2.days.ago, current_user: project.creator }) }
+
+ before do
+ mr_1.metrics.update!(merged_at: 30.minutes.ago)
+ mr_2.metrics.update!(merged_at: 10.minutes.ago)
+
+ create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
+ create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
+ create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_3)
+ end
it_behaves_like 'base stage'
+
+ describe '#median' do
+ around do |example|
+ Timecop.freeze { example.run }
+ end
+
+ it 'counts median from issues with metrics' do
+ expect(stage.median).to eq(ISSUES_MEDIAN)
+ end
+ end
+
+ describe '#events' do
+ it 'exposes merge requests that close issues' do
+ result = stage.events
+
+ expect(result.count).to eq(2)
+ expect(result.map { |event| event[:title] }).to contain_exactly(mr_1.title, mr_2.title)
+ end
+ end
end
diff --git a/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb
index 08425acbfc8..1a4b572cc11 100644
--- a/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/shared_stage_spec.rb
@@ -1,6 +1,8 @@
require 'spec_helper'
shared_examples 'base stage' do
+ ISSUES_MEDIAN = 30.minutes.to_i
+
let(:stage) { described_class.new(project: double, options: {}) }
before do
diff --git a/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb
index 8154b3ac701..17d5fbb9733 100644
--- a/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/staging_stage_spec.rb
@@ -4,5 +4,46 @@ require 'lib/gitlab/cycle_analytics/shared_stage_spec'
describe Gitlab::CycleAnalytics::StagingStage do
let(:stage_name) { :staging }
+ let(:project) { create(:project) }
+ let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
+ let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:mr_1) { create(:merge_request, :closed, source_project: project, created_at: 60.minutes.ago) }
+ let!(:mr_2) { create(:merge_request, :closed, source_project: project, created_at: 40.minutes.ago, source_branch: 'A') }
+ let!(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
+ let(:build_1) { create(:ci_build, project: project) }
+ let(:build_2) { create(:ci_build, project: project) }
+
+ let(:stage) { described_class.new(project: project, options: { from: 2.days.ago, current_user: project.creator }) }
+
+ before do
+ mr_1.metrics.update!(merged_at: 80.minutes.ago, first_deployed_to_production_at: 50.minutes.ago, pipeline_id: build_1.commit_id)
+ mr_2.metrics.update!(merged_at: 60.minutes.ago, first_deployed_to_production_at: 30.minutes.ago, pipeline_id: build_2.commit_id)
+ mr_3.metrics.update!(merged_at: 10.minutes.ago, first_deployed_to_production_at: 3.days.ago, pipeline_id: create(:ci_build, project: project).commit_id)
+
+ create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
+ create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
+ create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_3)
+ end
+
it_behaves_like 'base stage'
+
+ describe '#median' do
+ around do |example|
+ Timecop.freeze { example.run }
+ end
+
+ it 'counts median from issues with metrics' do
+ expect(stage.median).to eq(ISSUES_MEDIAN)
+ end
+ end
+
+ describe '#events' do
+ it 'exposes builds connected to merge request' do
+ result = stage.events
+
+ expect(result.count).to eq(2)
+ expect(result.map { |event| event[:name] }).to contain_exactly(build_1.name, build_2.name)
+ end
+ end
end
diff --git a/spec/lib/gitlab/gpg/commit_spec.rb b/spec/lib/gitlab/gpg/commit_spec.rb
index 8229f0eb794..47e6f5d4220 100644
--- a/spec/lib/gitlab/gpg/commit_spec.rb
+++ b/spec/lib/gitlab/gpg/commit_spec.rb
@@ -109,6 +109,89 @@ describe Gitlab::Gpg::Commit do
end
end
+ context 'valid key signed using recent version of Gnupg' do
+ let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
+
+ let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
+
+ let!(:gpg_key) do
+ create :gpg_key, key: GpgHelpers::User1.public_key, user: user
+ end
+
+ let!(:crypto) { instance_double(GPGME::Crypto) }
+
+ before do
+ fake_signature = [
+ GpgHelpers::User1.signed_commit_signature,
+ GpgHelpers::User1.signed_commit_base_data
+ ]
+
+ allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
+ .with(Gitlab::Git::Repository, commit_sha)
+ .and_return(fake_signature)
+ end
+
+ it 'returns a valid signature' do
+ verified_signature = double('verified-signature', fingerprint: GpgHelpers::User1.fingerprint, valid?: true)
+ allow(GPGME::Crypto).to receive(:new).and_return(crypto)
+ allow(crypto).to receive(:verify).and_return(verified_signature)
+
+ signature = described_class.new(commit).signature
+
+ expect(signature).to have_attributes(
+ commit_sha: commit_sha,
+ project: project,
+ gpg_key: gpg_key,
+ gpg_key_primary_keyid: GpgHelpers::User1.primary_keyid,
+ gpg_key_user_name: GpgHelpers::User1.names.first,
+ gpg_key_user_email: GpgHelpers::User1.emails.first,
+ verification_status: 'verified'
+ )
+ end
+ end
+
+ context 'valid key signed using older version of Gnupg' do
+ let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User1.emails.first }
+
+ let!(:user) { create(:user, email: GpgHelpers::User1.emails.first) }
+
+ let!(:gpg_key) do
+ create :gpg_key, key: GpgHelpers::User1.public_key, user: user
+ end
+
+ let!(:crypto) { instance_double(GPGME::Crypto) }
+
+ before do
+ fake_signature = [
+ GpgHelpers::User1.signed_commit_signature,
+ GpgHelpers::User1.signed_commit_base_data
+ ]
+
+ allow(Gitlab::Git::Commit).to receive(:extract_signature_lazily)
+ .with(Gitlab::Git::Repository, commit_sha)
+ .and_return(fake_signature)
+ end
+
+ it 'returns a valid signature' do
+ keyid = GpgHelpers::User1.fingerprint.last(16)
+ verified_signature = double('verified-signature', fingerprint: keyid, valid?: true)
+ allow(GPGME::Crypto).to receive(:new).and_return(crypto)
+ allow(crypto).to receive(:verify).and_return(verified_signature)
+
+ signature = described_class.new(commit).signature
+
+ expect(signature).to have_attributes(
+ commit_sha: commit_sha,
+ project: project,
+ gpg_key: gpg_key,
+ gpg_key_primary_keyid: GpgHelpers::User1.primary_keyid,
+ gpg_key_user_name: GpgHelpers::User1.names.first,
+ gpg_key_user_email: GpgHelpers::User1.emails.first,
+ verification_status: 'verified'
+ )
+ end
+ end
+
context 'commit signed with a subkey' do
let!(:commit) { create :commit, project: project, sha: commit_sha, committer_email: GpgHelpers::User3.emails.first }
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 2242543daad..002359e5cc0 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -175,6 +175,8 @@ deploy_keys:
services:
- project
- service_hook
+- jira_tracker_data
+- issue_tracker_data
hooks:
- project
- web_hook_logs
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index a8701f0efa4..c4e54be673f 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -2736,7 +2736,7 @@ describe Ci::Pipeline, :mailer do
create(:ci_pipeline,
project: project,
sha: project.commit('master').sha,
- user: create(:user))
+ user: project.owner)
end
before do
diff --git a/spec/models/lfs_object_spec.rb b/spec/models/lfs_object_spec.rb
index 3d4d4b7d795..85bfc3f1387 100644
--- a/spec/models/lfs_object_spec.rb
+++ b/spec/models/lfs_object_spec.rb
@@ -3,6 +3,20 @@
require 'spec_helper'
describe LfsObject do
+ it 'has a distinct has_many :projects relation through lfs_objects_projects' do
+ lfs_object = create(:lfs_object)
+ project = create(:project)
+ [:project, :design].each do |repository_type|
+ create(:lfs_objects_project, project: project,
+ lfs_object: lfs_object,
+ repository_type: repository_type)
+ end
+
+ expect(lfs_object.lfs_objects_projects.size).to eq(2)
+ expect(lfs_object.projects.size).to eq(1)
+ expect(lfs_object.projects.to_a).to eql([project])
+ end
+
describe '#local_store?' do
it 'returns true when file_store is equal to LfsObjectUploader::Store::LOCAL' do
subject.file_store = LfsObjectUploader::Store::LOCAL
diff --git a/spec/models/lfs_objects_project_spec.rb b/spec/models/lfs_objects_project_spec.rb
index 3e86ee38566..e320f873989 100644
--- a/spec/models/lfs_objects_project_spec.rb
+++ b/spec/models/lfs_objects_project_spec.rb
@@ -20,8 +20,8 @@ describe LfsObjectsProject do
it 'validates object id' do
is_expected.to validate_uniqueness_of(:lfs_object_id)
- .scoped_to(:project_id)
- .with_message("already exists in project")
+ .scoped_to(:project_id, :repository_type)
+ .with_message("already exists in repository")
end
end
diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb
index a04b984c1f6..a1bd0855708 100644
--- a/spec/models/project_services/hipchat_service_spec.rb
+++ b/spec/models/project_services/hipchat_service_spec.rb
@@ -301,7 +301,7 @@ describe HipchatService do
end
context 'pipeline events' do
- let(:pipeline) { create(:ci_empty_pipeline, user: create(:user)) }
+ let(:pipeline) { create(:ci_empty_pipeline, user: project.owner) }
let(:data) { Gitlab::DataBuilder::Pipeline.build(pipeline) }
context 'for failed' do
diff --git a/spec/models/project_services/issue_tracker_data_spec.rb b/spec/models/project_services/issue_tracker_data_spec.rb
new file mode 100644
index 00000000000..aaab654f874
--- /dev/null
+++ b/spec/models/project_services/issue_tracker_data_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe IssueTrackerData do
+ let(:service) { create(:custom_issue_tracker_service, active: false, properties: {}) }
+
+ describe 'Associations' do
+ it { is_expected.to belong_to :service }
+ end
+
+ describe 'Validations' do
+ subject { described_class.new(service: service) }
+
+ context 'url validations' do
+ context 'when service is inactive' do
+ it { is_expected.not_to validate_presence_of(:project_url) }
+ it { is_expected.not_to validate_presence_of(:issues_url) }
+ end
+
+ context 'when service is active' do
+ before do
+ service.update(active: true)
+ end
+
+ it_behaves_like 'issue tracker service URL attribute', :project_url
+ it_behaves_like 'issue tracker service URL attribute', :issues_url
+ it_behaves_like 'issue tracker service URL attribute', :new_issue_url
+
+ it { is_expected.to validate_presence_of(:project_url) }
+ it { is_expected.to validate_presence_of(:issues_url) }
+ end
+ end
+ end
+end
diff --git a/spec/models/project_services/jira_tracker_data_spec.rb b/spec/models/project_services/jira_tracker_data_spec.rb
new file mode 100644
index 00000000000..1b6ece8531b
--- /dev/null
+++ b/spec/models/project_services/jira_tracker_data_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe JiraTrackerData do
+ let(:service) { create(:jira_service, active: false, properties: {}) }
+
+ describe 'Associations' do
+ it { is_expected.to belong_to(:service) }
+ end
+
+ describe 'Validations' do
+ subject { described_class.new(service: service) }
+
+ context 'jira_issue_transition_id' do
+ it { is_expected.to allow_value(nil).for(:jira_issue_transition_id) }
+ it { is_expected.to allow_value('1,2,3').for(:jira_issue_transition_id) }
+ it { is_expected.to allow_value('1;2;3').for(:jira_issue_transition_id) }
+ it { is_expected.not_to allow_value('a,b,cd').for(:jira_issue_transition_id) }
+ end
+
+ context 'url validations' do
+ context 'when service is inactive' do
+ it { is_expected.not_to validate_presence_of(:url) }
+ it { is_expected.not_to validate_presence_of(:username) }
+ it { is_expected.not_to validate_presence_of(:password) }
+ end
+
+ context 'when service is active' do
+ before do
+ service.update(active: true)
+ end
+
+ it_behaves_like 'issue tracker service URL attribute', :url
+
+ it { is_expected.to validate_presence_of(:url) }
+ it { is_expected.to validate_presence_of(:username) }
+ it { is_expected.to validate_presence_of(:password) }
+ end
+ end
+ end
+end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index aad08b9d4aa..e6d5e8fc320 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -103,6 +103,20 @@ describe Project do
expect(described_class.reflect_on_association(:merge_requests).has_inverse?).to eq(:target_project)
end
+ it 'has a distinct has_many :lfs_objects relation through lfs_objects_projects' do
+ project = create(:project)
+ lfs_object = create(:lfs_object)
+ [:project, :design].each do |repository_type|
+ create(:lfs_objects_project, project: project,
+ lfs_object: lfs_object,
+ repository_type: repository_type)
+ end
+
+ expect(project.lfs_objects_projects.size).to eq(2)
+ expect(project.lfs_objects.size).to eq(1)
+ expect(project.lfs_objects.to_a).to eql([lfs_object])
+ end
+
context 'after initialized' do
it "has a project_feature" do
expect(described_class.new.project_feature).to be_present
@@ -1479,11 +1493,28 @@ describe Project do
end
context 'when set to INTERNAL in application settings' do
+ using RSpec::Parameterized::TableSyntax
+
before do
stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
end
it { is_expected.to eq(Gitlab::VisibilityLevel::INTERNAL) }
+
+ where(:attribute_name, :value) do
+ :visibility | 'public'
+ :visibility_level | Gitlab::VisibilityLevel::PUBLIC
+ 'visibility' | 'public'
+ 'visibility_level' | Gitlab::VisibilityLevel::PUBLIC
+ end
+
+ with_them do
+ it 'sets the visibility level' do
+ proj = described_class.new(attribute_name => value, name: 'test', path: 'test')
+
+ expect(proj.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
+ end
+ end
end
end
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index 64db32781fe..c9439b0846d 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -6,6 +6,8 @@ describe Service do
describe "Associations" do
it { is_expected.to belong_to :project }
it { is_expected.to have_one :service_hook }
+ it { is_expected.to have_one :jira_tracker_data }
+ it { is_expected.to have_one :issue_tracker_data }
end
describe 'Validations' do
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index ed0e82ef179..4b723a52b51 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -39,7 +39,7 @@ describe ProjectPolicy do
admin_milestone admin_merge_request update_merge_request create_commit_status
update_commit_status create_build update_build create_pipeline
update_pipeline create_merge_request_from create_wiki push_code
- resolve_note create_container_image update_container_image
+ resolve_note create_container_image update_container_image destroy_container_image
create_environment create_deployment create_release update_release
]
end
diff --git a/spec/requests/api/container_registry_spec.rb b/spec/requests/api/container_registry_spec.rb
index ea035a8be4a..4ad15ed6bea 100644
--- a/spec/requests/api/container_registry_spec.rb
+++ b/spec/requests/api/container_registry_spec.rb
@@ -201,10 +201,10 @@ describe API::ContainerRegistry do
describe 'DELETE /projects/:id/registry/repositories/:repository_id/tags/:tag_name' do
subject { delete api("/projects/#{project.id}/registry/repositories/#{root_repository.id}/tags/rootA", api_user) }
- it_behaves_like 'being disallowed', :developer
+ it_behaves_like 'being disallowed', :reporter
- context 'for maintainer' do
- let(:api_user) { maintainer }
+ context 'for developer' do
+ let(:api_user) { developer }
before do
stub_container_registry_tags(repository: root_repository.path, tags: %w(rootA), with_manifest: true)
diff --git a/spec/requests/api/graphql/tasks/task_completion_status_spec.rb b/spec/requests/api/graphql/tasks/task_completion_status_spec.rb
new file mode 100644
index 00000000000..c457a6d7c25
--- /dev/null
+++ b/spec/requests/api/graphql/tasks/task_completion_status_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'getting task completion status information' do
+ include GraphqlHelpers
+
+ DESCRIPTION_0_DONE = '- [ ] task 1\n- [ ] task 2'
+ DESCRIPTION_1_DONE = '- [x] task 1\n- [ ] task 2'
+ DESCRIPTION_2_DONE = '- [x] task 1\n- [x] task 2'
+
+ set(:user1) { create(:user) }
+ set(:project) { create(:project, :repository, :public) }
+
+ let(:fields) do
+ <<~QUERY
+ taskCompletionStatus {
+ count,
+ completedCount
+ }
+ QUERY
+ end
+
+ def create_task_completion_status_query_for(type, iid)
+ graphql_query_for(
+ 'project',
+ { 'fullPath' => project.full_path },
+ query_graphql_field(type, { iid: iid }, fields)
+ )
+ end
+
+ shared_examples_for 'graphql task completion status provider' do |type|
+ it 'returns the expected task completion status' do
+ post_graphql(create_task_completion_status_query_for(type, item.iid), current_user: user1)
+
+ expect(response).to have_gitlab_http_status(200)
+
+ task_completion_status = graphql_data.dig('project', type, 'taskCompletionStatus')
+ expect(task_completion_status).not_to be_nil
+ expect(task_completion_status['count']).to eq(item.task_completion_status[:count])
+ expect(task_completion_status['completedCount']).to eq(item.task_completion_status[:completed_count])
+ end
+ end
+
+ [DESCRIPTION_0_DONE, DESCRIPTION_1_DONE, DESCRIPTION_2_DONE].each do |desc|
+ context "with description #{desc}" do
+ context 'when type is issue' do
+ it_behaves_like 'graphql task completion status provider', 'issue' do
+ let(:item) { create(:issue, project: project, description: desc) }
+ end
+ end
+
+ context 'when type is merge request' do
+ it_behaves_like 'graphql task completion status provider', 'mergeRequest' do
+ let(:item) { create(:merge_request, author: user1, source_project: project, description: desc) }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/cycle_analytics_events_spec.rb b/spec/requests/projects/cycle_analytics_events_spec.rb
index 49412b628b3..25390f8a23e 100644
--- a/spec/requests/projects/cycle_analytics_events_spec.rb
+++ b/spec/requests/projects/cycle_analytics_events_spec.rb
@@ -32,10 +32,10 @@ describe 'cycle analytics events' do
it 'lists the plan events' do
get project_cycle_analytics_plan_path(project, format: :json)
- first_mr_short_sha = project.merge_requests.sort_by_attribute(:created_asc).first.commits.first.short_id
+ first_issue_iid = project.issues.sort_by_attribute(:created_desc).pluck(:iid).first.to_s
expect(json_response['events']).not_to be_empty
- expect(json_response['events'].first['short_sha']).to eq(first_mr_short_sha)
+ expect(json_response['events'].first['iid']).to eq(first_issue_iid)
end
it 'lists the code events' do
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 867692d4d64..d9b61dfe503 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -1132,5 +1132,17 @@ describe Ci::CreatePipelineService do
.with_message('Insufficient permissions to create a new pipeline')
end
end
+
+ context 'when a user with permissions has been blocked' do
+ before do
+ user.block!
+ end
+
+ it 'raises an error' do
+ expect { subject }
+ .to raise_error(described_class::CreateError)
+ .with_message('Insufficient permissions to create a new pipeline')
+ end
+ end
end
end
diff --git a/spec/services/ci/play_build_service_spec.rb b/spec/services/ci/play_build_service_spec.rb
index 634f865e2d8..1e68b7956ea 100644
--- a/spec/services/ci/play_build_service_spec.rb
+++ b/spec/services/ci/play_build_service_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
describe Ci::PlayBuildService, '#execute' do
- let(:user) { create(:user) }
+ let(:user) { create(:user, developer_projects: [project]) }
let(:project) { create(:project) }
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, :manual, pipeline: pipeline) }
@@ -16,8 +16,6 @@ describe Ci::PlayBuildService, '#execute' do
let(:project) { create(:project) }
it 'allows user to play build if protected branch rules are met' do
- project.add_developer(user)
-
create(:protected_branch, :developers_can_merge,
name: build.ref, project: project)
@@ -27,8 +25,6 @@ describe Ci::PlayBuildService, '#execute' do
end
it 'does not allow user with developer role to play build' do
- project.add_developer(user)
-
expect { service.execute(build) }
.to raise_error Gitlab::Access::AccessDeniedError
end
@@ -38,23 +34,21 @@ describe Ci::PlayBuildService, '#execute' do
let(:project) { create(:project, :repository) }
it 'allows user with developer role to play a build' do
- project.add_developer(user)
-
service.execute(build)
expect(build.reload).to be_pending
end
+
+ it 'prevents a blocked developer from playing a build' do
+ user.block!
+
+ expect { service.execute(build) }.to raise_error(Gitlab::Access::AccessDeniedError)
+ end
end
context 'when build is a playable manual action' do
let(:build) { create(:ci_build, :manual, pipeline: pipeline) }
-
- before do
- project.add_developer(user)
-
- create(:protected_branch, :developers_can_merge,
- name: build.ref, project: project)
- end
+ let!(:branch) { create(:protected_branch, :developers_can_merge, name: build.ref, project: project) }
it 'enqueues the build' do
expect(service.execute(build)).to eq build
@@ -70,13 +64,7 @@ describe Ci::PlayBuildService, '#execute' do
context 'when build is not a playable manual action' do
let(:build) { create(:ci_build, when: :manual, pipeline: pipeline) }
-
- before do
- project.add_developer(user)
-
- create(:protected_branch, :developers_can_merge,
- name: build.ref, project: project)
- end
+ let!(:branch) { create(:protected_branch, :developers_can_merge, name: build.ref, project: project) }
it 'duplicates the build' do
duplicate = service.execute(build)
@@ -94,6 +82,7 @@ describe Ci::PlayBuildService, '#execute' do
end
context 'when build is not action' do
+ let(:user) { create(:user) }
let(:build) { create(:ci_build, :success, pipeline: pipeline) }
it 'raises an error' do
@@ -103,10 +92,8 @@ describe Ci::PlayBuildService, '#execute' do
end
context 'when user does not have ability to trigger action' do
- before do
- create(:protected_branch, :no_one_can_push,
- name: build.ref, project: project)
- end
+ let(:user) { create(:user) }
+ let!(:branch) { create(:protected_branch, :developers_can_merge, name: build.ref, project: project) }
it 'raises an error' do
expect { service.execute(build) }
diff --git a/spec/services/lfs/file_transformer_spec.rb b/spec/services/lfs/file_transformer_spec.rb
index 888eea6e91e..9973d64930b 100644
--- a/spec/services/lfs/file_transformer_spec.rb
+++ b/spec/services/lfs/file_transformer_spec.rb
@@ -3,13 +3,13 @@
require "spec_helper"
describe Lfs::FileTransformer do
- let(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :repository, :wiki_repo) }
let(:repository) { project.repository }
let(:file_content) { 'Test file content' }
let(:branch_name) { 'lfs' }
let(:file_path) { 'test_file.lfs' }
- subject { described_class.new(project, branch_name) }
+ subject { described_class.new(project, repository, branch_name) }
describe '#new_file' do
context 'with lfs disabled' do
@@ -100,6 +100,12 @@ describe Lfs::FileTransformer do
end.to change { project.lfs_objects.count }.by(1)
end
+ it 'saves the repository_type to LfsObjectsProject' do
+ subject.new_file(file_path, file_content)
+
+ expect(project.lfs_objects_projects.first.repository_type).to eq('project')
+ end
+
context 'when LfsObject already exists' do
let(:lfs_pointer) { Gitlab::Git::LfsPointerFile.new(file_content) }
@@ -113,6 +119,56 @@ describe Lfs::FileTransformer do
end.to change { project.lfs_objects.count }.by(1)
end
end
+
+ context 'when the LfsObject is already linked to project' do
+ before do
+ subject.new_file(file_path, file_content)
+ end
+
+ shared_examples 'a new LfsObject is not created' do
+ it do
+ expect do
+ second_service.new_file(file_path, file_content)
+ end.not_to change { project.lfs_objects.count }
+ end
+ end
+
+ context 'and the service is called again with the same repository type' do
+ let(:second_service) { described_class.new(project, repository, branch_name) }
+
+ include_examples 'a new LfsObject is not created'
+
+ it 'does not create a new LfsObjectsProject record' do
+ expect do
+ second_service.new_file(file_path, file_content)
+ end.not_to change { project.lfs_objects_projects.count }
+ end
+ end
+
+ context 'and the service is called again with a different repository type' do
+ let(:second_service) { described_class.new(project, project.wiki.repository, branch_name) }
+
+ before do
+ expect(second_service).to receive(:lfs_file?).and_return(true)
+ end
+
+ include_examples 'a new LfsObject is not created'
+
+ it 'creates a new LfsObjectsProject record' do
+ expect do
+ second_service.new_file(file_path, file_content)
+ end.to change { project.lfs_objects_projects.count }.by(1)
+ end
+
+ it 'sets the correct repository_type on the new LfsObjectsProject record' do
+ second_service.new_file(file_path, file_content)
+
+ repository_types = project.lfs_objects_projects.order(:id).pluck(:repository_type)
+
+ expect(repository_types).to eq(%w(project wiki))
+ end
+ end
+ end
end
end
end
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 4b40c86574f..f25e2fe5e2b 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -2217,10 +2217,12 @@ describe NotificationService, :mailer do
let(:pipeline) { create(:ci_pipeline, :failed, project: project, user: pipeline_user) }
it 'emails project owner and user that triggered the pipeline' do
+ project.add_developer(pipeline_user)
+
notification.autodevops_disabled(pipeline, [owner.email, pipeline_user.email])
- should_email(owner)
- should_email(pipeline_user)
+ should_email(owner, times: 1) # Once for the disable pipeline.
+ should_email(pipeline_user, times: 2) # Once for the new permission, once for the disable.
end
end
end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index f54f9200661..a4c48991807 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -152,6 +152,33 @@ describe Projects::CreateService, '#execute' do
end
end
+ context 'default visibility level' do
+ let(:group) { create(:group, :private) }
+
+ before do
+ stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
+ group.add_developer(user)
+
+ opts.merge!(
+ visibility: 'private',
+ name: 'test',
+ namespace: group,
+ path: 'foo'
+ )
+ end
+
+ it 'creates a private project' do
+ project = create_project(user, opts)
+
+ expect(project).to respond_to(:errors)
+
+ expect(project.errors.any?).to be(false)
+ expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
+ expect(project.saved?).to be(true)
+ expect(project.valid?).to be(true)
+ end
+ end
+
context 'restricted visibility level' do
before do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb
index e95c7f2a6d6..bcf6669f37d 100644
--- a/spec/support/helpers/graphql_helpers.rb
+++ b/spec/support/helpers/graphql_helpers.rb
@@ -157,7 +157,7 @@ module GraphqlHelpers
when Array # multiplexed queries
json_response.map { |response| response['errors'] }
else
- raise "Unkown GraphQL response type #{json_response.class}"
+ raise "Unknown GraphQL response type #{json_response.class}"
end
end
diff --git a/spec/support/helpers/query_recorder.rb b/spec/support/helpers/query_recorder.rb
index c4ae62b25e4..d45377267f3 100644
--- a/spec/support/helpers/query_recorder.rb
+++ b/spec/support/helpers/query_recorder.rb
@@ -11,7 +11,7 @@ module ActiveRecord
def show_backtrace(values)
Rails.logger.debug("QueryRecorder SQL: #{values[:sql]}")
- caller.each { |line| Rails.logger.debug(" --> #{line}") }
+ Gitlab::Profiler.clean_backtrace(caller).each { |line| Rails.logger.debug(" --> #{line}") }
end
def callback(name, start, finish, message_id, values)
diff --git a/spec/views/notify/pipeline_failed_email.html.haml_spec.rb b/spec/views/notify/pipeline_failed_email.html.haml_spec.rb
index d04affc7df1..623237b111a 100644
--- a/spec/views/notify/pipeline_failed_email.html.haml_spec.rb
+++ b/spec/views/notify/pipeline_failed_email.html.haml_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe 'notify/pipeline_failed_email.html.haml' do
include Devise::Test::ControllerHelpers
- let(:user) { create(:user) }
+ let(:user) { create(:user, developer_projects: [project]) }
let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
diff --git a/spec/views/notify/pipeline_failed_email.text.erb_spec.rb b/spec/views/notify/pipeline_failed_email.text.erb_spec.rb
index 079fb865d7b..81245239eba 100644
--- a/spec/views/notify/pipeline_failed_email.text.erb_spec.rb
+++ b/spec/views/notify/pipeline_failed_email.text.erb_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
describe 'notify/pipeline_failed_email.text.erb' do
include Devise::Test::ControllerHelpers
- let(:user) { create(:user) }
+ let(:user) { create(:user, developer_projects: [project]) }
let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
diff --git a/spec/views/notify/pipeline_success_email.html.haml_spec.rb b/spec/views/notify/pipeline_success_email.html.haml_spec.rb
index 8ee7f954d70..a876bf13e11 100644
--- a/spec/views/notify/pipeline_success_email.html.haml_spec.rb
+++ b/spec/views/notify/pipeline_success_email.html.haml_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe 'notify/pipeline_success_email.html.haml' do
include Devise::Test::ControllerHelpers
- let(:user) { create(:user) }
+ let(:user) { create(:user, developer_projects: [project]) }
let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
diff --git a/spec/views/projects/commit/_commit_box.html.haml_spec.rb b/spec/views/projects/commit/_commit_box.html.haml_spec.rb
index 457dd2e940f..1086546c10d 100644
--- a/spec/views/projects/commit/_commit_box.html.haml_spec.rb
+++ b/spec/views/projects/commit/_commit_box.html.haml_spec.rb
@@ -27,7 +27,7 @@ describe 'projects/commit/_commit_box.html.haml' do
render
- expect(rendered).to have_text("Pipeline ##{third_pipeline.id} (##{third_pipeline.iid}) failed")
+ expect(rendered).to have_text("Pipeline ##{third_pipeline.id} failed")
end
end
@@ -40,7 +40,7 @@ describe 'projects/commit/_commit_box.html.haml' do
it 'shows correct pipeline description' do
render
- expect(rendered).to have_text "Pipeline ##{pipeline.id} (##{pipeline.iid}) " \
+ expect(rendered).to have_text "Pipeline ##{pipeline.id} " \
'waiting for manual action'
end
end
diff --git a/spec/views/projects/jobs/_build.html.haml_spec.rb b/spec/views/projects/jobs/_build.html.haml_spec.rb
index 97b25a6976f..1d58891036e 100644
--- a/spec/views/projects/jobs/_build.html.haml_spec.rb
+++ b/spec/views/projects/jobs/_build.html.haml_spec.rb
@@ -4,7 +4,7 @@ describe 'projects/ci/jobs/_build' do
include Devise::Test::ControllerHelpers
let(:project) { create(:project, :repository) }
- let(:pipeline) { create(:ci_empty_pipeline, id: 1337, iid: 57, project: project, sha: project.commit.id) }
+ let(:pipeline) { create(:ci_empty_pipeline, id: 1337, project: project, sha: project.commit.id) }
let(:build) { create(:ci_build, pipeline: pipeline, stage: 'test', stage_idx: 1, name: 'rspec 0:2', status: :pending) }
before do
@@ -15,14 +15,14 @@ describe 'projects/ci/jobs/_build' do
it 'won\'t include a column with a link to its pipeline by default' do
render partial: 'projects/ci/builds/build', locals: { build: build }
- expect(rendered).not_to have_link('#1337 (#57)')
- expect(rendered).not_to have_text('#1337 (#57) by API')
+ expect(rendered).not_to have_link('#1337')
+ expect(rendered).not_to have_text('#1337 by API')
end
it 'can include a column with a link to its pipeline' do
render partial: 'projects/ci/builds/build', locals: { build: build, pipeline_link: true }
- expect(rendered).to have_link('#1337 (#57)')
- expect(rendered).to have_text('#1337 (#57) by API')
+ expect(rendered).to have_link('#1337')
+ expect(rendered).to have_text('#1337 by API')
end
end
diff --git a/spec/workers/auto_devops/disable_worker_spec.rb b/spec/workers/auto_devops/disable_worker_spec.rb
index 800a07e41a5..53113f286ba 100644
--- a/spec/workers/auto_devops/disable_worker_spec.rb
+++ b/spec/workers/auto_devops/disable_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
describe AutoDevops::DisableWorker, '#perform' do
- let(:user) { create(:user) }
+ let(:user) { create(:user, developer_projects: [project]) }
let(:project) { create(:project, :repository, :auto_devops) }
let(:auto_devops) { project.auto_devops }
let(:pipeline) { create(:ci_pipeline, :failed, :auto_devops_source, project: project, user: user) }
@@ -10,6 +10,7 @@ describe AutoDevops::DisableWorker, '#perform' do
subject { described_class.new }
before do
+ project.add_developer(user)
stub_application_setting(auto_devops_enabled: true)
auto_devops.update_attribute(:enabled, nil)
end