diff options
457 files changed, 29803 insertions, 4413 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b489f1a07c..5556bf5bc0b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,8 +35,14 @@ variables: before_script: - bundle --version + - date - source scripts/utils.sh + - date - source scripts/prepare_build.sh + - date + +after_script: + - date stages: - build @@ -88,6 +94,26 @@ stages: - /(^docs[\/-].*|.*-docs$)/ - /(^qa[\/-].*|.*-qa$)/ +# Jobs that only need to pull cache +.dedicated-no-docs-pull-cache-job: &dedicated-no-docs-pull-cache-job + <<: *dedicated-runner + <<: *except-docs-and-qa + <<: *pull-cache + dependencies: + - setup-test-env + stage: test + +# Jobs that do not need a DB +.dedicated-no-docs-no-db-pull-cache-job: &dedicated-no-docs-no-db-pull-cache-job + <<: *dedicated-no-docs-pull-cache-job + variables: + SETUP_DB: "false" + +.rake-exec: &rake-exec + <<: *dedicated-no-docs-no-db-pull-cache-job + script: + - bundle exec rake $CI_JOB_NAME + .rspec-metadata: &rspec-metadata <<: *dedicated-runner <<: *except-docs-and-qa @@ -164,21 +190,23 @@ stages: - master@gitlab/gitlabhq - master@gitlab/gitlab-ee -## -# Trigger a package build in omnibus-gitlab repository -# -package-qa: - <<: *dedicated-runner - image: ruby:2.4-alpine - before_script: [] - stage: build - cache: {} - when: manual +.gitlab-setup: &gitlab-setup + <<: *dedicated-no-docs-pull-cache-job + <<: *use-pg + variables: + CREATE_DB_USER: "true" script: - - scripts/trigger-build-omnibus - only: - - //@gitlab-org/gitlab-ce - - //@gitlab-org/gitlab-ee + # Manually clone gitlab-test and only seed this project in + # db/fixtures/development/04_project.rb thanks to SIZE=1 below + - git clone https://gitlab.com/gitlab-org/gitlab-test.git + /home/git/repositories/gitlab-org/gitlab-test.git + - scripts/gitaly-test-spawn + - force=yes SIZE=1 FIXTURE_PATH="db/fixtures/development" bundle exec rake gitlab:setup + artifacts: + when: on_failure + expire_in: 1d + paths: + - log/development.log # Review docs base .review-docs: &review-docs @@ -201,6 +229,47 @@ package-qa: only: - branches +# DB migration, rollback, and seed jobs +.db-migrate-reset: &db-migrate-reset + <<: *dedicated-no-docs-pull-cache-job + script: + - bundle exec rake db:migrate:reset + +.migration-paths: &migration-paths + <<: *dedicated-no-docs-pull-cache-job + variables: + CREATE_DB_USER: "true" + script: + - git fetch https://gitlab.com/gitlab-org/gitlab-ce.git v9.3.0 + - git checkout -f FETCH_HEAD + - bundle install $BUNDLE_INSTALL_FLAGS + - date + - cp config/gitlab.yml.example config/gitlab.yml + - bundle exec rake db:drop db:create db:schema:load db:seed_fu + - date + - git checkout $CI_COMMIT_SHA + - bundle install $BUNDLE_INSTALL_FLAGS + - date + - . scripts/prepare_build.sh + - date + - bundle exec rake db:migrate + +## +# Trigger a package build in omnibus-gitlab repository +# +package-qa: + <<: *dedicated-runner + image: ruby:2.4-alpine + before_script: [] + stage: build + cache: {} + when: manual + script: + - scripts/trigger-build-omnibus + only: + - //@gitlab-org/gitlab-ce + - //@gitlab-org/gitlab-ee + # Trigger a docs build in gitlab-docs # Useful to preview the docs changes live review-docs-deploy: @@ -265,7 +334,7 @@ update-tests-metadata: flaky-examples-check: <<: *dedicated-runner - image: ruby:2.3-alpine + image: ruby:2.4-alpine services: [] before_script: [] variables: @@ -299,7 +368,9 @@ compile-assets: <<: *default-cache script: - node --version + - date - yarn install --frozen-lockfile --cache-folder .yarn-cache + - date - bundle exec rake gitlab:assets:compile artifacts: expire_in: 7d @@ -387,26 +458,11 @@ spinach-pg 1 2: *spinach-metadata-pg spinach-mysql 0 2: *spinach-metadata-mysql spinach-mysql 1 2: *spinach-metadata-mysql -# Static analysis jobs -.ruby-static-analysis: &ruby-static-analysis - variables: - SIMPLECOV: "false" - SETUP_DB: "false" - -.rake-exec: &rake-exec - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache - <<: *ruby-static-analysis - stage: test - script: - - bundle exec rake $CI_JOB_NAME - static-analysis: - <<: *dedicated-runner - <<: *except-docs - <<: *ruby-static-analysis - stage: test + <<: *dedicated-no-docs-no-db-pull-cache-job + dependencies: + - compile-assets + - setup-test-env script: - scripts/static-analysis cache: @@ -463,15 +519,6 @@ ee_compat_check: paths: - ee_compat_check/patches/*.patch -# DB migration, rollback, and seed jobs -.db-migrate-reset: &db-migrate-reset - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache - stage: test - script: - - bundle exec rake db:migrate:reset - db:migrate:reset-pg: <<: *db-migrate-reset <<: *use-pg @@ -486,25 +533,6 @@ db:check-schema-pg: script: - source scripts/schema_changed.sh -.migration-paths: &migration-paths - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache - stage: test - variables: - SETUP_DB: "false" - CREATE_DB_USER: "true" - script: - - git fetch https://gitlab.com/gitlab-org/gitlab-ce.git v9.3.0 - - git checkout -f FETCH_HEAD - - bundle install $BUNDLE_INSTALL_FLAGS - - cp config/gitlab.yml.example config/gitlab.yml - - bundle exec rake db:drop db:create db:schema:load db:seed_fu - - git checkout $CI_COMMIT_SHA - - bundle install $BUNDLE_INSTALL_FLAGS - - . scripts/prepare_build.sh - - bundle exec rake db:migrate - migration:path-pg: <<: *migration-paths <<: *use-pg @@ -514,10 +542,7 @@ migration:path-mysql: <<: *use-mysql .db-rollback: &db-rollback - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache - stage: test + <<: *dedicated-no-docs-pull-cache-job script: - bundle exec rake db:rollback STEP=119 - bundle exec rake db:migrate @@ -530,27 +555,6 @@ db:rollback-mysql: <<: *db-rollback <<: *use-mysql -.gitlab-setup: &gitlab-setup - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache - stage: test - variables: - SIZE: "1" - SETUP_DB: "false" - CREATE_DB_USER: "true" - FIXTURE_PATH: db/fixtures/development - script: - - git clone https://gitlab.com/gitlab-org/gitlab-test.git - /home/git/repositories/gitlab-org/gitlab-test.git - - scripts/gitaly-test-spawn - - force=yes bundle exec rake gitlab:setup - artifacts: - when: on_failure - expire_in: 1d - paths: - - log/development.log - gitlab:setup-pg: <<: *gitlab-setup <<: *use-pg @@ -561,10 +565,7 @@ gitlab:setup-mysql: # Frontend-related jobs gitlab:assets:compile: - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache - stage: test + <<: *dedicated-no-docs-no-db-pull-cache-job dependencies: [] variables: NODE_ENV: "production" @@ -574,7 +575,9 @@ gitlab:assets:compile: WEBPACK_REPORT: "true" NO_COMPRESSION: "true" script: + - date - yarn install --frozen-lockfile --production --cache-folder .yarn-cache + - date - bundle exec rake gitlab:assets:compile artifacts: name: webpack-report @@ -583,17 +586,16 @@ gitlab:assets:compile: - webpack-report/ karma: - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache + <<: *dedicated-no-docs-pull-cache-job <<: *use-pg - stage: test - variables: - BABEL_ENV: "coverage" - CHROME_LOG_FILE: "chrome_debug.log" + dependencies: + - compile-assets + - setup-test-env script: + - export BABEL_ENV=coverage CHROME_LOG_FILE=chrome_debug.log + - date - scripts/gitaly-test-spawn - - bundle exec rake gettext:po_to_json + - date - bundle exec rake karma coverage: '/^Statements *: (\d+\.\d+%)/' artifacts: @@ -601,13 +603,11 @@ karma: expire_in: 31d when: always paths: - - chrome_debug.log - - coverage-javascript/ + - chrome_debug.log + - coverage-javascript/ codequality: - <<: *except-docs - <<: *pull-cache - stage: test + <<: *dedicated-no-docs-no-db-pull-cache-job image: docker:latest before_script: [] services: @@ -639,11 +639,7 @@ sast: paths: [gl-sast-report.json] qa:internal: - <<: *dedicated-runner - <<: *except-docs - stage: test - variables: - SETUP_DB: "false" + <<: *dedicated-no-docs-no-db-pull-cache-job services: [] script: - cd qa/ @@ -651,11 +647,7 @@ qa:internal: - bundle exec rspec qa:selectors: - <<: *dedicated-runner - <<: *except-docs - stage: test - variables: - SETUP_DB: "false" + <<: *dedicated-no-docs-no-db-pull-cache-job services: [] script: - cd qa/ @@ -663,14 +655,8 @@ qa:selectors: - bundle exec bin/qa Test::Sanity::Selectors coverage: - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache + <<: *dedicated-no-docs-no-db-pull-cache-job stage: post-test - services: [] - variables: - SETUP_DB: "false" - USE_BUNDLE_INSTALL: "true" script: - bundle exec scripts/merge-simplecov coverage: '/LOC \((\d+\.\d+%)\) covered.$/' @@ -682,26 +668,25 @@ coverage: - coverage/assets/ lint:javascript:report: - <<: *dedicated-runner - <<: *except-docs-and-qa - <<: *pull-cache + <<: *dedicated-no-docs-no-db-pull-cache-job stage: post-test dependencies: - compile-assets - setup-test-env before_script: [] script: + - date - find app/ spec/ -name '*.js' -exec sed --in-place 's|/\* eslint-disable .*\*/||' {} \; # run report over all files + - date - yarn run eslint-report || true # ignore exit code artifacts: name: eslint-report expire_in: 31d paths: - - eslint-report.html + - eslint-report.html pages: - <<: *dedicated-runner - <<: *pull-cache + <<: *dedicated-no-docs-no-db-pull-cache-job before_script: [] stage: pages dependencies: @@ -726,10 +711,7 @@ pages: # Insurance in case a gem needed by one of our releases gets yanked from # rubygems.org in the future. cache gems: - <<: *dedicated-runner - <<: *pull-cache - variables: - SETUP_DB: "false" + <<: *dedicated-no-docs-no-db-pull-cache-job script: - bundle package --all --all-platforms artifacts: diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index 090ea9dad19..1aa5e414fd3 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -6.0.3 +6.0.4 @@ -126,6 +126,7 @@ gem 'html-pipeline', '~> 1.11.0' gem 'deckar01-task_list', '2.0.0' gem 'gitlab-markup', '~> 1.6.2' gem 'redcarpet', '~> 3.4' +gem 'commonmarker', '~> 0.17' gem 'RedCloth', '~> 4.3.2' gem 'rdoc', '~> 4.2' gem 'org-ruby', '~> 0.9.12' @@ -412,6 +413,10 @@ end # Gitaly GRPC client gem 'gitaly-proto', '~> 0.88.0', require: 'gitaly' +# Explicitly lock grpc as we know 1.9 is bad +# 1.10 is still being tested. See gitlab-org/gitaly#1059 +gem 'grpc', '~> 1.8.3' + # Locked until https://github.com/google/protobuf/issues/4210 is closed gem 'google-protobuf', '= 3.5.1' diff --git a/Gemfile.lock b/Gemfile.lock index a5c94a9e074..bbdc48f964d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -131,6 +131,8 @@ GEM coercible (1.0.0) descendants_tracker (~> 0.0.1) colorize (0.7.7) + commonmarker (0.17.8) + ruby-enum (~> 0.5) concord (0.1.5) adamantium (~> 0.2.0) equalizer (~> 0.0.9) @@ -797,6 +799,8 @@ GEM rubocop (>= 0.51) rubocop-rspec (1.22.1) rubocop (>= 0.52.1) + ruby-enum (0.7.2) + i18n ruby-fogbugz (0.2.1) crack (~> 0.4) ruby-prof (0.16.2) @@ -1019,6 +1023,7 @@ DEPENDENCIES charlock_holmes (~> 0.7.5) chronic (~> 0.10.2) chronic_duration (~> 0.10.6) + commonmarker (~> 0.17) concurrent-ruby (~> 1.0.5) connection_pool (~> 2.0) creole (~> 0.5.0) @@ -1073,6 +1078,7 @@ DEPENDENCIES grape-entity (~> 0.6.0) grape-route-helpers (~> 2.1.0) grape_logging (~> 1.7) + grpc (~> 1.8.3) haml_lint (~> 0.26.0) hamlit (~> 2.6.1) hashie-forbidden_attributes diff --git a/app/assets/javascripts/behaviors/toggler_behavior.js b/app/assets/javascripts/behaviors/toggler_behavior.js index 417ac31fc86..81c89441424 100644 --- a/app/assets/javascripts/behaviors/toggler_behavior.js +++ b/app/assets/javascripts/behaviors/toggler_behavior.js @@ -12,7 +12,7 @@ $(() => { const $container = $(container); $container - .find('.js-toggle-button .fa') + .find('.js-toggle-button .fa-chevron-up, .js-toggle-button .fa-chevron-down') .toggleClass('fa-chevron-up', toggleState) .toggleClass('fa-chevron-down', toggleState !== undefined ? !toggleState : undefined); @@ -22,7 +22,7 @@ $(() => { } $('body').on('click', '.js-toggle-button', function toggleButton(e) { - e.target.classList.toggle('open'); + e.currentTarget.classList.toggle(e.currentTarget.dataset.toggleOpenClass || 'open'); toggleContainer($(this).closest('.js-toggle-container')); const targetTag = e.currentTarget.tagName.toLowerCase(); diff --git a/app/assets/javascripts/boards/components/board_card.vue b/app/assets/javascripts/boards/components/board_card.vue index 23fec503586..84885ca9306 100644 --- a/app/assets/javascripts/boards/components/board_card.vue +++ b/app/assets/javascripts/boards/components/board_card.vue @@ -1,4 +1,5 @@ <script> +/* eslint-disable vue/require-default-prop */ import './issue_card_inner'; import eventHub from '../eventhub'; @@ -34,6 +35,9 @@ export default { type: String, default: '', }, + groupId: { + type: Number, + }, }, data() { return { @@ -88,6 +92,7 @@ export default { :list="list" :issue="issue" :issue-link-base="issueLinkBase" + :group-id="groupId" :root-path="rootPath" :update-filters="true" /> diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue index 6637904d87d..0d03c1c419c 100644 --- a/app/assets/javascripts/boards/components/board_list.vue +++ b/app/assets/javascripts/boards/components/board_list.vue @@ -15,6 +15,11 @@ export default { loadingIcon, }, props: { + groupId: { + type: Number, + required: false, + default: 0, + }, disabled: { type: Boolean, required: true, @@ -170,6 +175,7 @@ export default { <loading-icon /> </div> <board-new-issue + :group-id="groupId" :list="list" v-if="list.type !== 'closed' && showIssueForm"/> <ul @@ -185,6 +191,7 @@ export default { :list="list" :issue="issue" :issue-link-base="issueLinkBase" + :group-id="groupId" :root-path="rootPath" :disabled="disabled" :key="issue.id" /> diff --git a/app/assets/javascripts/boards/components/board_new_issue.vue b/app/assets/javascripts/boards/components/board_new_issue.vue index efface7143d..870d242e774 100644 --- a/app/assets/javascripts/boards/components/board_new_issue.vue +++ b/app/assets/javascripts/boards/components/board_new_issue.vue @@ -1,12 +1,21 @@ <script> import eventHub from '../eventhub'; +import ProjectSelect from './project_select.vue'; import ListIssue from '../models/issue'; const Store = gl.issueBoards.BoardsStore; export default { name: 'BoardNewIssue', + components: { + ProjectSelect, + }, props: { + groupId: { + type: Number, + required: false, + default: 0, + }, list: { type: Object, required: true, @@ -16,10 +25,20 @@ export default { return { title: '', error: false, + selectedProject: {}, }; }, + computed: { + disabled() { + if (this.groupId) { + return this.title === '' || !this.selectedProject.name; + } + return this.title === ''; + }, + }, mounted() { this.$refs.input.focus(); + eventHub.$on('setSelectedProject', this.setSelectedProject); }, methods: { submit(e) { @@ -34,6 +53,7 @@ export default { labels, subscribed: true, assignees: [], + project_id: this.selectedProject.id, }); eventHub.$emit(`scroll-board-list-${this.list.id}`); @@ -62,52 +82,62 @@ export default { this.title = ''; eventHub.$emit(`hide-issue-form-${this.list.id}`); }, + setSelectedProject(selectedProject) { + this.selectedProject = selectedProject; + }, }, }; </script> <template> - <div class="card board-new-issue-form"> - <form @submit="submit($event)"> - <div - class="flash-container" - v-if="error" - > - <div class="flash-alert"> - An error occurred. Please try again. - </div> - </div> - <label - class="label-light" - :for="list.id + '-title'" - > - Title - </label> - <input - class="form-control" - type="text" - v-model="title" - ref="input" - autocomplete="off" - :id="list.id + '-title'" - /> - <div class="clearfix prepend-top-10"> - <button - class="btn btn-success pull-left" - type="submit" - :disabled="title === ''" - ref="submit-button" + <div class="board-new-issue-form"> + <div class="card"> + <form @submit="submit($event)"> + <div + class="flash-container" + v-if="error" > - Submit issue - </button> - <button - class="btn btn-default pull-right" - type="button" - @click="cancel" + <div class="flash-alert"> + An error occurred. Please try again. + </div> + </div> + <label + class="label-light" + :for="list.id + '-title'" > - Cancel - </button> - </div> - </form> + Title + </label> + <input + class="form-control" + type="text" + v-model="title" + ref="input" + autocomplete="off" + :id="list.id + '-title'" + /> + <project-select + v-if="groupId" + :group-id="groupId" + /> + <div class="clearfix prepend-top-10"> + <button + class="btn btn-success pull-left" + type="submit" + :disabled="disabled" + ref="submit-button" + > + Submit issue + </button> + <button + class="btn btn-default pull-right" + type="button" + @click="cancel" + > + Cancel + </button> + </div> + </form> + </div> </div> </template> + diff --git a/app/assets/javascripts/boards/components/issue_card_inner.js b/app/assets/javascripts/boards/components/issue_card_inner.js index bf474879024..fc2bad2415f 100644 --- a/app/assets/javascripts/boards/components/issue_card_inner.js +++ b/app/assets/javascripts/boards/components/issue_card_inner.js @@ -31,6 +31,10 @@ gl.issueBoards.IssueCardInner = Vue.extend({ required: false, default: false, }, + groupId: { + type: Number, + required: false, + }, }, data() { return { @@ -64,7 +68,13 @@ gl.issueBoards.IssueCardInner = Vue.extend({ return this.issue.assignees.length > this.numberOverLimit; }, cardUrl() { - return `${this.issueLinkBase}/${this.issue.iid}`; + let baseUrl = this.issueLinkBase; + + if (this.groupId && this.issue.project) { + baseUrl = this.issueLinkBase.replace(':project_path', this.issue.project.path); + } + + return `${baseUrl}/${this.issue.iid}`; }, issueId() { if (this.issue.iid) { @@ -148,7 +158,7 @@ gl.issueBoards.IssueCardInner = Vue.extend({ class="card-number" v-if="issueId" > - {{ issueId }} + <template v-if="groupId && issue.project">{{issue.project.path}}</template>{{ issueId }} </span> </h4> <div class="card-assignee"> diff --git a/app/assets/javascripts/boards/components/project_select.vue b/app/assets/javascripts/boards/components/project_select.vue new file mode 100644 index 00000000000..d99b222c305 --- /dev/null +++ b/app/assets/javascripts/boards/components/project_select.vue @@ -0,0 +1,127 @@ +<script> + /* global ListIssue */ + import _ from 'underscore'; + import eventHub from '../eventhub'; + import loadingIcon from '../../vue_shared/components/loading_icon.vue'; + import Api from '../../api'; + + export default { + name: 'BoardProjectSelect', + components: { + loadingIcon, + }, + props: { + groupId: { + type: Number, + required: true, + default: 0, + }, + }, + data() { + return { + loading: true, + selectedProject: {}, + }; + }, + computed: { + selectedProjectName() { + return this.selectedProject.name || 'Select a project'; + }, + }, + mounted() { + $(this.$refs.projectsDropdown).glDropdown({ + filterable: true, + filterRemote: true, + search: { + fields: ['name_with_namespace'], + }, + clicked: ({ $el, e }) => { + e.preventDefault(); + this.selectedProject = { + id: $el.data('project-id'), + name: $el.data('project-name'), + }; + eventHub.$emit('setSelectedProject', this.selectedProject); + }, + selectable: true, + data: (term, callback) => { + this.loading = true; + return Api.groupProjects(this.groupId, term, (projects) => { + this.loading = false; + callback(projects); + }); + }, + renderRow(project) { + return ` + <li> + <a href='#' class='dropdown-menu-link' data-project-id="${project.id}" data-project-name="${project.name}"> + ${_.escape(project.name)} + </a> + </li> + `; + }, + text: project => project.name, + }); + }, + }; +</script> + +<template> + <div> + <label class="label-light prepend-top-10"> + Project + </label> + <div + ref="projectsDropdown" + class="dropdown" + > + <button + class="dropdown-menu-toggle wide" + type="button" + data-toggle="dropdown" + aria-expanded="false" + > + {{ selectedProjectName }} + <i + class="fa fa-chevron-down" + aria-hidden="true" + > + </i> + </button> + <div class="dropdown-menu dropdown-menu-selectable dropdown-menu-full-width"> + <div class="dropdown-title"> + <span>Projects</span> + <button + aria-label="Close" + type="button" + class="dropdown-title-button dropdown-menu-close" + > + <i + aria-hidden="true" + data-hidden="true" + class="fa fa-times dropdown-menu-close-icon" + > + </i> + </button> + </div> + <div class="dropdown-input"> + <input + class="dropdown-input-field" + type="search" + placeholder="Search projects" + /> + <i + aria-hidden="true" + data-hidden="true" + class="fa fa-search dropdown-input-search" + > + </i> + </div> + <div class="dropdown-content"></div> + <div class="dropdown-loading"> + <loading-icon /> + </div> + </div> + </div> + </div> +</template> diff --git a/app/assets/javascripts/boards/components/sidebar/remove_issue.js b/app/assets/javascripts/boards/components/sidebar/remove_issue.js index 0ae32bb4d0a..09c683ff621 100644 --- a/app/assets/javascripts/boards/components/sidebar/remove_issue.js +++ b/app/assets/javascripts/boards/components/sidebar/remove_issue.js @@ -24,7 +24,7 @@ gl.issueBoards.RemoveIssueBtn = Vue.extend({ }, computed: { updateUrl() { - return this.issueUpdate; + return this.issueUpdate.replace(':project_path', this.issue.project.path); }, }, methods: { @@ -32,17 +32,21 @@ gl.issueBoards.RemoveIssueBtn = Vue.extend({ const issue = this.issue; const lists = issue.getLists(); const listLabelIds = lists.map(list => list.label.id); - let labelIds = this.issue.labels + + let labelIds = issue.labels .map(label => label.id) .filter(id => !listLabelIds.includes(id)); if (labelIds.length === 0) { labelIds = ['']; } + const data = { issue: { label_ids: labelIds, }, }; + + // Post the remove data Vue.http.patch(this.updateUrl, data).catch(() => { Flash(__('Failed to remove issue from board, please try again.')); diff --git a/app/assets/javascripts/boards/filtered_search_boards.js b/app/assets/javascripts/boards/filtered_search_boards.js index 57a7cc4ca30..fb40b9f5565 100644 --- a/app/assets/javascripts/boards/filtered_search_boards.js +++ b/app/assets/javascripts/boards/filtered_search_boards.js @@ -6,6 +6,7 @@ export default class FilteredSearchBoards extends FilteredSearchManager { constructor(store, updateUrl = false, cantEdit = []) { super({ page: 'boards', + stateFiltersSelector: '.issues-state-filters', }); this.store = store; diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js index 8b34fe232c2..efc0da2e7a2 100644 --- a/app/assets/javascripts/boards/index.js +++ b/app/assets/javascripts/boards/index.js @@ -13,6 +13,7 @@ import sidebarEventHub from '~/sidebar/event_hub'; // eslint-disable-line import import './models/issue'; import './models/list'; import './models/milestone'; +import './models/project'; import './models/assignee'; import './stores/boards_store'; import './stores/modal_store'; @@ -89,7 +90,7 @@ export default () => { sidebarEventHub.$off('toggleSubscription', this.toggleSubscription); }, mounted () { - this.filterManager = new FilteredSearchBoards(Store.filter, true); + this.filterManager = new FilteredSearchBoards(Store.filter, true, Store.cantEdit); this.filterManager.setup(); Store.disabled = this.disabled; @@ -179,6 +180,7 @@ export default () => { return { modal: ModalStore.store, store: Store.state, + canAdminList: this.$options.el.hasAttribute('data-can-admin-list'), }; }, computed: { @@ -232,6 +234,7 @@ export default () => { :class="{ 'disabled': disabled }" :title="tooltipTitle" :aria-disabled="disabled" + v-if="canAdminList" @click="openModal"> Add issues </button> diff --git a/app/assets/javascripts/boards/mixins/sortable_default_options.js b/app/assets/javascripts/boards/mixins/sortable_default_options.js index 38a0eb12f92..5e31c6314b2 100644 --- a/app/assets/javascripts/boards/mixins/sortable_default_options.js +++ b/app/assets/javascripts/boards/mixins/sortable_default_options.js @@ -1,6 +1,8 @@ /* eslint-disable no-unused-vars, no-mixed-operators, comma-dangle */ /* global DocumentTouch */ +import sortableConfig from '../../sortable/sortable_config'; + window.gl = window.gl || {}; window.gl.issueBoards = window.gl.issueBoards || {}; @@ -18,19 +20,14 @@ gl.issueBoards.onEnd = () => { gl.issueBoards.touchEnabled = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch; gl.issueBoards.getBoardSortableDefaultOptions = (obj) => { - const defaultSortOptions = { - animation: 200, - forceFallback: true, - fallbackClass: 'is-dragging', - fallbackOnBody: true, - ghostClass: 'is-ghost', + const defaultSortOptions = Object.assign({}, sortableConfig, { filter: '.board-delete, .btn', delay: gl.issueBoards.touchEnabled ? 100 : 0, scrollSensitivity: gl.issueBoards.touchEnabled ? 60 : 100, scrollSpeed: 20, onStart: gl.issueBoards.onStart, - onEnd: gl.issueBoards.onEnd - }; + onEnd: gl.issueBoards.onEnd, + }); Object.keys(obj).forEach((key) => { defaultSortOptions[key] = obj[key]; }); return defaultSortOptions; diff --git a/app/assets/javascripts/boards/models/issue.js b/app/assets/javascripts/boards/models/issue.js index 3bfb6d39ad5..4c5079efc8b 100644 --- a/app/assets/javascripts/boards/models/issue.js +++ b/app/assets/javascripts/boards/models/issue.js @@ -4,6 +4,7 @@ /* global ListAssignee */ import Vue from 'vue'; +import IssueProject from './project'; class ListIssue { constructor (obj, defaultAvatar) { @@ -23,6 +24,12 @@ class ListIssue { this.isLoading = {}; this.sidebarInfoEndpoint = obj.issue_sidebar_endpoint; this.toggleSubscriptionEndpoint = obj.toggle_subscription_endpoint; + this.milestone_id = obj.milestone_id; + this.project_id = obj.project_id; + + if (obj.project) { + this.project = new IssueProject(obj.project); + } if (obj.milestone) { this.milestone = new ListMilestone(obj.milestone); @@ -105,7 +112,8 @@ class ListIssue { data.issue.label_ids = ['']; } - return Vue.http.patch(url, data); + const projectPath = this.project ? this.project.path : ''; + return Vue.http.patch(url.replace(':project_path', projectPath), data); } } diff --git a/app/assets/javascripts/boards/models/project.js b/app/assets/javascripts/boards/models/project.js new file mode 100644 index 00000000000..a3d5c7af7ac --- /dev/null +++ b/app/assets/javascripts/boards/models/project.js @@ -0,0 +1,6 @@ +export default class IssueProject { + constructor(obj) { + this.id = obj.id; + this.path = obj.path; + } +} diff --git a/app/assets/javascripts/clusters/components/applications.vue b/app/assets/javascripts/clusters/components/applications.vue index 1325a268214..f8dcdf3f60a 100644 --- a/app/assets/javascripts/clusters/components/applications.vue +++ b/app/assets/javascripts/clusters/components/applications.vue @@ -117,7 +117,10 @@ </script> <template> - <section class="settings no-animate expanded"> + <section + id="cluster-applications" + class="settings no-animate expanded" + > <div class="settings-header"> <h4> {{ s__('ClusterIntegration|Applications') }} @@ -183,7 +186,7 @@ <clipboard-button :text="ingressExternalIp" :title="s__('ClusterIntegration|Copy Ingress IP Address to clipboard')" - css-class="btn btn-default js-clipboard-btn" + class="js-clipboard-btn" /> </span> </div> diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue index ce19069f103..466a5b5d635 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue +++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue @@ -20,10 +20,6 @@ type: String, required: true, }, - emptyStateSvgPath: { - type: String, - required: true, - }, errorStateSvgPath: { type: String, required: true, @@ -45,23 +41,14 @@ }, computed: { - /** - * Empty state is only rendered if after the first request we receive no pipelines. - * - * @return {Boolean} - */ - shouldRenderEmptyState() { - return !this.state.pipelines.length && - !this.isLoading && - this.hasMadeRequest && - !this.hasError; - }, - shouldRenderTable() { return !this.isLoading && this.state.pipelines.length > 0 && !this.hasError; }, + shouldRenderErrorState() { + return this.hasError && !this.isLoading; + }, }, created() { this.service = new PipelinesService(this.endpoint); @@ -92,25 +79,22 @@ <div class="content-list pipelines"> <loading-icon - label="Loading pipelines" + :label="s__('Pipelines|Loading Pipelines')" size="3" v-if="isLoading" + class="prepend-top-20" /> - <empty-state - v-if="shouldRenderEmptyState" - :help-page-path="helpPagePath" - :empty-state-svg-path="emptyStateSvgPath" - /> - - <error-state - v-if="shouldRenderErrorState" - :error-state-svg-path="errorStateSvgPath" + <svg-blank-state + v-else-if="shouldRenderErrorState" + :svg-path="errorStateSvgPath" + :message="s__(`Pipelines|There was an error fetching the pipelines. + Try again in a few moments or contact your support team.`)" /> <div class="table-holder" - v-if="shouldRenderTable" + v-else-if="shouldRenderTable" > <pipelines-table-component :pipelines="state.pipelines" diff --git a/app/assets/javascripts/commons/vue.js b/app/assets/javascripts/commons/vue.js index 8b62d78c043..798623b94fb 100644 --- a/app/assets/javascripts/commons/vue.js +++ b/app/assets/javascripts/commons/vue.js @@ -1,4 +1,5 @@ import Vue from 'vue'; +import '../vue_shared/vue_resource_interceptor'; if (process.env.NODE_ENV !== 'production') { Vue.config.productionTip = false; diff --git a/app/assets/javascripts/groups/components/app.vue b/app/assets/javascripts/groups/components/app.vue index b8f0566f48c..0578f43d5af 100644 --- a/app/assets/javascripts/groups/components/app.vue +++ b/app/assets/javascripts/groups/components/app.vue @@ -152,14 +152,14 @@ export default { showLeaveGroupModal(group, parentGroup) { this.targetGroup = group; this.targetParentGroup = parentGroup; - this.updateModal = true; + this.showModal = true; this.groupLeaveConfirmationMessage = s__(`GroupsTree|Are you sure you want to leave the "${group.fullName}" group?`); }, hideLeaveGroupModal() { - this.updateModal = false; + this.showModal = false; }, leaveGroup() { - this.updateModal = false; + this.showModal = false; this.targetGroup.isBeingRemoved = true; this.service.leaveGroup(this.targetGroup.leavePath) .then(res => res.json()) @@ -208,9 +208,9 @@ export default { :page-info="pageInfo" /> <modal - v-show="showModal" - :primary-button-label="__('Leave')" + v-if="showModal" kind="warning" + :primary-button-label="__('Leave')" :title="__('Are you sure?')" :text="groupLeaveConfirmationMessage" @cancel="hideLeaveGroupModal" diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue index 031badc7026..8ca94ef3e2a 100644 --- a/app/assets/javascripts/monitoring/components/dashboard.vue +++ b/app/assets/javascripts/monitoring/components/dashboard.vue @@ -7,34 +7,82 @@ import EmptyState from './empty_state.vue'; import MonitoringStore from '../stores/monitoring_store'; import eventHub from '../event_hub'; - import { convertPermissionToBoolean } from '../../lib/utils/common_utils'; export default { - components: { Graph, GraphGroup, EmptyState, }, - data() { - const metricsData = document.querySelector('#prometheus-graphs').dataset; - const store = new MonitoringStore(); + props: { + hasMetrics: { + type: Boolean, + required: false, + default: true, + }, + showLegend: { + type: Boolean, + required: false, + default: true, + }, + showPanels: { + type: Boolean, + required: false, + default: true, + }, + forceSmallGraph: { + type: Boolean, + required: false, + default: false, + }, + documentationPath: { + type: String, + required: true, + }, + settingsPath: { + type: String, + required: true, + }, + clustersPath: { + type: String, + required: true, + }, + tagsPath: { + type: String, + required: true, + }, + projectPath: { + type: String, + required: true, + }, + metricsEndpoint: { + type: String, + required: true, + }, + deploymentEndpoint: { + type: String, + required: false, + default: null, + }, + emptyGettingStartedSvgPath: { + type: String, + required: true, + }, + emptyLoadingSvgPath: { + type: String, + required: true, + }, + emptyUnableToConnectSvgPath: { + type: String, + required: true, + }, + }, + data() { return { - store, + store: new MonitoringStore(), state: 'gettingStarted', - hasMetrics: convertPermissionToBoolean(metricsData.hasMetrics), - documentationPath: metricsData.documentationPath, - settingsPath: metricsData.settingsPath, - clustersPath: metricsData.clustersPath, - tagsPath: metricsData.tagsPath, - projectPath: metricsData.projectPath, - metricsEndpoint: metricsData.additionalMetrics, - deploymentEndpoint: metricsData.deploymentEndpoint, - emptyGettingStartedSvgPath: metricsData.emptyGettingStartedSvgPath, - emptyLoadingSvgPath: metricsData.emptyLoadingSvgPath, - emptyUnableToConnectSvgPath: metricsData.emptyUnableToConnectSvgPath, showEmptyState: true, updateAspectRatio: false, updatedAspectRatios: 0, @@ -67,6 +115,7 @@ window.addEventListener('resize', this.resizeThrottled, false); } }, + methods: { getGraphsData() { this.state = 'loading'; @@ -115,6 +164,7 @@ v-for="(groupData, index) in store.groups" :key="index" :name="groupData.group" + :show-panels="showPanels" > <graph v-for="(graphData, index) in groupData.metrics" @@ -125,6 +175,8 @@ :deployment-data="store.deploymentData" :project-path="projectPath" :tags-path="tagsPath" + :show-legend="showLegend" + :small-graph="forceSmallGraph" /> </graph-group> </div> diff --git a/app/assets/javascripts/monitoring/components/graph.vue b/app/assets/javascripts/monitoring/components/graph.vue index ea5c24efaf9..9e67a6f2146 100644 --- a/app/assets/javascripts/monitoring/components/graph.vue +++ b/app/assets/javascripts/monitoring/components/graph.vue @@ -52,6 +52,16 @@ type: String, required: true, }, + showLegend: { + type: Boolean, + required: false, + default: true, + }, + smallGraph: { + type: Boolean, + required: false, + default: false, + }, }, data() { @@ -130,7 +140,7 @@ const breakpointSize = bp.getBreakpointSize(); const query = this.graphData.queries[0]; this.margin = measurements.large.margin; - if (breakpointSize === 'xs' || breakpointSize === 'sm') { + if (this.smallGraph || breakpointSize === 'xs' || breakpointSize === 'sm') { this.graphHeight = 300; this.margin = measurements.small.margin; this.measurements = measurements.small; @@ -182,7 +192,9 @@ this.graphHeightOffset, ); - if (this.timeSeries.length > 3) { + if (!this.showLegend) { + this.baseGraphHeight -= 50; + } else if (this.timeSeries.length > 3) { this.baseGraphHeight = this.baseGraphHeight += (this.timeSeries.length - 3) * 20; } @@ -255,6 +267,7 @@ :time-series="timeSeries" :unit-of-display="unitOfDisplay" :current-data-index="currentDataIndex" + :show-legend-group="showLegend" /> <svg class="graph-data" diff --git a/app/assets/javascripts/monitoring/components/graph/legend.vue b/app/assets/javascripts/monitoring/components/graph/legend.vue index c6e8d726ffc..3149397b61f 100644 --- a/app/assets/javascripts/monitoring/components/graph/legend.vue +++ b/app/assets/javascripts/monitoring/components/graph/legend.vue @@ -39,6 +39,11 @@ type: Number, required: true, }, + showLegendGroup: { + type: Boolean, + required: false, + default: true, + }, }, data() { return { @@ -57,8 +62,9 @@ }, rectTransform() { - const yCoordinate = ((this.graphHeight - this.margin.top) / 2) - + (this.yLabelWidth / 2) + 10 || 0; + const yCoordinate = (((this.graphHeight - this.margin.top) + + this.measurements.axisLabelLineOffset) / 2) + + (this.yLabelWidth / 2) || 0; return `translate(0, ${yCoordinate}) rotate(-90)`; }, @@ -166,39 +172,41 @@ > Time </text> - <g - class="legend-group" - v-for="(series, index) in timeSeries" - :key="index" - :transform="translateLegendGroup(index)" - > - <line - :stroke="series.lineColor" - :stroke-width="measurements.legends.height" - :stroke-dasharray="strokeDashArray(series.lineStyle)" - :x1="measurements.legends.offsetX" - :x2="measurements.legends.offsetX + measurements.legends.width" - :y1="graphHeight - measurements.legends.offsetY" - :y2="graphHeight - measurements.legends.offsetY" - /> - <text - v-if="timeSeries.length > 1" - class="legend-metric-title" - ref="legendTitleSvg" - x="38" - :y="graphHeight - 30" - > - {{ createSeriesString(index, series) }} - </text> - <text - v-else - class="legend-metric-title" - ref="legendTitleSvg" - x="38" - :y="graphHeight - 30" + <template v-if="showLegendGroup"> + <g + class="legend-group" + v-for="(series, index) in timeSeries" + :key="index" + :transform="translateLegendGroup(index)" > - {{ legendTitle }} {{ formatMetricUsage(series) }} - </text> - </g> + <line + :stroke="series.lineColor" + :stroke-width="measurements.legends.height" + :stroke-dasharray="strokeDashArray(series.lineStyle)" + :x1="measurements.legends.offsetX" + :x2="measurements.legends.offsetX + measurements.legends.width" + :y1="graphHeight - measurements.legends.offsetY" + :y2="graphHeight - measurements.legends.offsetY" + /> + <text + v-if="timeSeries.length > 1" + class="legend-metric-title" + ref="legendTitleSvg" + x="38" + :y="graphHeight - 30" + > + {{ createSeriesString(index, series) }} + </text> + <text + v-else + class="legend-metric-title" + ref="legendTitleSvg" + x="38" + :y="graphHeight - 30" + > + {{ legendTitle }} {{ formatMetricUsage(series) }} + </text> + </g> + </template> </g> </template> diff --git a/app/assets/javascripts/monitoring/components/graph_group.vue b/app/assets/javascripts/monitoring/components/graph_group.vue index 079351a69af..f71cf614552 100644 --- a/app/assets/javascripts/monitoring/components/graph_group.vue +++ b/app/assets/javascripts/monitoring/components/graph_group.vue @@ -5,12 +5,20 @@ type: String, required: true, }, + showPanels: { + type: Boolean, + required: false, + default: true, + }, }, }; </script> <template> - <div class="panel panel-default prometheus-panel"> + <div + v-if="showPanels" + class="panel panel-default prometheus-panel" + > <div class="panel-heading"> <h4>{{ name }}</h4> </div> @@ -18,4 +26,10 @@ <slot></slot> </div> </div> + <div + v-else + class="prometheus-graph-group" + > + <slot></slot> + </div> </template> diff --git a/app/assets/javascripts/monitoring/monitoring_bundle.js b/app/assets/javascripts/monitoring/monitoring_bundle.js index c3b0ef7e9ca..41270e015d4 100644 --- a/app/assets/javascripts/monitoring/monitoring_bundle.js +++ b/app/assets/javascripts/monitoring/monitoring_bundle.js @@ -1,7 +1,22 @@ import Vue from 'vue'; +import { convertPermissionToBoolean } from '~/lib/utils/common_utils'; import Dashboard from './components/dashboard.vue'; -export default () => new Vue({ - el: '#prometheus-graphs', - render: createElement => createElement(Dashboard), -}); +export default () => { + const el = document.getElementById('prometheus-graphs'); + + if (el && el.dataset) { + // eslint-disable-next-line no-new + new Vue({ + el, + render(createElement) { + return createElement(Dashboard, { + props: { + ...el.dataset, + hasMetrics: convertPermissionToBoolean(el.dataset.hasMetrics), + }, + }); + }, + }); + } +}; diff --git a/app/assets/javascripts/monitoring/services/monitoring_service.js b/app/assets/javascripts/monitoring/services/monitoring_service.js index e230a06cd8c..6fcca36d2fa 100644 --- a/app/assets/javascripts/monitoring/services/monitoring_service.js +++ b/app/assets/javascripts/monitoring/services/monitoring_service.js @@ -40,6 +40,9 @@ export default class MonitoringService { } getDeploymentData() { + if (!this.deploymentEndpoint) { + return Promise.resolve([]); + } return backOffRequest(() => axios.get(this.deploymentEndpoint)) .then(resp => resp.data) .then((response) => { diff --git a/app/assets/javascripts/monitoring/utils/multiple_time_series.js b/app/assets/javascripts/monitoring/utils/multiple_time_series.js index 4ce3dad440c..b5b8e3c255d 100644 --- a/app/assets/javascripts/monitoring/utils/multiple_time_series.js +++ b/app/assets/javascripts/monitoring/utils/multiple_time_series.js @@ -76,7 +76,7 @@ function queryTimeSeries(query, graphWidth, graphHeight, graphHeightOffset, xDom metricTag = seriesCustomizationData.value || timeSeriesMetricLabel; [lineColor, areaColor] = pickColor(seriesCustomizationData.color); } else { - metricTag = timeSeriesMetricLabel || `series ${timeSeriesNumber + 1}`; + metricTag = timeSeriesMetricLabel || query.label || `series ${timeSeriesNumber + 1}`; [lineColor, areaColor] = pickColor(); } diff --git a/app/assets/javascripts/notes/components/diff_file_header.vue b/app/assets/javascripts/notes/components/diff_file_header.vue index fe5baa3537f..3bcde17f07c 100644 --- a/app/assets/javascripts/notes/components/diff_file_header.vue +++ b/app/assets/javascripts/notes/components/diff_file_header.vue @@ -35,6 +35,7 @@ <clipboard-button title="Copy file path to clipboard" :text="diffFile.submoduleLink" + css-class="btn-default btn-transparent btn-clipboard" /> </span> </div> @@ -79,6 +80,7 @@ <clipboard-button title="Copy file path to clipboard" :text="diffFile.filePath" + css-class="btn-default btn-transparent btn-clipboard" /> <small diff --git a/app/assets/javascripts/pages/groups/boards/index.js b/app/assets/javascripts/pages/groups/boards/index.js new file mode 100644 index 00000000000..5cfe8723204 --- /dev/null +++ b/app/assets/javascripts/pages/groups/boards/index.js @@ -0,0 +1,9 @@ +import UsersSelect from '~/users_select'; +import ShortcutsNavigation from '~/shortcuts_navigation'; +import initBoards from '~/boards'; + +document.addEventListener('DOMContentLoaded', () => { + new UsersSelect(); // eslint-disable-line no-new + new ShortcutsNavigation(); // eslint-disable-line no-new + initBoards(); +}); diff --git a/app/assets/javascripts/pages/projects/environments/index.js b/app/assets/javascripts/pages/projects/environments/index/index.js index ace8af00ece..ace8af00ece 100644 --- a/app/assets/javascripts/pages/projects/environments/index.js +++ b/app/assets/javascripts/pages/projects/environments/index/index.js diff --git a/app/assets/javascripts/pages/projects/pipelines/index/index.js b/app/assets/javascripts/pages/projects/pipelines/index/index.js index 25dfa99ad9c..a84e2790680 100644 --- a/app/assets/javascripts/pages/projects/pipelines/index/index.js +++ b/app/assets/javascripts/pages/projects/pipelines/index/index.js @@ -2,6 +2,7 @@ import Vue from 'vue'; import PipelinesStore from '../../../../pipelines/stores/pipelines_store'; import pipelinesComponent from '../../../../pipelines/components/pipelines.vue'; import Translate from '../../../../vue_shared/translate'; +import { convertPermissionToBoolean } from '../../../../lib/utils/common_utils'; Vue.use(Translate); @@ -11,16 +12,28 @@ document.addEventListener('DOMContentLoaded', () => new Vue({ pipelinesComponent, }, data() { - const store = new PipelinesStore(); - return { - store, + store: new PipelinesStore(), }; }, + created() { + this.dataset = document.querySelector(this.$options.el).dataset; + }, render(createElement) { return createElement('pipelines-component', { props: { store: this.store, + endpoint: this.dataset.endpoint, + helpPagePath: this.dataset.helpPagePath, + emptyStateSvgPath: this.dataset.emptyStateSvgPath, + errorStateSvgPath: this.dataset.errorStateSvgPath, + noPipelinesSvgPath: this.dataset.noPipelinesSvgPath, + autoDevopsPath: this.dataset.helpAutoDevopsPath, + newPipelinePath: this.dataset.newPipelinePath, + canCreatePipeline: convertPermissionToBoolean(this.dataset.canCreatePipeline), + hasGitlabCi: convertPermissionToBoolean(this.dataset.hasGitlabCi), + ciLintPath: this.dataset.ciLintPath, + resetCachePath: this.dataset.resetCachePath, }, }); }, diff --git a/app/assets/javascripts/pipelines/components/blank_state.vue b/app/assets/javascripts/pipelines/components/blank_state.vue new file mode 100644 index 00000000000..8d3d6223d7b --- /dev/null +++ b/app/assets/javascripts/pipelines/components/blank_state.vue @@ -0,0 +1,32 @@ +<script> + export default { + name: 'PipelinesSvgState', + props: { + svgPath: { + type: String, + required: true, + }, + + message: { + type: String, + required: true, + }, + }, + }; +</script> + +<template> + <div class="row empty-state"> + <div class="col-xs-12"> + <div class="svg-content"> + <img :src="svgPath" /> + </div> + </div> + + <div class="col-xs-12 text-center"> + <div class="text-content"> + <h4>{{ message }}</h4> + </div> + </div> + </div> +</template> diff --git a/app/assets/javascripts/pipelines/components/empty_state.vue b/app/assets/javascripts/pipelines/components/empty_state.vue index dfaa2574091..10ac8c08bed 100644 --- a/app/assets/javascripts/pipelines/components/empty_state.vue +++ b/app/assets/javascripts/pipelines/components/empty_state.vue @@ -1,5 +1,6 @@ <script> export default { + name: 'PipelinesEmptyState', props: { helpPagePath: { type: String, @@ -9,6 +10,10 @@ type: String, required: true, }, + canSetCi: { + type: Boolean, + required: true, + }, }, }; </script> @@ -22,22 +27,36 @@ <div class="col-xs-12"> <div class="text-content"> - <h4 class="text-center"> - {{ s__("Pipelines|Build with confidence") }} - </h4> - <p> - {{ s__(`Pipelines|Continous Integration can help -catch bugs by running your tests automatically, -while Continuous Deployment can help you deliver code to your product environment.`) }} + + <template v-if="canSetCi"> + <h4 class="text-center"> + {{ s__('Pipelines|Build with confidence') }} + </h4> + + <p> + {{ s__(`Pipelines|Continous Integration can help + catch bugs by running your tests automatically, + while Continuous Deployment can help you deliver + code to your product environment.`) }} + </p> + + <div class="text-center"> + <a + :href="helpPagePath" + class="btn btn-primary js-get-started-pipelines" + > + {{ s__('Pipelines|Get started with Pipelines') }} + </a> + </div> + </template> + + <p + v-else + class="text-center" + > + {{ s__('Pipelines|This project is not currently set up to run pipelines.') }} </p> - <div class="text-center"> - <a - :href="helpPagePath" - class="btn btn-info" - > - {{ s__("Pipelines|Get started with Pipelines") }} - </a> - </div> + </div> </div> </div> diff --git a/app/assets/javascripts/pipelines/components/error_state.vue b/app/assets/javascripts/pipelines/components/error_state.vue deleted file mode 100644 index 012853b201d..00000000000 --- a/app/assets/javascripts/pipelines/components/error_state.vue +++ /dev/null @@ -1,26 +0,0 @@ -<script> -export default { - props: { - errorStateSvgPath: { - type: String, - required: true, - }, - }, -}; -</script> - -<template> - <div class="row empty-state js-pipelines-error-state"> - <div class="col-xs-12"> - <div class="svg-content"> - <img :src="errorStateSvgPath"/> - </div> - </div> - - <div class="col-xs-12 text-center"> - <div class="text-content"> - <h4>The API failed to fetch the pipelines.</h4> - </div> - </div> - </div> -</template> diff --git a/app/assets/javascripts/pipelines/components/nav_controls.vue b/app/assets/javascripts/pipelines/components/nav_controls.vue index f31a91c3403..383ab51fe56 100644 --- a/app/assets/javascripts/pipelines/components/nav_controls.vue +++ b/app/assets/javascripts/pipelines/components/nav_controls.vue @@ -1,67 +1,52 @@ <script> -export default { - name: 'PipelineNavControls', - props: { - newPipelinePath: { - type: String, - required: true, + export default { + name: 'PipelineNavControls', + props: { + newPipelinePath: { + type: String, + required: false, + default: null, + }, + + resetCachePath: { + type: String, + required: false, + default: null, + }, + + ciLintPath: { + type: String, + required: false, + default: null, + }, }, - - hasCiEnabled: { - type: Boolean, - required: true, - }, - - helpPagePath: { - type: String, - required: true, - }, - - resetCachePath: { - type: String, - required: true, - }, - - ciLintPath: { - type: String, - required: true, - }, - - canCreatePipeline: { - type: Boolean, - required: true, - }, - }, -}; + }; </script> <template> <div class="nav-controls"> <a - v-if="canCreatePipeline" + v-if="newPipelinePath" :href="newPipelinePath" - class="btn btn-create"> - Run Pipeline - </a> - - <a - v-if="!hasCiEnabled" - :href="helpPagePath" - class="btn btn-info"> - Get started with Pipelines + class="btn btn-create js-run-pipeline" + > + {{ s__('Pipelines|Run Pipeline') }} </a> <a + v-if="resetCachePath" data-method="post" - rel="nofollow" :href="resetCachePath" - class="btn btn-default"> - Clear runner caches + class="btn btn-default js-clear-cache" + > + {{ s__('Pipelines|Clear Runner Caches') }} </a> <a + v-if="ciLintPath" :href="ciLintPath" - class="btn btn-default"> - CI Lint + class="btn btn-default js-ci-lint" + > + {{ s__('Pipelines|CI Lint') }} </a> </div> </template> diff --git a/app/assets/javascripts/pipelines/components/pipelines.vue b/app/assets/javascripts/pipelines/components/pipelines.vue index 90930d5ff44..6e5ee68eeb1 100644 --- a/app/assets/javascripts/pipelines/components/pipelines.vue +++ b/app/assets/javascripts/pipelines/components/pipelines.vue @@ -1,12 +1,12 @@ <script> import _ from 'underscore'; + import { __, sprintf, s__ } from '../../locale'; import PipelinesService from '../services/pipelines_service'; import pipelinesMixin from '../mixins/pipelines'; - import tablePagination from '../../vue_shared/components/table_pagination.vue'; - import navigationTabs from '../../vue_shared/components/navigation_tabs.vue'; - import navigationControls from './nav_controls.vue'; + import TablePagination from '../../vue_shared/components/table_pagination.vue'; + import NavigationTabs from '../../vue_shared/components/navigation_tabs.vue'; + import NavigationControls from './nav_controls.vue'; import { - convertPermissionToBoolean, getParameterByName, parseQueryStringIntoObject, } from '../../lib/utils/common_utils'; @@ -14,9 +14,9 @@ export default { components: { - tablePagination, - navigationTabs, - navigationControls, + TablePagination, + NavigationTabs, + NavigationControls, }, mixins: [ pipelinesMixin, @@ -36,111 +36,186 @@ required: false, default: 'root', }, + endpoint: { + type: String, + required: true, + }, + helpPagePath: { + type: String, + required: true, + }, + emptyStateSvgPath: { + type: String, + required: true, + }, + errorStateSvgPath: { + type: String, + required: true, + }, + noPipelinesSvgPath: { + type: String, + required: true, + }, + autoDevopsPath: { + type: String, + required: true, + }, + hasGitlabCi: { + type: Boolean, + required: true, + }, + canCreatePipeline: { + type: Boolean, + required: true, + }, + ciLintPath: { + type: String, + required: false, + default: null, + }, + resetCachePath: { + type: String, + required: false, + default: null, + }, + newPipelinePath: { + type: String, + required: false, + default: null, + }, }, data() { - const pipelinesData = document.querySelector('#pipelines-list-vue').dataset; - return { - endpoint: pipelinesData.endpoint, - helpPagePath: pipelinesData.helpPagePath, - emptyStateSvgPath: pipelinesData.emptyStateSvgPath, - errorStateSvgPath: pipelinesData.errorStateSvgPath, - autoDevopsPath: pipelinesData.helpAutoDevopsPath, - newPipelinePath: pipelinesData.newPipelinePath, - canCreatePipeline: pipelinesData.canCreatePipeline, - hasCi: pipelinesData.hasCi, - ciLintPath: pipelinesData.ciLintPath, - resetCachePath: pipelinesData.resetCachePath, + // Start with loading state to avoid a glitch when the empty state will be rendered + isLoading: true, state: this.store.state, scope: getParameterByName('scope') || 'all', page: getParameterByName('page') || '1', requestData: {}, }; }, - computed: { - canCreatePipelineParsed() { - return convertPermissionToBoolean(this.canCreatePipeline); - }, + stateMap: { + // with tabs + loading: 'loading', + tableList: 'tableList', + error: 'error', + emptyTab: 'emptyTab', + // without tabs + emptyState: 'emptyState', + }, + scopes: { + all: 'all', + pending: 'pending', + running: 'running', + finished: 'finished', + branches: 'branches', + tags: 'tags', + }, + computed: { /** - * The empty state should only be rendered when the request is made to fetch all pipelines - * and none is returned. - * - * @return {Boolean} - */ - shouldRenderEmptyState() { - return !this.isLoading && - !this.hasError && - this.hasMadeRequest && - !this.state.pipelines.length && - (this.scope === 'all' || this.scope === null); + * `hasGitlabCi` handles both internal and external CI. + * The order on which the checks are made in this method is + * important to guarantee we handle all the corner cases. + */ + stateToRender() { + const { stateMap } = this.$options; + + if (this.isLoading) { + return stateMap.loading; + } + + if (this.hasError) { + return stateMap.error; + } + + if (this.state.pipelines.length) { + return stateMap.tableList; + } + + if ((this.scope !== 'all' && this.scope !== null) || this.hasGitlabCi) { + return stateMap.emptyTab; + } + + return stateMap.emptyState; }, /** - * When a specific scope does not have pipelines we render a message. - * - * @return {Boolean} + * Tabs are rendered in all states except empty state. + * They are not rendered before the first request to avoid a flicker on first load. */ - shouldRenderNoPipelinesMessage() { - return !this.isLoading && - !this.hasError && - !this.state.pipelines.length && - this.scope !== 'all' && - this.scope !== null; + shouldRenderTabs() { + const { stateMap } = this.$options; + return this.hasMadeRequest && + [ + stateMap.loading, + stateMap.tableList, + stateMap.error, + stateMap.emptyTab, + ].includes(this.stateToRender); }, - shouldRenderTable() { - return !this.hasError && - !this.isLoading && this.state.pipelines.length; + shouldRenderButtons() { + return (this.newPipelinePath || + this.resetCachePath || + this.ciLintPath) && this.shouldRenderTabs; }, - /** - * Pagination should only be rendered when there is more than one page. - * - * @return {Boolean} - */ + shouldRenderPagination() { return !this.isLoading && this.state.pipelines.length && this.state.pageInfo.total > this.state.pageInfo.perPage; }, - hasCiEnabled() { - return this.hasCi !== undefined; + + emptyTabMessage() { + const { scopes } = this.$options; + const possibleScopes = [scopes.pending, scopes.running, scopes.finished]; + + if (possibleScopes.includes(this.scope)) { + return sprintf(s__('Pipelines|There are currently no %{scope} pipelines.'), { + scope: this.scope, + }); + } + + return s__('Pipelines|There are currently no pipelines.'); }, tabs() { const { count } = this.state; + const { scopes } = this.$options; + return [ { - name: 'All', - scope: 'all', + name: __('All'), + scope: scopes.all, count: count.all, isActive: this.scope === 'all', }, { - name: 'Pending', - scope: 'pending', + name: __('Pending'), + scope: scopes.pending, count: count.pending, isActive: this.scope === 'pending', }, { - name: 'Running', - scope: 'running', + name: __('Running'), + scope: scopes.running, count: count.running, isActive: this.scope === 'running', }, { - name: 'Finished', - scope: 'finished', + name: __('Finished'), + scope: scopes.finished, count: count.finished, isActive: this.scope === 'finished', }, { - name: 'Branches', - scope: 'branches', + name: __('Branches'), + scope: scopes.branches, isActive: this.scope === 'branches', }, { - name: 'Tags', - scope: 'tags', + name: __('Tags'), + scope: scopes.tags, isActive: this.scope === 'tags', }, ]; @@ -187,7 +262,7 @@ this.errorCallback(); // restart polling - this.poll.restart(); + this.poll.restart({ data: this.requestData }); }); }, }, @@ -197,69 +272,70 @@ <div class="pipelines-container"> <div class="top-area scrolling-tabs-container inner-page-scroll-tabs" - v-if="!shouldRenderEmptyState" + v-if="shouldRenderTabs || shouldRenderButtons" > <div class="fade-left"> <i class="fa fa-angle-left" - aria-hidden="true"> + aria-hidden="true" + > </i> </div> <div class="fade-right"> <i class="fa fa-angle-right" - aria-hidden="true"> + aria-hidden="true" + > </i> </div> <navigation-tabs + v-if="shouldRenderTabs" :tabs="tabs" @onChangeTab="onChangeTab" scope="pipelines" /> <navigation-controls + v-if="shouldRenderButtons" :new-pipeline-path="newPipelinePath" - :has-ci-enabled="hasCiEnabled" - :help-page-path="helpPagePath" :reset-cache-path="resetCachePath" :ci-lint-path="ciLintPath" - :can-create-pipeline="canCreatePipelineParsed " /> </div> <div class="content-list pipelines"> <loading-icon - label="Loading Pipelines" + v-if="stateToRender === $options.stateMap.loading" + :label="s__('Pipelines|Loading Pipelines')" size="3" - v-if="isLoading" class="prepend-top-20" /> <empty-state - v-if="shouldRenderEmptyState" + v-else-if="stateToRender === $options.stateMap.emptyState" :help-page-path="helpPagePath" :empty-state-svg-path="emptyStateSvgPath" + :can-set-ci="canCreatePipeline" /> - <error-state - v-if="shouldRenderErrorState" - :error-state-svg-path="errorStateSvgPath" + <svg-blank-state + v-else-if="stateToRender === $options.stateMap.error" + :svg-path="errorStateSvgPath" + :message="s__(`Pipelines|There was an error fetching the pipelines. + Try again in a few moments or contact your support team.`)" /> - <div - class="blank-state-row" - v-if="shouldRenderNoPipelinesMessage" - > - <div class="blank-state-center"> - <h2 class="blank-state-title js-blank-state-title">No pipelines to show.</h2> - </div> - </div> + <svg-blank-state + v-else-if="stateToRender === $options.stateMap.emptyTab" + :svg-path="noPipelinesSvgPath" + :message="emptyTabMessage" + /> <div class="table-holder" - v-if="shouldRenderTable" + v-else-if="stateToRender === $options.stateMap.tableList" > <pipelines-table-component diff --git a/app/assets/javascripts/pipelines/mixins/pipelines.js b/app/assets/javascripts/pipelines/mixins/pipelines.js index 50bdf80c3e3..9fcc07abee5 100644 --- a/app/assets/javascripts/pipelines/mixins/pipelines.js +++ b/app/assets/javascripts/pipelines/mixins/pipelines.js @@ -1,23 +1,19 @@ import Visibility from 'visibilityjs'; +import { __ } from '../../locale'; import Flash from '../../flash'; import Poll from '../../lib/utils/poll'; -import emptyState from '../components/empty_state.vue'; -import errorState from '../components/error_state.vue'; -import loadingIcon from '../../vue_shared/components/loading_icon.vue'; -import pipelinesTableComponent from '../components/pipelines_table.vue'; +import EmptyState from '../components/empty_state.vue'; +import SvgBlankState from '../components/blank_state.vue'; +import LoadingIcon from '../../vue_shared/components/loading_icon.vue'; +import PipelinesTableComponent from '../components/pipelines_table.vue'; import eventHub from '../event_hub'; export default { components: { - pipelinesTableComponent, - errorState, - emptyState, - loadingIcon, - }, - computed: { - shouldRenderErrorState() { - return this.hasError && !this.isLoading; - }, + PipelinesTableComponent, + SvgBlankState, + EmptyState, + LoadingIcon, }, data() { return { @@ -85,6 +81,7 @@ export default { this.hasError = true; this.isLoading = false; this.updateGraphDropdown = false; + this.hasMadeRequest = true; }, setIsMakingRequest(isMakingRequest) { this.isMakingRequest = isMakingRequest; @@ -96,7 +93,7 @@ export default { postAction(endpoint) { this.service.postAction(endpoint) .then(() => eventHub.$emit('refreshPipelines')) - .catch(() => new Flash('An error occurred while making the request.')); + .catch(() => Flash(__('An error occurred while making the request.'))); }, }, }; diff --git a/app/assets/javascripts/registry/components/collapsible_container.vue b/app/assets/javascripts/registry/components/collapsible_container.vue index b4906ba4ee5..a03180e80e6 100644 --- a/app/assets/javascripts/registry/components/collapsible_container.vue +++ b/app/assets/javascripts/registry/components/collapsible_container.vue @@ -86,6 +86,7 @@ v-if="repo.location" :text="clipboardText" :title="repo.location" + css-class="btn-default btn-transparent btn-clipboard" /> <div class="controls hidden-xs pull-right"> diff --git a/app/assets/javascripts/registry/components/table_registry.vue b/app/assets/javascripts/registry/components/table_registry.vue index bef850eddc0..ee4eb3581f3 100644 --- a/app/assets/javascripts/registry/components/table_registry.vue +++ b/app/assets/javascripts/registry/components/table_registry.vue @@ -90,6 +90,7 @@ v-if="item.location" :title="item.location" :text="clipboardText(item.location)" + css-class="btn-default btn-transparent btn-clipboard" /> </td> <td> diff --git a/app/assets/javascripts/sortable/sortable_config.js b/app/assets/javascripts/sortable/sortable_config.js new file mode 100644 index 00000000000..43ef5d66422 --- /dev/null +++ b/app/assets/javascripts/sortable/sortable_config.js @@ -0,0 +1,7 @@ +export default { + animation: 200, + forceFallback: true, + fallbackClass: 'is-dragging', + fallbackOnBody: true, + ghostClass: 'is-ghost', +}; diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue index 18a3787857d..3d886e7d628 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue @@ -67,6 +67,7 @@ <clipboard-button :text="branchNameClipboardData" :title="__('Copy branch name to clipboard')" + css-class="btn-default btn-transparent btn-clipboard" /> {{ s__("mrWidget|into") }} diff --git a/app/assets/javascripts/vue_shared/components/clipboard_button.vue b/app/assets/javascripts/vue_shared/components/clipboard_button.vue index 3b6c2da1664..cab126a7eca 100644 --- a/app/assets/javascripts/vue_shared/components/clipboard_button.vue +++ b/app/assets/javascripts/vue_shared/components/clipboard_button.vue @@ -31,7 +31,7 @@ cssClass: { type: String, required: false, - default: 'btn btn-default btn-transparent btn-clipboard', + default: 'btn-default', }, }, }; @@ -40,6 +40,7 @@ <template> <button type="button" + class="btn" :class="cssClass" :title="title" :data-clipboard-text="text" diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue index 3b17135f0e5..c1dd4d42d9d 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue +++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue @@ -88,7 +88,7 @@ export default { </script> <template> - <div class="block labels"> + <div class="block labels js-labels-block"> <dropdown-value-collapsed v-if="showCreate" :labels="context.labels" @@ -104,7 +104,7 @@ export default { </dropdown-value> <div v-if="canEdit" - class="selectbox" + class="selectbox js-selectbox" style="display: none;" > <dropdown-hidden-input diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value.vue index ba4c8fba5ec..69d588eb25d 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value.vue +++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_value.vue @@ -35,7 +35,7 @@ export default { </script> <template> - <div class="hide-collapsed value issuable-show-labels"> + <div class="hide-collapsed value issuable-show-labels js-value"> <span v-if="isEmpty" class="text-secondary" diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss index 884665d35c7..58700661142 100644 --- a/app/assets/stylesheets/pages/environments.scss +++ b/app/assets/stylesheets/pages/environments.scss @@ -369,7 +369,8 @@ } > text { - font-size: 12px; + fill: $theme-gray-600; + font-size: 10px; } } diff --git a/app/controllers/boards/issues_controller.rb b/app/controllers/boards/issues_controller.rb index 352f12a89fd..19dbee84c11 100644 --- a/app/controllers/boards/issues_controller.rb +++ b/app/controllers/boards/issues_controller.rb @@ -1,6 +1,9 @@ module Boards class IssuesController < Boards::ApplicationController include BoardsResponses + include ControllerWithCrossProjectAccessCheck + + requires_cross_project_access if: -> { board&.group_board? } before_action :whitelist_query_limiting, only: [:index, :update] before_action :authorize_read_issue, only: [:index] @@ -64,11 +67,19 @@ module Boards end def issues_finder - IssuesFinder.new(current_user, project_id: board_parent.id) + if board.group_board? + IssuesFinder.new(current_user, group_id: board_parent.id) + else + IssuesFinder.new(current_user, project_id: board_parent.id) + end end def project - board_parent + @project ||= if board.group_board? + Project.find(issue_params[:project_id]) + else + board_parent + end end def move_params diff --git a/app/controllers/concerns/boards_responses.rb b/app/controllers/concerns/boards_responses.rb index a145049dc7d..da830ec2cb1 100644 --- a/app/controllers/concerns/boards_responses.rb +++ b/app/controllers/concerns/boards_responses.rb @@ -1,10 +1,46 @@ module BoardsResponses + include Gitlab::Utils::StrongMemoize + + def board_params + params.require(:board).permit(:name, :weight, :milestone_id, :assignee_id, label_ids: []) + end + + def parent + strong_memoize(:parent) do + group? ? group : project + end + end + + def boards_path + if group? + group_boards_path(parent) + else + project_boards_path(parent) + end + end + + def board_path(board) + if group? + group_board_path(parent, board) + else + project_board_path(parent, board) + end + end + + def group? + instance_variable_defined?(:@group) + end + def authorize_read_list - authorize_action_for!(board.parent, :read_list) + ability = board.group_board? ? :read_group : :read_list + + authorize_action_for!(board.parent, ability) end def authorize_read_issue - authorize_action_for!(board.parent, :read_issue) + ability = board.group_board? ? :read_group : :read_issue + + authorize_action_for!(board.parent, ability) end def authorize_update_issue @@ -31,6 +67,10 @@ module BoardsResponses respond_with(@board) # rubocop:disable Gitlab/ModuleWithInstanceVariables end + def serialize_as_json(resource) + resource.as_json(only: [:id]) + end + def respond_with(resource) respond_to do |format| format.html diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb new file mode 100644 index 00000000000..7c2016f0326 --- /dev/null +++ b/app/controllers/groups/boards_controller.rb @@ -0,0 +1,27 @@ +class Groups::BoardsController < Groups::ApplicationController + include BoardsResponses + + before_action :assign_endpoint_vars + + def index + @boards = Boards::ListService.new(group, current_user).execute + + respond_with_boards + end + + def show + @board = group.boards.find(params[:id]) + + respond_with_board + end + + def assign_endpoint_vars + @boards_endpoint = group_boards_url(group) + @namespace_path = group.to_param + @labels_endpoint = group_labels_url(group) + end + + def serialize_as_json(resource) + resource.as_json(only: [:id]) + end +end diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index ac1d97dc54a..58be330f466 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -35,10 +35,18 @@ class Groups::LabelsController < Groups::ApplicationController def create @label = Labels::CreateService.new(label_params).execute(group: group) - if @label.valid? - redirect_to group_labels_path(@group) - else - render :new + respond_to do |format| + format.html do + if @label.valid? + redirect_to group_labels_path(@group) + else + render :new + end + end + + format.json do + render json: LabelSerializer.new.represent_appearance(@label) + end end end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 52430ea771f..025d8270b7c 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -62,7 +62,7 @@ class InvitesController < ApplicationController case source when Project project = member.source - label = "project #{project.name_with_namespace}" + label = "project #{project.full_name}" path = project_path(project) when Group group = member.source diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 74c25505e36..405726c017c 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -38,7 +38,7 @@ class Projects::BlobController < Projects::ApplicationController end format.json do - page_title @blob.path, @ref, @project.name_with_namespace + page_title @blob.path, @ref, @project.full_name show_json end diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index cabafe26357..965cece600e 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -7,13 +7,19 @@ class Projects::BranchesController < Projects::ApplicationController before_action :authorize_download_code! before_action :authorize_push_code!, only: [:new, :create, :destroy, :destroy_all_merged] - def index - @sort = params[:sort].presence || sort_value_recently_updated - @branches = BranchesFinder.new(@repository, params.merge(sort: @sort)).execute - @branches = Kaminari.paginate_array(@branches).page(params[:page]) + # Support legacy URLs + before_action :redirect_for_legacy_index_sort_or_search, only: [:index] + def index respond_to do |format| format.html do + @sort = params[:sort].presence || sort_value_recently_updated + @mode = params[:state].presence || 'overview' + @overview_max_branches = 5 + + # Fetch branches for the specified mode + fetch_branches_by_mode + @refs_pipelines = @project.pipelines.latest_successful_for_refs(@branches.map(&:name)) @merged_branch_names = repository.merged_branch_names(@branches.map(&:name)) @@ -28,7 +34,9 @@ class Projects::BranchesController < Projects::ApplicationController end end format.json do - render json: @branches.map(&:name) + branches = BranchesFinder.new(@repository, params).execute + branches = Kaminari.paginate_array(branches).page(params[:page]) + render json: branches.map(&:name) end end end @@ -123,4 +131,27 @@ class Projects::BranchesController < Projects::ApplicationController context: 'autodeploy' ) end + + def redirect_for_legacy_index_sort_or_search + # Normalize a legacy URL with redirect + if request.format != :json && !params[:state].presence && [:sort, :search, :page].any? { |key| params[key].presence } + redirect_to project_branches_filtered_path(@project, state: 'all'), notice: 'Update your bookmarked URLs as filtered/sorted branches URL has been changed.' + end + end + + def fetch_branches_by_mode + if @mode == 'overview' + # overview mode + @active_branches, @stale_branches = BranchesFinder.new(@repository, sort: sort_value_recently_updated).execute.partition(&:active?) + # Here we get one more branch to indicate if there are more data we're not showing + @active_branches = @active_branches.first(@overview_max_branches + 1) + @stale_branches = @stale_branches.first(@overview_max_branches + 1) + @branches = @active_branches + @stale_branches + else + # active/stale/all view mode + @branches = BranchesFinder.new(@repository, params.merge(sort: @sort)).execute + @branches = @branches.select { |b| b.state.to_s == @mode } if %w[active stale].include?(@mode) + @branches = Kaminari.paginate_array(@branches).page(params[:page]) + end + end end diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index 1a418d0f15a..b68cdc39cb8 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -24,7 +24,7 @@ class Projects::DeploymentsController < Projects::ApplicationController end def additional_metrics - return render_404 unless deployment.has_additional_metrics? + return render_404 unless deployment.has_metrics? respond_to do |format| format.json do diff --git a/app/controllers/projects/network_controller.rb b/app/controllers/projects/network_controller.rb index 3b10a93e97f..35fec229db7 100644 --- a/app/controllers/projects/network_controller.rb +++ b/app/controllers/projects/network_controller.rb @@ -9,25 +9,22 @@ class Projects::NetworkController < Projects::ApplicationController before_action :assign_commit def show - # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37602 - Gitlab::GitalyClient.allow_n_plus_1_calls do - @url = project_network_path(@project, @ref, @options.merge(format: :json)) - @commit_url = project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s") - - respond_to do |format| - format.html do - if @options[:extended_sha1] && !@commit - flash.now[:alert] = "Git revision '#{@options[:extended_sha1]}' does not exist." - end - end + @url = project_network_path(@project, @ref, @options.merge(format: :json)) + @commit_url = project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s") - format.json do - @graph = Network::Graph.new(project, @ref, @commit, @options[:filter_ref]) + respond_to do |format| + format.html do + if @options[:extended_sha1] && !@commit + flash.now[:alert] = "Git revision '#{@options[:extended_sha1]}' does not exist." end end - render + format.json do + @graph = Network::Graph.new(project, @ref, @commit, @options[:filter_ref]) + end end + + render end def assign_commit diff --git a/app/controllers/projects/prometheus/metrics_controller.rb b/app/controllers/projects/prometheus/metrics_controller.rb index b739d0f0f90..1dd886409a5 100644 --- a/app/controllers/projects/prometheus/metrics_controller.rb +++ b/app/controllers/projects/prometheus/metrics_controller.rb @@ -2,11 +2,12 @@ module Projects module Prometheus class MetricsController < Projects::ApplicationController before_action :authorize_admin_project! + before_action :require_prometheus_metrics! def active_common respond_to do |format| format.json do - matched_metrics = prometheus_service.matched_metrics || {} + matched_metrics = prometheus_adapter.query(:matched_metrics) || {} if matched_metrics.any? render json: matched_metrics @@ -19,8 +20,12 @@ module Projects private - def prometheus_service - @prometheus_service ||= project.find_or_initialize_service('prometheus') + def prometheus_adapter + @prometheus_adapter ||= ::Prometheus::AdapterService.new(project).prometheus_adapter + end + + def require_prometheus_metrics! + render_404 unless prometheus_adapter.can_query? end end end diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb index f752a46f828..ee9b5458282 100644 --- a/app/controllers/projects/tree_controller.rb +++ b/app/controllers/projects/tree_controller.rb @@ -36,7 +36,7 @@ class Projects::TreeController < Projects::ApplicationController end format.json do - page_title @path.presence || _("Files"), @ref, @project.name_with_namespace + page_title @path.presence || _("Files"), @ref, @project.full_name # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/38261 Gitlab::GitalyClient.allow_n_plus_1_calls do diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 913689a1e74..ee197c75764 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -41,11 +41,11 @@ class ProjectsController < Projects::ApplicationController cookies[:issue_board_welcome_hidden] = { path: project_path(@project), value: nil, expires: Time.at(0) } redirect_to( - project_path(@project), + project_path(@project, custom_import_params), notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name } ) else - render 'new', locals: { active_tab: ('import' if project_params[:import_url].present?) } + render 'new', locals: { active_tab: active_new_project_tab } end end @@ -103,7 +103,7 @@ class ProjectsController < Projects::ApplicationController def show if @project.import_in_progress? - redirect_to project_import_path(@project) + redirect_to project_import_path(@project, custom_import_params) return end @@ -130,7 +130,7 @@ class ProjectsController < Projects::ApplicationController return access_denied! unless can?(current_user, :remove_project, @project) ::Projects::DestroyService.new(@project, current_user, {}).async_execute - flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.name_with_namespace } + flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.full_name } redirect_to dashboard_projects_path, status: 302 rescue Projects::DestroyService::DestroyError => ex @@ -359,6 +359,14 @@ class ProjectsController < Projects::ApplicationController ] end + def custom_import_params + {} + end + + def active_new_project_tab + project_params[:import_url].present? ? 'import' : 'blank' + end + def repo_exists? project.repository_exists? && !project.empty_repo? diff --git a/app/finders/branches_finder.rb b/app/finders/branches_finder.rb index 852eac3647d..8bb1366867c 100644 --- a/app/finders/branches_finder.rb +++ b/app/finders/branches_finder.rb @@ -1,5 +1,5 @@ class BranchesFinder - def initialize(repository, params) + def initialize(repository, params = {}) @repository = repository @params = params end diff --git a/app/finders/todos_finder.rb b/app/finders/todos_finder.rb index 47c8b9b60ed..150f4c7688b 100644 --- a/app/finders/todos_finder.rb +++ b/app/finders/todos_finder.rb @@ -150,9 +150,7 @@ class TodosFinder if project? items.where(project: project) else - projects = Project - .public_or_visible_to_user(current_user) - .order_id_desc + projects = Project.public_or_visible_to_user(current_user) items.joins(:project).merge(projects) end diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb index 12b3d9bac1a..275e892b2e6 100644 --- a/app/helpers/boards_helper.rb +++ b/app/helpers/boards_helper.rb @@ -17,23 +17,35 @@ module BoardsHelper end def build_issue_link_base - project_issues_path(@project) + if board.group_board? + "#{group_path(@board.group)}/:project_path/issues" + else + project_issues_path(@project) + end end def board_base_url - project_boards_path(@project) + if board.group_board? + group_boards_url(@group) + else + project_boards_path(@project) + end end def multiple_boards_available? - current_board_parent.multiple_issue_boards_available?(current_user) + current_board_parent.multiple_issue_boards_available? end def current_board_path(board) - @current_board_path ||= project_board_path(current_board_parent, board) + @current_board_path ||= if board.group_board? + group_board_path(current_board_parent, board) + else + project_board_path(current_board_parent, board) + end end def current_board_parent - @current_board_parent ||= @project + @current_board_parent ||= @group || @project end def can_admin_issue? @@ -47,7 +59,8 @@ module BoardsHelper labels: labels_filter_path(true), labels_endpoint: @labels_endpoint, namespace_path: @namespace_path, - project_path: @project&.try(:path) + project_path: @project&.path, + group_path: @group&.path } end @@ -59,7 +72,8 @@ module BoardsHelper field_name: 'issue[assignee_ids][]', first_user: current_user&.username, current_user: 'true', - project_id: @project&.try(:id), + project_id: @project&.id, + group_id: @group&.id, null_user: 'true', multi_select: 'true', 'dropdown-header': dropdown_options[:data][:'dropdown-header'], diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index 00b9a0e00eb..07b1fc3d7cf 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -1,15 +1,4 @@ module BranchesHelper - def filter_branches_path(options = {}) - exist_opts = { - search: params[:search], - sort: params[:sort] - } - - options = exist_opts.merge(options) - - project_branches_path(@project, @id, options) - end - def project_branches options_for_select(@project.repository.branch_names, @project.default_branch) end diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb index e26ce6da030..905e2002592 100644 --- a/app/helpers/form_helper.rb +++ b/app/helpers/form_helper.rb @@ -27,7 +27,7 @@ module FormHelper first_user: current_user&.username, null_user: true, current_user: true, - project_id: @project.id, + project_id: @project&.id, field_name: 'issue[assignee_ids][]', default_label: 'Unassigned', 'max-select': 1, diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index 7910de73c52..16eceb3f48f 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -129,7 +129,7 @@ module GroupsHelper links = [:overview, :group_members] if can?(current_user, :read_cross_project) - links += [:activity, :issues, :labels, :milestones, :merge_requests] + links += [:activity, :issues, :boards, :labels, :milestones, :merge_requests] end if can?(current_user, :admin_group, @group) diff --git a/app/helpers/import_helper.rb b/app/helpers/import_helper.rb index a18ebfb6030..b484a868f92 100644 --- a/app/helpers/import_helper.rb +++ b/app/helpers/import_helper.rb @@ -1,19 +1,45 @@ module ImportHelper + def has_ci_cd_only_params? + false + end + def import_project_target(owner, name) namespace = current_user.can_create_group? ? owner : current_user.namespace_path "#{namespace}/#{name}" end - def provider_project_link(provider, path_with_namespace) - url = __send__("#{provider}_project_url", path_with_namespace) # rubocop:disable GitlabSecurity/PublicSend + def provider_project_link(provider, full_path) + url = __send__("#{provider}_project_url", full_path) # rubocop:disable GitlabSecurity/PublicSend + + link_to full_path, url, target: '_blank', rel: 'noopener noreferrer' + end + + def import_will_timeout_message(_ci_cd_only) + timeout = time_interval_in_words(Gitlab.config.gitlab_shell.git_timeout) + _('The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination.') % { timeout: timeout } + end + + def import_svn_message(_ci_cd_only) + svn_link = link_to _('this document'), help_page_path('user/project/import/svn') + _('To import an SVN repository, check out %{svn_link}.').html_safe % { svn_link: svn_link } + end + + def import_in_progress_title + if @project.forked? + _('Forking in progress') + else + _('Import in progress') + end + end - link_to path_with_namespace, url, target: '_blank', rel: 'noopener noreferrer' + def import_wait_and_refresh_message + _('Please wait while we import the repository for you. Refresh at will.') end private - def github_project_url(path_with_namespace) - "#{github_root_url}/#{path_with_namespace}" + def github_project_url(full_path) + "#{github_root_url}/#{full_path}" end def github_root_url @@ -23,7 +49,7 @@ module ImportHelper @github_url = provider.fetch('url', 'https://github.com') if provider end - def gitea_project_url(path_with_namespace) - "#{@gitea_host_url.sub(%r{/+\z}, '')}/#{path_with_namespace}" + def gitea_project_url(full_path) + "#{@gitea_host_url.sub(%r{/+\z}, '')}/#{full_path}" end end diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index 44ecc2212f2..f6ddb6d4cfe 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -99,7 +99,7 @@ module IssuablesHelper project = Project.find_by(id: project_id) if project - project.name_with_namespace + project.full_name else default_label end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index cc1c69a1999..da9fe734f1c 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -97,13 +97,13 @@ module ProjectsHelper end def remove_project_message(project) - _("You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?") % - { project_name_with_namespace: project.name_with_namespace } + _("You are going to remove %{project_full_name}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?") % + { project_full_name: project.full_name } end def transfer_project_message(project) - _("You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?") % - { project_name_with_namespace: project.name_with_namespace } + _("You are going to transfer %{project_full_name} to another owner. Are you ABSOLUTELY sure?") % + { project_full_name: project.full_name } end def remove_fork_project_message(project) diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index e6a6496871a..761c1252fc8 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -110,7 +110,7 @@ module SearchHelper category: "Projects", id: p.id, value: "#{search_result_sanitize(p.name)}", - label: "#{search_result_sanitize(p.name_with_namespace)}", + label: "#{search_result_sanitize(p.full_name)}", url: project_path(p) } end diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index ddb48371c79..f7620e0b6b8 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -114,7 +114,7 @@ module TodosHelper projects = current_user.authorized_projects.sorted_by_activity.non_archived.with_route projects = projects.map do |project| - { id: project.id, text: project.name_with_namespace } + { id: project.id, text: project.full_name } end projects.unshift({ id: '', text: 'Any Project' }).to_json diff --git a/app/models/badge.rb b/app/models/badge.rb new file mode 100644 index 00000000000..f7e10c2ebfc --- /dev/null +++ b/app/models/badge.rb @@ -0,0 +1,51 @@ +class Badge < ActiveRecord::Base + # This structure sets the placeholders that the urls + # can have. This hash also sets which action to ask when + # the placeholder is found. + PLACEHOLDERS = { + 'project_path' => :full_path, + 'project_id' => :id, + 'default_branch' => :default_branch, + 'commit_sha' => ->(project) { project.commit&.sha } + }.freeze + + # This regex is built dynamically using the keys from the PLACEHOLDER struct. + # So, we can easily add new placeholder just by modifying the PLACEHOLDER hash. + # This regex will build the new PLACEHOLDER_REGEX with the new information + PLACEHOLDERS_REGEX = /(#{PLACEHOLDERS.keys.join('|')})/.freeze + + default_scope { order_created_at_asc } + + scope :order_created_at_asc, -> { reorder(created_at: :asc) } + + validates :link_url, :image_url, url_placeholder: { protocols: %w(http https), placeholder_regex: PLACEHOLDERS_REGEX } + validates :type, presence: true + + def rendered_link_url(project = nil) + build_rendered_url(link_url, project) + end + + def rendered_image_url(project = nil) + build_rendered_url(image_url, project) + end + + private + + def build_rendered_url(url, project = nil) + return url unless valid? && project + + Gitlab::StringPlaceholderReplacer.replace_string_placeholders(url, PLACEHOLDERS_REGEX) do |arg| + replace_placeholder_action(PLACEHOLDERS[arg], project) + end + end + + # The action param represents the :symbol or Proc to call in order + # to retrieve the return value from the project. + # This method checks if it is a Proc and use the call method, and if it is + # a symbol just send the action + def replace_placeholder_action(action, project) + return unless project + + action.is_a?(Proc) ? action.call(project) : project.public_send(action) # rubocop:disable GitlabSecurity/PublicSend + end +end diff --git a/app/models/badges/group_badge.rb b/app/models/badges/group_badge.rb new file mode 100644 index 00000000000..f4b2bdecdcc --- /dev/null +++ b/app/models/badges/group_badge.rb @@ -0,0 +1,5 @@ +class GroupBadge < Badge + belongs_to :group + + validates :group, presence: true +end diff --git a/app/models/badges/project_badge.rb b/app/models/badges/project_badge.rb new file mode 100644 index 00000000000..3945b376052 --- /dev/null +++ b/app/models/badges/project_badge.rb @@ -0,0 +1,15 @@ +class ProjectBadge < Badge + belongs_to :project + + validates :project, presence: true + + def rendered_link_url(project = nil) + project ||= self.project + super + end + + def rendered_image_url(project = nil) + project ||= self.project + super + end +end diff --git a/app/models/board.rb b/app/models/board.rb index 5bb7d3d3722..3cede6fc99a 100644 --- a/app/models/board.rb +++ b/app/models/board.rb @@ -1,20 +1,22 @@ class Board < ActiveRecord::Base + belongs_to :group belongs_to :project has_many :lists, -> { order(:list_type, :position) }, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent validates :project, presence: true, if: :project_needed? + validates :group, presence: true, unless: :project def project_needed? - true + !group end def parent - project + @parent ||= group || project end def group_board? - false + group_id.present? end def backlog_list diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb index 89ebd63e605..7b25d8c4089 100644 --- a/app/models/clusters/applications/prometheus.rb +++ b/app/models/clusters/applications/prometheus.rb @@ -1,6 +1,8 @@ module Clusters module Applications class Prometheus < ActiveRecord::Base + include PrometheusAdapter + VERSION = "2.0.0".freeze self.table_name = 'clusters_applications_prometheus' @@ -39,7 +41,7 @@ module Clusters ) end - def proxy_client + def prometheus_client return unless kube_client proxy_url = kube_client.proxy_url('service', service_name, service_port, Gitlab::Kubernetes::Helm::NAMESPACE) diff --git a/app/models/clusters/applications/runner.rb b/app/models/clusters/applications/runner.rb index 7adf1663c35..16efe90fa27 100644 --- a/app/models/clusters/applications/runner.rb +++ b/app/models/clusters/applications/runner.rb @@ -56,12 +56,13 @@ module Clusters def specification { "gitlabUrl" => gitlab_url, - "runnerToken" => ensure_runner.token + "runnerToken" => ensure_runner.token, + "runners" => { "privileged" => privileged } } end def content_values - specification.merge(YAML.load_file(chart_values_file)) + YAML.load_file(chart_values_file).deep_merge!(specification) end end end diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb index 1c0046107d7..49eb069016a 100644 --- a/app/models/clusters/cluster.rb +++ b/app/models/clusters/cluster.rb @@ -51,9 +51,6 @@ module Clusters scope :enabled, -> { where(enabled: true) } scope :disabled, -> { where(enabled: false) } - scope :for_environment, -> (env) { where(environment_scope: ['*', '', env.slug]) } - scope :for_all_environments, -> { where(environment_scope: ['*', '']) } - def status_name if provider provider.status_name diff --git a/app/models/commit.rb b/app/models/commit.rb index b9106309142..cceae5efb72 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -9,6 +9,7 @@ class Commit include Mentionable include Referable include StaticModel + include ::Gitlab::Utils::StrongMemoize attr_mentionable :safe_message, pipeline: :single_line @@ -225,11 +226,13 @@ class Commit end def parents - @parents ||= parent_ids.map { |id| project.commit(id) } + @parents ||= parent_ids.map { |oid| Commit.lazy(project, oid) } end def parent - @parent ||= project.commit(self.parent_id) if self.parent_id + strong_memoize(:parent) do + project.commit_by(oid: self.parent_id) if self.parent_id + end end def notes diff --git a/app/models/concerns/deployment_platform.rb b/app/models/concerns/deployment_platform.rb index 89d0474a596..faa94204e33 100644 --- a/app/models/concerns/deployment_platform.rb +++ b/app/models/concerns/deployment_platform.rb @@ -1,5 +1,6 @@ module DeploymentPlatform - def deployment_platform + # EE would override this and utilize the extra argument + def deployment_platform(environment: nil) @deployment_platform ||= find_cluster_platform_kubernetes || find_kubernetes_service_integration || diff --git a/app/models/concerns/prometheus_adapter.rb b/app/models/concerns/prometheus_adapter.rb new file mode 100644 index 00000000000..18cbbd871a1 --- /dev/null +++ b/app/models/concerns/prometheus_adapter.rb @@ -0,0 +1,48 @@ +module PrometheusAdapter + extend ActiveSupport::Concern + + included do + include ReactiveCaching + + self.reactive_cache_key = ->(adapter) { [adapter.class.model_name.singular, adapter.id] } + self.reactive_cache_lease_timeout = 30.seconds + self.reactive_cache_refresh_interval = 30.seconds + self.reactive_cache_lifetime = 1.minute + + def prometheus_client + raise NotImplementedError + end + + def prometheus_client_wrapper + Gitlab::PrometheusClient.new(prometheus_client) + end + + def can_query? + prometheus_client.present? + end + + def query(query_name, *args) + return unless can_query? + + query_class = Gitlab::Prometheus::Queries.const_get("#{query_name.to_s.classify}Query") + + args.map!(&:id) + + with_reactive_cache(query_class.name, *args, &query_class.method(:transform_reactive_result)) + end + + # Cache metrics for specific environment + def calculate_reactive_cache(query_class_name, *args) + return unless prometheus_client + + data = Kernel.const_get(query_class_name).new(prometheus_client_wrapper).query(*args) + { + success: true, + data: data, + last_update: Time.now.utc + } + rescue Gitlab::PrometheusClient::Error => err + { success: false, result: err.message } + end + end +end diff --git a/app/models/deployment.rb b/app/models/deployment.rb index b6cf168d60e..66e61c06765 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -98,28 +98,29 @@ class Deployment < ActiveRecord::Base end def has_metrics? - project.monitoring_service.present? + prometheus_adapter&.can_query? end def metrics return {} unless has_metrics? - project.monitoring_service.deployment_metrics(self) - end - - def has_additional_metrics? - project.prometheus_service.present? + metrics = prometheus_adapter.query(:deployment, self) + metrics&.merge(deployment_time: created_at.to_i) || {} end def additional_metrics - return {} unless project.prometheus_service.present? + return {} unless has_metrics? - metrics = project.prometheus_service.additional_deployment_metrics(self) + metrics = prometheus_adapter.query(:additional_metrics_deployment, self) metrics&.merge(deployment_time: created_at.to_i) || {} end private + def prometheus_adapter + environment.prometheus_adapter + end + def ref_path File.join(environment.ref_path, 'deployments', iid.to_s) end diff --git a/app/models/environment.rb b/app/models/environment.rb index f78c21aebe5..582a7818502 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -146,21 +146,19 @@ class Environment < ActiveRecord::Base end def has_metrics? - project.monitoring_service.present? && available? && last_deployment.present? + prometheus_adapter&.can_query? && available? && last_deployment.present? end def metrics - project.monitoring_service.environment_metrics(self) if has_metrics? + prometheus_adapter.query(:environment, self) if has_metrics? end - def has_additional_metrics? - project.prometheus_service.present? && available? && last_deployment.present? + def additional_metrics + prometheus_adapter.query(:additional_metrics_environment, self) if has_metrics? end - def additional_metrics - if has_additional_metrics? - project.prometheus_service.additional_environment_metrics(self) - end + def prometheus_adapter + @prometheus_adapter ||= Prometheus::AdapterService.new(project, deployment_platform).prometheus_adapter end def slug @@ -226,6 +224,10 @@ class Environment < ActiveRecord::Base self.environment_type || self.name end + def deployment_platform + project.deployment_platform(environment: self) + end + private # Slugifying a name may remove the uniqueness guarantee afforded by it being diff --git a/app/models/event.rb b/app/models/event.rb index 75538ba196c..17a198d52c7 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -65,6 +65,7 @@ class Event < ActiveRecord::Base # Callbacks after_create :reset_project_activity after_create :set_last_repository_updated_at, if: :push? + after_create :track_user_interacted_projects # Scopes scope :recent, -> { reorder(id: :desc) } @@ -158,7 +159,7 @@ class Event < ActiveRecord::Base def project_name if project - project.name_with_namespace + project.full_name else "(deleted project)" end @@ -389,4 +390,11 @@ class Event < ActiveRecord::Base Project.unscoped.where(id: project_id) .update_all(last_repository_updated_at: created_at) end + + def track_user_interacted_projects + # Note the call to .available? is due to earlier migrations + # that would otherwise conflict with the call to .track + # (because the table does not exist yet). + UserInteractedProject.track(self) if UserInteractedProject.available? + end end diff --git a/app/models/group.rb b/app/models/group.rb index 75bf013ecd2..8d183006c65 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -31,6 +31,9 @@ class Group < Namespace has_many :uploads, as: :model, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent + has_many :boards + has_many :badges, class_name: 'GroupBadge' + accepts_nested_attributes_for :variables, allow_destroy: true validate :visibility_level_allowed_by_projects diff --git a/app/models/label.rb b/app/models/label.rb index 7538f2d8718..de7f1d56c64 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -35,6 +35,7 @@ class Label < ActiveRecord::Base scope :templates, -> { where(template: true) } scope :with_title, ->(title) { where(title: title) } scope :with_lists_and_board, -> { joins(lists: :board).merge(List.movable) } + scope :on_group_boards, ->(group_id) { with_lists_and_board.where(boards: { group_id: group_id }) } scope :on_project_boards, ->(project_id) { with_lists_and_board.where(boards: { project_id: project_id }) } def self.prioritized(project) diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index c1c27ccf3e5..06aa67c600f 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -197,10 +197,6 @@ class MergeRequestDiff < ActiveRecord::Base CompareService.new(project, head_commit_sha).execute(project, sha, straight: true) end - def commits_count - super || merge_request_diff_commits.size - end - private def create_merge_request_diff_files(diffs) diff --git a/app/models/namespace.rb b/app/models/namespace.rb index db274ea8172..e350b675639 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -222,6 +222,11 @@ class Namespace < ActiveRecord::Base has_parent? end + # Overridden on EE module + def multiple_issue_boards_available? + false + end + def full_path_was if parent_id_was.nil? path_was diff --git a/app/models/network/commit.rb b/app/models/network/commit.rb index 9357e55b419..22d48c9e661 100644 --- a/app/models/network/commit.rb +++ b/app/models/network/commit.rb @@ -24,12 +24,7 @@ module Network end def parents(map) - @commit.parents.map do |p| - if map.include?(p.id) - map[p.id] - end - end - .compact + map.values_at(*@commit.parent_ids).compact end end end diff --git a/app/models/project.rb b/app/models/project.rb index 5b1f8b2658b..5cd1da43645 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -221,6 +221,8 @@ class Project < ActiveRecord::Base has_one :auto_devops, class_name: 'ProjectAutoDevops' has_many :custom_attributes, class_name: 'ProjectCustomAttribute' + has_many :project_badges, class_name: 'ProjectBadge' + accepts_nested_attributes_for :variables, allow_destroy: true accepts_nested_attributes_for :project_feature, update_only: true accepts_nested_attributes_for :import_data @@ -274,7 +276,8 @@ class Project < ActiveRecord::Base scope :without_storage_feature, ->(feature) { where('storage_version < :version OR storage_version IS NULL', version: HASHED_STORAGE_FEATURES[feature]) } scope :with_unmigrated_storage, -> { where('storage_version < :version OR storage_version IS NULL', version: LATEST_STORAGE_VERSION) } - scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) } + # last_activity_at is throttled every minute, but last_repository_updated_at is updated with every push + scope :sorted_by_activity, -> { reorder("GREATEST(COALESCE(last_activity_at, '1970-01-01'), COALESCE(last_repository_updated_at, '1970-01-01')) DESC") } scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } scope :in_namespace, ->(namespace_ids) { where(namespace_id: namespace_ids) } @@ -776,7 +779,7 @@ class Project < ActiveRecord::Base end def last_activity_date - last_repository_updated_at || last_activity_at || updated_at + [last_activity_at, last_repository_updated_at, updated_at].compact.max end def project_id @@ -1525,16 +1528,34 @@ class Project < ActiveRecord::Base end end + def import_export_shared + @import_export_shared ||= Gitlab::ImportExport::Shared.new(self) + end + def export_path return nil unless namespace.present? || hashed_storage?(:repository) - File.join(Gitlab::ImportExport.storage_path, disk_path) + import_export_shared.archive_path end def export_project_path Dir.glob("#{export_path}/*export.tar.gz").max_by { |f| File.ctime(f) } end + def export_status + if export_in_progress? + :started + elsif export_project_path + :finished + else + :none + end + end + + def export_in_progress? + import_export_shared.active_export_count > 0 + end + def remove_exports return nil unless export_path.present? @@ -1663,8 +1684,9 @@ class Project < ActiveRecord::Base end end - def multiple_issue_boards_available?(user) - feature_available?(:multiple_issue_boards, user) + # Overridden on EE module + def multiple_issue_boards_available? + false end def issue_board_milestone_available?(user = nil) @@ -1766,6 +1788,17 @@ class Project < ActiveRecord::Base .set(import_jid, StuckImportJobsWorker::IMPORT_JOBS_EXPIRATION) end + def badges + return project_badges unless group + + group_badges_rel = GroupBadge.where(group: group.self_and_ancestors) + + union = Gitlab::SQL::Union.new([project_badges.select(:id), + group_badges_rel.select(:id)]) + + Badge.where("id IN (#{union.to_sql})") # rubocop:disable GitlabSecurity/SqlInjection + end + private def storage diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb index 109258d1eb7..4f289e6e215 100644 --- a/app/models/project_services/asana_service.rb +++ b/app/models/project_services/asana_service.rb @@ -68,7 +68,7 @@ http://app.asana.com/-/account_api' end user = data[:user_name] - project_name = project.name_with_namespace + project_name = project.full_name data[:commits].each do |commit| push_msg = "#{user} pushed to branch #{branch} of #{project_name} ( #{commit[:url]} ):" diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb index c3f5b310619..8d7a4fceb08 100644 --- a/app/models/project_services/campfire_service.rb +++ b/app/models/project_services/campfire_service.rb @@ -86,7 +86,7 @@ class CampfireService < Service after = push[:after] message = "" - message << "[#{project.name_with_namespace}] " + message << "[#{project.full_name}] " message << "#{push[:user_name]} " if Gitlab::Git.blank_ref?(before) diff --git a/app/models/project_services/chat_notification_service.rb b/app/models/project_services/chat_notification_service.rb index e2ffdf72201..dab0ea1a681 100644 --- a/app/models/project_services/chat_notification_service.rb +++ b/app/models/project_services/chat_notification_service.rb @@ -129,7 +129,7 @@ class ChatNotificationService < Service end def project_name - project.name_with_namespace.gsub(/\s/, '') + project.full_name.gsub(/\s/, '') end def project_url diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index bfe7ac29c18..f31c3f02af2 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -120,7 +120,7 @@ class HipchatService < Service else message << "pushed to #{ref_type} <a href=\""\ "#{project.web_url}/commits/#{CGI.escape(ref)}\">#{ref}</a> " - message << "of <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/, '')}</a> " + message << "of <a href=\"#{project.web_url}\">#{project.full_name.gsub!(/\s/, '')}</a> " message << "(<a href=\"#{project.web_url}/compare/#{before}...#{after}\">Compare changes</a>)" push[:commits].take(MAX_COMMITS).each do |commit| @@ -274,7 +274,7 @@ class HipchatService < Service end def project_name - project.name_with_namespace.gsub(/\s/, '') + project.full_name.gsub(/\s/, '') end def project_url diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index 436a870b0c4..e5035c81df0 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -1,5 +1,7 @@ class JiraService < IssueTrackerService include Gitlab::Routing + include ApplicationHelper + include ActionView::Helpers::AssetUrlHelper validates :url, url: true, presence: true, if: :activated? validates :api_url, url: true, allow_blank: true @@ -268,7 +270,9 @@ class JiraService < IssueTrackerService url: url, title: title, status: status, - icon: { title: 'GitLab', url16x16: 'https://gitlab.com/favicon.ico' } + icon: { + title: 'GitLab', url16x16: asset_url('favicon.ico', host: gitlab_config.url) + } } } end diff --git a/app/models/project_services/mattermost_slash_commands_service.rb b/app/models/project_services/mattermost_slash_commands_service.rb index 4d2037286a2..227d430083d 100644 --- a/app/models/project_services/mattermost_slash_commands_service.rb +++ b/app/models/project_services/mattermost_slash_commands_service.rb @@ -37,7 +37,7 @@ class MattermostSlashCommandsService < SlashCommandsService private def command(params) - pretty_project_name = project.name_with_namespace + pretty_project_name = project.full_name params.merge( auto_complete: true, diff --git a/app/models/project_services/monitoring_service.rb b/app/models/project_services/monitoring_service.rb index ee9cd78327a..9af68b4e821 100644 --- a/app/models/project_services/monitoring_service.rb +++ b/app/models/project_services/monitoring_service.rb @@ -9,11 +9,11 @@ class MonitoringService < Service %w() end - def environment_metrics(environment) + def can_query? raise NotImplementedError end - def deployment_metrics(deployment) + def query(_, *_) raise NotImplementedError end end diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index 58731451429..dcaeb65dc32 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -1,9 +1,5 @@ class PrometheusService < MonitoringService - include ReactiveService - - self.reactive_cache_lease_timeout = 30.seconds - self.reactive_cache_refresh_interval = 30.seconds - self.reactive_cache_lifetime = 1.minute + include PrometheusAdapter # Access to prometheus is directly through the API prop_accessor :api_url @@ -13,7 +9,7 @@ class PrometheusService < MonitoringService validates :api_url, url: true end - before_save :synchronize_service_state! + before_save :synchronize_service_state after_save :clear_reactive_cache! @@ -66,63 +62,15 @@ class PrometheusService < MonitoringService # Check we can connect to the Prometheus API def test(*args) - client.ping + Gitlab::PrometheusClient.new(prometheus_client).ping { success: true, result: 'Checked API endpoint' } rescue Gitlab::PrometheusClient::Error => err { success: false, result: err } end - def environment_metrics(environment) - with_reactive_cache(Gitlab::Prometheus::Queries::EnvironmentQuery.name, environment.id, &rename_field(:data, :metrics)) - end - - def deployment_metrics(deployment) - metrics = with_reactive_cache(Gitlab::Prometheus::Queries::DeploymentQuery.name, deployment.environment.id, deployment.id, &rename_field(:data, :metrics)) - metrics&.merge(deployment_time: deployment.created_at.to_i) || {} - end - - def additional_environment_metrics(environment) - with_reactive_cache(Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery.name, environment.id, &:itself) - end - - def additional_deployment_metrics(deployment) - with_reactive_cache(Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery.name, deployment.environment.id, deployment.id, &:itself) - end - - def matched_metrics - with_reactive_cache(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) - end - - # Cache metrics for specific environment - def calculate_reactive_cache(query_class_name, *args) - return unless active? && project && !project.pending_delete? - - environment_id = args.first - client = client(environment_id) - - data = Kernel.const_get(query_class_name).new(client).query(*args) - { - success: true, - data: data, - last_update: Time.now.utc - } - rescue Gitlab::PrometheusClient::Error => err - { success: false, result: err.message } - end - - def client(environment_id = nil) - if manual_configuration? - Gitlab::PrometheusClient.new(RestClient::Resource.new(api_url)) - else - cluster = cluster_with_prometheus(environment_id) - raise Gitlab::PrometheusClient::Error, "couldn't find cluster with Prometheus installed" unless cluster - - rest_client = client_from_cluster(cluster) - raise Gitlab::PrometheusClient::Error, "couldn't create proxy Prometheus client" unless rest_client - - Gitlab::PrometheusClient.new(rest_client) - end + def prometheus_client + RestClient::Resource.new(api_url) if api_url && manual_configuration? && active? end def prometheus_installed? @@ -134,32 +82,7 @@ class PrometheusService < MonitoringService private - def cluster_with_prometheus(environment_id = nil) - clusters = if environment_id - ::Environment.find_by(id: environment_id).try do |env| - # sort results by descending order based on environment_scope being longer - # thus more closely matching environment slug - project.clusters.enabled.for_environment(env).sort_by { |c| c.environment_scope&.length }.reverse! - end - else - project.clusters.enabled.for_all_environments - end - - clusters&.detect { |cluster| cluster.application_prometheus&.installed? } - end - - def client_from_cluster(cluster) - cluster.application_prometheus.proxy_client - end - - def rename_field(old_field, new_field) - -> (metrics) do - metrics[new_field] = metrics.delete(old_field) - metrics - end - end - - def synchronize_service_state! + def synchronize_service_state self.active = prometheus_installed? || manual_configuration? true diff --git a/app/models/project_services/pushover_service.rb b/app/models/project_services/pushover_service.rb index aa7bd4c3c84..e3a1ca2d45f 100644 --- a/app/models/project_services/pushover_service.rb +++ b/app/models/project_services/pushover_service.rb @@ -88,10 +88,10 @@ class PushoverService < Service user: user_key, device: device, priority: priority, - title: "#{project.name_with_namespace}", + title: "#{project.full_name}", message: message, url: data[:project][:web_url], - url_title: "See project #{project.name_with_namespace}" + url_title: "See project #{project.full_name}" } # Sound parameter MUST NOT be sent to API if not selected diff --git a/app/models/repository.rb b/app/models/repository.rb index 1a14afb951a..e6b88320110 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -866,20 +866,20 @@ class Repository raw_repository.ancestor?(ancestor_id, descendant_id) end - def fetch_as_mirror(url, forced: false, refmap: :all_refs, remote_name: nil) + def fetch_as_mirror(url, forced: false, refmap: :all_refs, remote_name: nil, prune: true) unless remote_name remote_name = "tmp-#{SecureRandom.hex}" tmp_remote_name = true end add_remote(remote_name, url, mirror_refmap: refmap) - fetch_remote(remote_name, forced: forced) + fetch_remote(remote_name, forced: forced, prune: prune) ensure remove_remote(remote_name) if tmp_remote_name end - def fetch_remote(remote, forced: false, ssh_auth: nil, no_tags: false) - gitlab_shell.fetch_remote(raw_repository, remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags) + def fetch_remote(remote, forced: false, ssh_auth: nil, no_tags: false, prune: true) + gitlab_shell.fetch_remote(raw_repository, remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags, prune: prune) end def fetch_source_branch!(source_repository, source_branch, local_ref) diff --git a/app/models/todo.rb b/app/models/todo.rb index bb5965e20eb..8afacd188e0 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -32,8 +32,6 @@ class Todo < ActiveRecord::Base validates :target_id, presence: true, unless: :for_commit? validates :commit_id, presence: true, if: :for_commit? - default_scope { reorder(id: :desc) } - scope :pending, -> { with_state(:pending) } scope :done, -> { with_state(:done) } @@ -53,10 +51,14 @@ class Todo < ActiveRecord::Base # milestones, but still show something if the user has a URL with that # selected. def sort(method) - case method.to_s - when 'priority', 'label_priority' then order_by_labels_priority - else order_by(method) - end + sorted = + case method.to_s + when 'priority', 'label_priority' then order_by_labels_priority + else order_by(method) + end + + # Break ties with the ID column for pagination + sorted.order(id: :desc) end # Order by priority depending on which issue/merge request the Todo belongs to diff --git a/app/models/user_interacted_project.rb b/app/models/user_interacted_project.rb new file mode 100644 index 00000000000..dd55a6acb79 --- /dev/null +++ b/app/models/user_interacted_project.rb @@ -0,0 +1,59 @@ +class UserInteractedProject < ActiveRecord::Base + belongs_to :user + belongs_to :project + + validates :project_id, presence: true + validates :user_id, presence: true + + CACHE_EXPIRY_TIME = 1.day + + # Schema version required for this model + REQUIRED_SCHEMA_VERSION = 20180223120443 + + class << self + def track(event) + # For events without a project, we simply don't care. + # An example of this is the creation of a snippet (which + # is not related to any project). + return unless event.project_id + + attributes = { + project_id: event.project_id, + user_id: event.author_id + } + + cached_exists?(attributes) do + transaction(requires_new: true) do + begin + where(attributes).select(1).first || create!(attributes) + true # not caching the whole record here for now + rescue ActiveRecord::RecordNotUnique + # Note, above queries are not atomic and prone + # to race conditions (similar like #find_or_create!). + # In the case where we hit this, the record we want + # already exists - shortcut and return. + true + end + end + end + end + + # Check if we can safely call .track (table exists) + def available? + @available_flag ||= ActiveRecord::Migrator.current_version >= REQUIRED_SCHEMA_VERSION # rubocop:disable Gitlab/PredicateMemoization + end + + # Flushes cached information about schema + def reset_column_information + @available_flag = nil + super + end + + private + + def cached_exists?(project_id:, user_id:, &block) + cache_key = "user_interacted_projects:#{project_id}:#{user_id}" + Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRY_TIME, &block) + end + end +end diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb index f0bcba588a2..c9cb730c4e9 100644 --- a/app/policies/group_policy.rb +++ b/app/policies/group_policy.rb @@ -48,7 +48,12 @@ class GroupPolicy < BasePolicy rule { has_access }.enable :read_namespace rule { developer }.enable :admin_milestones - rule { reporter }.enable :admin_label + + rule { reporter }.policy do + enable :admin_label + enable :admin_list + enable :admin_issue + end rule { master }.policy do enable :create_projects diff --git a/app/services/badges/base_service.rb b/app/services/badges/base_service.rb new file mode 100644 index 00000000000..4f87426bd38 --- /dev/null +++ b/app/services/badges/base_service.rb @@ -0,0 +1,11 @@ +module Badges + class BaseService + protected + + attr_accessor :params + + def initialize(params = {}) + @params = params.dup + end + end +end diff --git a/app/services/badges/build_service.rb b/app/services/badges/build_service.rb new file mode 100644 index 00000000000..6267e571838 --- /dev/null +++ b/app/services/badges/build_service.rb @@ -0,0 +1,12 @@ +module Badges + class BuildService < Badges::BaseService + # returns the created badge + def execute(source) + if source.is_a?(Group) + GroupBadge.new(params.merge(group: source)) + else + ProjectBadge.new(params.merge(project: source)) + end + end + end +end diff --git a/app/services/badges/create_service.rb b/app/services/badges/create_service.rb new file mode 100644 index 00000000000..aafb87f7dcd --- /dev/null +++ b/app/services/badges/create_service.rb @@ -0,0 +1,10 @@ +module Badges + class CreateService < Badges::BaseService + # returns the created badge + def execute(source) + badge = Badges::BuildService.new(params).execute(source) + + badge.tap { |b| b.save } + end + end +end diff --git a/app/services/badges/update_service.rb b/app/services/badges/update_service.rb new file mode 100644 index 00000000000..7ca84b5df31 --- /dev/null +++ b/app/services/badges/update_service.rb @@ -0,0 +1,12 @@ +module Badges + class UpdateService < Badges::BaseService + # returns the updated badge + def execute(badge) + if params.present? + badge.update_attributes(params) + end + + badge + end + end +end diff --git a/app/services/boards/issues/list_service.rb b/app/services/boards/issues/list_service.rb index 6078fe38064..ecd74b74f8a 100644 --- a/app/services/boards/issues/list_service.rb +++ b/app/services/boards/issues/list_service.rb @@ -40,7 +40,11 @@ module Boards end def set_parent - params[:project_id] = parent.id + if parent.is_a?(Group) + params[:group_id] = parent.id + else + params[:project_id] = parent.id + end end def set_state diff --git a/app/services/boards/issues/move_service.rb b/app/services/boards/issues/move_service.rb index 797d6df7c1a..15fed7d17c1 100644 --- a/app/services/boards/issues/move_service.rb +++ b/app/services/boards/issues/move_service.rb @@ -60,8 +60,10 @@ module Boards label_ids = if moving_to_list.movable? moving_from_list.label_id + elsif board.group_board? + ::Label.on_group_boards(parent.id).pluck(:label_id) else - Label.on_project_boards(parent.id).pluck(:label_id) + ::Label.on_project_boards(parent.id).pluck(:label_id) end Array(label_ids).compact diff --git a/app/services/boards/lists/create_service.rb b/app/services/boards/lists/create_service.rb index 183556a1d6b..bebc90c7a8d 100644 --- a/app/services/boards/lists/create_service.rb +++ b/app/services/boards/lists/create_service.rb @@ -12,7 +12,11 @@ module Boards private def available_labels_for(board) - LabelsFinder.new(current_user, project_id: parent.id).execute + if board.group_board? + parent.labels + else + LabelsFinder.new(current_user, project_id: parent.id).execute + end end def next_position(board) diff --git a/app/services/ci/create_trace_artifact_service.rb b/app/services/ci/create_trace_artifact_service.rb deleted file mode 100644 index ffde824972c..00000000000 --- a/app/services/ci/create_trace_artifact_service.rb +++ /dev/null @@ -1,36 +0,0 @@ -module Ci - class CreateTraceArtifactService < BaseService - def execute(job) - return if job.job_artifacts_trace - - job.trace.read do |stream| - break unless stream.file? - - clone_file!(stream.path, JobArtifactUploader.workhorse_upload_path) do |clone_path| - create_job_trace!(job, clone_path) - FileUtils.rm(stream.path) - end - end - end - - private - - def create_job_trace!(job, path) - File.open(path) do |stream| - job.create_job_artifacts_trace!( - project: job.project, - file_type: :trace, - file: stream) - end - end - - def clone_file!(src_path, temp_dir) - FileUtils.mkdir_p(temp_dir) - Dir.mktmpdir('tmp-trace', temp_dir) do |dir_path| - temp_path = File.join(dir_path, "job.log") - FileUtils.copy(src_path, temp_path) - yield(temp_path) - end - end - end -end diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb index fe4e8ea10bf..af41ce82f65 100644 --- a/app/services/projects/import_export/export_service.rb +++ b/app/services/projects/import_export/export_service.rb @@ -2,7 +2,7 @@ module Projects module ImportExport class ExportService < BaseService def execute(_options = {}) - @shared = Gitlab::ImportExport::Shared.new(relative_path: File.join(project.disk_path, 'work')) + @shared = project.import_export_shared save_all end diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb index c760bd3b626..00fdd047208 100644 --- a/app/services/projects/update_pages_service.rb +++ b/app/services/projects/update_pages_service.rb @@ -1,5 +1,8 @@ module Projects class UpdatePagesService < BaseService + InvaildStateError = Class.new(StandardError) + FailedToExtractError = Class.new(StandardError) + BLOCK_SIZE = 32.kilobytes MAX_SIZE = 1.terabyte SITE_PATH = 'public/'.freeze @@ -11,13 +14,15 @@ module Projects end def execute + register_attempt + # Create status notifying the deployment of pages @status = create_status @status.enqueue! @status.run! - raise 'missing pages artifacts' unless build.artifacts? - raise 'pages are outdated' unless latest? + raise InvaildStateError, 'missing pages artifacts' unless build.artifacts? + raise InvaildStateError, 'pages are outdated' unless latest? # Create temporary directory in which we will extract the artifacts FileUtils.mkdir_p(tmp_path) @@ -26,24 +31,22 @@ module Projects # Check if we did extract public directory archive_public_path = File.join(archive_path, 'public') - raise 'pages miss the public folder' unless Dir.exist?(archive_public_path) - raise 'pages are outdated' unless latest? + raise FailedToExtractError, 'pages miss the public folder' unless Dir.exist?(archive_public_path) + raise InvaildStateError, 'pages are outdated' unless latest? deploy_page!(archive_public_path) success end - rescue => e + rescue InvaildStateError, FailedToExtractError => e register_failure error(e.message) - ensure - register_attempt - build.erase_artifacts! unless build.has_expiring_artifacts? end private def success @status.success + delete_artifact! super end @@ -52,6 +55,7 @@ module Projects @status.allow_failure = !latest? @status.description = message @status.drop(:script_failure) + delete_artifact! super end @@ -72,7 +76,7 @@ module Projects elsif artifacts.ends_with?('.zip') extract_zip_archive!(temp_path) else - raise 'unsupported artifacts format' + raise FailedToExtractError, 'unsupported artifacts format' end end @@ -81,17 +85,17 @@ module Projects %W(dd bs=#{BLOCK_SIZE} count=#{blocks}), %W(tar -x -C #{temp_path} #{SITE_PATH}), err: '/dev/null') - raise 'pages failed to extract' unless results.compact.all?(&:success?) + raise FailedToExtractError, 'pages failed to extract' unless results.compact.all?(&:success?) end def extract_zip_archive!(temp_path) - raise 'missing artifacts metadata' unless build.artifacts_metadata? + raise FailedToExtractError, 'missing artifacts metadata' unless build.artifacts_metadata? # Calculate page size after extract public_entry = build.artifacts_metadata_entry(SITE_PATH, recursive: true) if public_entry.total_size > max_size - raise "artifacts for pages are too large: #{public_entry.total_size}" + raise FailedToExtractError, "artifacts for pages are too large: #{public_entry.total_size}" end # Requires UnZip at least 6.00 Info-ZIP. @@ -100,7 +104,7 @@ module Projects # We add * to end of SITE_PATH, because we want to extract SITE_PATH and all subdirectories site_path = File.join(SITE_PATH, '*') unless system(*%W(unzip -qq -n #{artifacts} #{site_path} -d #{temp_path})) - raise 'pages failed to extract' + raise FailedToExtractError, 'pages failed to extract' end end @@ -163,6 +167,11 @@ module Projects build.artifacts_file.path end + def delete_artifact! + build.reload # Reload stable object to prevent erase artifacts with old state + build.erase_artifacts! unless build.has_expiring_artifacts? + end + def latest_sha project.commit(build.ref).try(:sha).to_s end diff --git a/app/services/prometheus/adapter_service.rb b/app/services/prometheus/adapter_service.rb new file mode 100644 index 00000000000..4504d2ccfe6 --- /dev/null +++ b/app/services/prometheus/adapter_service.rb @@ -0,0 +1,36 @@ +module Prometheus + class AdapterService + def initialize(project, deployment_platform = nil) + @project = project + + @deployment_platform = if deployment_platform + deployment_platform + else + project.deployment_platform + end + end + + attr_reader :deployment_platform, :project + + def prometheus_adapter + @prometheus_adapter ||= if service_prometheus_adapter.can_query? + service_prometheus_adapter + else + cluster_prometheus_adapter + end + end + + def service_prometheus_adapter + project.find_or_initialize_service('prometheus') + end + + def cluster_prometheus_adapter + return unless deployment_platform.respond_to?(:cluster) + + cluster = deployment_platform.cluster + return unless cluster.application_prometheus&.installed? + + cluster.application_prometheus + end + end +end diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb index af8c02a10b7..ba7946fd23c 100644 --- a/app/services/system_hooks_service.rb +++ b/app/services/system_hooks_service.rb @@ -20,8 +20,8 @@ class SystemHooksService def build_event_data(model, event) data = { event_name: build_event_name(model, event), - created_at: model.created_at.xmlschema, - updated_at: model.updated_at.xmlschema + created_at: model.created_at&.xmlschema, + updated_at: model.updated_at&.xmlschema } case model diff --git a/app/validators/url_placeholder_validator.rb b/app/validators/url_placeholder_validator.rb new file mode 100644 index 00000000000..dd681218b6b --- /dev/null +++ b/app/validators/url_placeholder_validator.rb @@ -0,0 +1,32 @@ +# UrlValidator +# +# Custom validator for URLs. +# +# By default, only URLs for the HTTP(S) protocols will be considered valid. +# Provide a `:protocols` option to configure accepted protocols. +# +# Also, this validator can help you validate urls with placeholders inside. +# Usually, if you have a url like 'http://www.example.com/%{project_path}' the +# URI parser will reject that URL format. Provide a `:placeholder_regex` option +# to configure accepted placeholders. +# +# Example: +# +# class User < ActiveRecord::Base +# validates :personal_url, url: true +# +# validates :ftp_url, url: { protocols: %w(ftp) } +# +# validates :git_url, url: { protocols: %w(http https ssh git) } +# +# validates :placeholder_url, url: { placeholder_regex: /(project_path|project_id|default_branch)/ } +# end +# +class UrlPlaceholderValidator < UrlValidator + def validate_each(record, attribute, value) + placeholder_regex = self.options[:placeholder_regex] + value = value.gsub(/%{#{placeholder_regex}}/, 'foo') if placeholder_regex && value + + super(record, attribute, value) + end +end diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index e3711421b61..05c41082882 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -164,7 +164,7 @@ %h4 Latest projects - @projects.each do |project| %p - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated-60' + = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated-60' %span.light.pull-right #{time_ago_with_tooltip(project.created_at)} .col-md-4 diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index 2545cecc721..324f3c0a22f 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -68,7 +68,7 @@ - @projects.each do |project| %li %strong - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] + = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project] %span.badge = storage_counter(project.statistics.storage_size) %span.pull-right.light @@ -86,7 +86,7 @@ - @group.shared_projects.sort_by(&:name).each do |project| %li %strong - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] + = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project] %span.badge = storage_counter(project.statistics.storage_size) %span.pull-right.light diff --git a/app/views/admin/hooks/_form.html.haml b/app/views/admin/hooks/_form.html.haml index d8f96ed5b0d..a6324a97fd5 100644 --- a/app/views/admin/hooks/_form.html.haml +++ b/app/views/admin/hooks/_form.html.haml @@ -1,21 +1,20 @@ = form_errors(hook) .form-group - = form.label :url, 'URL', class: 'control-label' - .col-sm-10 - = form.text_field :url, class: 'form-control' + = form.label :url, 'URL', class: 'label-light' + = form.text_field :url, class: 'form-control' .form-group - = form.label :token, 'Secret Token', class: 'control-label' - .col-sm-10 - = form.text_field :token, class: 'form-control' - %p.help-block - Use this token to validate received payloads + = form.label :token, 'Secret Token', class: 'label-light' + = form.text_field :token, class: 'form-control' + %p.help-block + Use this token to validate received payloads .form-group - = form.label :url, 'Trigger', class: 'control-label' - .col-sm-10.prepend-top-10 - %div - System hook will be triggered on set of events like creating project - or adding ssh key. But you can also enable extra triggers like Push events. + = form.label :url, 'Trigger', class: 'label-light' + %ul.list-unstyled + %li + .help-block + System hook will be triggered on set of events like creating project + or adding ssh key. But you can also enable extra triggers like Push events. .prepend-top-default = form.check_box :repository_update_events, class: 'pull-left' @@ -24,21 +23,21 @@ %strong Repository update events %p.light This URL will be triggered when repository is updated - %div + %li = form.check_box :push_events, class: 'pull-left' .prepend-left-20 = form.label :push_events, class: 'list-label' do %strong Push events %p.light This URL will be triggered for each branch updated to the repository - %div + %li = form.check_box :tag_push_events, class: 'pull-left' .prepend-left-20 = form.label :tag_push_events, class: 'list-label' do %strong Tag push events %p.light This URL will be triggered when a new tag is pushed to the repository - %div + %li = form.check_box :merge_requests_events, class: 'pull-left' .prepend-left-20 = form.label :merge_requests_events, class: 'list-label' do @@ -46,9 +45,8 @@ %p.light This URL will be triggered when a merge request is created/updated/merged .form-group - = form.label :enable_ssl_verification, 'SSL verification', class: 'control-label checkbox' - .col-sm-10 - .checkbox - = form.label :enable_ssl_verification do - = form.check_box :enable_ssl_verification - %strong Enable SSL verification + = form.label :enable_ssl_verification, 'SSL verification', class: 'label-light checkbox' + .checkbox + = form.label :enable_ssl_verification do + = form.check_box :enable_ssl_verification + %strong Enable SSL verification diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml index bc02d9969d6..d9e2ce5e74c 100644 --- a/app/views/admin/hooks/index.html.haml +++ b/app/views/admin/hooks/index.html.haml @@ -1,33 +1,35 @@ - page_title 'System Hooks' -%h3.page-title - System hooks +.row.prepend-top-default + .col-lg-4 + %h4.prepend-top-0 + = page_title + %p + #{link_to 'System hooks ', help_page_path('system_hooks/system_hooks'), class: 'vlink'} can be + used for binding events when GitLab creates a User or Project. -%p.light - #{link_to 'System hooks ', help_page_path('system_hooks/system_hooks'), class: 'vlink'} can be - used for binding events when GitLab creates a User or Project. + .col-lg-8.append-bottom-default + = form_for @hook, as: :hook, url: admin_hooks_path do |f| + = render partial: 'form', locals: { form: f, hook: @hook } + = f.submit 'Add system hook', class: 'btn btn-create' -%hr + %hr -= form_for @hook, as: :hook, url: admin_hooks_path, html: { class: 'form-horizontal' } do |f| - = render partial: 'form', locals: { form: f, hook: @hook } - .form-actions - = f.submit 'Add system hook', class: 'btn btn-create' -%hr + - if @hooks.any? + .panel.panel-default + .panel-heading + System hooks (#{@hooks.count}) + %ul.content-list + - @hooks.each do |hook| + %li + .controls + = render 'shared/web_hooks/test_button', triggers: SystemHook.triggers, hook: hook, button_class: 'btn-sm' + = link_to 'Edit', edit_admin_hook_path(hook), class: 'btn btn-sm' + = link_to 'Remove', admin_hook_path(hook), data: { confirm: 'Are you sure?' }, method: :delete, class: 'btn btn-remove btn-sm' + .monospace= hook.url + %div + - SystemHook.triggers.each_value do |event| + - if hook.public_send(event) + %span.label.label-gray= event.to_s.titleize + %span.label.label-gray SSL Verification: #{hook.enable_ssl_verification ? 'enabled' : 'disabled'} -- if @hooks.any? - .panel.panel-default - .panel-heading - System hooks (#{@hooks.count}) - %ul.content-list - - @hooks.each do |hook| - %li - .controls - = render 'shared/web_hooks/test_button', triggers: SystemHook.triggers, hook: hook, button_class: 'btn-sm' - = link_to 'Edit', edit_admin_hook_path(hook), class: 'btn btn-sm' - = link_to 'Remove', admin_hook_path(hook), data: { confirm: 'Are you sure?' }, method: :delete, class: 'btn btn-remove btn-sm' - .monospace= hook.url - %div - - SystemHook.triggers.each_value do |event| - - if hook.public_send(event) - %span.label.label-gray= event.to_s.titleize - %span.label.label-gray SSL Verification: #{hook.enable_ssl_verification ? 'enabled' : 'disabled'} += render 'shared/plugins/index' diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 42f92079d85..c02ddafe108 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -1,8 +1,8 @@ - add_to_breadcrumbs "Projects", admin_projects_path -- breadcrumb_title @project.name_with_namespace -- page_title @project.name_with_namespace, "Projects" +- breadcrumb_title @project.full_name +- page_title @project.full_name, "Projects" %h3.page-title - Project: #{@project.name_with_namespace} + Project: #{@project.full_name} = link_to edit_project_path(@project), class: "btn btn-nr pull-right" do %i.fa.fa-pencil-square-o Edit diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml index 6d8fad0eb8d..185e9d7b35d 100644 --- a/app/views/admin/runners/show.html.haml +++ b/app/views/admin/runners/show.html.haml @@ -39,7 +39,7 @@ %tr.alert-info %td %strong - = project.name_with_namespace + = project.full_name %td .pull-right = link_to 'Disable', [:admin, project.namespace.becomes(Namespace), project, runner_project], method: :delete, class: 'btn btn-danger btn-xs' @@ -61,7 +61,7 @@ - @projects.each do |project| %tr %td - = project.name_with_namespace + = project.full_name %td .pull-right = form_for [:admin, project.namespace.becomes(Namespace), project, project.runner_projects.new] do |f| @@ -95,7 +95,7 @@ %td.status - if project - = project.name_with_namespace + = project.full_name %td.build-link - if project diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml index 4a440f3f6d4..96835ee9af5 100644 --- a/app/views/admin/users/projects.html.haml +++ b/app/views/admin/users/projects.html.haml @@ -29,12 +29,12 @@ .panel.panel-default .panel-heading Joined projects (#{@joined_projects.count}) %ul.well-list - - @joined_projects.sort_by(&:name_with_namespace).each do |project| + - @joined_projects.sort_by(&:full_name).each do |project| - member = project.team.find_member(@user.id) %li.project_member .list-item-name = link_to admin_project_path(project), class: dom_class(project) do - = project.name_with_namespace + = project.full_name - if member .pull-right diff --git a/app/views/groups/boards/index.html.haml b/app/views/groups/boards/index.html.haml new file mode 100644 index 00000000000..bb56769bd3f --- /dev/null +++ b/app/views/groups/boards/index.html.haml @@ -0,0 +1 @@ += render "shared/boards/show", board: @boards.first diff --git a/app/views/groups/boards/show.html.haml b/app/views/groups/boards/show.html.haml new file mode 100644 index 00000000000..92838fa4b11 --- /dev/null +++ b/app/views/groups/boards/show.html.haml @@ -0,0 +1 @@ += render "shared/boards/show", board: @board, group: true diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml index ca3f018c5e6..36df03302e8 100644 --- a/app/views/groups/issues.html.haml +++ b/app/views/groups/issues.html.haml @@ -2,9 +2,6 @@ = content_for :meta_tags do = auto_discovery_link_tag(:atom, params.merge(rss_url_options), title: "#{@group.name} issues") -- content_for :page_specific_javascripts do - = webpack_bundle_tag 'common_vue' - - if group_issues_count(state: 'all').zero? = render 'shared/empty_states/issues', project_select_button: true - else diff --git a/app/views/groups/labels/index.html.haml b/app/views/groups/labels/index.html.haml index d10efdad53b..ac7e12fcd0b 100644 --- a/app/views/groups/labels/index.html.haml +++ b/app/views/groups/labels/index.html.haml @@ -1,8 +1,10 @@ - page_title 'Labels' +- issuables = ['issues', 'merge requests'] + .top-area.adjust .nav-text - Labels can be applied to issues and merge requests. Group labels are available for any project within the group. + = _("Labels can be applied to %{features}. Group labels are available for any project within the group.") % { features: issuables.to_sentence } .nav-controls - if can?(current_user, :admin_label, @group) @@ -16,4 +18,4 @@ = paginate @labels, theme: 'gitlab' - else .nothing-here-block - No labels created yet. + = _("No labels created yet.") diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml index 8d2bc810a7d..ef181b425bc 100644 --- a/app/views/groups/projects.html.haml +++ b/app/views/groups/projects.html.haml @@ -14,7 +14,7 @@ .list-item-name %span{ class: visibility_level_color(project.visibility_level) } = visibility_level_icon(project.visibility_level) - %strong= link_to project.name_with_namespace, project + %strong= link_to project.full_name, project .pull-right - if project.archived %span.label.label-warning archived diff --git a/app/views/invites/show.html.haml b/app/views/invites/show.html.haml index ad6213b4efd..c2bb1216c5f 100644 --- a/app/views/invites/show.html.haml +++ b/app/views/invites/show.html.haml @@ -12,7 +12,7 @@ - project = @member.source project %strong - = link_to project.name_with_namespace, project_url(project) + = link_to project.full_name, project_url(project) - when Group - group = @member.source group diff --git a/app/views/layouts/nav/projects_dropdown/_show.html.haml b/app/views/layouts/nav/projects_dropdown/_show.html.haml index 59becb043d3..5809d6f7fea 100644 --- a/app/views/layouts/nav/projects_dropdown/_show.html.haml +++ b/app/views/layouts/nav/projects_dropdown/_show.html.haml @@ -1,4 +1,4 @@ -- project_meta = { id: @project.id, name: @project.name, namespace: @project.name_with_namespace, web_url: project_path(@project), avatar_url: @project.avatar_url } if @project&.persisted? +- project_meta = { id: @project.id, name: @project.name, namespace: @project.full_name, web_url: project_path(@project), avatar_url: @project.avatar_url } if @project&.persisted? .projects-dropdown-container .project-dropdown-sidebar.qa-projects-dropdown-sidebar %ul diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml index b520f28123f..5ea19c9882d 100644 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ b/app/views/layouts/nav/sidebar/_group.html.haml @@ -1,6 +1,6 @@ - issues_count = group_issues_count(state: 'opened') - merge_requests_count = group_merge_requests_count(state: 'opened') -- issues_sub_menu_items = ['groups#issues', 'labels#index', 'milestones#index'] +- issues_sub_menu_items = ['groups#issues', 'labels#index', 'milestones#index', 'boards#index', 'boards#show'] .nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) } .nav-sidebar-inner-scroll @@ -51,12 +51,19 @@ %strong.fly-out-top-item-name #{ _('Issues') } %span.badge.count.issue_counter.fly-out-badge= number_with_delimiter(issues_count) + %li.divider.fly-out-top-item = nav_link(path: 'groups#issues', html_options: { class: 'home' }) do = link_to issues_group_path(@group), title: 'List' do %span List + - if group_sidebar_link?(:boards) + = nav_link(path: ['boards#index', 'boards#show']) do + = link_to group_boards_path(@group), title: boards_link_text do + %span + = boards_link_text + - if group_sidebar_link?(:labels) = nav_link(path: 'labels#index') do = link_to group_labels_path(@group), title: 'Labels' do diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index 6b847fb4b7c..6b51483810e 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -1,4 +1,4 @@ -- page_title @project.name_with_namespace +- page_title @project.full_name - page_description @project.description unless page_description - header_title project_title(@project) unless header_title - nav "project" diff --git a/app/views/notify/project_was_exported_email.html.haml b/app/views/notify/project_was_exported_email.html.haml index f0ba7827cef..71c62f6be4e 100644 --- a/app/views/notify/project_was_exported_email.html.haml +++ b/app/views/notify/project_was_exported_email.html.haml @@ -3,6 +3,6 @@ %p The project export can be downloaded from: = link_to download_export_project_url(@project), rel: 'nofollow', download: '' do - = @project.name_with_namespace + " export" + = @project.full_name + " export" %p The download link will expire in 24 hours. diff --git a/app/views/notify/project_was_moved_email.html.haml b/app/views/notify/project_was_moved_email.html.haml index c476a39b661..1b6b1a81665 100644 --- a/app/views/notify/project_was_moved_email.html.haml +++ b/app/views/notify/project_was_moved_email.html.haml @@ -3,7 +3,7 @@ %p The project is now located under = link_to project_url(@project) do - = @project.name_with_namespace + = @project.full_name %p To update the remote url in your local repository run (for ssh): %p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } diff --git a/app/views/profiles/chat_names/_chat_name.html.haml b/app/views/profiles/chat_names/_chat_name.html.haml index fe1cf802971..c7094800fb2 100644 --- a/app/views/profiles/chat_names/_chat_name.html.haml +++ b/app/views/profiles/chat_names/_chat_name.html.haml @@ -4,7 +4,7 @@ %td %strong - if can?(current_user, :read_project, project) - = link_to project.name_with_namespace, project_path(project) + = link_to project.full_name, project_path(project) - else .light N/A %td diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 457583cfd35..1e206def7ee 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -12,7 +12,9 @@ Add an SSH key %p.profile-settings-content Before you can add an SSH key you need to - = link_to "generate it.", help_page_path("ssh/README") + = link_to "generate one", help_page_path("ssh/README", anchor: 'generating-a-new-ssh-key-pair') + or use an + = link_to "existing key.", help_page_path("ssh/README", anchor: 'locating-an-existing-ssh-key-pair') = render 'form' %hr %h5 diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index b565f14747a..a2ecfddb163 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -23,6 +23,12 @@ - deleted_message = s_('ForkedFromProjectPath|Forked from %{project_name} (deleted)') = deleted_message % { project_name: fork_source_name(@project) } + .project-badges + - @project.badges.each do |badge| + - badge_link_url = badge.rendered_link_url(@project) + %a{ href: badge_link_url, target: '_blank', rel: 'noopener noreferrer' } + %img{ src: badge.rendered_image_url(@project), alt: badge_link_url } + .project-repo-buttons .count-buttons = render 'projects/buttons/star' diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml index d367bd6be7b..f4b5ef1555e 100644 --- a/app/views/projects/_new_project_fields.html.haml +++ b/app/views/projects/_new_project_fields.html.haml @@ -1,6 +1,8 @@ - visibility_level = params.dig(:project, :visibility_level) || default_project_visibility +- ci_cd_only = local_assigns.fetch(:ci_cd_only, false) .row{ id: project_name_id } + = f.hidden_field :ci_cd_only, value: ci_cd_only .form-group.project-path.col-sm-6 = f.label :namespace_id, class: 'label-light' do %span diff --git a/app/views/projects/branches/_panel.html.haml b/app/views/projects/branches/_panel.html.haml new file mode 100644 index 00000000000..12e5a8e8d69 --- /dev/null +++ b/app/views/projects/branches/_panel.html.haml @@ -0,0 +1,19 @@ +- branches = local_assigns.fetch(:branches) +- state = local_assigns.fetch(:state) +- panel_title = local_assigns.fetch(:panel_title) +- show_more_text = local_assigns.fetch(:show_more_text) +- project = local_assigns.fetch(:project) +- overview_max_branches = local_assigns.fetch(:overview_max_branches) + +- return unless branches.any? + +.panel.panel-default.prepend-top-10 + .panel-heading + %h4.panel-title + = panel_title + %ul.content-list.all-branches + - branches.first(overview_max_branches).each do |branch| + = render "projects/branches/branch", branch: branch, merged: project.repository.merged_to_root_ref?(branch) + - if branches.size > overview_max_branches + .panel-footer.text-center + = link_to show_more_text, project_branches_filtered_path(project, state: state), id: "state-#{state}", data: { state: state } diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index fb770764364..5dcc72d8263 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -3,26 +3,35 @@ %div{ class: container_class } .top-area.adjust - - if can?(current_user, :admin_project, @project) - .nav-text - - project_settings_link = link_to s_('Branches|project settings'), project_protected_branches_path(@project) - = s_('Branches|Protected branches can be managed in %{project_settings_link}').html_safe % { project_settings_link: project_settings_link } + %ul.nav-links.issues-state-filters + %li{ class: active_when(@mode == 'overview') }> + = link_to s_('Branches|Overview'), project_branches_path(@project), title: s_('Branches|Show overview of the branches') + + %li{ class: active_when(@mode == 'active') }> + = link_to s_('Branches|Active'), project_branches_filtered_path(@project, state: 'active'), title: s_('Branches|Show active branches') + + %li{ class: active_when(@mode == 'stale') }> + = link_to s_('Branches|Stale'), project_branches_filtered_path(@project, state: 'stale'), title: s_('Branches|Show stale branches') + + %li{ class: active_when(!%w[overview active stale].include?(@mode)) }> + = link_to s_('Branches|All'), project_branches_filtered_path(@project, state: 'all'), title: s_('Branches|Show all branches') .nav-controls - = form_tag(filter_branches_path, method: :get) do + = form_tag(project_branches_filtered_path(@project, state: 'all'), method: :get) do = search_field_tag :search, params[:search], { placeholder: s_('Branches|Filter by branch name'), id: 'branch-search', class: 'form-control search-text-input input-short', spellcheck: false } - .dropdown.inline> - %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' } - %span.light - = branches_sort_options_hash[@sort] - = icon('chevron-down') - %ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable - %li.dropdown-header - = s_('Branches|Sort by') - - branches_sort_options_hash.each do |value, title| - %li - = link_to title, filter_branches_path(sort: value), class: ("is-active" if @sort == value) + - unless @mode == 'overview' + .dropdown.inline> + %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' } + %span.light + = branches_sort_options_hash[@sort] + = icon('chevron-down') + %ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable + %li.dropdown-header + = s_('Branches|Sort by') + - branches_sort_options_hash.each do |value, title| + %li + = link_to title, project_branches_filtered_path(@project, state: 'all', search: params[:search], sort: value), class: ("is-active" if @sort == value) - if can? current_user, :push_code, @project = link_to project_merged_branches_path(@project), @@ -35,7 +44,17 @@ = link_to new_project_branch_path(@project), class: 'btn btn-create' do = s_('Branches|New branch') - - if @branches.any? + - if can?(current_user, :admin_project, @project) + - project_settings_link = link_to s_('Branches|project settings'), project_protected_branches_path(@project) + .row-content-block + %h5 + = s_('Branches|Protected branches can be managed in %{project_settings_link}.').html_safe % { project_settings_link: project_settings_link } + + - if @mode == 'overview' && (@active_branches.any? || @stale_branches.any?) + = render "projects/branches/panel", branches: @active_branches, state: 'active', panel_title: s_('Branches|Active branches'), show_more_text: s_('Branches|Show more active branches'), project: @project, overview_max_branches: @overview_max_branches + = render "projects/branches/panel", branches: @stale_branches, state: 'stale', panel_title: s_('Branches|Stale branches'), show_more_text: s_('Branches|Show more stale branches'), project: @project, overview_max_branches: @overview_max_branches + + - elsif @branches.any? %ul.content-list.all-branches - @branches.each do |branch| = render "projects/branches/branch", branch: branch, merged: @merged_branch_names.include?(branch.name) diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml index 0cd2d45c74b..9126476e79e 100644 --- a/app/views/projects/ci/builds/_build.html.haml +++ b/app/views/projects/ci/builds/_build.html.haml @@ -63,7 +63,7 @@ - if admin %td - if job.project - = link_to job.project.name_with_namespace, admin_project_path(job.project) + = link_to job.project.full_name, admin_project_path(job.project) %td - if job.try(:runner) = runner_link(job.runner) diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index 02395b6eb9b..5041f322612 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -1,7 +1,5 @@ - @no_container = true - page_title "Cycle Analytics" -- content_for :page_specific_javascripts do - = webpack_bundle_tag('common_vue') #cycle-analytics{ class: container_class, "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } } - if @cycle_analytics_no_data diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 0d656b25bc8..7ebe617766f 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -2,9 +2,6 @@ - page_title "Environments" - add_to_breadcrumbs("Pipelines", project_pipelines_path(@project)) -- content_for :page_specific_javascripts do - = webpack_bundle_tag("common_vue") - #environments-list-view{ data: { environments_data: environments_list_data, "can-create-deployment" => can?(current_user, :create_deployment, @project).to_s, "can-read-environment" => can?(current_user, :read_environment, @project).to_s, diff --git a/app/views/projects/environments/metrics.html.haml b/app/views/projects/environments/metrics.html.haml index 9d9759ebc5f..c151b5acdf7 100644 --- a/app/views/projects/environments/metrics.html.haml +++ b/app/views/projects/environments/metrics.html.haml @@ -15,7 +15,8 @@ "empty-getting-started-svg-path": image_path('illustrations/monitoring/getting_started.svg'), "empty-loading-svg-path": image_path('illustrations/monitoring/loading.svg'), "empty-unable-to-connect-svg-path": image_path('illustrations/monitoring/unable_to_connect.svg'), - "additional-metrics": additional_metrics_project_environment_path(@project, @environment, format: :json), + "metrics-endpoint": additional_metrics_project_environment_path(@project, @environment, format: :json), + "deployment-endpoint": project_environment_deployments_path(@project, @environment, format: :json), "project-path": project_path(@project), "tags-path": project_tags_path(@project), - "has-metrics": "#{@environment.has_metrics?}", deployment_endpoint: project_environment_deployments_path(@project, @environment, format: :json) } } + "has-metrics": "#{@environment.has_metrics?}" } } diff --git a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml index 2599ce5c4b8..620fd1906ba 100644 --- a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml +++ b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml @@ -53,7 +53,7 @@ - if admin %td - if generic_commit_status.project - = link_to generic_commit_status.project.name_with_namespace, admin_project_path(generic_commit_status.project) + = link_to generic_commit_status.project.full_name, admin_project_path(generic_commit_status.project) %td - if generic_commit_status.try(:runner) = runner_link(generic_commit_status.runner) diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index 8c490773a56..3b0c828ccd1 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -1,12 +1,11 @@ -- page_title @project.forked? ? "Forking in progress" : "Import in progress" +- page_title import_in_progress_title + .save-project-loader .center %h2 %i.fa.fa-spinner.fa-spin - - if @project.forked? - Forking in progress. - - else - Import in progress. - - if @project.external_import? + = import_in_progress_title + - if !has_ci_cd_only_params? && @project.external_import? %p.monospace git clone --bare #{@project.safe_import_url} - %p Please wait while we import the repository for you. Refresh at will. + %p + = import_wait_and_refresh_message diff --git a/app/views/projects/issues/_merge_requests.html.haml b/app/views/projects/issues/_merge_requests.html.haml index 5f97d31f610..5c36d2202a6 100644 --- a/app/views/projects/issues/_merge_requests.html.haml +++ b/app/views/projects/issues/_merge_requests.html.haml @@ -18,7 +18,7 @@ - unless @issue.project.id == merge_request.target_project.id in - project = merge_request.target_project - = link_to project.name_with_namespace, project_path(project) + = link_to project.full_name, project_path(project) - if merge_request.merged? %span.merge-request-status.prepend-left-10.merged diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index fb06ba58c27..c427a9eedc2 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -4,9 +4,6 @@ - page_title "Issues" - new_issue_email = @project.new_issuable_address(current_user, 'issue') -- content_for :page_specific_javascripts do - = webpack_bundle_tag 'common_vue' - = content_for :meta_tags do = auto_discovery_link_tag(:atom, params.merge(rss_url_options), title: "#{@project.name} issues") diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 720ba236434..b2c0d9e1cfa 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -6,9 +6,6 @@ - page_title "Merge Requests" - new_merge_request_email = @project.new_issuable_address(current_user, 'merge_request') -- content_for :page_specific_javascripts do - = webpack_bundle_tag 'common_vue' - %div{ class: container_class } = render 'projects/last_push' diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 679ba23a4db..1d31b58a2cc 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -12,11 +12,14 @@ .row.prepend-top-default .col-lg-3.profile-settings-sidebar %h4.prepend-top-0 - New project + = _('New project') %p - A project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), #{link_to 'among other things', help_page_path("user/project/index.md", anchor: "projects-features"), target: '_blank'}. + - among_other_things_link = link_to _('among other things'), help_page_path("user/project/index.md", anchor: "projects-features"), target: '_blank' + = _('A project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}.').html_safe % { among_other_things_link: among_other_things_link } %p - All features are enabled when you create a project, but you can disable the ones you don’t need in the project settings. + = _('All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings.') + -# EE-specific start + -# EE-specific end .md = brand_new_project_guidelines %p @@ -28,36 +31,38 @@ .col-lg-9.js-toggle-container %ul.nav-links.gitlab-tabs{ role: 'tablist' } - %li{ class: ('active' if active_tab == 'blank'), role: 'presentation' } + %li{ class: active_when(active_tab == 'blank'), role: 'presentation' } %a{ href: '#blank-project-pane', id: 'blank-project-tab', data: { toggle: 'tab' }, role: 'tab' } %span.hidden-xs Blank project %span.visible-xs Blank - %li{ class: ('active' if active_tab == 'template'), role: 'presentation' } + %li{ class: active_when(active_tab == 'template'), role: 'presentation' } %a{ href: '#create-from-template-pane', id: 'create-from-template-tab', data: { toggle: 'tab' }, role: 'tab' } %span.hidden-xs Create from template %span.visible-xs Template - %li{ class: ('active' if active_tab == 'import'), role: 'presentation' } + %li{ class: active_when(active_tab == 'import'), role: 'presentation' } %a{ href: '#import-project-pane', id: 'import-project-tab', data: { toggle: 'tab' }, role: 'tab' } %span.hidden-xs Import project %span.visible-xs Import + -# EE-specific start + -# EE-specific end .tab-content.gitlab-tab-content - .tab-pane{ id: 'blank-project-pane', class: ('active' if active_tab == 'blank'), role: 'tabpanel' } + .tab-pane{ id: 'blank-project-pane', class: active_when(active_tab == 'blank'), role: 'tabpanel' } = form_for @project, html: { class: 'new_project' } do |f| = render 'new_project_fields', f: f, project_name_id: "blank-project-name" - .tab-pane.no-padding{ id: 'create-from-template-pane', class: ('active' if active_tab == 'template'), role: 'tabpanel' } + .tab-pane.no-padding{ id: 'create-from-template-pane', class: active_when(active_tab == 'template'), role: 'tabpanel' } = form_for @project, html: { class: 'new_project' } do |f| .project-template .form-group %div = render 'project_templates', f: f - .tab-pane.import-project-pane{ id: 'import-project-pane', class: ('active' if active_tab == 'import'), role: 'tabpanel' } + .tab-pane.import-project-pane.js-toggle-container{ id: 'import-project-pane', class: active_when(active_tab == 'import'), role: 'tabpanel' } = form_for @project, html: { class: 'new_project' } do |f| - if import_sources_enabled? .project-import.row - .col-sm-12 + .col-lg-12 .form-group.import-btn-container.clearfix = f.label :visibility_level, class: 'label-light' do #the label here seems wrong Import project from @@ -97,7 +102,7 @@ Gitea %div - if git_import_enabled? - %button.btn.js-toggle-button.import_git{ type: "button" } + %button.btn.js-toggle-button.js-import-git-toggle-button{ type: "button", data: { toggle_open_class: 'active' } } = icon('git', text: 'Repo by URL') .col-lg-12 .js-toggle-content.toggle-import-form{ class: ('hide' if active_tab != 'import') } @@ -105,6 +110,10 @@ = render "shared/import_form", f: f = render 'new_project_fields', f: f, project_name_id: "import-url-name" + + -# EE-specific start + -# EE-specific end + .save-project-loader.hide .center %h2 diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml index cf95cdbfec2..3e6b3346787 100644 --- a/app/views/projects/pipelines/index.html.haml +++ b/app/views/projects/pipelines/index.html.haml @@ -7,8 +7,9 @@ "help-auto-devops-path" => help_page_path('topics/autodevops/index.md'), "empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'), "error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'), - "new-pipeline-path" => new_project_pipeline_path(@project), + "no-pipelines-svg-path" => image_path('illustrations/pipelines_pending.svg'), "can-create-pipeline" => can?(current_user, :create_pipeline, @project).to_s, - "has-ci" => @repository.gitlab_ci_yml, - "ci-lint-path" => ci_lint_path, - "reset-cache-path" => reset_cache_project_settings_ci_cd_path(@project) } } + "new-pipeline-path" => can?(current_user, :create_pipeline, @project) && new_project_pipeline_path(@project), + "ci-lint-path" => can?(current_user, :create_pipeline, @project) && ci_lint_path, + "reset-cache-path" => can?(current_user, :admin_pipeline, @project) && reset_cache_project_settings_ci_cd_path(@project) , + "has-gitlab-ci" => (@project.has_ci? && @project.builds_enabled?).to_s } } diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml index ffb0ae95f9b..a7d7c923957 100644 --- a/app/views/projects/pipelines/show.html.haml +++ b/app/views/projects/pipelines/show.html.haml @@ -10,6 +10,3 @@ = render "projects/pipelines/with_tabs", pipeline: @pipeline .js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json) } } - -- content_for :page_specific_javascripts do - = webpack_bundle_tag('common_vue') diff --git a/app/views/projects/registry/repositories/index.html.haml b/app/views/projects/registry/repositories/index.html.haml index 27e1f9fba3e..12d56e244ce 100644 --- a/app/views/projects/registry/repositories/index.html.haml +++ b/app/views/projects/registry/repositories/index.html.haml @@ -14,8 +14,6 @@ .col-lg-12 #js-vue-registry-images{ data: { endpoint: project_container_registry_index_path(@project, format: :json) } } - = webpack_bundle_tag('common_vue') - .row.prepend-top-10 .col-lg-12 .panel.panel-default diff --git a/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml b/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml index 5dbcbf7eba6..2ab0227126a 100644 --- a/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml +++ b/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml @@ -1,4 +1,4 @@ -- run_actions_text = "Perform common operations on GitLab project: #{@project.name_with_namespace}" +- run_actions_text = "Perform common operations on GitLab project: #{@project.full_name}" %p To setup this service: %ul.list-unstyled.indent-list @@ -20,7 +20,7 @@ .form-group = label_tag :display_name, 'Display name', class: 'col-sm-2 col-xs-12 control-label' .col-sm-10.col-xs-12.input-group - = text_field_tag :display_name, "GitLab / #{@project.name_with_namespace}", class: 'form-control input-sm', readonly: 'readonly' + = text_field_tag :display_name, "GitLab / #{@project.full_name}", class: 'form-control input-sm', readonly: 'readonly' .input-group-btn = clipboard_button(target: '#display_name') diff --git a/app/views/projects/services/slack_slash_commands/_help.html.haml b/app/views/projects/services/slack_slash_commands/_help.html.haml index c31c95608c6..d592a5e4663 100644 --- a/app/views/projects/services/slack_slash_commands/_help.html.haml +++ b/app/views/projects/services/slack_slash_commands/_help.html.haml @@ -1,4 +1,4 @@ -- pretty_name = defined?(@project) ? @project.name_with_namespace : 'namespace / path' +- pretty_name = defined?(@project) ? @project.full_name : 'namespace / path' - run_actions_text = "Perform common operations on GitLab project: #{pretty_name}" .well diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml index 235d532bf98..6bef4d19434 100644 --- a/app/views/projects/settings/repository/show.html.haml +++ b/app/views/projects/settings/repository/show.html.haml @@ -2,9 +2,6 @@ - page_title "Repository" - @content_class = "limit-container-width" unless fluid_layout -- content_for :page_specific_javascripts do - = webpack_bundle_tag('common_vue') - -# Protected branches & tags use a lot of nested partials. -# The shared parts of the views can be found in the `shared` directory. -# Those are used throughout the actual views. These `shared` views are then diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index da364b58e36..10415d011d6 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -1,7 +1,6 @@ - @no_container = true - @sort ||= sort_value_recently_updated - page_title s_('TagsPage|Tags') -- add_to_breadcrumbs("Repository", project_tree_path(@project)) .flex-list{ class: container_class } .top-area.adjust diff --git a/app/views/search/_filter.html.haml b/app/views/search/_filter.html.haml index e43796e9654..e4902d368e7 100644 --- a/app/views/search/_filter.html.haml +++ b/app/views/search/_filter.html.haml @@ -22,7 +22,7 @@ %span.dropdown-toggle-text Project: - if @project.present? - = @project.name_with_namespace + = @project.full_name - else Any = icon("chevron-down") diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 60ef44482f0..ab56f48ba4d 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -6,7 +6,7 @@ = search_entries_info(@search_objects, @scope, @search_term) - unless @show_snippets - if @project - in project #{link_to @project.name_with_namespace, [@project.namespace.becomes(Namespace), @project]} + in project #{link_to @project.full_name, [@project.namespace.becomes(Namespace), @project]} - elsif @group in group #{link_to @group.name, @group} diff --git a/app/views/search/results/_issue.html.haml b/app/views/search/results/_issue.html.haml index b4bc8982c05..b7a27ef6be2 100644 --- a/app/views/search/results/_issue.html.haml +++ b/app/views/search/results/_issue.html.haml @@ -10,4 +10,4 @@ .description.term = search_md_sanitize(issue, :description) %span.light - #{issue.project.name_with_namespace} + #{issue.project.full_name} diff --git a/app/views/search/results/_merge_request.html.haml b/app/views/search/results/_merge_request.html.haml index 1a5499e4d58..8b0fd74f680 100644 --- a/app/views/search/results/_merge_request.html.haml +++ b/app/views/search/results/_merge_request.html.haml @@ -11,4 +11,4 @@ .description.term = search_md_sanitize(merge_request, :description) %span.light - #{merge_request.project.name_with_namespace} + #{merge_request.project.full_name} diff --git a/app/views/search/results/_note.html.haml b/app/views/search/results/_note.html.haml index a7e178dfa71..e4ab7b0541f 100644 --- a/app/views/search/results/_note.html.haml +++ b/app/views/search/results/_note.html.haml @@ -7,7 +7,7 @@ %i.fa.fa-comment = link_to_member(project, note.author, avatar: false) commented on - = link_to project.name_with_namespace, project + = link_to project.full_name, project · - if note.for_commit? diff --git a/app/views/search/results/_snippet_title.html.haml b/app/views/search/results/_snippet_title.html.haml index 65710c09a89..d46c4d11e51 100644 --- a/app/views/search/results/_snippet_title.html.haml +++ b/app/views/search/results/_snippet_title.html.haml @@ -11,7 +11,7 @@ %small.pull-right.cgray - if snippet_title.project_id? - = link_to snippet_title.project.name_with_namespace, project_path(snippet_title.project) + = link_to snippet_title.project.full_name, project_path(snippet_title.project) .snippet-info = snippet_title.to_reference diff --git a/app/views/sent_notifications/unsubscribe.html.haml b/app/views/sent_notifications/unsubscribe.html.haml index de52fd00157..7d3e243495f 100644 --- a/app/views/sent_notifications/unsubscribe.html.haml +++ b/app/views/sent_notifications/unsubscribe.html.haml @@ -1,7 +1,7 @@ - noteable = @sent_notification.noteable - noteable_type = @sent_notification.noteable_type.titleize.downcase - noteable_text = %(#{noteable.title} (#{noteable.to_reference})) -- page_title "Unsubscribe", noteable_text, noteable_type.pluralize, @sent_notification.project.name_with_namespace +- page_title "Unsubscribe", noteable_text, noteable_type.pluralize, @sent_notification.project.full_name %h3.page-title Unsubscribe from #{noteable_type} diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml index 736afa085e8..5eaaa1448d5 100644 --- a/app/views/shared/_import_form.html.haml +++ b/app/views/shared/_import_form.html.haml @@ -1,17 +1,22 @@ +- ci_cd_only = local_assigns.fetch(:ci_cd_only, false) + .form-group.import-url-data = f.label :import_url, class: 'label-light' do - %span Git repository URL + %span + = _('Git repository URL') - = f.text_field :import_url, autocomplete: 'off', class: 'form-control', placeholder: 'https://username:password@gitlab.company.com/group/project.git' + = f.text_field :import_url, autocomplete: 'off', class: 'form-control', placeholder: 'https://username:password@gitlab.company.com/group/project.git', required: true .well.prepend-top-20 %ul %li - The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>. + = _('The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>.').html_safe %li - If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>. + = _('If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>.').html_safe %li - The import will time out after #{time_interval_in_words(Gitlab.config.gitlab_shell.git_timeout)}. - For repositories that take longer, use a clone/push combination. + = import_will_timeout_message(ci_cd_only) %li - To migrate an SVN repository, check out #{link_to "this document", help_page_path('user/project/import/svn')}. + = import_svn_message(ci_cd_only) + +-# EE-specific start +-# EE-specific end diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml index 014b8de1dc9..44b09545a61 100644 --- a/app/views/shared/boards/_show.html.haml +++ b/app/views/shared/boards/_show.html.haml @@ -1,3 +1,5 @@ +- board = local_assigns.fetch(:board, nil) +- group = local_assigns.fetch(:group, false) - @no_breadcrumb_container = true - @no_container = true - @content_class = "issue-boards-content" @@ -5,7 +7,6 @@ - page_title "Boards" - content_for :page_specific_javascripts do - = webpack_bundle_tag 'common_vue' -# haml-lint:disable InlineJavaScript %script#js-board-template{ type: "text/x-template" }= render "shared/boards/components/board" @@ -27,7 +28,7 @@ ":root-path" => "rootPath", ":board-id" => "boardId", ":key" => "_uid" } - = render "shared/boards/components/sidebar" + = render "shared/boards/components/sidebar", group: group - if @project %board-add-issues-modal{ "new-issue-path" => new_project_issue_path(@project), "milestone-path" => milestones_filter_dropdown_path, diff --git a/app/views/shared/boards/components/_board.html.haml b/app/views/shared/boards/components/_board.html.haml index c687e66fd43..2e9ad380012 100644 --- a/app/views/shared/boards/components/_board.html.haml +++ b/app/views/shared/boards/components/_board.html.haml @@ -42,6 +42,7 @@ ":disabled" => "disabled", ":issue-link-base" => "issueLinkBase", ":root-path" => "rootPath", + ":groupId" => ((current_board_parent.id if @group) || 'null'), "ref" => "board-list" } - if can?(current_user, :admin_list, current_board_parent) %board-blank-state{ "v-if" => 'list.id == "blank"' } diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml index fabb17c7340..fc6f71ef60f 100644 --- a/app/views/shared/issuable/_search_bar.html.haml +++ b/app/views/shared/issuable/_search_bar.html.haml @@ -112,6 +112,7 @@ - if can?(current_user, :admin_label, board.parent) = render partial: "shared/issuable/label_page_create" = dropdown_loading - #js-add-issues-btn.prepend-left-10 + - if @project + #js-add-issues-btn.prepend-left-10{ data: { can_admin_list: can?(current_user, :admin_list, @project) } } - elsif type != :boards_modal = render 'shared/sort_dropdown' diff --git a/app/views/shared/milestones/_issuable.html.haml b/app/views/shared/milestones/_issuable.html.haml index 129f6ab604e..eba64daaadc 100644 --- a/app/views/shared/milestones/_issuable.html.haml +++ b/app/views/shared/milestones/_issuable.html.haml @@ -12,7 +12,7 @@ - if show_project_name %strong #{project.name} · - elsif show_full_project_name - %strong #{project.name_with_namespace} · + %strong #{project.full_name} · - if issuable.is_a?(Issue) = confidential_icon(issuable) = link_to issuable.title, issuable_url_args, title: issuable.title diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml index e3b2b53833e..da01fc02d07 100644 --- a/app/views/shared/milestones/_milestone.html.haml +++ b/app/views/shared/milestones/_milestone.html.haml @@ -27,7 +27,7 @@ - milestone.milestones.each do |milestone| = link_to milestone_path(milestone) do %span.label.label-gray - = dashboard ? milestone.project.name_with_namespace : milestone.project.name + = dashboard ? milestone.project.full_name : milestone.project.name - if @group .col-sm-6.milestone-actions - if can?(current_user, :admin_milestones, @group) diff --git a/app/views/shared/milestones/_top.html.haml b/app/views/shared/milestones/_top.html.haml index fd0760d83a5..6006ab8b43f 100644 --- a/app/views/shared/milestones/_top.html.haml +++ b/app/views/shared/milestones/_top.html.haml @@ -56,7 +56,7 @@ - milestone.milestones.each do |ms| %tr %td - - project_name = group ? ms.project.name : ms.project.name_with_namespace + - project_name = group ? ms.project.name : ms.project.full_name = link_to project_name, project_milestone_path(ms.project, ms) %td = ms.issues_visible_to_user(current_user).opened.count diff --git a/app/views/shared/plugins/_index.html.haml b/app/views/shared/plugins/_index.html.haml new file mode 100644 index 00000000000..fc643c3ecc2 --- /dev/null +++ b/app/views/shared/plugins/_index.html.haml @@ -0,0 +1,23 @@ +- plugins = Gitlab::Plugin.files + +.row.prepend-top-default + .col-lg-4 + %h4.prepend-top-0 + Plugins + %p + #{link_to 'Plugins', help_page_path('administration/plugins')} are similar to + system hooks but are executed as files instead of sending data to a URL. + + .col-lg-8.append-bottom-default + - if plugins.any? + .panel.panel-default + .panel-heading + Plugins (#{plugins.count}) + %ul.content-list + - plugins.each do |file| + %li + .monospace + = File.basename(file) + - else + %p.light-well.text-center + No plugins found. diff --git a/app/views/shared/snippets/_snippet.html.haml b/app/views/shared/snippets/_snippet.html.haml index 491a8a41090..3acec88c2e3 100644 --- a/app/views/shared/snippets/_snippet.html.haml +++ b/app/views/shared/snippets/_snippet.html.haml @@ -31,7 +31,7 @@ %span.hidden-xs in = link_to project_path(snippet.project) do - = snippet.project.name_with_namespace + = snippet.project.full_name .pull-right.snippet-updated-at %span updated #{time_ago_with_tooltip(snippet.updated_at, placement: 'bottom')} diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 328db19be29..f65e8385ac8 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -43,12 +43,11 @@ - pipeline_cache:expire_pipeline_cache - pipeline_creation:create_pipeline - pipeline_creation:run_pipeline_schedule +- pipeline_background:archive_trace - pipeline_default:build_coverage - pipeline_default:build_trace_sections -- pipeline_default:create_trace_artifact - pipeline_default:pipeline_metrics - pipeline_default:pipeline_notification -- pipeline_default:update_head_pipeline_for_merge_request - pipeline_hooks:build_hooks - pipeline_hooks:pipeline_hooks - pipeline_processing:build_finished @@ -58,6 +57,7 @@ - pipeline_processing:pipeline_success - pipeline_processing:pipeline_update - pipeline_processing:stage_update +- pipeline_processing:update_head_pipeline_for_merge_request - repository_check:repository_check_clear - repository_check:repository_check_single_repository diff --git a/app/workers/archive_trace_worker.rb b/app/workers/archive_trace_worker.rb new file mode 100644 index 00000000000..dea7425ad88 --- /dev/null +++ b/app/workers/archive_trace_worker.rb @@ -0,0 +1,10 @@ +class ArchiveTraceWorker + include ApplicationWorker + include PipelineBackgroundQueue + + def perform(job_id) + Ci::Build.find_by(id: job_id).try do |job| + job.trace.archive! + end + end +end diff --git a/app/workers/build_finished_worker.rb b/app/workers/build_finished_worker.rb index b5ed8d607b3..46f1ac09915 100644 --- a/app/workers/build_finished_worker.rb +++ b/app/workers/build_finished_worker.rb @@ -12,7 +12,7 @@ class BuildFinishedWorker # We execute that async as this are two indepentent operations that can be executed after TraceSections and Coverage BuildHooksWorker.perform_async(build.id) - CreateTraceArtifactWorker.perform_async(build.id) + ArchiveTraceWorker.perform_async(build.id) end end end diff --git a/app/workers/concerns/gitlab/github_import/object_importer.rb b/app/workers/concerns/gitlab/github_import/object_importer.rb index 9a9fbaad653..100d86e38c8 100644 --- a/app/workers/concerns/gitlab/github_import/object_importer.rb +++ b/app/workers/concerns/gitlab/github_import/object_importer.rb @@ -22,7 +22,7 @@ module Gitlab importer_class.new(object, project, client).execute - counter.increment(project: project.path_with_namespace) + counter.increment(project: project.full_path) end def counter diff --git a/app/workers/concerns/pipeline_background_queue.rb b/app/workers/concerns/pipeline_background_queue.rb new file mode 100644 index 00000000000..8bf43de6b26 --- /dev/null +++ b/app/workers/concerns/pipeline_background_queue.rb @@ -0,0 +1,10 @@ +## +# Concern for setting Sidekiq settings for the low priority CI pipeline workers. +# +module PipelineBackgroundQueue + extend ActiveSupport::Concern + + included do + queue_namespace :pipeline_background + end +end diff --git a/app/workers/create_trace_artifact_worker.rb b/app/workers/create_trace_artifact_worker.rb deleted file mode 100644 index 11cda58021e..00000000000 --- a/app/workers/create_trace_artifact_worker.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreateTraceArtifactWorker - include ApplicationWorker - include PipelineQueue - - def perform(job_id) - Ci::Build.preload(:project, :user).find_by(id: job_id).try do |job| - Ci::CreateTraceArtifactService.new(job.project, job.user).execute(job) - end - end -end diff --git a/app/workers/git_garbage_collect_worker.rb b/app/workers/git_garbage_collect_worker.rb index 7ba224d74c8..55fb817ca6e 100644 --- a/app/workers/git_garbage_collect_worker.rb +++ b/app/workers/git_garbage_collect_worker.rb @@ -44,6 +44,10 @@ class GitGarbageCollectWorker # Refresh the branch cache in case garbage collection caused a ref lookup to fail flush_ref_caches(project) if task == :gc + + # In case pack files are deleted, release libgit2 cache and open file + # descriptors ASAP instead of waiting for Ruby garbage collection + project.cleanup ensure cancel_lease(lease_key, lease_uuid) if lease_key.present? && lease_uuid.present? end diff --git a/app/workers/gitlab/github_import/stage/finish_import_worker.rb b/app/workers/gitlab/github_import/stage/finish_import_worker.rb index 073d6608082..a779e631516 100644 --- a/app/workers/gitlab/github_import/stage/finish_import_worker.rb +++ b/app/workers/gitlab/github_import/stage/finish_import_worker.rb @@ -16,7 +16,7 @@ module Gitlab def report_import_time(project) duration = Time.zone.now - project.created_at - path = project.path_with_namespace + path = project.full_path histogram.observe({ project: path }, duration) counter.increment diff --git a/app/workers/pages_worker.rb b/app/workers/pages_worker.rb index d3b95009364..66a0ff83bef 100644 --- a/app/workers/pages_worker.rb +++ b/app/workers/pages_worker.rb @@ -1,7 +1,7 @@ class PagesWorker include ApplicationWorker - sidekiq_options retry: false + sidekiq_options retry: 3 def perform(action, *arg) send(action, *arg) # rubocop:disable GitlabSecurity/PublicSend diff --git a/app/workers/update_head_pipeline_for_merge_request_worker.rb b/app/workers/update_head_pipeline_for_merge_request_worker.rb index f09d89aa170..76f84ff920f 100644 --- a/app/workers/update_head_pipeline_for_merge_request_worker.rb +++ b/app/workers/update_head_pipeline_for_merge_request_worker.rb @@ -2,6 +2,8 @@ class UpdateHeadPipelineForMergeRequestWorker include ApplicationWorker include PipelineQueue + queue_namespace :pipeline_processing + def perform(merge_request_id) merge_request = MergeRequest.find(merge_request_id) pipeline = Ci::Pipeline.where(project: merge_request.source_project, ref: merge_request.source_branch).last diff --git a/changelogs/unreleased/29130-api-project-export.yml b/changelogs/unreleased/29130-api-project-export.yml new file mode 100644 index 00000000000..7dee349232a --- /dev/null +++ b/changelogs/unreleased/29130-api-project-export.yml @@ -0,0 +1,5 @@ +--- +title: Add project export API +merge_request: 15860 +author: Travis Miller +type: added diff --git a/changelogs/unreleased/38587-pipelines-empty-state.yml b/changelogs/unreleased/38587-pipelines-empty-state.yml new file mode 100644 index 00000000000..58ea204d394 --- /dev/null +++ b/changelogs/unreleased/38587-pipelines-empty-state.yml @@ -0,0 +1,5 @@ +--- +title: Handle empty state in Pipelines page +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/40187-project-branch-dashboard-with-active-stale-branches.yml b/changelogs/unreleased/40187-project-branch-dashboard-with-active-stale-branches.yml new file mode 100644 index 00000000000..3833aab42dd --- /dev/null +++ b/changelogs/unreleased/40187-project-branch-dashboard-with-active-stale-branches.yml @@ -0,0 +1,5 @@ +--- +title: Add overview of branches and a filter for active/stale branches +merge_request: 15402 +author: Takuya Noguchi +type: added diff --git a/changelogs/unreleased/42921-ci-charts-include-current-day.yml b/changelogs/unreleased/42921-ci-charts-include-current-day.yml new file mode 100644 index 00000000000..d0de6665735 --- /dev/null +++ b/changelogs/unreleased/42921-ci-charts-include-current-day.yml @@ -0,0 +1,5 @@ +--- +title: CI charts now include the current day +merge_request: 17032 +author: Dakkaron +type: changed diff --git a/changelogs/unreleased/43460-track-projects-a-user-interacted-with.yml b/changelogs/unreleased/43460-track-projects-a-user-interacted-with.yml new file mode 100644 index 00000000000..99b6ac76a3e --- /dev/null +++ b/changelogs/unreleased/43460-track-projects-a-user-interacted-with.yml @@ -0,0 +1,5 @@ +--- +title: Keep track of projects a user interacted with. +merge_request: 17327 +author: +type: other diff --git a/changelogs/unreleased/43793-enable-privileged-mode-for-runner.yml b/changelogs/unreleased/43793-enable-privileged-mode-for-runner.yml new file mode 100644 index 00000000000..08109632e8e --- /dev/null +++ b/changelogs/unreleased/43793-enable-privileged-mode-for-runner.yml @@ -0,0 +1,5 @@ +--- +title: Enable privileged mode for GitLab Runner +merge_request: 17528 +author: +type: added diff --git a/changelogs/unreleased/43829-update-ssh-addtion-text.yml b/changelogs/unreleased/43829-update-ssh-addtion-text.yml new file mode 100644 index 00000000000..b7052bb171e --- /dev/null +++ b/changelogs/unreleased/43829-update-ssh-addtion-text.yml @@ -0,0 +1,5 @@ +--- +title: Update SSH key link to include existing keys +merge_request: +author: Brendan O'Leary +type: changed diff --git a/changelogs/unreleased/43924-breadcrumbs-on-project-tags.yml b/changelogs/unreleased/43924-breadcrumbs-on-project-tags.yml new file mode 100644 index 00000000000..67c223b31c5 --- /dev/null +++ b/changelogs/unreleased/43924-breadcrumbs-on-project-tags.yml @@ -0,0 +1,5 @@ +--- +title: Remove extra breadcrumb on tags +merge_request: 17562 +author: Takuya Noguchi +type: fixed diff --git a/changelogs/unreleased/an-network-controller-fix.yml b/changelogs/unreleased/an-network-controller-fix.yml new file mode 100644 index 00000000000..cb2c447b957 --- /dev/null +++ b/changelogs/unreleased/an-network-controller-fix.yml @@ -0,0 +1,5 @@ +--- +title: Prevent the graphs page from generating unnecessary Gitaly requests +merge_request: 37602 +author: +type: performance diff --git a/changelogs/unreleased/bvl-port-of-ee-translations.yml b/changelogs/unreleased/bvl-port-of-ee-translations.yml new file mode 100644 index 00000000000..8f232ec8da3 --- /dev/null +++ b/changelogs/unreleased/bvl-port-of-ee-translations.yml @@ -0,0 +1,5 @@ +--- +title: Started translation into Turkish, Indonesian and Filipino +merge_request: 17526 +author: +type: other diff --git a/changelogs/unreleased/dz-plugins-project-integrations.yml b/changelogs/unreleased/dz-plugins-project-integrations.yml new file mode 100644 index 00000000000..9dbe82f9af8 --- /dev/null +++ b/changelogs/unreleased/dz-plugins-project-integrations.yml @@ -0,0 +1,5 @@ +--- +title: Add plugins list to the system hooks page +merge_request: 17518 +author: +type: added diff --git a/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml b/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml index 768686aeda8..d8020592897 100644 --- a/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml +++ b/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml @@ -1,5 +1,5 @@ --- -title: Count comments on diffs as contributions for the contributions calendar +title: Count comments on diffs and discussions as contributions for the contributions calendar merge_request: 17418 author: Riccardo Padovani type: fixed diff --git a/changelogs/unreleased/feature-sm-add-check-sum-to-job-artifacts.yml b/changelogs/unreleased/feature-sm-add-check-sum-to-job-artifacts.yml new file mode 100644 index 00000000000..23a870d6e9f --- /dev/null +++ b/changelogs/unreleased/feature-sm-add-check-sum-to-job-artifacts.yml @@ -0,0 +1,5 @@ +--- +title: Store sha256 checksum to job artifacts +merge_request: 17354 +author: +type: performance diff --git a/changelogs/unreleased/fix-sm-fix_pages_worker.yml b/changelogs/unreleased/fix-sm-fix_pages_worker.yml new file mode 100644 index 00000000000..190c7d3e83e --- /dev/null +++ b/changelogs/unreleased/fix-sm-fix_pages_worker.yml @@ -0,0 +1,5 @@ +--- +title: Fix pages flaky failure by reloading stale object +merge_request: 17522 +author: +type: fixed diff --git a/changelogs/unreleased/fj-41174-projects-groups-badges-api.yml b/changelogs/unreleased/fj-41174-projects-groups-badges-api.yml new file mode 100644 index 00000000000..7cb12e26332 --- /dev/null +++ b/changelogs/unreleased/fj-41174-projects-groups-badges-api.yml @@ -0,0 +1,5 @@ +--- +title: Implemented badge API endpoints +merge_request: 17082 +author: +type: added diff --git a/changelogs/unreleased/issue_31081.yml b/changelogs/unreleased/issue_31081.yml new file mode 100644 index 00000000000..ac547c285db --- /dev/null +++ b/changelogs/unreleased/issue_31081.yml @@ -0,0 +1,5 @@ +--- +title: Use host URL to build JIRA remote link icon +merge_request: +author: +type: other diff --git a/changelogs/unreleased/issue_38337.yml b/changelogs/unreleased/issue_38337.yml new file mode 100644 index 00000000000..df65118b65c --- /dev/null +++ b/changelogs/unreleased/issue_38337.yml @@ -0,0 +1,5 @@ +--- +title: Add one group board to Libre +merge_request: +author: +type: added diff --git a/changelogs/unreleased/oauth_generic_provider.yml b/changelogs/unreleased/oauth_generic_provider.yml new file mode 100644 index 00000000000..3b6f8b04529 --- /dev/null +++ b/changelogs/unreleased/oauth_generic_provider.yml @@ -0,0 +1,4 @@ +--- +title: Make oauth provider login generic +merge_request: 8809 +author: Horatiu Eugen Vlad
\ No newline at end of file diff --git a/changelogs/unreleased/proper-fix-for-artifacts-service.yml b/changelogs/unreleased/proper-fix-for-artifacts-service.yml new file mode 100644 index 00000000000..e92e995dbf5 --- /dev/null +++ b/changelogs/unreleased/proper-fix-for-artifacts-service.yml @@ -0,0 +1,5 @@ +--- +title: Add archive feature to trace +merge_request: 17314 +author: +type: added diff --git a/changelogs/unreleased/replace_redcarpet_with_cmark.yml b/changelogs/unreleased/replace_redcarpet_with_cmark.yml new file mode 100644 index 00000000000..7ce848b0bbd --- /dev/null +++ b/changelogs/unreleased/replace_redcarpet_with_cmark.yml @@ -0,0 +1,5 @@ +--- +title: Add CommonMark markdown engine (experimental) +merge_request: 14835 +author: blackst0ne +type: added diff --git a/changelogs/unreleased/sh-cleanup-after-git-gc.yml b/changelogs/unreleased/sh-cleanup-after-git-gc.yml new file mode 100644 index 00000000000..4b652f4d6ce --- /dev/null +++ b/changelogs/unreleased/sh-cleanup-after-git-gc.yml @@ -0,0 +1,5 @@ +--- +title: Release libgit2 cache and open file descriptors after `git gc` run +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/sh-dashboard-sort-fix.yml b/changelogs/unreleased/sh-dashboard-sort-fix.yml new file mode 100644 index 00000000000..6fd252f6707 --- /dev/null +++ b/changelogs/unreleased/sh-dashboard-sort-fix.yml @@ -0,0 +1,5 @@ +--- +title: Fix project dashboard showing the wrong timestamps +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/sh-fix-issue-43871-system-hooks.yml b/changelogs/unreleased/sh-fix-issue-43871-system-hooks.yml new file mode 100644 index 00000000000..7c7ef39cb75 --- /dev/null +++ b/changelogs/unreleased/sh-fix-issue-43871-system-hooks.yml @@ -0,0 +1,5 @@ +--- +title: Don't error out in system hook if user has `nil` datetime columns +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/sh-make-prune-optional-in-git-fetch.yml b/changelogs/unreleased/sh-make-prune-optional-in-git-fetch.yml new file mode 100644 index 00000000000..e961a23a031 --- /dev/null +++ b/changelogs/unreleased/sh-make-prune-optional-in-git-fetch.yml @@ -0,0 +1,5 @@ +--- +title: Make --prune a configurable parameter in fetching a git remote +merge_request: +author: +type: performance diff --git a/changelogs/unreleased/wip-new-mr-cmd.yml b/changelogs/unreleased/wip-new-mr-cmd.yml index ce7072631dd..e930758ec9d 100644 --- a/changelogs/unreleased/wip-new-mr-cmd.yml +++ b/changelogs/unreleased/wip-new-mr-cmd.yml @@ -1,3 +1,4 @@ +--- title: Port /wip quick action command to Merge Request creation (on description) merge_request: 17463 author: Adam Pahlevi diff --git a/config/application.rb b/config/application.rb index 918bd4d57cf..74fe3e439ed 100644 --- a/config/application.rb +++ b/config/application.rb @@ -26,6 +26,7 @@ module Gitlab # This is a nice reference article on autoloading/eager loading: # http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload config.eager_load_paths.push(*%W[#{config.root}/lib + #{config.root}/app/models/badges #{config.root}/app/models/hooks #{config.root}/app/models/members #{config.root}/app/models/project_services diff --git a/config/initializers/8_metrics.rb b/config/initializers/8_metrics.rb index 45b39b2a38d..7cdf49159b4 100644 --- a/config/initializers/8_metrics.rb +++ b/config/initializers/8_metrics.rb @@ -94,6 +94,7 @@ def instrument_classes(instrumentation) instrumentation.instrument_instance_methods(RepositoryCheck::SingleRepositoryWorker) + instrumentation.instrument_instance_methods(Rouge::Plugins::CommonMark) instrumentation.instrument_instance_methods(Rouge::Plugins::Redcarpet) instrumentation.instrument_instance_methods(Rouge::Formatters::HTMLGitlab) diff --git a/config/prometheus/additional_metrics.yml b/config/prometheus/additional_metrics.yml index 601a86490d4..c4f60eb2687 100644 --- a/config/prometheus/additional_metrics.yml +++ b/config/prometheus/additional_metrics.yml @@ -140,20 +140,20 @@ priority: 5 metrics: - title: "Memory Usage" - y_label: "Memory Usage (MB)" + y_label: "Memory Used per Pod" required_metrics: - container_memory_usage_bytes weight: 1 queries: - - query_range: '(sum(avg(container_memory_usage_bytes{container_name!="POD",environment="%{ci_environment_slug}"}) without (job))) / count(avg(container_memory_usage_bytes{container_name!="POD",environment="%{ci_environment_slug}"}) without (job)) /1024/1024' + - query_range: 'avg(sum(container_memory_usage_bytes{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}) by (job)) without (job) / count(avg(container_memory_usage_bytes{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}) without (job)) /1024/1024' label: Average unit: MB - - title: "CPU Utilization" - y_label: "CPU Utilization (%)" + - title: "CPU Usage" + y_label: "Cores per Pod" required_metrics: - container_cpu_usage_seconds_total weight: 1 queries: - - query_range: 'sum(avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="%{ci_environment_slug}"}[2m])) without (job)) * 100' + - query_range: 'avg(sum(rate(container_cpu_usage_seconds_total{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}[15m])) by (job)) without (job) / count(sum(rate(container_cpu_usage_seconds_total{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}[15m])) by (pod_name))' label: Average - unit: "%"
\ No newline at end of file + unit: "cores"
\ No newline at end of file diff --git a/config/routes/group.rb b/config/routes/group.rb index 7a4740a4df7..710f12e33ad 100644 --- a/config/routes/group.rb +++ b/config/routes/group.rb @@ -56,6 +56,9 @@ constraints(GroupUrlConstrainer.new) do get ":secret/:filename", action: :show, as: :show, constraints: { filename: %r{[^/]+} } end end + + # On CE only index and show actions are needed + resources :boards, only: [:index, :show] end scope(path: '*id', diff --git a/config/routes/project.rb b/config/routes/project.rb index 34636285c51..cb46c439415 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -381,7 +381,8 @@ constraints(ProjectUrlConstrainer.new) do get 'noteable/:target_type/:target_id/notes' => 'notes#index', as: 'noteable_notes' - resources :boards, only: [:index, :show, :create, :update, :destroy] + # On CE only index and show are needed + resources :boards, only: [:index, :show] resources :todos, only: [:create] diff --git a/config/routes/repository.rb b/config/routes/repository.rb index 9ffdebbcff1..eace3a615b4 100644 --- a/config/routes/repository.rb +++ b/config/routes/repository.rb @@ -49,6 +49,7 @@ scope format: false do end end + get '/branches/:state', to: 'branches#index', as: :branches_filtered, constraints: { state: /active|stale|all/ } resources :branches, only: [:index, :new, :create, :destroy] delete :merged_branches, controller: 'branches', action: :destroy_all_merged resources :tags, only: [:index, :show, :new, :create, :destroy] do diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml index 4845dc28a4a..554502c5d83 100644 --- a/config/sidekiq_queues.yml +++ b/config/sidekiq_queues.yml @@ -69,3 +69,4 @@ - [storage_migrator, 1] - [pages_domain_verification, 1] - [plugin, 1] + - [pipeline_background, 1] diff --git a/config/webpack.config.js b/config/webpack.config.js index 19eeb497a14..3403c0c207d 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -44,8 +44,6 @@ function generateEntries() { const manualEntries = { common: './commons/index.js', - common_vue: './vue_shared/vue_resource_interceptor.js', - locale: './locale/index.js', main: './main.js', raven: './raven/index.js', webpack_runtime: './webpack.js', diff --git a/db/migrate/20180214093516_create_badges.rb b/db/migrate/20180214093516_create_badges.rb new file mode 100644 index 00000000000..6559f834484 --- /dev/null +++ b/db/migrate/20180214093516_create_badges.rb @@ -0,0 +1,17 @@ +class CreateBadges < ActiveRecord::Migration + DOWNTIME = false + + def change + create_table :badges do |t| + t.string :link_url, null: false + t.string :image_url, null: false + t.references :project, index: true, foreign_key: { on_delete: :cascade }, null: true + t.integer :group_id, index: true, null: true + t.string :type, null: false + + t.timestamps_with_timezone null: false + end + + add_foreign_key :badges, :namespaces, column: :group_id, on_delete: :cascade + end +end diff --git a/db/migrate/20180223120443_create_user_interacted_projects_table.rb b/db/migrate/20180223120443_create_user_interacted_projects_table.rb new file mode 100644 index 00000000000..20749940b1e --- /dev/null +++ b/db/migrate/20180223120443_create_user_interacted_projects_table.rb @@ -0,0 +1,18 @@ +class CreateUserInteractedProjectsTable < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + create_table :user_interacted_projects, id: false do |t| + t.references :user, null: false + t.references :project, null: false + end + end + + def down + drop_table :user_interacted_projects + end +end diff --git a/db/migrate/20180226050030_add_checksum_to_ci_job_artifacts.rb b/db/migrate/20180226050030_add_checksum_to_ci_job_artifacts.rb new file mode 100644 index 00000000000..54e6e35449e --- /dev/null +++ b/db/migrate/20180226050030_add_checksum_to_ci_job_artifacts.rb @@ -0,0 +1,7 @@ +class AddChecksumToCiJobArtifacts < ActiveRecord::Migration + DOWNTIME = false + + def change + add_column :ci_job_artifacts, :file_sha256, :binary + end +end diff --git a/db/migrate/20180227182112_add_group_id_to_boards_ce.rb b/db/migrate/20180227182112_add_group_id_to_boards_ce.rb new file mode 100644 index 00000000000..f54dd8d7687 --- /dev/null +++ b/db/migrate/20180227182112_add_group_id_to_boards_ce.rb @@ -0,0 +1,34 @@ +class AddGroupIdToBoardsCe < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + DOWNTIME = false + + def up + return if group_id_exists? + + add_column :boards, :group_id, :integer + add_foreign_key :boards, :namespaces, column: :group_id, on_delete: :cascade + add_concurrent_index :boards, :group_id + + change_column_null :boards, :project_id, true + end + + def down + return unless group_id_exists? + + remove_foreign_key :boards, column: :group_id + remove_index :boards, :group_id if index_exists? :boards, :group_id + remove_column :boards, :group_id + + execute "DELETE from boards WHERE project_id IS NULL" + change_column_null :boards, :project_id, false + end + + private + + def group_id_exists? + column_exists?(:boards, :group_id) + end +end diff --git a/db/migrate/20180304204842_clean_commits_count_migration.rb b/db/migrate/20180304204842_clean_commits_count_migration.rb new file mode 100644 index 00000000000..ace4c6aa1cf --- /dev/null +++ b/db/migrate/20180304204842_clean_commits_count_migration.rb @@ -0,0 +1,14 @@ +class CleanCommitsCountMigration < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + Gitlab::BackgroundMigration.steal('AddMergeRequestDiffCommitsCount') + end + + def down + end +end diff --git a/db/migrate/20180305144721_add_privileged_to_runner.rb b/db/migrate/20180305144721_add_privileged_to_runner.rb new file mode 100644 index 00000000000..32e73dba8d5 --- /dev/null +++ b/db/migrate/20180305144721_add_privileged_to_runner.rb @@ -0,0 +1,18 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddPrivilegedToRunner < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_column_with_default :clusters_applications_runners, :privileged, :boolean, default: true, allow_null: false + end + + def down + remove_column :clusters_applications_runners, :privileged + end +end diff --git a/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb b/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb new file mode 100644 index 00000000000..5e729b1aa53 --- /dev/null +++ b/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb @@ -0,0 +1,124 @@ +class BuildUserInteractedProjectsTable < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + disable_ddl_transaction! + + def up + if Gitlab::Database.postgresql? + PostgresStrategy.new + else + MysqlStrategy.new + end.up + + unless index_exists?(:user_interacted_projects, [:project_id, :user_id]) + add_concurrent_index :user_interacted_projects, [:project_id, :user_id], unique: true + end + + unless foreign_key_exists?(:user_interacted_projects, :user_id) + add_concurrent_foreign_key :user_interacted_projects, :users, column: :user_id, on_delete: :cascade + end + + unless foreign_key_exists?(:user_interacted_projects, :project_id) + add_concurrent_foreign_key :user_interacted_projects, :projects, column: :project_id, on_delete: :cascade + end + end + + def down + execute "TRUNCATE user_interacted_projects" + + if foreign_key_exists?(:user_interacted_projects, :user_id) + remove_foreign_key :user_interacted_projects, :users + end + + if foreign_key_exists?(:user_interacted_projects, :project_id) + remove_foreign_key :user_interacted_projects, :projects + end + + if index_exists_by_name?(:user_interacted_projects, 'index_user_interacted_projects_on_project_id_and_user_id') + remove_concurrent_index_by_name :user_interacted_projects, 'index_user_interacted_projects_on_project_id_and_user_id' + end + end + + private + + # Rails' index_exists? doesn't work when you only give it a table and index + # name. As such we have to use some extra code to check if an index exists for + # a given name. + def index_exists_by_name?(table, index) + indexes_for_table[table].include?(index) + end + + def indexes_for_table + @indexes_for_table ||= Hash.new do |hash, table_name| + hash[table_name] = indexes(table_name).map(&:name) + end + end + + def foreign_key_exists?(table, column) + foreign_keys(table).any? do |key| + key.options[:column] == column.to_s + end + end + + class PostgresStrategy < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + BATCH_SIZE = 100_000 + SLEEP_TIME = 5 + + def up + with_index(:events, [:author_id, :project_id], name: 'events_user_interactions_temp', where: 'project_id IS NOT NULL') do + iteration = 0 + records = 0 + begin + Rails.logger.info "Building user_interacted_projects table, batch ##{iteration}" + result = execute <<~SQL + INSERT INTO user_interacted_projects (user_id, project_id) + SELECT e.user_id, e.project_id + FROM (SELECT DISTINCT author_id AS user_id, project_id FROM events WHERE project_id IS NOT NULL) AS e + LEFT JOIN user_interacted_projects ucp USING (user_id, project_id) + WHERE ucp.user_id IS NULL + LIMIT #{BATCH_SIZE} + SQL + iteration += 1 + records += result.cmd_tuples + Rails.logger.info "Building user_interacted_projects table, batch ##{iteration} complete, created #{records} overall" + Kernel.sleep(SLEEP_TIME) if result.cmd_tuples > 0 + rescue ActiveRecord::InvalidForeignKey => e + Rails.logger.info "Retry on InvalidForeignKey: #{e}" + retry + end while result.cmd_tuples > 0 + end + + execute "ANALYZE user_interacted_projects" + + end + + private + + def with_index(*args) + add_concurrent_index(*args) unless index_exists?(*args) + yield + ensure + remove_concurrent_index(*args) if index_exists?(*args) + end + end + + class MysqlStrategy < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + def up + execute <<~SQL + INSERT INTO user_interacted_projects (user_id, project_id) + SELECT e.user_id, e.project_id + FROM (SELECT DISTINCT author_id AS user_id, project_id FROM events WHERE project_id IS NOT NULL) AS e + LEFT JOIN user_interacted_projects ucp USING (user_id, project_id) + WHERE ucp.user_id IS NULL + SQL + end + end + +end diff --git a/db/post_migrate/20180306074045_migrate_create_trace_artifact_sidekiq_queue.rb b/db/post_migrate/20180306074045_migrate_create_trace_artifact_sidekiq_queue.rb new file mode 100644 index 00000000000..0af1c3bc0a5 --- /dev/null +++ b/db/post_migrate/20180306074045_migrate_create_trace_artifact_sidekiq_queue.rb @@ -0,0 +1,13 @@ +class MigrateCreateTraceArtifactSidekiqQueue < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def up + sidekiq_queue_migrate 'pipeline_default:create_trace_artifact', to: 'pipeline_background:archive_trace' + end + + def down + sidekiq_queue_migrate 'pipeline_background:archive_trace', to: 'pipeline_default:create_trace_artifact' + end +end diff --git a/db/post_migrate/20180307012445_migrate_update_head_pipeline_for_merge_request_sidekiq_queue.rb b/db/post_migrate/20180307012445_migrate_update_head_pipeline_for_merge_request_sidekiq_queue.rb new file mode 100644 index 00000000000..9728df6d409 --- /dev/null +++ b/db/post_migrate/20180307012445_migrate_update_head_pipeline_for_merge_request_sidekiq_queue.rb @@ -0,0 +1,15 @@ +class MigrateUpdateHeadPipelineForMergeRequestSidekiqQueue < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def up + sidekiq_queue_migrate 'pipeline_default:update_head_pipeline_for_merge_request', + to: 'pipeline_processing:update_head_pipeline_for_merge_request' + end + + def down + sidekiq_queue_migrate 'pipeline_processing:update_head_pipeline_for_merge_request', + to: 'pipeline_default:update_head_pipeline_for_merge_request' + end +end diff --git a/db/schema.rb b/db/schema.rb index db8bafe9677..387b15f8f30 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180301084653) do +ActiveRecord::Schema.define(version: 20180307012445) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -183,12 +183,27 @@ ActiveRecord::Schema.define(version: 20180301084653) do add_index "award_emoji", ["awardable_type", "awardable_id"], name: "index_award_emoji_on_awardable_type_and_awardable_id", using: :btree add_index "award_emoji", ["user_id", "name"], name: "index_award_emoji_on_user_id_and_name", using: :btree + create_table "badges", force: :cascade do |t| + t.string "link_url", null: false + t.string "image_url", null: false + t.integer "project_id" + t.integer "group_id" + t.string "type", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + end + + add_index "badges", ["group_id"], name: "index_badges_on_group_id", using: :btree + add_index "badges", ["project_id"], name: "index_badges_on_project_id", using: :btree + create_table "boards", force: :cascade do |t| - t.integer "project_id", null: false + t.integer "project_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "group_id" end + add_index "boards", ["group_id"], name: "index_boards_on_group_id", using: :btree add_index "boards", ["project_id"], name: "index_boards_on_project_id", using: :btree create_table "broadcast_messages", force: :cascade do |t| @@ -333,6 +348,7 @@ ActiveRecord::Schema.define(version: 20180301084653) do t.datetime_with_timezone "updated_at", null: false t.datetime_with_timezone "expire_at" t.string "file" + t.binary "file_sha256" end add_index "ci_job_artifacts", ["expire_at", "job_id"], name: "index_ci_job_artifacts_on_expire_at_and_job_id", using: :btree @@ -590,6 +606,7 @@ ActiveRecord::Schema.define(version: 20180301084653) do t.datetime_with_timezone "updated_at", null: false t.string "version", null: false t.text "status_reason" + t.boolean "privileged", default: true, null: false end add_index "clusters_applications_runners", ["cluster_id"], name: "index_clusters_applications_runners_on_cluster_id", unique: true, using: :btree @@ -1826,6 +1843,13 @@ ActiveRecord::Schema.define(version: 20180301084653) do add_index "user_custom_attributes", ["key", "value"], name: "index_user_custom_attributes_on_key_and_value", using: :btree add_index "user_custom_attributes", ["user_id", "key"], name: "index_user_custom_attributes_on_user_id_and_key", unique: true, using: :btree + create_table "user_interacted_projects", id: false, force: :cascade do |t| + t.integer "user_id", null: false + t.integer "project_id", null: false + end + + add_index "user_interacted_projects", ["project_id", "user_id"], name: "index_user_interacted_projects_on_project_id_and_user_id", unique: true, using: :btree + create_table "user_synced_attributes_metadata", force: :cascade do |t| t.boolean "name_synced", default: false t.boolean "email_synced", default: false @@ -1969,6 +1993,9 @@ ActiveRecord::Schema.define(version: 20180301084653) do add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree add_index "web_hooks", ["type"], name: "index_web_hooks_on_type", using: :btree + add_foreign_key "badges", "namespaces", column: "group_id", on_delete: :cascade + add_foreign_key "badges", "projects", on_delete: :cascade + add_foreign_key "boards", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "boards", "projects", name: "fk_f15266b5f9", on_delete: :cascade add_foreign_key "chat_teams", "namespaces", on_delete: :cascade add_foreign_key "ci_build_trace_section_names", "projects", on_delete: :cascade @@ -2095,6 +2122,8 @@ ActiveRecord::Schema.define(version: 20180301084653) do add_foreign_key "u2f_registrations", "users" add_foreign_key "user_callouts", "users", on_delete: :cascade add_foreign_key "user_custom_attributes", "users", on_delete: :cascade + add_foreign_key "user_interacted_projects", "projects", name: "fk_722ceba4f7", on_delete: :cascade + add_foreign_key "user_interacted_projects", "users", name: "fk_0894651f08", on_delete: :cascade add_foreign_key "user_synced_attributes_metadata", "users", on_delete: :cascade add_foreign_key "users_star_projects", "projects", name: "fk_22cd27ddfc", on_delete: :cascade add_foreign_key "web_hook_logs", "web_hooks", on_delete: :cascade diff --git a/doc/README.md b/doc/README.md index fb7a23e2750..05fa444657c 100644 --- a/doc/README.md +++ b/doc/README.md @@ -77,6 +77,7 @@ Manage your [repositories](user/project/repository/index.md) from the UI (user i - [Discussions](user/discussions/index.md): Threads, comments, and resolvable discussions in issues, commits, and merge requests. - [Issues](user/project/issues/index.md) - [Project issue Board](user/project/issue_board.md) +- [Group Issue Board](user/project/issue_board.md#group-issue-board) - [Issues and merge requests templates](user/project/description_templates.md): Create templates for submitting new issues and merge requests. - [Labels](user/project/labels.md): Categorize your issues or merge requests based on descriptive titles. - [Merge Requests](user/project/merge_requests/index.md) diff --git a/doc/api/README.md b/doc/api/README.md index b193ef4ab7f..b67500a9b9e 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -24,9 +24,11 @@ following locations: - [GitLab CI Config templates](templates/gitlab_ci_ymls.md) - [Groups](groups.md) - [Group Access Requests](access_requests.md) +- [Group Badges](group_badges.md) - [Group Members](members.md) - [Issues](issues.md) - [Issue Boards](boards.md) +- [Group Issue Boards](group_boards.md) - [Jobs](jobs.md) - [Keys](keys.md) - [Labels](labels.md) @@ -43,6 +45,7 @@ following locations: - [Pipeline Schedules](pipeline_schedules.md) - [Projects](projects.md) including setting Webhooks - [Project Access Requests](access_requests.md) +- [Project Badges](project_badges.md) - [Project import/export](project_import_export.md) - [Project Members](members.md) - [Project Snippets](project_snippets.md) diff --git a/doc/api/group_badges.md b/doc/api/group_badges.md new file mode 100644 index 00000000000..3e0683f378d --- /dev/null +++ b/doc/api/group_badges.md @@ -0,0 +1,191 @@ +# Group badges API + +## Placeholder tokens + +Badges support placeholders that will be replaced in real time in both the link and image URL. The allowed placeholders are: + +- **%{project_path}**: will be replaced by the project path. +- **%{project_id}**: will be replaced by the project id. +- **%{default_branch}**: will be replaced by the project default branch. +- **%{commit_sha}**: will be replaced by the last project's commit sha. + +Because these enpoints aren't inside a project's context, the information used to replace the placeholders will be +from the first group's project by creation date. If the group hasn't got any project the original URL with the placeholders will be returned. + +## List all badges of a group + +Gets a list of a group's badges. + +``` +GET /groups/:id/badges +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/:id/badges +``` + +Example response: + +```json +[ + { + "id": 1, + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "group" + }, + { + "id": 2, + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "group" + }, +] +``` + +## Get a badge of a group + +Gets a badge of a group. + +``` +GET /groups/:id/badges/:badge_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `badge_id` | integer | yes | The badge ID | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/:id/badges/:badge_id +``` + +Example response: + +```json +{ + "id": 1, + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "group" +} +``` + +## Add a badge to a group + +Adds a badge to a group. + +``` +POST /groups/:id/badges +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `link_url` | string | yes | URL of the badge link | +| `image_url` | string | yes | URL of the badge image | + +```bash +curl --request POST --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" --data "link_url=https://gitlab.com/gitlab-org/gitlab-ce/commits/master&image_url=https://shields.io/my/badge1&position=0" https://gitlab.example.com/api/v4/groups/:id/badges +``` + +Example response: + +```json +{ + "id": 1, + "link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "image_url": "https://shields.io/my/badge1", + "rendered_link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "rendered_image_url": "https://shields.io/my/badge1", + "kind": "group" +} +``` + +## Edit a badge of a group + +Updates a badge of a group. + +``` +PUT /groups/:id/badges/:badge_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `badge_id` | integer | yes | The badge ID | +| `link_url` | string | no | URL of the badge link | +| `image_url` | string | no | URL of the badge image | + +```bash +curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/:id/badges/:badge_id +``` + +Example response: + +```json +{ + "id": 1, + "link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "group" +} +``` + +## Remove a badge from a group + +Removes a badge from a group. + +``` +DELETE /groups/:id/badges/:badge_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `badge_id` | integer | yes | The badge ID | + +```bash +curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/:id/badges/:badge_id +``` + +## Preview a badge from a group + +Returns how the `link_url` and `image_url` final URLs would be after resolving the placeholder interpolation. + +``` +GET /groups/:id/badges/render +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `link_url` | string | yes | URL of the badge link| +| `image_url` | string | yes | URL of the badge image | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/:id/badges/render?link_url=http%3A%2F%2Fexample.com%2Fci_status.svg%3Fproject%3D%25%7Bproject_path%7D%26ref%3D%25%7Bdefault_branch%7D&image_url=https%3A%2F%2Fshields.io%2Fmy%2Fbadge +``` + +Example response: + +```json +{ + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", +} +``` diff --git a/doc/api/group_boards.md b/doc/api/group_boards.md new file mode 100644 index 00000000000..45a8544d6b1 --- /dev/null +++ b/doc/api/group_boards.md @@ -0,0 +1,284 @@ +# Group Issue Boards API + +Every API call to group boards must be authenticated. + +If a user is not a member of a group and the group is private, a `GET` +request will result in `404` status code. + +## Group Board + +Lists Issue Boards in the given group. + +``` +GET /groups/:id/boards +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/5/boards +``` + +Example response: + +```json +[ + { + "id": 1, + "group_id": 5, + "lists" : [ + { + "id" : 1, + "label" : { + "name" : "Testing", + "color" : "#F0AD4E", + "description" : null + }, + "position" : 1 + }, + { + "id" : 2, + "label" : { + "name" : "Ready", + "color" : "#FF0000", + "description" : null + }, + "position" : 2 + }, + { + "id" : 3, + "label" : { + "name" : "Production", + "color" : "#FF5F00", + "description" : null + }, + "position" : 3 + } + ] + } +] +``` + +## Single board + +Gets a single board. + +``` +GET /groups/:id/boards/:board_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `board_id` | integer | yes | The ID of a board | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/5/boards/1 +``` + +Example response: + +```json + { + "id": 1, + "group_id": 5, + "lists" : [ + { + "id" : 1, + "label" : { + "name" : "Testing", + "color" : "#F0AD4E", + "description" : null + }, + "position" : 1 + }, + { + "id" : 2, + "label" : { + "name" : "Ready", + "color" : "#FF0000", + "description" : null + }, + "position" : 2 + }, + { + "id" : 3, + "label" : { + "name" : "Production", + "color" : "#FF5F00", + "description" : null + }, + "position" : 3 + } + ] + } +``` + +## List board lists + +Get a list of the board's lists. +Does not include `backlog` and `closed` lists + +``` +GET /groups/:id/boards/:board_id/lists +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `board_id` | integer | yes | The ID of a board | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/5/boards/1/lists +``` + +Example response: + +```json +[ + { + "id" : 1, + "label" : { + "name" : "Testing", + "color" : "#F0AD4E", + "description" : null + }, + "position" : 1 + }, + { + "id" : 2, + "label" : { + "name" : "Ready", + "color" : "#FF0000", + "description" : null + }, + "position" : 2 + }, + { + "id" : 3, + "label" : { + "name" : "Production", + "color" : "#FF5F00", + "description" : null + }, + "position" : 3 + } +] +``` + +## Single board list + +Get a single board list. + +``` +GET /groups/:id/boards/:board_id/lists/:list_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `board_id` | integer | yes | The ID of a board | +| `list_id` | integer | yes | The ID of a board's list | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/5/boards/1/lists/1 +``` + +Example response: + +```json +{ + "id" : 1, + "label" : { + "name" : "Testing", + "color" : "#F0AD4E", + "description" : null + }, + "position" : 1 +} +``` + +## New board list + +Creates a new Issue Board list. + +``` +POST /groups/:id/boards/:board_id/lists +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `board_id` | integer | yes | The ID of a board | +| `label_id` | integer | yes | The ID of a label | + +```bash +curl --request POST --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/5/boards/1/lists?label_id=5 +``` + +Example response: + +```json +{ + "id" : 1, + "label" : { + "name" : "Testing", + "color" : "#F0AD4E", + "description" : null + }, + "position" : 1 +} +``` + +## Edit board list + +Updates an existing Issue Board list. This call is used to change list position. + +``` +PUT /groups/:id/boards/:board_id/lists/:list_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `board_id` | integer | yes | The ID of a board | +| `list_id` | integer | yes | The ID of a board's list | +| `position` | integer | yes | The position of the list | + +```bash +curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/group/5/boards/1/lists/1?position=2 +``` + +Example response: + +```json +{ + "id" : 1, + "label" : { + "name" : "Testing", + "color" : "#F0AD4E", + "description" : null + }, + "position" : 1 +} +``` + +## Delete a board list + +Only for admins and group owners. Soft deletes the board list in question. + +``` +DELETE /groups/:id/boards/:board_id/lists/:list_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | +| `board_id` | integer | yes | The ID of a board | +| `list_id` | integer | yes | The ID of a board's list | + +```bash +curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/5/boards/1/lists/1 +``` diff --git a/doc/api/groups.md b/doc/api/groups.md index f50558b58a6..1aed8aac64e 100644 --- a/doc/api/groups.md +++ b/doc/api/groups.md @@ -525,3 +525,7 @@ And to switch pages add: ``` [ce-15142]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/15142 + +## Group badges + +Read more in the [Group Badges](group_badges.md) documentation. diff --git a/doc/api/project_badges.md b/doc/api/project_badges.md new file mode 100644 index 00000000000..3f6e348b5b4 --- /dev/null +++ b/doc/api/project_badges.md @@ -0,0 +1,188 @@ +# Project badges API + +## Placeholder tokens + +Badges support placeholders that will be replaced in real time in both the link and image URL. The allowed placeholders are: + +- **%{project_path}**: will be replaced by the project path. +- **%{project_id}**: will be replaced by the project id. +- **%{default_branch}**: will be replaced by the project default branch. +- **%{commit_sha}**: will be replaced by the last project's commit sha. + +## List all badges of a project + +Gets a list of a project's badges and its group badges. + +``` +GET /projects/:id/badges +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/:id/badges +``` + +Example response: + +```json +[ + { + "id": 1, + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "project" + }, + { + "id": 2, + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "group" + }, +] +``` + +## Get a badge of a project + +Gets a badge of a project. + +``` +GET /projects/:id/badges/:badge_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | +| `badge_id` | integer | yes | The badge ID | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/:id/badges/:badge_id +``` + +Example response: + +```json +{ + "id": 1, + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "project" +} +``` + +## Add a badge to a project + +Adds a badge to a project. + +``` +POST /projects/:id/badges +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project ](README.md#namespaced-path-encoding) owned by the authenticated user | +| `link_url` | string | yes | URL of the badge link | +| `image_url` | string | yes | URL of the badge image | + +```bash +curl --request POST --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" --data "link_url=https://gitlab.com/gitlab-org/gitlab-ce/commits/master&image_url=https://shields.io/my/badge1&position=0" https://gitlab.example.com/api/v4/projects/:id/badges +``` + +Example response: + +```json +{ + "id": 1, + "link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "image_url": "https://shields.io/my/badge1", + "rendered_link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "rendered_image_url": "https://shields.io/my/badge1", + "kind": "project" +} +``` + +## Edit a badge of a project + +Updates a badge of a project. + +``` +PUT /projects/:id/badges/:badge_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | +| `badge_id` | integer | yes | The badge ID | +| `link_url` | string | no | URL of the badge link | +| `image_url` | string | no | URL of the badge image | + +```bash +curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/:id/badges/:badge_id +``` + +Example response: + +```json +{ + "id": 1, + "link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "https://gitlab.com/gitlab-org/gitlab-ce/commits/master", + "rendered_image_url": "https://shields.io/my/badge", + "kind": "project" +} +``` + +## Remove a badge from a project + +Removes a badge from a project. Only project's badges will be removed by using this endpoint. + +``` +DELETE /projects/:id/badges/:badge_id +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | +| `badge_id` | integer | yes | The badge ID | + +```bash +curl --request DELETE --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/:id/badges/:badge_id +``` + +## Preview a badge from a project + +Returns how the `link_url` and `image_url` final URLs would be after resolving the placeholder interpolation. + +``` +GET /projects/:id/badges/render +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | +| `link_url` | string | yes | URL of the badge link| +| `image_url` | string | yes | URL of the badge image | + +```bash +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/:id/badges/render?link_url=http%3A%2F%2Fexample.com%2Fci_status.svg%3Fproject%3D%25%7Bproject_path%7D%26ref%3D%25%7Bdefault_branch%7D&image_url=https%3A%2F%2Fshields.io%2Fmy%2Fbadge +``` + +Example response: + +```json +{ + "link_url": "http://example.com/ci_status.svg?project=%{project_path}&ref=%{default_branch}", + "image_url": "https://shields.io/my/badge", + "rendered_link_url": "http://example.com/ci_status.svg?project=example-org/example-project&ref=master", + "rendered_image_url": "https://shields.io/my/badge", +} +``` diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md index e442442c750..677765368a8 100644 --- a/doc/api/project_import_export.md +++ b/doc/api/project_import_export.md @@ -1,9 +1,89 @@ -# Project import API +# Project import/export API [Introduced][ce-41899] in GitLab 10.6 [See also the project import/export documentation](../user/project/settings/import_export.md) +## Schedule an export + +Start a new export. + +```http +POST /projects/:id/export +``` + +| Attribute | Type | Required | Description | +| --------- | -------------- | -------- | ---------------------------------------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | + +```console +curl --request POST --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/1/export +``` + +```json +{ + "message": "202 Accepted" +} +``` + +## Export status + +Get the status of export. + +```http +GET /projects/:id/export +``` + +| Attribute | Type | Required | Description | +| --------- | -------------- | -------- | ---------------------------------------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | + +```console +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/1/export +``` + +Status can be one of `none`, `started`, or `finished`. + +`_links` are only present when export has finished. + +```json +{ + "id": 1, + "description": "Itaque perspiciatis minima aspernatur corporis consequatur.", + "name": "Gitlab Test", + "name_with_namespace": "Gitlab Org / Gitlab Test", + "path": "gitlab-test", + "path_with_namespace": "gitlab-org/gitlab-test", + "created_at": "2017-08-29T04:36:44.383Z", + "export_status": "finished", + "_links": { + "api_url": "https://gitlab.example.com/api/v4/projects/1/export/download", + "web_url": "https://gitlab.example.com/gitlab-org/gitlab-test/download_export", + } +} +``` + +## Export download + +Download the finished export. + +```http +GET /projects/:id/export/download +``` + +| Attribute | Type | Required | Description | +| --------- | -------------- | -------- | ---------------------------------------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | + +```console +curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" --remote-header-name --remote-name https://gitlab.example.com/api/v4/projects/5/export/download +``` + +```console +ls *export.tar.gz +2017-12-05_22-11-148_namespace_project_export.tar.gz +``` + ## Import a file ```http diff --git a/doc/api/projects.md b/doc/api/projects.md index b6442cfac22..271ee91dc72 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -1340,3 +1340,7 @@ Read more in the [Project import/export](project_import_export.md) documentation ## Project members Read more in the [Project members](members.md) documentation. + +## Project badges + +Read more in the [Project Badges](project_badges.md) documentation. diff --git a/doc/development/automatic_ce_ee_merge.md b/doc/development/automatic_ce_ee_merge.md index cf6314f9521..a85e5b1b1cc 100644 --- a/doc/development/automatic_ce_ee_merge.md +++ b/doc/development/automatic_ce_ee_merge.md @@ -103,6 +103,99 @@ Notes: - You can use [`git rerere`](https://git-scm.com/blog/2010/03/08/rerere.html) to avoid resolving the same conflicts multiple times. +### Cherry-picking from CE to EE + +For avoiding merge conflicts, we use a method of creating equivalent branches +for CE and EE. If the `ee-compat-check` job fails, this process is required. + +This method only requires that you have cloned both CE and EE into your computer. +If you don't have them yet, please go ahead and clone them: + +- Clone CE repo: `git clone git@gitlab.com:gitlab-org/gitlab-ce.git` +- Clone EE repo: `git clone git@gitlab.com:gitlab-org/gitlab-ee.git` + +And the only additional setup we need is to add CE as remote of EE and vice-versa: + +- Open two terminal windows, one in CE, and another one in EE: + - In EE: `git remote add ce git@gitlab.com:gitlab-org/gitlab-ce.git` + - In CE: `git remote add ee git@gitlab.com:gitlab-org/gitlab-ee.git` + +That's all setup we need, so that we can cherry-pick a commit from CE to EE, and +from EE to CE. + +Now, every time you create an MR for CE and EE: + +1. Open two terminal windows, one in CE, and another one in EE +1. In the CE terminal: + 1. Create the CE branch, e.g., `branch-example` + 1. Make your changes and push a commit (commit A) + 1. Create the CE merge request in GitLab +1. In the EE terminal: + 1. Create the EE-equivalent branch ending with `-ee`, e.g., + `git checkout -b branch-example-ee` + 1. Fetch the CE branch: `git fetch ce branch-example` + 1. Cherry-pick the commit A: `git cherry-pick commit-A-SHA` + 1. If Git prompts you to fix the conflicts, do a `git status` + to check which files contain conflicts, fix them, save the files + 1. Add the changes with `git add .` but **DO NOT commit** them + 1. Continue cherry-picking: `git cherry-pick --continue` + 1. Push to EE: `git push origin branch-example-ee` +1. Create the EE-equivalent MR and link to the CE MR from the +description "Ports [CE-MR-LINK] to EE" +1. Once all the jobs are passing in both CE and EE, you've addressed the +feedback from your own team, and got them approved, the merge requests can be merged. +1. When both MRs are ready, the EE merge request will be merged first, and the +CE-equivalent will be merged next. + +**Important notes:** + +- The commit SHA can be easily found from the GitLab UI. From a merge request, +open the tab **Commits** and click the copy icon to copy the commit SHA. +- To cherry-pick a **commit range**, such as [A > B > C > D] use: + + ```shell + git cherry-pick "oldest-commit-SHA^..newest-commit-SHA" + ``` + + For example, suppose the commit A is the oldest, and its SHA is `4f5e4018c09ed797fdf446b3752f82e46f5af502`, + and the commit D is the newest, and its SHA is `80e1c9e56783bd57bd7129828ec20b252ebc0538`. + The cherry-pick command will be: + + ```shell + git cherry-pick "4f5e4018c09ed797fdf446b3752f82e46f5af502^..80e1c9e56783bd57bd7129828ec20b252ebc0538" + ``` + +- To cherry-pick a **merge commit**, use the flag `-m 1`. For example, suppose that the +merge commit SHA is `138f5e2f20289bb376caffa0303adb0cac859ce1`: + + ```shell + git cherry-pick -m 1 138f5e2f20289bb376caffa0303adb0cac859ce1 + ``` +- To cherry-pick multiple commits, such as B and D in a range [A > B > C > D], use: + + ```shell + git cherry-pick commmit-B-SHA commit-D-SHA + ``` + + For example, suppose commit B SHA = `4f5e4018c09ed797fdf446b3752f82e46f5af502`, + and the commit D SHA = `80e1c9e56783bd57bd7129828ec20b252ebc0538`. + The cherry-pick command will be: + + ```shell + git cherry-pick 4f5e4018c09ed797fdf446b3752f82e46f5af502 80e1c9e56783bd57bd7129828ec20b252ebc0538 + ``` + + This case is particularly useful when you have a merge commit in a sequence of + commits and you want to cherry-pick all but the merge commit. + +- If you push more commits to the CE branch, you can safely repeat the procedure +to cherry-pick them to the EE-equivalent branch. You can do that as many times as +necessary, using the same CE and EE branches. +- If you submitted the merge request to the CE repo and the `ee-compat-check` job passed, +you are not required to submit the EE-equivalent MR, but it's still recommended. If the +job failed, you are required to submit the EE MR so that you can fix the conflicts in EE +before merging your changes into CE. + --- [Return to Development documentation](README.md) diff --git a/doc/development/writing_documentation.md b/doc/development/writing_documentation.md index 403c9d08752..40c21e5355c 100644 --- a/doc/development/writing_documentation.md +++ b/doc/development/writing_documentation.md @@ -19,7 +19,7 @@ The one responsible for writing the first piece of documentation is the develope wrote the code. It's the job of the Product Manager to ensure all features are shipped with its docs, whether is a small or big change. At the pace GitLab evolves, this is the only way to keep the docs up-to-date. If you have any questions about it, -please ask a Technical Writer. Otherwise, when your content is ready, assign one of +ask a Technical Writer. Otherwise, when your content is ready, assign one of them to review it for you. We use the [monthly release blog post](https://about.gitlab.com/handbook/marketing/blog/release-posts/#monthly-releases) as a changelog checklist to ensure everything @@ -27,6 +27,8 @@ is documented. Whenever you submit a merge request for the documentation, use the documentation MR description template. +Please check the [documentation workflow](https://about.gitlab.com/handbook/product/technical-writing/workflow/) before getting started. + ### Documentation directory structure The documentation is structured based on the GitLab UI structure itself, @@ -40,7 +42,7 @@ all docs should be linked. Every new document should be cross-linked to its rela The directories `/workflow/`, `/gitlab-basics/`, `/university/`, and `/articles/` have been deprecated and the majority their docs have been moved to their correct location -in small iterations. Please don't create new docs in these folders. +in small iterations. Don't create new docs in these folders. To move a document from its location to another directory, read the section [changing document location](doc_styleguide.md#changing-document-location) of the doc style guide. @@ -116,6 +118,49 @@ choices: If your branch name matches any of the above, it will run only the docs tests. If it doesn't, the whole test suite will run (including docs). +### Merge requests for GitLab documentation + +Before getting started, make sure you read the introductory section +"[contributing to docs](#contributing-to-docs)" above and the +[tech writing workflow](https://about.gitlab.com/handbook/product/technical-writing/workflow/) +for GitLab Team members. + +- Use the current [merge request description template](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/.gitlab/merge_request_templates/Documentation.md) +- Use the correct [branch name](#branch-naming) +- Label the MR `Documentation` +- Assign the correct milestone (see note below) + + +NOTE: **Note:** +If the release version you want to add the documentation to has already been +frozen or released, use the label `Pick into X.Y` to get it merged into +the correct release. Avoid picking into a past release as much as you can, as +it increases the work of the release managers. + +#### Cherry-picking from CE to EE + +As we have the `master` branch of CE merged into EE once a day, it's common to +run into merge conflicts. To avoid them, we [test for merge conflicts against EE](#testing) +with the `ee-compat-check` job, and use the following method of creating equivalent +branches for CE and EE. + +Follow this [method for cherry-picking from CE to EE](automatic_ce_ee_merge.md#cherry-picking-from-ce-to-ee), with a few adjustments: + +- Create the [CE branch](#branch-naming) starting with `docs-`, + e.g.: `git checkout -b docs-example` +- Create the EE-equivalent branch ending with `-ee`, e.g., + `git checkout -b docs-example-ee` +- Once all the jobs are passing in CE and EE, and you've addressed the +feedback from your own team, assign the CE MR to a technical writer for review +- When both MRs are ready, the EE merge request will be merged first, and the +CE-equivalent will be merged next. +- Note that the review will occur only in the CE MR, as the EE MR +contains the same commits as the CE MR. +- If you have a few more changes that apply to the EE-version only, you can submit +a couple more commits to the EE branch, but ask the reviewer to review the EE merge request +additionally to the CE MR. If there are many EE-only changes though, start a new MR +to EE only. + ### Previewing the changes live If you want to preview the doc changes of your merge request live, you can use diff --git a/doc/install/requirements.md b/doc/install/requirements.md index b2c9177e6eb..1f2b4d9d3d9 100644 --- a/doc/install/requirements.md +++ b/doc/install/requirements.md @@ -137,6 +137,14 @@ CREATE EXTENSION pg_trgm; On some systems you may need to install an additional package (e.g. `postgresql-contrib`) for this extension to become available. +#### Additional requirements for GitLab Geo + +If you are using [GitLab Geo](https://docs.gitlab.com/ee/development/geo.html), the [tracking database](https://docs.gitlab.com/ee/development/geo.html#geo-tracking-database) also requires the `postgres_fdw` extension. + +``` +CREATE EXTENSION postgres_fdw; +``` + ## Unicorn Workers It's possible to increase the amount of unicorn workers and this will usually help to reduce the response time of the applications and increase the ability to handle parallel requests. diff --git a/doc/user/project/import/img/import_projects_from_repo_url.png b/doc/user/project/import/img/import_projects_from_repo_url.png Binary files differnew file mode 100644 index 00000000000..ec867da1087 --- /dev/null +++ b/doc/user/project/import/img/import_projects_from_repo_url.png diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md index e2b285678c3..72cc58546b7 100644 --- a/doc/user/project/import/index.md +++ b/doc/user/project/import/index.md @@ -10,6 +10,7 @@ 1. [From Perforce](perforce.md) 1. [From SVN](svn.md) 1. [From TFS](tfs.md) +1. [From repo by URL](repo_by_url.md) In addition to the specific migration documentation above, you can import any Git repository via HTTP from the New Project page. Be aware that if the diff --git a/doc/user/project/import/perforce.md b/doc/user/project/import/perforce.md index aa7508e1e8e..a1ea716b606 100644 --- a/doc/user/project/import/perforce.md +++ b/doc/user/project/import/perforce.md @@ -48,3 +48,9 @@ Here's a few links to get you started: - [git-p4 manual page](https://www.kernel.org/pub/software/scm/git/docs/git-p4.html) - [git-p4 example usage](https://git.wiki.kernel.org/index.php/Git-p4_Usage) - [Git book migration guide](https://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git#_perforce_import) + +Note that `git p4` and `git filter-branch` are not very good at +creating small and efficient Git pack files. So it might be a good +idea to spend time and CPU to properly repack your repository before +sending it for the first time to your GitLab server. See +[this StackOverflow question](https://stackoverflow.com/questions/28720151/git-gc-aggressive-vs-git-repack/). diff --git a/doc/user/project/import/repo_by_url.md b/doc/user/project/import/repo_by_url.md new file mode 100644 index 00000000000..f43e384de88 --- /dev/null +++ b/doc/user/project/import/repo_by_url.md @@ -0,0 +1,12 @@ +# Import project from repo by URL + +You can import your existing repositories by providing the Git URL: + +1. From your GitLab dashboard click **New project** +1. Switch to the **Import project** tab +1. Click on the **Repo by URL** button +1. Fill in the "Git repository URL" and the remaining project fields +1. Click **Create project** to being the import process +1. Once complete, you will be redirected to your newly created project + +![Import project by repo URL](img/import_projects_from_repo_url.png) diff --git a/doc/user/project/integrations/prometheus_library/kubernetes.md b/doc/user/project/integrations/prometheus_library/kubernetes.md index 02adc562028..8ac753c07bf 100644 --- a/doc/user/project/integrations/prometheus_library/kubernetes.md +++ b/doc/user/project/integrations/prometheus_library/kubernetes.md @@ -13,21 +13,18 @@ integration services must be enabled. | Name | Query | | ---- | ----- | -| Average Memory Usage (MB) | (sum(avg(container_memory_usage_bytes{container_name!="POD",environment="%{ci_environment_slug}"}) without (job))) / count(avg(container_memory_usage_bytes{container_name!="POD",environment="%{ci_environment_slug}"}) without (job)) /1024/1024 | -| Average CPU Utilization (%) | sum(avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="%{ci_environment_slug}"}[2m])) without (job)) * 100 | +| Average Memory Usage (MB) | avg(sum(container_memory_usage_bytes{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}) by (job)) without (job) / count(avg(container_memory_usage_bytes{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}) without (job)) /1024/1024 | +| Average CPU Utilization (%) | avg(sum(rate(container_cpu_usage_seconds_total{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}[15m])) by (job)) without (job) / count(sum(rate(container_cpu_usage_seconds_total{container_name!="POD",pod_name=~"^%{ci_environment_slug}-([^c].*|c([^a]|a([^n]|n([^a]|a([^r]|r[^y])))).*|)-(.*)",namespace="%{kube_namespace}"}[15m])) by (pod_name)) | -## Configuring Prometheus to monitor for Kubernetes node metrics +## Configuring Prometheus to monitor for Kubernetes metrics -In order for Prometheus to collect Kubernetes metrics, you first must have a -Prometheus server up and running. You have two options here: +Prometheus needs to be deployed into the cluster and configured properly in order to gather Kubernetes metrics. GitLab supports two methods for doing so: -- If you have an Omnibus based GitLab installation within your Kubernetes cluster, you can leverage the bundled Prometheus server to [monitor Kubernetes](../../../../administration/monitoring/prometheus/index.md#configuring-prometheus-to-monitor-kubernetes). -- To configure your own Prometheus server, you can follow the [Prometheus documentation](https://prometheus.io/docs/introduction/overview/) or [our guide](../../../../administration/monitoring/prometheus/index.md#configuring-your-own-prometheus-server-within-kubernetes). +- GitLab [integrates with Kubernetes](../../clusters/index.md), and can [deploy Prometheus into a connected cluster](../prometheus.html#managed-prometheus-on-kubernetes). It is automatically configured to collect Kubernetes metrics. +- To configure your own Prometheus server, you can follow the [Prometheus documentation](https://prometheus.io/docs/introduction/overview/). ## Specifying the Environment In order to isolate and only display relevant CPU and Memory metrics for a given environment, GitLab needs a method to detect which containers it is running. Because these metrics are tracked at the container level, traditional Kubernetes labels are not available. Instead, the [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) or [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) name should begin with [CI_ENVIRONMENT_SLUG](../../../../ci/variables/README.md#predefined-variables-environment-variables). It can be followed by a `-` and additional content if desired. For example, a deployment name of `review-homepage-5620p5` would match the `review/homepage` environment. - -If you are using [GitLab Auto-Deploy](../../../../ci/autodeploy/index.md) and one of the two [provided Kubernetes monitoring solutions](../prometheus.md#getting-started-with-prometheus-monitoring), the `environment` label will be automatically added. diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md index bc6306927e1..550ad4a8b1f 100644 --- a/doc/user/project/issue_board.md +++ b/doc/user/project/issue_board.md @@ -235,6 +235,16 @@ to another list the label changes and a system not is recorded. [Developers and up](../permissions.md) can use all the functionality of the Issue Board, that is create/delete lists and drag issues around. +## Group Issue Board + +>Introduced in GitLab 10.6 + +Group issue board is analogous to project-level issue board and it is accessible at the group +navigation level. A group-level issue board allows you to view all issues from all projects in that group +(currently, it does not see issues from projects in subgroups). Similarly, you can only filter by group labels for these +boards. When updating milestones and labels for an issue through the sidebar update mechanism, again only +group-level objects are available. + ## Tips A few things to remember: diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md index dedf102fc37..5ddeb014b30 100644 --- a/doc/user/project/settings/import_export.md +++ b/doc/user/project/settings/import_export.md @@ -31,7 +31,8 @@ with all their related data and be moved into a new GitLab instance. | GitLab version | Import/Export version | | ---------------- | --------------------- | -| 10.4 to current | 0.2.2 | +| 10.6 to current | 0.2.3 | +| 10.4 | 0.2.2 | | 10.3 | 0.2.1 | | 10.0 | 0.2.0 | | 9.4.0 | 0.1.8 | diff --git a/lib/api/api.rb b/lib/api/api.rb index 754549f72f0..5e93c129bc8 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -108,6 +108,7 @@ module API mount ::API::AccessRequests mount ::API::Applications mount ::API::AwardEmoji + mount ::API::Badges mount ::API::Boards mount ::API::Branches mount ::API::BroadcastMessages @@ -120,6 +121,7 @@ module API mount ::API::Events mount ::API::Features mount ::API::Files + mount ::API::GroupBoards mount ::API::Groups mount ::API::GroupMilestones mount ::API::Internal @@ -138,6 +140,7 @@ module API mount ::API::PagesDomains mount ::API::Pipelines mount ::API::PipelineSchedules + mount ::API::ProjectExport mount ::API::ProjectImport mount ::API::ProjectHooks mount ::API::Projects diff --git a/lib/api/badges.rb b/lib/api/badges.rb new file mode 100644 index 00000000000..334948b2995 --- /dev/null +++ b/lib/api/badges.rb @@ -0,0 +1,134 @@ +module API + class Badges < Grape::API + include PaginationParams + + before { authenticate_non_get! } + + helpers ::API::Helpers::BadgesHelpers + + helpers do + def find_source_if_admin(source_type) + source = find_source(source_type, params[:id]) + + authorize_admin_source!(source_type, source) + + source + end + end + + %w[group project].each do |source_type| + params do + requires :id, type: String, desc: "The ID of a #{source_type}" + end + resource source_type.pluralize, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do + desc "Gets a list of #{source_type} badges viewable by the authenticated user." do + detail 'This feature was introduced in GitLab 10.6.' + success Entities::Badge + end + params do + use :pagination + end + get ":id/badges" do + source = find_source(source_type, params[:id]) + + present_badges(source, paginate(source.badges)) + end + + desc "Preview a badge from a #{source_type}." do + detail 'This feature was introduced in GitLab 10.6.' + success Entities::BasicBadgeDetails + end + params do + requires :link_url, type: String, desc: 'URL of the badge link' + requires :image_url, type: String, desc: 'URL of the badge image' + end + get ":id/badges/render" do + authenticate! + + source = find_source_if_admin(source_type) + + badge = ::Badges::BuildService.new(declared_params(include_missing: false)) + .execute(source) + + if badge.valid? + present_badges(source, badge, with: Entities::BasicBadgeDetails) + else + render_validation_error!(badge) + end + end + + desc "Gets a badge of a #{source_type}." do + detail 'This feature was introduced in GitLab 10.6.' + success Entities::Badge + end + params do + requires :badge_id, type: Integer, desc: 'The badge ID' + end + get ":id/badges/:badge_id" do + source = find_source(source_type, params[:id]) + badge = find_badge(source) + + present_badges(source, badge) + end + + desc "Adds a badge to a #{source_type}." do + detail 'This feature was introduced in GitLab 10.6.' + success Entities::Badge + end + params do + requires :link_url, type: String, desc: 'URL of the badge link' + requires :image_url, type: String, desc: 'URL of the badge image' + end + post ":id/badges" do + source = find_source_if_admin(source_type) + + badge = ::Badges::CreateService.new(declared_params(include_missing: false)).execute(source) + + if badge.persisted? + present_badges(source, badge) + else + render_validation_error!(badge) + end + end + + desc "Updates a badge of a #{source_type}." do + detail 'This feature was introduced in GitLab 10.6.' + success Entities::Badge + end + params do + optional :link_url, type: String, desc: 'URL of the badge link' + optional :image_url, type: String, desc: 'URL of the badge image' + end + put ":id/badges/:badge_id" do + source = find_source_if_admin(source_type) + + badge = ::Badges::UpdateService.new(declared_params(include_missing: false)) + .execute(find_badge(source)) + + if badge.valid? + present_badges(source, badge) + else + render_validation_error!(badge) + end + end + + desc 'Removes a badge from a project or group.' do + detail 'This feature was introduced in GitLab 10.6.' + end + params do + requires :badge_id, type: Integer, desc: 'The badge ID' + end + delete ":id/badges/:badge_id" do + source = find_source_if_admin(source_type) + badge = find_badge(source) + + if badge.is_a?(GroupBadge) && source.is_a?(Project) + error!('To delete a Group badge please use the Group endpoint', 403) + end + + destroy_conditionally!(badge) + end + end + end + end +end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 0c8ec7dd5f5..f39906270d8 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -91,6 +91,21 @@ module API expose :created_at end + class ProjectExportStatus < ProjectIdentity + include ::API::Helpers::RelatedResourcesHelpers + + expose :export_status + expose :_links, if: lambda { |project, _options| project.export_status == :finished } do + expose :api_url do |project| + expose_url(api_v4_projects_export_download_path(id: project.id)) + end + + expose :web_url do |project| + Gitlab::Routing.url_helpers.download_export_project_url(project) + end + end + end + class ProjectImportStatus < ProjectIdentity expose :import_status @@ -1235,5 +1250,23 @@ module API expose :startline expose :project_id end + + class BasicBadgeDetails < Grape::Entity + expose :link_url + expose :image_url + expose :rendered_link_url do |badge, options| + badge.rendered_link_url(options.fetch(:project, nil)) + end + expose :rendered_image_url do |badge, options| + badge.rendered_image_url(options.fetch(:project, nil)) + end + end + + class Badge < BasicBadgeDetails + expose :id + expose :kind do |badge| + badge.type == 'ProjectBadge' ? 'project' : 'group' + end + end end end diff --git a/lib/api/group_boards.rb b/lib/api/group_boards.rb new file mode 100644 index 00000000000..aa9fff25fc8 --- /dev/null +++ b/lib/api/group_boards.rb @@ -0,0 +1,117 @@ +module API + class GroupBoards < Grape::API + include BoardsResponses + include PaginationParams + + before do + authenticate! + end + + helpers do + def board_parent + user_group + end + end + + params do + requires :id, type: String, desc: 'The ID of a group' + end + + resource :groups, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do + segment ':id/boards' do + desc 'Find a group board' do + detail 'This feature was introduced in 10.6' + success ::API::Entities::Board + end + get '/:board_id' do + present board, with: ::API::Entities::Board + end + + desc 'Get all group boards' do + detail 'This feature was introduced in 10.6' + success Entities::Board + end + params do + use :pagination + end + get '/' do + present paginate(board_parent.boards), with: Entities::Board + end + end + + params do + requires :board_id, type: Integer, desc: 'The ID of a board' + end + segment ':id/boards/:board_id' do + desc 'Get the lists of a group board' do + detail 'Does not include backlog and closed lists. This feature was introduced in 10.6' + success Entities::List + end + params do + use :pagination + end + get '/lists' do + present paginate(board_lists), with: Entities::List + end + + desc 'Get a list of a group board' do + detail 'This feature was introduced in 10.6' + success Entities::List + end + params do + requires :list_id, type: Integer, desc: 'The ID of a list' + end + get '/lists/:list_id' do + present board_lists.find(params[:list_id]), with: Entities::List + end + + desc 'Create a new board list' do + detail 'This feature was introduced in 10.6' + success Entities::List + end + params do + requires :label_id, type: Integer, desc: 'The ID of an existing label' + end + post '/lists' do + unless available_labels_for(board_parent).exists?(params[:label_id]) + render_api_error!({ error: 'Label not found!' }, 400) + end + + authorize!(:admin_list, user_group) + + create_list + end + + desc 'Moves a board list to a new position' do + detail 'This feature was introduced in 10.6' + success Entities::List + end + params do + requires :list_id, type: Integer, desc: 'The ID of a list' + requires :position, type: Integer, desc: 'The position of the list' + end + put '/lists/:list_id' do + list = board_lists.find(params[:list_id]) + + authorize!(:admin_list, user_group) + + move_list(list) + end + + desc 'Delete a board list' do + detail 'This feature was introduced in 10.6' + success Entities::List + end + params do + requires :list_id, type: Integer, desc: 'The ID of a board list' + end + delete "/lists/:list_id" do + authorize!(:admin_list, user_group) + list = board_lists.find(params[:list_id]) + + destroy_list(list) + end + end + end + end +end diff --git a/lib/api/helpers/badges_helpers.rb b/lib/api/helpers/badges_helpers.rb new file mode 100644 index 00000000000..1f8afbf3c90 --- /dev/null +++ b/lib/api/helpers/badges_helpers.rb @@ -0,0 +1,28 @@ +module API + module Helpers + module BadgesHelpers + include ::API::Helpers::MembersHelpers + + def find_badge(source) + source.badges.find(params[:badge_id]) + end + + def present_badges(source, records, options = {}) + entity_type = options[:with] || Entities::Badge + badge_params = badge_source_params(source).merge(with: entity_type) + + present records, badge_params + end + + def badge_source_params(source) + project = if source.is_a?(Project) + source + else + GroupProjectsFinder.new(group: source, current_user: current_user).execute.first + end + + { project: project } + end + end + end +end diff --git a/lib/api/job_artifacts.rb b/lib/api/job_artifacts.rb index 2a8fa7659bf..47e5eeab31d 100644 --- a/lib/api/job_artifacts.rb +++ b/lib/api/job_artifacts.rb @@ -2,20 +2,28 @@ module API class JobArtifacts < Grape::API before { authenticate_non_get! } + # EE::API::JobArtifacts would override the following helpers + helpers do + def authorize_download_artifacts! + authorize_read_builds! + end + end + params do requires :id, type: String, desc: 'The ID of a project' end resource :projects, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do - desc 'Download the artifacts file from a job' do + desc 'Download the artifacts archive from a job' do detail 'This feature was introduced in GitLab 8.10' end params do requires :ref_name, type: String, desc: 'The ref from repository' requires :job, type: String, desc: 'The name for the job' end + route_setting :authentication, job_token_allowed: true get ':id/jobs/artifacts/:ref_name/download', requirements: { ref_name: /.+/ } do - authorize_read_builds! + authorize_download_artifacts! builds = user_project.latest_successful_builds_for(params[:ref_name]) latest_build = builds.find_by!(name: params[:job]) @@ -23,14 +31,15 @@ module API present_artifacts!(latest_build.artifacts_file) end - desc 'Download the artifacts file from a job' do + desc 'Download the artifacts archive from a job' do detail 'This feature was introduced in GitLab 8.5' end params do requires :job_id, type: Integer, desc: 'The ID of a job' end + route_setting :authentication, job_token_allowed: true get ':id/jobs/:job_id/artifacts' do - authorize_read_builds! + authorize_download_artifacts! build = find_build!(params[:job_id]) diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 8c02972b421..ead1bb7957b 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -6,6 +6,32 @@ module API helpers ::Gitlab::IssuableMetadata + # EE::API::MergeRequests would override the following helpers + helpers do + params :optional_params_ee do + end + + params :merge_params_ee do + end + + def update_merge_request_ee(merge_request) + end + end + + def self.update_params_at_least_one_of + %i[ + assignee_id + description + labels + milestone_id + remove_source_branch + state_event + target_branch + title + discussion_locked + ] + end + helpers do def find_merge_requests(args = {}) args = declared_params.merge(args) @@ -31,6 +57,12 @@ module API mr.all_pipelines end + def check_sha_param!(params, merge_request) + if params[:sha] && merge_request.diff_head_sha != params[:sha] + render_api_error!("SHA does not match HEAD of source branch: #{merge_request.diff_head_sha}", 409) + end + end + params :merge_requests_params do optional :state, type: String, values: %w[opened closed merged all], default: 'all', desc: 'Return opened, closed, merged, or all merge requests' @@ -106,16 +138,14 @@ module API render_api_error!(errors, 400) end - params :optional_params_ce do + params :optional_params do optional :description, type: String, desc: 'The description of the merge request' optional :assignee_id, type: Integer, desc: 'The ID of a user to assign the merge request' optional :milestone_id, type: Integer, desc: 'The ID of a milestone to assign the merge request' optional :labels, type: String, desc: 'Comma-separated list of label names' optional :remove_source_branch, type: Boolean, desc: 'Remove source branch when merging' - end - params :optional_params do - use :optional_params_ce + use :optional_params_ee end end @@ -240,18 +270,6 @@ module API success Entities::MergeRequest end params do - # CE - at_least_one_of_ce = [ - :assignee_id, - :description, - :labels, - :milestone_id, - :remove_source_branch, - :state_event, - :target_branch, - :title, - :discussion_locked - ] optional :title, type: String, allow_blank: false, desc: 'The title of the merge request' optional :target_branch, type: String, allow_blank: false, desc: 'The target branch' optional :state_event, type: String, values: %w[close reopen], @@ -259,7 +277,7 @@ module API optional :discussion_locked, type: Boolean, desc: 'Whether the MR discussion is locked' use :optional_params - at_least_one_of(*at_least_one_of_ce) + at_least_one_of(*::API::MergeRequests.update_params_at_least_one_of) end put ':id/merge_requests/:merge_request_iid' do Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42318') @@ -282,13 +300,14 @@ module API success Entities::MergeRequest end params do - # CE optional :merge_commit_message, type: String, desc: 'Custom merge commit message' optional :should_remove_source_branch, type: Boolean, desc: 'When true, the source branch will be deleted if possible' optional :merge_when_pipeline_succeeds, type: Boolean, desc: 'When true, this merge request will be merged when the pipeline succeeds' optional :sha, type: String, desc: 'When present, must have the HEAD SHA of the source branch' + + use :merge_params_ee end put ':id/merge_requests/:merge_request_iid/merge' do Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42317') @@ -304,9 +323,9 @@ module API render_api_error!('Branch cannot be merged', 406) unless merge_request.mergeable?(skip_ci_check: merge_when_pipeline_succeeds) - if params[:sha] && merge_request.diff_head_sha != params[:sha] - render_api_error!("SHA does not match HEAD of source branch: #{merge_request.diff_head_sha}", 409) - end + check_sha_param!(params, merge_request) + + update_merge_request_ee(merge_request) merge_params = { commit_message: params[:merge_commit_message], diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb new file mode 100644 index 00000000000..6ec2626df1a --- /dev/null +++ b/lib/api/project_export.rb @@ -0,0 +1,41 @@ +module API + class ProjectExport < Grape::API + before do + not_found! unless Gitlab::CurrentSettings.project_export_enabled? + authorize_admin_project + end + + params do + requires :id, type: String, desc: 'The ID of a project' + end + resource :projects, requirements: { id: %r{[^/]+} } do + desc 'Get export status' do + detail 'This feature was introduced in GitLab 10.6.' + success Entities::ProjectExportStatus + end + get ':id/export' do + present user_project, with: Entities::ProjectExportStatus + end + + desc 'Download export' do + detail 'This feature was introduced in GitLab 10.6.' + end + get ':id/export/download' do + path = user_project.export_project_path + + render_api_error!('404 Not found or has expired', 404) unless path + + present_file!(path, File.basename(path), 'application/gzip') + end + + desc 'Start export' do + detail 'This feature was introduced in GitLab 10.6.' + end + post ':id/export' do + user_project.add_export_job(current_user: current_user) + + accepted! + end + end + end +end diff --git a/lib/api/runner.rb b/lib/api/runner.rb index 91cdc564002..7e6c33ec33d 100644 --- a/lib/api/runner.rb +++ b/lib/api/runner.rb @@ -204,6 +204,7 @@ module API optional 'file.path', type: String, desc: %q(path to locally stored body (generated by Workhorse)) optional 'file.name', type: String, desc: %q(real filename as send in Content-Disposition (generated by Workhorse)) optional 'file.type', type: String, desc: %q(real content type as send in Content-Type (generated by Workhorse)) + optional 'file.sha256', type: String, desc: %q(sha256 checksum of the file) optional 'metadata.path', type: String, desc: %q(path to locally stored body (generated by Workhorse)) optional 'metadata.name', type: String, desc: %q(filename (generated by Workhorse)) end @@ -224,7 +225,7 @@ module API expire_in = params['expire_in'] || Gitlab::CurrentSettings.current_application_settings.default_artifacts_expire_in - job.build_job_artifacts_archive(project: job.project, file_type: :archive, file: artifacts, expire_in: expire_in) + job.build_job_artifacts_archive(project: job.project, file_type: :archive, file: artifacts, file_sha256: params['file.sha256'], expire_in: expire_in) job.build_job_artifacts_metadata(project: job.project, file_type: :metadata, file: metadata, expire_in: expire_in) if metadata job.artifacts_expire_in = expire_in diff --git a/lib/banzai/filter/commit_reference_filter.rb b/lib/banzai/filter/commit_reference_filter.rb index eedb95197aa..43bf4fc6565 100644 --- a/lib/banzai/filter/commit_reference_filter.rb +++ b/lib/banzai/filter/commit_reference_filter.rb @@ -18,7 +18,8 @@ module Banzai def find_object(project, id) if project && project.valid_repo? - project.commit(id) + # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/43894 + Gitlab::GitalyClient.allow_n_plus_1_calls { project.commit(id) } end end diff --git a/lib/banzai/filter/markdown_engines/common_mark.rb b/lib/banzai/filter/markdown_engines/common_mark.rb new file mode 100644 index 00000000000..bc9597df894 --- /dev/null +++ b/lib/banzai/filter/markdown_engines/common_mark.rb @@ -0,0 +1,45 @@ +# `CommonMark` markdown engine for GitLab's Banzai markdown filter. +# This module is used in Banzai::Filter::MarkdownFilter. +# Used gem is `commonmarker` which is a ruby wrapper for libcmark (CommonMark parser) +# including GitHub's GFM extensions. +# Homepage: https://github.com/gjtorikian/commonmarker + +module Banzai + module Filter + module MarkdownEngines + class CommonMark + EXTENSIONS = [ + :autolink, # provides support for automatically converting URLs to anchor tags. + :strikethrough, # provides support for strikethroughs. + :table, # provides support for tables. + :tagfilter # strips out several "unsafe" HTML tags from being used: https://github.github.com/gfm/#disallowed-raw-html-extension- + ].freeze + + PARSE_OPTIONS = [ + :FOOTNOTES, # parse footnotes. + :STRIKETHROUGH_DOUBLE_TILDE, # parse strikethroughs by double tildes (as redcarpet does). + :VALIDATE_UTF8 # replace illegal sequences with the replacement character U+FFFD. + ].freeze + + # The `:GITHUB_PRE_LANG` option is not used intentionally because + # it renders a fence block with language as `<pre lang="LANG"><code>some code\n</code></pre>` + # while GitLab's syntax is `<pre><code lang="LANG">some code\n</code></pre>`. + # If in the future the syntax is about to be made GitHub-compatible, please, add `:GITHUB_PRE_LANG` render option below + # and remove `code_block` method from `lib/banzai/renderer/common_mark/html.rb`. + RENDER_OPTIONS = [ + :DEFAULT # default rendering system. Nothing special. + ].freeze + + def initialize + @renderer = Banzai::Renderer::CommonMark::HTML.new(options: RENDER_OPTIONS) + end + + def render(text) + doc = CommonMarker.render_doc(text, PARSE_OPTIONS, EXTENSIONS) + + @renderer.render(doc) + end + end + end + end +end diff --git a/lib/banzai/filter/markdown_engines/redcarpet.rb b/lib/banzai/filter/markdown_engines/redcarpet.rb new file mode 100644 index 00000000000..ac99941fefa --- /dev/null +++ b/lib/banzai/filter/markdown_engines/redcarpet.rb @@ -0,0 +1,32 @@ +# `Redcarpet` markdown engine for GitLab's Banzai markdown filter. +# This module is used in Banzai::Filter::MarkdownFilter. +# Used gem is `redcarpet` which is a ruby library for markdown processing. +# Homepage: https://github.com/vmg/redcarpet + +module Banzai + module Filter + module MarkdownEngines + class Redcarpet + OPTIONS = { + fenced_code_blocks: true, + footnotes: true, + lax_spacing: true, + no_intra_emphasis: true, + space_after_headers: true, + strikethrough: true, + superscript: true, + tables: true + }.freeze + + def initialize + html_renderer = Banzai::Renderer::Redcarpet::HTML.new + @renderer = ::Redcarpet::Markdown.new(html_renderer, OPTIONS) + end + + def render(text) + @renderer.render(text) + end + end + end + end +end diff --git a/lib/banzai/filter/markdown_filter.rb b/lib/banzai/filter/markdown_filter.rb index 9cac303e645..c1e2b680240 100644 --- a/lib/banzai/filter/markdown_filter.rb +++ b/lib/banzai/filter/markdown_filter.rb @@ -1,34 +1,31 @@ module Banzai module Filter class MarkdownFilter < HTML::Pipeline::TextFilter - # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use - REDCARPET_OPTIONS = { - fenced_code_blocks: true, - footnotes: true, - lax_spacing: true, - no_intra_emphasis: true, - space_after_headers: true, - strikethrough: true, - superscript: true, - tables: true - }.freeze - def initialize(text, context = nil, result = nil) - super text, context, result - @text = @text.delete "\r" + super(text, context, result) + + @renderer = renderer(context[:markdown_engine]).new + @text = @text.delete("\r") end def call - html = self.class.renderer.render(@text) - html.rstrip! - html + @renderer.render(@text).rstrip + end + + private + + DEFAULT_ENGINE = :redcarpet + + def engine(engine_from_context) + engine_from_context ||= DEFAULT_ENGINE + + engine_from_context.to_s.classify end - def self.renderer - Thread.current[:banzai_markdown_renderer] ||= begin - renderer = Banzai::Renderer::HTML.new - Redcarpet::Markdown.new(renderer, REDCARPET_OPTIONS) - end + def renderer(engine_from_context) + "Banzai::Filter::MarkdownEngines::#{engine(engine_from_context)}".constantize + rescue NameError + raise NameError, "`#{engine_from_context}` is unknown markdown engine" end end end diff --git a/lib/banzai/filter/syntax_highlight_filter.rb b/lib/banzai/filter/syntax_highlight_filter.rb index 0ac7e231b5b..6dbf0d68fe8 100644 --- a/lib/banzai/filter/syntax_highlight_filter.rb +++ b/lib/banzai/filter/syntax_highlight_filter.rb @@ -1,3 +1,4 @@ +require 'rouge/plugins/common_mark' require 'rouge/plugins/redcarpet' module Banzai diff --git a/lib/banzai/renderer/common_mark/html.rb b/lib/banzai/renderer/common_mark/html.rb new file mode 100644 index 00000000000..c7a54629f31 --- /dev/null +++ b/lib/banzai/renderer/common_mark/html.rb @@ -0,0 +1,21 @@ +module Banzai + module Renderer + module CommonMark + class HTML < CommonMarker::HtmlRenderer + def code_block(node) + block do + code = node.string_content + lang = node.fence_info + lang_attr = lang.present? ? %Q{ lang="#{lang}"} : '' + result = + "<pre>" \ + "<code#{lang_attr}>#{html_escape(code)}</code>" \ + "</pre>" + + out(result) + end + end + end + end + end +end diff --git a/lib/banzai/renderer/html.rb b/lib/banzai/renderer/html.rb deleted file mode 100644 index 252caa35947..00000000000 --- a/lib/banzai/renderer/html.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Banzai - module Renderer - class HTML < Redcarpet::Render::HTML - def block_code(code, lang) - lang_attr = lang ? %Q{ lang="#{lang}"} : '' - - "\n<pre>" \ - "<code#{lang_attr}>#{html_escape(code)}</code>" \ - "</pre>" - end - end - end -end diff --git a/lib/banzai/renderer/redcarpet/html.rb b/lib/banzai/renderer/redcarpet/html.rb new file mode 100644 index 00000000000..94df5d8b1e1 --- /dev/null +++ b/lib/banzai/renderer/redcarpet/html.rb @@ -0,0 +1,15 @@ +module Banzai + module Renderer + module Redcarpet + class HTML < ::Redcarpet::Render::HTML + def block_code(code, lang) + lang_attr = lang ? %Q{ lang="#{lang}"} : '' + + "\n<pre>" \ + "<code#{lang_attr}>#{html_escape(code)}</code>" \ + "</pre>" + end + end + end + end +end diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb index 86393ee254d..f5ccf952cf9 100644 --- a/lib/gitlab/auth.rb +++ b/lib/gitlab/auth.rb @@ -40,8 +40,8 @@ module Gitlab end def find_with_user_password(login, password) - # Avoid resource intensive login checks if password is not provided - return unless password.present? + # Avoid resource intensive checks if login credentials are not provided + return unless login.present? && password.present? # Nothing to do here if internal auth is disabled and LDAP is # not configured @@ -50,14 +50,26 @@ module Gitlab Gitlab::Auth::UniqueIpsLimiter.limit_user! do user = User.by_login(login) - # If no user is found, or it's an LDAP server, try LDAP. - # LDAP users are only authenticated via LDAP - if user.nil? || user.ldap_user? - # Second chance - try LDAP authentication - Gitlab::Auth::LDAP::Authentication.login(login, password) - elsif Gitlab::CurrentSettings.password_authentication_enabled_for_git? - user if user.active? && user.valid_password?(password) + return if user && !user.active? + + authenticators = [] + + if user + authenticators << Gitlab::Auth::OAuth::Provider.authentication(user, 'database') + + # Add authenticators for all identities if user is not nil + user&.identities&.each do |identity| + authenticators << Gitlab::Auth::OAuth::Provider.authentication(user, identity.provider) + end + else + # If no user is provided, try LDAP. + # LDAP users are only authenticated via LDAP + authenticators << Gitlab::Auth::LDAP::Authentication end + + authenticators.compact! + + user if authenticators.find { |auth| auth.login(login, password) } end end diff --git a/lib/gitlab/auth/database/authentication.rb b/lib/gitlab/auth/database/authentication.rb new file mode 100644 index 00000000000..260a77058a4 --- /dev/null +++ b/lib/gitlab/auth/database/authentication.rb @@ -0,0 +1,16 @@ +# These calls help to authenticate to OAuth provider by providing username and password +# + +module Gitlab + module Auth + module Database + class Authentication < Gitlab::Auth::OAuth::Authentication + def login(login, password) + return false unless Gitlab::CurrentSettings.password_authentication_enabled_for_git? + + user&.valid_password?(password) + end + end + end + end +end diff --git a/lib/gitlab/auth/ldap/authentication.rb b/lib/gitlab/auth/ldap/authentication.rb index cbb9cf4bb9c..e70c3ab6b46 100644 --- a/lib/gitlab/auth/ldap/authentication.rb +++ b/lib/gitlab/auth/ldap/authentication.rb @@ -7,7 +7,7 @@ module Gitlab module Auth module LDAP - class Authentication + class Authentication < Gitlab::Auth::OAuth::Authentication def self.login(login, password) return unless Gitlab::Auth::LDAP::Config.enabled? return unless login.present? && password.present? @@ -28,11 +28,7 @@ module Gitlab Gitlab::Auth::LDAP::Config.providers end - attr_accessor :provider, :ldap_user - - def initialize(provider) - @provider = provider - end + attr_accessor :ldap_user def login(login, password) @ldap_user = adapter.bind_as( @@ -62,7 +58,7 @@ module Gitlab end def user - return nil unless ldap_user + return unless ldap_user Gitlab::Auth::LDAP::User.find_by_uid_and_provider(ldap_user.dn, provider) end diff --git a/lib/gitlab/auth/o_auth/authentication.rb b/lib/gitlab/auth/o_auth/authentication.rb new file mode 100644 index 00000000000..ed03b9f8b40 --- /dev/null +++ b/lib/gitlab/auth/o_auth/authentication.rb @@ -0,0 +1,21 @@ +# These calls help to authenticate to OAuth provider by providing username and password +# + +module Gitlab + module Auth + module OAuth + class Authentication + attr_reader :provider, :user + + def initialize(provider, user = nil) + @provider = provider + @user = user + end + + def login(login, password) + raise NotImplementedError + end + end + end + end +end diff --git a/lib/gitlab/auth/o_auth/provider.rb b/lib/gitlab/auth/o_auth/provider.rb index f8ab8ee1388..5fb61ffe00d 100644 --- a/lib/gitlab/auth/o_auth/provider.rb +++ b/lib/gitlab/auth/o_auth/provider.rb @@ -8,11 +8,28 @@ module Gitlab "google_oauth2" => "Google" }.freeze + def self.authentication(user, provider) + return unless user + return unless enabled?(provider) + + authenticator = + case provider + when /^ldap/ + Gitlab::Auth::LDAP::Authentication + when 'database' + Gitlab::Auth::Database::Authentication + end + + authenticator&.new(provider, user) + end + def self.providers Devise.omniauth_providers end def self.enabled?(name) + return true if name == 'database' + providers.include?(name.to_sym) end diff --git a/lib/gitlab/auth/o_auth/user.rb b/lib/gitlab/auth/o_auth/user.rb index acd785bb02d..b6a96081278 100644 --- a/lib/gitlab/auth/o_auth/user.rb +++ b/lib/gitlab/auth/o_auth/user.rb @@ -161,7 +161,7 @@ module Gitlab def find_by_uid_and_provider identity = Identity.with_extern_uid(auth_hash.provider, auth_hash.uid).take - identity && identity.user + identity&.user end def build_new_user diff --git a/lib/gitlab/ci/charts.rb b/lib/gitlab/ci/charts.rb index 525563a97f5..46ed330dbbf 100644 --- a/lib/gitlab/ci/charts.rb +++ b/lib/gitlab/ci/charts.rb @@ -68,10 +68,11 @@ module Gitlab class YearChart < Chart include MonthlyInterval + attr_reader :to, :from def initialize(*) - @to = Date.today.end_of_month - @from = @to.years_ago(1).beginning_of_month + @to = Date.today.end_of_month.end_of_day + @from = @to.years_ago(1).beginning_of_month.beginning_of_day @format = '%d %B %Y' super @@ -80,10 +81,11 @@ module Gitlab class MonthChart < Chart include DailyInterval + attr_reader :to, :from def initialize(*) - @to = Date.today - @from = @to - 30.days + @to = Date.today.end_of_day + @from = 1.month.ago.beginning_of_day @format = '%d %B' super @@ -92,10 +94,11 @@ module Gitlab class WeekChart < Chart include DailyInterval + attr_reader :to, :from def initialize(*) - @to = Date.today - @from = @to - 7.days + @to = Date.today.end_of_day + @from = 1.week.ago.beginning_of_day @format = '%d %B' super diff --git a/lib/gitlab/ci/trace.rb b/lib/gitlab/ci/trace.rb index f2e5124c8a8..cedf4171ab1 100644 --- a/lib/gitlab/ci/trace.rb +++ b/lib/gitlab/ci/trace.rb @@ -1,6 +1,8 @@ module Gitlab module Ci class Trace + ArchiveError = Class.new(StandardError) + attr_reader :job delegate :old_trace, to: :job @@ -93,8 +95,53 @@ module Gitlab job.erase_old_trace! end + def archive! + raise ArchiveError, 'Already archived' if trace_artifact + raise ArchiveError, 'Job is not finished yet' unless job.complete? + + if current_path + File.open(current_path) do |stream| + archive_stream!(stream) + FileUtils.rm(current_path) + end + elsif old_trace + StringIO.new(old_trace, 'rb').tap do |stream| + archive_stream!(stream) + job.erase_old_trace! + end + end + end + private + def archive_stream!(stream) + clone_file!(stream, JobArtifactUploader.workhorse_upload_path) do |clone_path| + create_job_trace!(job, clone_path) + end + end + + def clone_file!(src_stream, temp_dir) + FileUtils.mkdir_p(temp_dir) + Dir.mktmpdir('tmp-trace', temp_dir) do |dir_path| + temp_path = File.join(dir_path, "job.log") + FileUtils.touch(temp_path) + size = IO.copy_stream(src_stream, temp_path) + raise ArchiveError, 'Failed to copy stream' unless size == src_stream.size + + yield(temp_path) + end + end + + def create_job_trace!(job, path) + File.open(path) do |stream| + job.create_job_artifacts_trace!( + project: job.project, + file_type: :trace, + file: stream, + file_sha256: Digest::SHA256.file(path).hexdigest) + end + end + def ensure_path return current_path if current_path diff --git a/lib/gitlab/contributions_calendar.rb b/lib/gitlab/contributions_calendar.rb index 02d3763514e..d7369060cc5 100644 --- a/lib/gitlab/contributions_calendar.rb +++ b/lib/gitlab/contributions_calendar.rb @@ -23,7 +23,7 @@ module Gitlab mr_events = event_counts(date_from, :merge_requests) .having(action: [Event::MERGED, Event::CREATED, Event::CLOSED], target_type: "MergeRequest") note_events = event_counts(date_from, :merge_requests) - .having(action: [Event::COMMENTED], target_type: %w(Note DiffNote)) + .having(action: [Event::COMMENTED]) union = Gitlab::SQL::Union.new([repo_events, issue_events, mr_events, note_events]) events = Event.find_by_sql(union.to_sql).map(&:attributes) diff --git a/lib/gitlab/git/branch.rb b/lib/gitlab/git/branch.rb index ae7e88f0503..6351cfb83e3 100644 --- a/lib/gitlab/git/branch.rb +++ b/lib/gitlab/git/branch.rb @@ -1,6 +1,8 @@ module Gitlab module Git class Branch < Ref + STALE_BRANCH_THRESHOLD = 3.months + def self.find(repo, branch_name) if branch_name.is_a?(Gitlab::Git::Branch) branch_name @@ -12,6 +14,18 @@ module Gitlab def initialize(repository, name, target, target_commit) super(repository, name, target, target_commit) end + + def active? + self.dereferenced_target.committed_date >= STALE_BRANCH_THRESHOLD.ago + end + + def stale? + !active? + end + + def state + active? ? :active : :stale + end end end end diff --git a/lib/gitlab/git/gitlab_projects.rb b/lib/gitlab/git/gitlab_projects.rb index e5a747cb987..5e1e22ae65c 100644 --- a/lib/gitlab/git/gitlab_projects.rb +++ b/lib/gitlab/git/gitlab_projects.rb @@ -63,11 +63,12 @@ module Gitlab end end - def fetch_remote(name, timeout, force:, tags:, ssh_key: nil, known_hosts: nil) + def fetch_remote(name, timeout, force:, tags:, ssh_key: nil, known_hosts: nil, prune: true) tags_option = tags ? '--tags' : '--no-tags' logger.info "Fetching remote #{name} for repository #{repository_absolute_path}." - cmd = %W(git fetch #{name} --prune --quiet) + cmd = %W(git fetch #{name} --quiet) + cmd << '--prune' if prune cmd << '--force' if force cmd << tags_option diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index fdb3247cf4d..e1bc2f9ab61 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -45,10 +45,10 @@ module Gitlab GitalyClient.call(@storage, :repository_service, :apply_gitattributes, request) end - def fetch_remote(remote, ssh_auth:, forced:, no_tags:, timeout:) + def fetch_remote(remote, ssh_auth:, forced:, no_tags:, timeout:, prune: true) request = Gitaly::FetchRemoteRequest.new( repository: @gitaly_repo, remote: remote, force: forced, - no_tags: no_tags, timeout: timeout + no_tags: no_tags, timeout: timeout, no_prune: !prune ) if ssh_auth&.ssh_import? diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb index bdc0f04b56b..3772ef11c7f 100644 --- a/lib/gitlab/i18n.rb +++ b/lib/gitlab/i18n.rb @@ -18,7 +18,10 @@ module Gitlab 'uk' => 'УкраїнÑька', 'ja' => '日本語', 'ko' => 'í•œêµì–´', - 'nl_NL' => 'Nederlands' + 'nl_NL' => 'Nederlands', + 'tr_TR' => 'Türkçe', + 'id_ID' => 'Bahasa Indonesia', + 'fil_PH' => 'Filipino' }.freeze def available_locales diff --git a/lib/gitlab/import_export.rb b/lib/gitlab/import_export.rb index af203ff711d..b713fa7e1cd 100644 --- a/lib/gitlab/import_export.rb +++ b/lib/gitlab/import_export.rb @@ -3,7 +3,7 @@ module Gitlab extend self # For every version update, the version history in import_export.md has to be kept up to date. - VERSION = '0.2.2'.freeze + VERSION = '0.2.3'.freeze FILENAME_LIMIT = 50 def export_path(relative_path:) diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index 9f404003125..4bdd01f5e94 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -65,6 +65,7 @@ project_tree: - :create_access_levels - :project_feature - :custom_attributes + - :project_badges # Only include the following attributes for the models specified. included_attributes: @@ -125,6 +126,8 @@ excluded_attributes: - :when push_event_payload: - :event_id + project_badges: + - :group_id methods: labels: @@ -147,3 +150,5 @@ methods: - :action push_event_payload: - :action + project_badges: + - :type diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb index a00795f553e..c38df9102eb 100644 --- a/lib/gitlab/import_export/importer.rb +++ b/lib/gitlab/import_export/importer.rb @@ -9,7 +9,7 @@ module Gitlab @archive_file = project.import_source @current_user = project.creator @project = project - @shared = Gitlab::ImportExport::Shared.new(relative_path: path_with_namespace) + @shared = project.import_export_shared end def execute diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 759833a5ee5..cf6b7e306dd 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -16,7 +16,8 @@ module Gitlab priorities: :label_priorities, auto_devops: :project_auto_devops, label: :project_label, - custom_attributes: 'ProjectCustomAttribute' }.freeze + custom_attributes: 'ProjectCustomAttribute', + project_badges: 'Badge' }.freeze USER_REFERENCES = %w[author_id assignee_id updated_by_id user_id created_by_id last_edited_by_id merge_user_id resolved_by_id].freeze diff --git a/lib/gitlab/import_export/shared.rb b/lib/gitlab/import_export/shared.rb index b34cafc6876..3d3d998a6a3 100644 --- a/lib/gitlab/import_export/shared.rb +++ b/lib/gitlab/import_export/shared.rb @@ -1,13 +1,17 @@ module Gitlab module ImportExport class Shared - attr_reader :errors, :opts + attr_reader :errors, :project - def initialize(opts) - @opts = opts + def initialize(project) + @project = project @errors = [] end + def active_export_count + Dir[File.join(archive_path, '*')].count { |name| File.directory?(name) } + end + def export_path @export_path ||= Gitlab::ImportExport.export_path(relative_path: relative_path) end @@ -31,11 +35,11 @@ module Gitlab private def relative_path - File.join(opts[:relative_path], SecureRandom.hex) + File.join(relative_archive_path, SecureRandom.hex) end def relative_archive_path - File.join(opts[:relative_path], '..') + @project.disk_path end def error_out(message, caller) diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index cb95daf2260..bb1172f82a1 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -1,10 +1,12 @@ module Gitlab module Prometheus module AdditionalMetricsParser + CONFIG_ROOT = 'config/prometheus'.freeze + MUTEX = Mutex.new extend self - def load_groups_from_yaml - additional_metrics_raw.map(&method(:group_from_entry)) + def load_groups_from_yaml(file_name = 'additional_metrics.yml') + yaml_metrics_raw(file_name).map(&method(:group_from_entry)) end private @@ -22,13 +24,20 @@ module Gitlab MetricGroup.new(entry).tap(&method(:validate!)) end - def additional_metrics_raw - load_yaml_file&.map(&:deep_symbolize_keys).freeze + def yaml_metrics_raw(file_name) + load_yaml_file(file_name)&.map(&:deep_symbolize_keys).freeze end - def load_yaml_file - @loaded_yaml_file ||= YAML.load_file(Rails.root.join('config/prometheus/additional_metrics.yml')) + # rubocop:disable Gitlab/ModuleWithInstanceVariables + def load_yaml_file(file_name) + return YAML.load_file(Rails.root.join(CONFIG_ROOT, file_name)) if Rails.env.development? + + MUTEX.synchronize do + @loaded_yaml_cache ||= {} + @loaded_yaml_cache[file_name] ||= YAML.load_file(Rails.root.join(CONFIG_ROOT, file_name)) + end end + # rubocop:enable Gitlab/ModuleWithInstanceVariables end end end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb index 972ab75d1d5..e677ec84cd4 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb @@ -4,7 +4,7 @@ module Gitlab class AdditionalMetricsDeploymentQuery < BaseQuery include QueryAdditionalMetrics - def query(environment_id, deployment_id) + def query(deployment_id) Deployment.find_by(id: deployment_id).try do |deployment| query_metrics( deployment.project, diff --git a/lib/gitlab/prometheus/queries/base_query.rb b/lib/gitlab/prometheus/queries/base_query.rb index c60828165bd..29cab6e9c15 100644 --- a/lib/gitlab/prometheus/queries/base_query.rb +++ b/lib/gitlab/prometheus/queries/base_query.rb @@ -20,6 +20,10 @@ module Gitlab def query(*args) raise NotImplementedError end + + def self.transform_reactive_result(result) + result + end end end end diff --git a/lib/gitlab/prometheus/queries/deployment_query.rb b/lib/gitlab/prometheus/queries/deployment_query.rb index 6e6da593178..c2626581897 100644 --- a/lib/gitlab/prometheus/queries/deployment_query.rb +++ b/lib/gitlab/prometheus/queries/deployment_query.rb @@ -2,7 +2,7 @@ module Gitlab module Prometheus module Queries class DeploymentQuery < BaseQuery - def query(environment_id, deployment_id) + def query(deployment_id) Deployment.find_by(id: deployment_id).try do |deployment| environment_slug = deployment.environment.slug @@ -25,6 +25,11 @@ module Gitlab } end end + + def self.transform_reactive_result(result) + result[:metrics] = result.delete :data + result + end end end end diff --git a/lib/gitlab/prometheus/queries/environment_query.rb b/lib/gitlab/prometheus/queries/environment_query.rb index 1d17d3cfd56..b62910c8de6 100644 --- a/lib/gitlab/prometheus/queries/environment_query.rb +++ b/lib/gitlab/prometheus/queries/environment_query.rb @@ -19,6 +19,11 @@ module Gitlab } end end + + def self.transform_reactive_result(result) + result[:metrics] = result.delete :data + result + end end end end diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metric_query.rb index 5710ad47c1a..d920e9a749f 100644 --- a/lib/gitlab/prometheus/queries/matched_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/matched_metric_query.rb @@ -1,7 +1,7 @@ module Gitlab module Prometheus module Queries - class MatchedMetricsQuery < BaseQuery + class MatchedMetricQuery < BaseQuery MAX_QUERY_ITEMS = 40.freeze def query diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb index 0c280dc9a3c..aad76e335af 100644 --- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -3,9 +3,16 @@ module Gitlab module Queries module QueryAdditionalMetrics def query_metrics(project, query_context) + matched_metrics(project).map(&query_group(query_context)) + .select(&method(:group_with_any_metrics)) + end + + protected + + def query_group(query_context) query_processor = method(:process_query).curry[query_context] - groups = matched_metrics(project).map do |group| + lambda do |group| metrics = group.metrics.map do |metric| { title: metric.title, @@ -21,8 +28,6 @@ module Gitlab metrics: metrics.select(&method(:metric_with_any_queries)) } end - - groups.select(&method(:group_with_any_metrics)) end private @@ -72,12 +77,17 @@ module Gitlab end def common_query_context(environment, timeframe_start:, timeframe_end:) - { - timeframe_start: timeframe_start, - timeframe_end: timeframe_end, + base_query_context(timeframe_start, timeframe_end).merge({ ci_environment_slug: environment.slug, kube_namespace: environment.project.deployment_platform&.actual_namespace || '', environment_filter: %{container_name!="POD",environment="#{environment.slug}"} + }) + end + + def base_query_context(timeframe_start, timeframe_end) + { + timeframe_start: timeframe_start, + timeframe_end: timeframe_end } end end diff --git a/lib/gitlab/prometheus_client.rb b/lib/gitlab/prometheus_client.rb index 659021c9ac9..b66253a10e0 100644 --- a/lib/gitlab/prometheus_client.rb +++ b/lib/gitlab/prometheus_client.rb @@ -57,7 +57,11 @@ module Gitlab rescue OpenSSL::SSL::SSLError raise PrometheusClient::Error, "#{rest_client.url} contains invalid SSL data" rescue RestClient::ExceptionWithResponse => ex - handle_exception_response(ex.response) + if ex.response + handle_exception_response(ex.response) + else + raise PrometheusClient::Error, "Network connection error" + end rescue RestClient::Exception raise PrometheusClient::Error, "Network connection error" end diff --git a/lib/gitlab/shell.rb b/lib/gitlab/shell.rb index 4ba44e0feef..dda7afc0999 100644 --- a/lib/gitlab/shell.rb +++ b/lib/gitlab/shell.rb @@ -125,13 +125,13 @@ module Gitlab # Ex. # fetch_remote(my_repo, "upstream") # - def fetch_remote(repository, remote, ssh_auth: nil, forced: false, no_tags: false) + def fetch_remote(repository, remote, ssh_auth: nil, forced: false, no_tags: false, prune: true) gitaly_migrate(:fetch_remote) do |is_enabled| if is_enabled - repository.gitaly_repository_client.fetch_remote(remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags, timeout: git_timeout) + repository.gitaly_repository_client.fetch_remote(remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags, timeout: git_timeout, prune: prune) else storage_path = Gitlab.config.repositories.storages[repository.storage]["path"] - local_fetch_remote(storage_path, repository.relative_path, remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags) + local_fetch_remote(storage_path, repository.relative_path, remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags, prune: prune) end end end @@ -428,8 +428,8 @@ module Gitlab ) end - def local_fetch_remote(storage_path, repository_relative_path, remote, ssh_auth: nil, forced: false, no_tags: false) - vars = { force: forced, tags: !no_tags } + def local_fetch_remote(storage_path, repository_relative_path, remote, ssh_auth: nil, forced: false, no_tags: false, prune: true) + vars = { force: forced, tags: !no_tags, prune: prune } if ssh_auth&.ssh_import? if ssh_auth.ssh_key_auth? && ssh_auth.ssh_private_key.present? diff --git a/lib/gitlab/string_placeholder_replacer.rb b/lib/gitlab/string_placeholder_replacer.rb new file mode 100644 index 00000000000..9a2219b7d77 --- /dev/null +++ b/lib/gitlab/string_placeholder_replacer.rb @@ -0,0 +1,27 @@ +module Gitlab + class StringPlaceholderReplacer + # This method accepts the following paras + # - string: the string to be analyzed + # - placeholder_regex: i.e. /%{project_path|project_id|default_branch|commit_sha}/ + # - block: this block will be called with each placeholder found in the string using + # the placeholder regex. If the result of the block is nil, the original + # placeholder will be returned. + + def self.replace_string_placeholders(string, placeholder_regex = nil, &block) + return string if string.blank? || placeholder_regex.blank? || !block_given? + + replace_placeholders(string, placeholder_regex, &block) + end + + class << self + private + + # If the result of the block is nil, then the placeholder is returned + def replace_placeholders(string, placeholder_regex, &block) + string.gsub(/%{(#{placeholder_regex})}/) do |arg| + yield($~[1]) || arg + end + end + end + end +end diff --git a/lib/gitlab/utils.rb b/lib/gitlab/utils.rb index fa22f0e37b2..dc9391f32cf 100644 --- a/lib/gitlab/utils.rb +++ b/lib/gitlab/utils.rb @@ -67,5 +67,13 @@ module Gitlab nil end + + # Used in EE + # Accepts either an Array or a String and returns an array + def ensure_array_from_string(string_or_array) + return string_or_array if string_or_array.is_a?(Array) + + string_or_array.split(',').map(&:strip) + end end end diff --git a/lib/rouge/plugins/common_mark.rb b/lib/rouge/plugins/common_mark.rb new file mode 100644 index 00000000000..8f9de061124 --- /dev/null +++ b/lib/rouge/plugins/common_mark.rb @@ -0,0 +1,20 @@ +# A rouge plugin for CommonMark markdown engine. +# Used to highlight code generated by CommonMark. + +module Rouge + module Plugins + module CommonMark + def code_block(code, language) + lexer = Lexer.find_fancy(language, code) || Lexers::PlainText + + formatter = rouge_formatter(lexer) + formatter.format(lexer.lex(code)) + end + + # override this method for custom formatting behavior + def rouge_formatter(lexer) + Formatters::HTMLLegacy.new(css_class: "highlight #{lexer.tag}") + end + end + end +end diff --git a/lib/tasks/gitlab/traces.rake b/lib/tasks/gitlab/traces.rake new file mode 100644 index 00000000000..fd2a4f2d11a --- /dev/null +++ b/lib/tasks/gitlab/traces.rake @@ -0,0 +1,24 @@ +require 'logger' +require 'resolv-replace' + +desc "GitLab | Archive legacy traces to trace artifacts" +namespace :gitlab do + namespace :traces do + task archive: :environment do + logger = Logger.new(STDOUT) + logger.info('Archiving legacy traces') + + Ci::Build.finished + .where('NOT EXISTS (?)', + Ci::JobArtifact.select(1).trace.where('ci_builds.id = ci_job_artifacts.job_id')) + .order(id: :asc) + .find_in_batches(batch_size: 1000) do |jobs| + job_ids = jobs.map { |job| [job.id] } + + ArchiveTraceWorker.bulk_perform_async(job_ids) + + logger.info("Scheduled #{job_ids.count} jobs. From #{job_ids.min} to #{job_ids.max}") + end + end + end +end diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index badd665c08c..c996b30d7fa 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:58-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:19-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Bulgarian\n" "Language: bg_BG\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s подаване беше пропуÑнато, за да не Ñе натоварва ÑиÑтемата." msgstr[1] "%s Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð±Ñха пропуÑнати, за да не Ñе натоварва ÑиÑтемата." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -66,6 +72,9 @@ msgstr "" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "" @@ -130,9 +139,15 @@ msgstr "ДобавÑне на ръководÑтво за ÑÑŠÑ‚Ñ€ÑƒÐ´Ð½Ð¸Ñ‡ÐµÑ msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "ДобавÑне на лиценз" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "ДобавÑне на нова папка" @@ -151,12 +166,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -181,6 +229,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "Ðрхивиран проект! Хранилището е Ñамо за msgid "Are you sure you want to delete this pipeline schedule?" msgstr "ÐаиÑтина ли иÑкате да изтриете този план за Ñхема?" -msgid "Are you sure you want to discard your changes?" -msgstr "" - msgid "Are you sure you want to reset registration token?" msgstr "" msgid "Are you sure you want to reset the health check token?" msgstr "" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "" @@ -280,6 +364,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -304,7 +391,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -316,6 +409,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -370,13 +466,10 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Клон" -msgstr[1] "Клони" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Клонът <strong>%{branch_name}</strong> беше Ñъздаден. За да наÑтроите автоматичното внедрÑване, изберете Yaml шаблон за GitLab CI и подайте промените Ñи. %{link_to_autodeploy_doc}" @@ -669,6 +762,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -723,6 +819,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -771,6 +870,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -822,9 +924,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -960,6 +1059,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "" @@ -968,6 +1073,11 @@ msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "ПодаваниÑ" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -980,6 +1090,9 @@ msgstr "Съобщение за подаването" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Подаване" @@ -1121,6 +1234,9 @@ msgstr "Копиране на адреÑа в буфера за обмен" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Копиране на идентификатора на подаването в буфера за обмен" @@ -1133,9 +1249,18 @@ msgstr "" msgid "Create New Directory" msgstr "Създаване на нова папка" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Създайте Ñи личен жетон за доÑтъп в акаунта Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Създаване на папка" @@ -1154,6 +1279,9 @@ msgstr "" msgid "Create merge request" msgstr "Създаване на заÑвка за Ñливане" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1178,6 +1306,12 @@ msgstr "Етикет" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "Ñи Ñъздадете личен жетон за доÑтъп" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1232,6 +1366,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Задайте потребителÑки шаблон, използвайки ÑинтакÑиÑа на „Cron“" @@ -1264,7 +1401,7 @@ msgstr "Име на папката" msgid "Disable" msgstr "" -msgid "Discard changes" +msgid "Discard draft" msgstr "" msgid "Discover GitLab Geo." @@ -1324,6 +1461,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1378,9 +1518,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1447,12 +1596,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "СобÑтвеникът не може да бъде променен" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Планът за Ñхема не може да бъде премахнат" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1468,6 +1641,9 @@ msgstr "" msgid "Files" msgstr "Файлове" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Филтриране по Ñъобщение" @@ -1503,6 +1679,9 @@ msgstr "От Ñъздаването на проблема до внедрÑваРmsgid "From merge request merge until deploy to production" msgstr "От прилагането на заÑвката за Ñливане до внедрÑването в крайната верÑиÑ" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1650,6 +1829,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1748,6 +1945,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "ОÑвежаването започна уÑпешно" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "ВнаÑÑне на хранилище" @@ -1760,6 +1960,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "" @@ -1810,6 +2013,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1887,6 +2096,12 @@ msgstr "" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "Ðаучете повече в" @@ -1905,6 +2120,9 @@ msgstr "ÐапуÑкане на проекта" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1914,6 +2132,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1923,6 +2144,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1953,9 +2177,6 @@ msgstr "Медиана" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1968,6 +2189,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "добавите SSH ключ" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2090,9 +2323,6 @@ msgstr "ÐÑма хранилище" msgid "No schedules" msgstr "ÐÑма планове" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "ÐÑма доÑтатъчно данни" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚Ñване" @@ -2210,6 +2443,9 @@ msgstr "" msgid "Options" msgstr "Опции" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "вÑички" @@ -2348,6 +2602,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2510,12 +2767,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2537,9 +2812,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2558,6 +2842,12 @@ msgstr "" msgid "Push events" msgstr "" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2621,6 +2911,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "ЗаÑвка за доÑтъп" @@ -2633,6 +2926,9 @@ msgstr "" msgid "Reset runners registration token" msgstr "" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2644,6 +2940,9 @@ msgstr "ОтмÑна на това подаване" msgid "Revert this merge request" msgstr "ОтмÑна на тази заÑвка за Ñливане" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2689,12 +2988,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Изберете формата на архива" msgid "Select a timezone" msgstr "Изберете чаÑова зона" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,6 +3012,9 @@ msgstr "Изберете целеви клон" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2719,6 +3027,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Задайте парола на акаунта Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}." @@ -2728,15 +3039,15 @@ msgstr "" msgid "Set up Koding" msgstr "ÐаÑтройка на „Koding“" -msgid "Set up auto deploy" -msgstr "ÐаÑтройка на авт. внедрÑване" - msgid "SetPasswordToCloneLink|set a password" msgstr "зададете парола" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2746,6 +3057,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2787,12 +3101,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2898,6 +3224,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "Изходен код" @@ -2937,10 +3266,10 @@ msgstr "Преминаване към клон/етикет" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Етикет" -msgstr[1] "Етикети" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" msgid "Tags" msgstr "Етикети" @@ -3071,9 +3400,15 @@ msgstr "Ð’Ñеки може да има доÑтъп до проекта, без msgid "The repository for this project does not exist." msgstr "Хранилището за този проект не ÑъщеÑтвува." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "Етапът на преглед и одобрение показва времето от Ñъздаването на заÑвката за Ñливане до прилагането Ñ. Данните ще бъдат добавени автоматично Ñлед като приложите първата Ñи заÑвка за Ñливане." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "Етапът на подготовка за издаване показва времето между прилагането на заÑвката за Ñливане и внедрÑването на кода в Ñредата на работещата крайна верÑиÑ. Данните ще бъдат добавени автоматично Ñлед като направите първото Ñи внедрÑване в крайната верÑиÑ." @@ -3167,6 +3502,9 @@ msgstr "Това означава, че нÑма да можете да изпр msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,9 +3674,15 @@ msgstr[1] "мин" msgid "Time|s" msgstr "Ñек" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3354,19 +3698,16 @@ msgstr "" msgid "Total Time" msgstr "Общо време" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "Общо време за теÑтване на вÑички подаваниÑ/ÑливаниÑ" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3396,6 +3734,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "Без звезда" @@ -3441,6 +3782,9 @@ msgstr "Използване на глобалната Ви наÑтройка Ð msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3477,6 +3821,9 @@ msgstr "ÐÑма доÑтатъчно данни за този етап." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3597,6 +3944,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "ОттеглÑне на заÑвката за доÑтъп" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Ðа път Ñте да премахнете „%{group_name}“. Ðко Ñ Ð¿Ñ€ÐµÐ¼Ð°Ñ…Ð½ÐµÑ‚Ðµ, групата ÐЕ може да бъде възÑтановена! ÐÐИСТИÐРли иÑкате това?" @@ -3609,10 +3959,13 @@ msgstr "Ðа път Ñте да премахнете връзката на раРmsgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Ðа път Ñте да прехвърлите „%{project_name_with_namespace}“ към друг ÑобÑтвеник. ÐÐИСТИÐРли иÑкате това?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Ðе можете да Ñъздавате повече проекти" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "ТрÑбва да Ñе впишете, за да отбележите проект ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð°" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "Ðуждаете Ñе от разрешение." @@ -3669,6 +4034,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,6 +4112,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3752,11 +4135,41 @@ msgstr[1] "дни" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,3 +4346,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po index 4a0ca1e7efb..76982ff61b1 100644 --- a/locale/de/gitlab.po +++ b/locale/de/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:00-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:21-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: German\n" "Language: de_DE\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s zusätzlicher Commit wurde ausgelassen um Leistungsprobleme zu verhindern." msgstr[1] "%s zusätzliche Commits wurden ausgelassen um Leistungsprobleme zu verhindern." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -66,6 +72,9 @@ msgstr "%{number_of_failures} von %{maximum_failures} Fehlschlägen. GitLab wird msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} von %{maximum_failures} Fehlschlägen. GitLab wird es nicht weiter versuchen. Setze die Speicherinformation nach Behebung des Problems zurück." +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}: fehlgeschlagener Speicherzugriff auf Host:" @@ -130,9 +139,15 @@ msgstr "Mitarbeitsanleitung hinzufügen" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Lizenz hinzufügen" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Erstelle eine neues Verzeichnis" @@ -151,12 +166,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -181,6 +229,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "Archiviertes Projekt! Repository ist nicht änderbar." msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Bist Du sicher, dass Du diesen Pipeline-Zeitplan löschen möchtest?" -msgid "Are you sure you want to discard your changes?" -msgstr "Bist Du sicher, dass Du alle Änderungen zurücksetzen willst?" - msgid "Are you sure you want to reset registration token?" msgstr "Bist Du sicher, dass Du den Registrierungstoken zurücksetzen willst?" msgid "Are you sure you want to reset the health check token?" msgstr "Bist Du sicher, dass Du den Systemüberwachungstoken zurücksetzen willst?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "Bist Du sicher?" @@ -280,6 +364,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -304,7 +391,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -316,6 +409,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -370,13 +466,10 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Zweig" -msgstr[1] "Zweige" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Branch <strong>%{branch_name}</strong> wurde erstellt. Um die automatische Bereitstellung einzurichten, wähle eine GitLab CI Yaml Vorlage und committe Deine Änderungen. %{link_to_autodeploy_doc}" @@ -669,6 +762,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -723,6 +819,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -771,6 +870,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -822,9 +924,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -960,6 +1059,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "Kommentare" @@ -968,6 +1073,11 @@ msgid_plural "Commits" msgstr[0] "Commit" msgstr[1] "Commits" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -980,6 +1090,9 @@ msgstr "Commit Nachricht" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Commit" @@ -1121,6 +1234,9 @@ msgstr "Kopiere URL in die Zwischenablage" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Kopiere Commit SHA in die Zwischenablage" @@ -1133,9 +1249,18 @@ msgstr "" msgid "Create New Directory" msgstr "Erstelle neues Verzeichnis" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Erstelle einen persönlichen Zugriffstoken in Deinem Konto um mittels %{protocol} zu übertragen (push) oder abzurufen (pull)." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Erstelle Verzeichnis" @@ -1154,6 +1279,9 @@ msgstr "" msgid "Create merge request" msgstr "Erstelle Merge Request" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1178,6 +1306,12 @@ msgstr "Tag " msgid "CreateTokenToCloneLink|create a personal access token" msgstr "Erstelle einen persönlichen Zugriffstoken" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1232,6 +1366,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Erstelle ein individuelles Muster mittels Cron Syntax" @@ -1264,8 +1401,8 @@ msgstr "Verzeichnisname" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "Änderungen verwerfen" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1324,6 +1461,9 @@ msgstr "E-Mails" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1378,9 +1518,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1447,12 +1596,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "Wechsel des Besitzers fehlgeschlagen" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Entfernung der Pipelineplanung fehlgeschlagen" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1468,6 +1641,9 @@ msgstr "" msgid "Files" msgstr "Dateien" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Filter nach Commit Nachricht" @@ -1503,6 +1679,9 @@ msgstr "Von der Ticketbeschreibung bis zur Bereitstellung" msgid "From merge request merge until deploy to production" msgstr "Vom Umsetzen des Merge Request bis zur Bereitstellung auf dem Produktivsystem" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1650,6 +1829,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1748,6 +1945,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "Aufräumen erfolgreich gestartet" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "Repository importieren" @@ -1760,6 +1960,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "Installiere einen Runner der mit GitLab CI kompatibel ist" @@ -1810,6 +2013,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1887,6 +2096,12 @@ msgstr "am" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "Erfahre mehr in den" @@ -1905,6 +2120,9 @@ msgstr "Verlasse das Projekt" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1914,6 +2132,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1923,6 +2144,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1953,9 +2177,6 @@ msgstr "Median" msgid "Members" msgstr "Mitglieder" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1968,6 +2189,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "einen SSH Schlüssel hinzufügst" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "Ãœberwachung" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "hier" @@ -2090,9 +2323,6 @@ msgstr "Kein Repository" msgid "No schedules" msgstr "Keine Zeitpläne" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "Nicht genügend Daten" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Benachrichtigungsereignisse" @@ -2210,6 +2443,9 @@ msgstr "" msgid "Options" msgstr "Optionen" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "Ãœbersicht" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "Alle" @@ -2348,6 +2602,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "Profil" @@ -2510,12 +2767,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2537,9 +2812,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2558,6 +2842,12 @@ msgstr "" msgid "Push events" msgstr "Ãœbertragungsereignisse" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2621,6 +2911,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "Anfrage auf Zugriff" @@ -2633,6 +2926,9 @@ msgstr "Zugriffstoken für Systemzustand zurücksetzen" msgid "Reset runners registration token" msgstr "Registrierungstoken für Runner zurücksetzen" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2644,6 +2940,9 @@ msgstr "Commit zurücksetzen" msgid "Revert this merge request" msgstr "Merge Request zurücksetzen" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "SSH-Schlüssel" @@ -2689,12 +2988,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Archivierungsformat auswählen" msgid "Select a timezone" msgstr "Zeitzone auswählen" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,6 +3012,9 @@ msgstr "Zielbranch auswählen" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2719,6 +3027,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Lege ein Passwort für dein Konto fest, um mittels %{protocol} zu übertragen (push) oder abzurufen (pull)." @@ -2728,15 +3039,15 @@ msgstr "" msgid "Set up Koding" msgstr "Koding einrichten" -msgid "Set up auto deploy" -msgstr "Automatische Bereitstellung einrichten" - msgid "SetPasswordToCloneLink|set a password" msgstr "ein Passwort festlegst" msgid "Settings" msgstr "Einstellungen" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2746,6 +3057,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2787,12 +3101,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2898,6 +3224,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "Quellcode" @@ -2937,8 +3266,8 @@ msgstr "Zu Branch/Tag wechseln" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" msgstr[0] "" msgstr[1] "" @@ -3071,9 +3400,15 @@ msgstr "Auf das Projekt kann ohne Authentifizierung zugegriffen werden." msgid "The repository for this project does not exist." msgstr "Das Repository für das Projekt existiert nicht." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "Die Ãœberprüfungsphase stellt die Zeit vom Anlegen eines Merge Requests bis dessen Umsetzung dar. Sobald Du Deinen ersten Merge Request abschließt, werden dessen Daten hier automatisch angezeigt." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "Die Staging-Phase stellt die Zeit zwischen der Umsetzung eines Merge Requests und der Bereitstellung des Codes auf dem Produktivsystem dar. Sobald Du das erste Mal auf das Produktivsystem ausgeliefert hast, werden dessen Daten hier automatisch angezeigt." @@ -3167,6 +3502,9 @@ msgstr "Dies bedeutet, dass Du keinen Code übertragen kannst, bevor Du kein lee msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,9 +3674,15 @@ msgstr[1] "Min." msgid "Time|s" msgstr "Sek." +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3354,19 +3698,16 @@ msgstr "" msgid "Total Time" msgstr "Gesamtzeit" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "Gesamte Testzeit für alle Commits/Merges" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3396,6 +3734,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "Entfavorisieren" @@ -3441,6 +3782,9 @@ msgstr "Benutze Deine globalen Benachrichtigungseinstellungen" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3477,6 +3821,9 @@ msgstr "Es liegen nicht genügend Daten vor, um diese Phase anzuzeigen." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3597,6 +3944,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "Zugriffsanfrage widerrufen" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Du bist dabei %{group_name} zu entfernen. Entfernte Gruppen können NICHT wiederhergestellt werden! Bist Du dir WIRKLICH sicher?" @@ -3609,10 +3959,13 @@ msgstr "Du bist dabei, die Beziehung des Ablegers zum Ursprungsprojekt %{forked_ msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Du bist dabei %{project_name_with_namespace} einem andere Besitzer zu übergeben. Bist Du dir WIRKLICH sicher?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Du hast die Projektbegrenzung erreicht." +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "Du musst angemeldet sein, um ein Projekt zu favorisieren." +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "Du brauchst eine Genehmigung." @@ -3669,6 +4034,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,6 +4112,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3752,11 +4135,41 @@ msgstr[1] "Tage" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,3 +4346,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po index 7d4648c55f1..2613d719882 100644 --- a/locale/eo/gitlab.po +++ b/locale/eo/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:59-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:22-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Esperanto\n" "Language: eo_UY\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s enmetado estis transsaltita, por ne troÅarÄi la sistemon." msgstr[1] "%s enmetadoj estis transsaltitaj, por ne troÅarÄi la sistemon." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -66,6 +72,9 @@ msgstr "" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "" @@ -130,9 +139,15 @@ msgstr "Aldoni gvidliniojn por kontribuado" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Aldoni rajtigilon" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Aldoni novan dosierujon" @@ -151,12 +166,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -181,6 +229,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "Arkivita projekto! La deponejo permesas nur legadon" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Ĉu vi certe volas forigi ĉi tiun ĉenstablan planon?" -msgid "Are you sure you want to discard your changes?" -msgstr "" - msgid "Are you sure you want to reset registration token?" msgstr "" msgid "Are you sure you want to reset the health check token?" msgstr "" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "" @@ -280,6 +364,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -304,7 +391,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -316,6 +409,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -370,13 +466,10 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Branĉo" -msgstr[1] "Branĉoj" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La branĉo <strong>%{branch_name}</strong> estis kreita. Por agordi aÅtomatan disponigadon, bonvolu elekti Yaml-Åablonon por GitLab CI kaj enmeti viajn ÅanÄojn. %{link_to_autodeploy_doc}" @@ -669,6 +762,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -723,6 +819,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -771,6 +870,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -822,9 +924,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -960,6 +1059,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "" @@ -968,6 +1073,11 @@ msgid_plural "Commits" msgstr[0] "Enmetado" msgstr[1] "Enmetadoj" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -980,6 +1090,9 @@ msgstr "MesaÄo pri la enmetado" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Enmeti" @@ -1121,6 +1234,9 @@ msgstr "Kopii la adreson en la kopibufron" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Kopii la identigilon de la enmetado" @@ -1133,9 +1249,18 @@ msgstr "" msgid "Create New Directory" msgstr "Krei novan dosierujon" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Kreu propran atingoĵetonon en via konto por ebligi al vi eltiri kaj alpuÅi per %{protocol}." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Krei dosierujon" @@ -1154,6 +1279,9 @@ msgstr "" msgid "Create merge request" msgstr "Krei peton pri kunfando" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1178,6 +1306,12 @@ msgstr "Etikedo" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "kreos propran atingoĵetonon" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1232,6 +1366,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Difini propran Åablonon, uzante la sintakson de Cron" @@ -1264,7 +1401,7 @@ msgstr "Nomo de dosierujo" msgid "Disable" msgstr "" -msgid "Discard changes" +msgid "Discard draft" msgstr "" msgid "Discover GitLab Geo." @@ -1324,6 +1461,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1378,9 +1518,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1447,12 +1596,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "Ne eblas ÅanÄi la posedanton" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Ne eblas forigi la ĉenstablan planon" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1468,6 +1641,9 @@ msgstr "" msgid "Files" msgstr "Dosieroj" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Filtri per mesaÄo" @@ -1503,6 +1679,9 @@ msgstr "De la kreado de la problemo Äis la disponigado en la publika versio" msgid "From merge request merge until deploy to production" msgstr "De la kunfandado de la peto pri kunfando Äis la disponigado en la publika versio" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1650,6 +1829,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1748,6 +1945,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "La refreÅigo komenciÄis sukcese" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "Enporti deponejon" @@ -1760,6 +1960,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "" @@ -1810,6 +2013,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1887,6 +2096,12 @@ msgstr "" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "Lernu pli en la" @@ -1905,6 +2120,9 @@ msgstr "Forlasi la projekton" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1914,6 +2132,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1923,6 +2144,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1953,9 +2177,6 @@ msgstr "Mediano" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1968,6 +2189,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "aldonos SSH-Ålosilon" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2090,9 +2323,6 @@ msgstr "Ne estas deponejo" msgid "No schedules" msgstr "Ne estas planoj" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "Ne estas sufiĉe da datenoj" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Sciigaj eventoj" @@ -2210,6 +2443,9 @@ msgstr "" msgid "Options" msgstr "Opcioj" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "ĉiuj" @@ -2348,6 +2602,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2510,12 +2767,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2537,9 +2812,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2558,6 +2842,12 @@ msgstr "" msgid "Push events" msgstr "" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2621,6 +2911,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "Peti atingeblon" @@ -2633,6 +2926,9 @@ msgstr "" msgid "Reset runners registration token" msgstr "" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2644,6 +2940,9 @@ msgstr "Malfari ĉi tiun enmetadon" msgid "Revert this merge request" msgstr "Malfari ĉi tiun peton pri kunfando" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2689,12 +2988,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Elektu formaton de arkivo" msgid "Select a timezone" msgstr "Elektu horzonon" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,6 +3012,9 @@ msgstr "Elektu celan branĉon" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2719,6 +3027,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Kreu pasvorton por via konto por ebligi al vi eltiri kaj alpuÅi per %{protocol}." @@ -2728,15 +3039,15 @@ msgstr "" msgid "Set up Koding" msgstr "Agordi „Koding“" -msgid "Set up auto deploy" -msgstr "Agordi aÅtomatan disponigadon" - msgid "SetPasswordToCloneLink|set a password" msgstr "kreos pasvorton" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2746,6 +3057,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2787,12 +3101,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2898,6 +3224,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "Kodo" @@ -2937,10 +3266,10 @@ msgstr "Iri al branĉo/etikedo" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Etikedo" -msgstr[1] "Etikedoj" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" msgid "Tags" msgstr "Etikedoj" @@ -3071,9 +3400,15 @@ msgstr "Ĉiu povas havi atingon al la projekto, sen ensaluti" msgid "The repository for this project does not exist." msgstr "La deponejo por ĉi tiu projekto ne ekzistas." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "La etapo de la kontrolo montras la tempon de la kreado de la peto pri kunfando Äis Äia aplikado. La datenoj aldoniÄos aÅtomate post kiam vi aplikos la unuan peton pri kunfando." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "La etapo de preparo por eldono montras la tempon inter la aplikado de la peto pri kunfando kaj la disponigado de la kodo en la publika versio. La datenoj aldoniÄos aÅtomate post kiam vi faros la unuan disponigadon en la publika versio." @@ -3167,6 +3502,9 @@ msgstr "Ĉi tiu signifas, ke vi ne povos alpuÅi kodon, antaÅ ol vi kreos malpl msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,9 +3674,15 @@ msgstr[1] "min" msgid "Time|s" msgstr "s" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3354,19 +3698,16 @@ msgstr "" msgid "Total Time" msgstr "Totala tempo" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "Totala tempo por la testado de ĉiuj enmetadoj/kunfandoj" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3396,6 +3734,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "Malsteligi" @@ -3441,6 +3782,9 @@ msgstr "Uzi vian Äeneralan agordon pri la sciigoj" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3477,6 +3821,9 @@ msgstr "Ne estas sufiĉe da datenoj por montri ĉi tiun etapon." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3597,6 +3944,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "Nuligi la peton pri atingeblo" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Vi forigos „%{group_name}“. Oni NE POVAS malfari la forigon de grupo! Ĉu vi estas ABSOLUTE certa?" @@ -3609,10 +3959,13 @@ msgstr "Vi forigos la rilaton de la disbranĉigo al la originala projekto, „%{ msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Vi estas transigonta „%{project_name_with_namespace}“ al alia posedanto. Ĉu vi estas ABSOLUTE certa?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Vi ne povas krei pliajn projektojn" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "Oni devas ensaluti por steligi projekton" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "VI bezonas permeson." @@ -3669,6 +4034,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,6 +4112,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3752,11 +4135,41 @@ msgstr[1] "tagoj" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,3 +4346,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po index 7d28a7064d3..76926fd5c64 100644 --- a/locale/es/gitlab.po +++ b/locale/es/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:01-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:20-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s cambio adicional ha sido omitido para evitar problemas de rendimiento." msgstr[1] "%s cambios adicionales han sido omitidos para evitar problemas de rendimiento." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "%{count} participante" msgstr[1] "%{count} participantes" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} commits detrás de %{default_branch}, %{number_commits_ahead} commits por delante" @@ -66,6 +72,9 @@ msgstr "%{number_of_failures} de %{maximum_failures} intentos fallidos. GitLab p msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} de %{maximum_failures} intentos fallidos. GitLab no reintentará automáticamente. Debe reinicializar la información de almacenamiento cuando el problema sea solventado." +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}: intento de acceso fallido al almacenamiento en host:" @@ -130,9 +139,15 @@ msgstr "Agregar guÃa de contribución" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "Añadir Webhooks Grupales y Gitlab Enterprise Edition." +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Agregar Licencia" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Agregar nuevo directorio" @@ -140,31 +155,64 @@ msgid "Add todo" msgstr "" msgid "AdminArea|Stop all jobs" -msgstr "" +msgstr "Detener todos los trabajos" msgid "AdminArea|Stop all jobs?" -msgstr "" +msgstr "Detener todos los trabajos?" msgid "AdminArea|Stop jobs" -msgstr "" +msgstr "Detener trabajos" msgid "AdminArea|Stopping jobs failed" -msgstr "" +msgstr "Error al detener trabajos" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "Página de estado" -msgid "Advanced" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" msgstr "" +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + +msgid "Advanced" +msgstr "Avanzado" + msgid "Advanced settings" msgstr "Configuración avanzada" msgid "All" -msgstr "" +msgstr "Todos" msgid "All changes are committed" msgstr "" @@ -173,7 +221,7 @@ msgid "Allows you to add and manage Kubernetes clusters." msgstr "" msgid "An error occurred previewing the blob" -msgstr "" +msgstr "Ha ocurrido un error visualizando el blob" msgid "An error occurred when toggling the notification subscription" msgstr "Se produjo un error al activar/desactivar la suscripción de notificación" @@ -181,6 +229,12 @@ msgstr "Se produjo un error al activar/desactivar la suscripción de notificacià msgid "An error occurred when updating the issue weight" msgstr "Se produjo un error al actualizar el peso de la incidencia" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "Se produjo un error al obtener datos de la barra lateral" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "¡Proyecto archivado! El repositorio es de solo lectura" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "¿Estás seguro que deseas eliminar esta programación del pipeline?" -msgid "Are you sure you want to discard your changes?" -msgstr "¿Está seguro que desea descartar sus cambios?" - msgid "Are you sure you want to reset registration token?" msgstr "¿Está seguro que desea reinicializar el token de registro?" msgid "Are you sure you want to reset the health check token?" msgstr "¿Está seguro que desea reinicializar el token de Verificación de Estado?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "¿Estás seguro?" @@ -251,16 +335,16 @@ msgid "Assign custom color like #FF0000" msgstr "" msgid "Assign labels" -msgstr "" +msgstr "Asignar etiquetas" msgid "Assign milestone" -msgstr "" +msgstr "Asignar milestone" msgid "Assign to" -msgstr "" +msgstr "Asignar a" msgid "Assignee" -msgstr "" +msgstr "Asignado a" msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Adjunte un archivo arrastrando & soltando o %{upload_link}" @@ -275,9 +359,12 @@ msgid "Authentication Log" msgstr "Registro de Autenticación" msgid "Author" -msgstr "Autor" +msgstr "" msgid "Authors: %{authors}" +msgstr "Autores: %{authors}" + +msgid "Auto DevOps enabled" msgstr "" msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." @@ -287,24 +374,30 @@ msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} t msgstr "" msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." -msgstr "" +msgstr "Tanto las Auto Review Apps como Auto Deploy necesitan un dominio para funcionar correctamente." msgid "AutoDevOps|Auto DevOps (Beta)" -msgstr "" +msgstr "Auto DevOps (Beta)" msgid "AutoDevOps|Auto DevOps documentation" -msgstr "" +msgstr "Documentación de Auto DevOps" msgid "AutoDevOps|Enable in settings" -msgstr "" +msgstr "Habilitar en la configuración" msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" +msgstr "Automáticamente construirán, probarán y desplegarán su aplicación con base en la configuración predefinida de CI/CD." msgid "AutoDevOps|Learn more in the %{link_to_documentation}" +msgstr "Más información en %{link_to_documentation}" + +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -314,81 +407,81 @@ msgid "Avatar will be removed. Are you sure?" msgstr "" msgid "Average per day: %{average}" -msgstr "" +msgstr "Promedio por dÃa: %{average}" + +msgid "Begin with the selected commit" +msgstr "Iniciar con el commit seleccionado" msgid "Billing" msgstr "Facturación" msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." -msgstr "" +msgstr "%{group_name} está actualmente en el plan %{plan_link}." msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." -msgstr "" +msgstr "Aumentar o disminuir automáticamente las caracterÃsticas de algunos Planes no está disponible actualmente." msgid "BillingPlans|Current plan" -msgstr "" +msgstr "Plan actual" msgid "BillingPlans|Customer Support" -msgstr "" +msgstr "Atención al cliente" msgid "BillingPlans|Downgrade" msgstr "" msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." -msgstr "" +msgstr "Obtenga más información sobre cada plan al leer nuestro %{faq_link}." msgid "BillingPlans|Manage plan" -msgstr "" +msgstr "Gestionar plan" msgid "BillingPlans|Please contact %{customer_support_link} in that case." -msgstr "" +msgstr "Por favor contacte a %{customer_support_link} en ese caso." msgid "BillingPlans|See all %{plan_name} features" -msgstr "" +msgstr "Ver todas la funcionalidades del plan %{plan_name}" msgid "BillingPlans|This group uses the plan associated with its parent group." msgstr "" msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." -msgstr "" +msgstr "Para gestionar el plan para este grupo, visite la sección de facturación de %{parent_billing_page_link}." msgid "BillingPlans|Upgrade" msgstr "" msgid "BillingPlans|You are currently on the %{plan_link} plan." -msgstr "" +msgstr "Actualmente estás en el plan %{plan_link}." msgid "BillingPlans|frequently asked questions" -msgstr "" +msgstr "preguntas frecuentes" msgid "BillingPlans|monthly" -msgstr "" +msgstr "mensual" msgid "BillingPlans|paid annually at %{price_per_year}" -msgstr "" +msgstr "%{price_per_year} pagados anualmente" msgid "BillingPlans|per user" -msgstr "" - -msgid "Begin with the selected commit" -msgstr "" +msgstr "por usuario" -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Rama" -msgstr[1] "Ramas" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La rama <strong>%{branch_name}</strong> fue creada. Para configurar el auto despliegue, escoge una plantilla Yaml para GitLab CI y envÃa tus cambios. %{link_to_autodeploy_doc}" msgid "Branch has changed" -msgstr "" +msgstr "La rama ha cambiado" msgid "Branch is already taken" -msgstr "" +msgstr "La rama ya existe" msgid "Branch name" -msgstr "" +msgstr "Nombre de la rama" msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Buscar ramas" @@ -400,34 +493,34 @@ msgid "Branches" msgstr "Ramas" msgid "Branches|Cant find HEAD commit for this branch" -msgstr "" +msgstr "No puedo encontrar el commit HEAD para esta rama" msgid "Branches|Compare" -msgstr "" +msgstr "Comparar" msgid "Branches|Delete all branches that are merged into '%{default_branch}'" -msgstr "" +msgstr "Borrar todas las ramas que se fusionen con '%{default_branch}'" msgid "Branches|Delete branch" -msgstr "" +msgstr "Eliminar la rama" msgid "Branches|Delete merged branches" -msgstr "" +msgstr "Borrar ramas fusionadas" msgid "Branches|Delete protected branch" -msgstr "" +msgstr "Borrar rama protegida" msgid "Branches|Delete protected branch '%{branch_name}'?" -msgstr "" +msgstr "¿Borrar rama protegida '%{branch_name}'?" msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" -msgstr "" +msgstr "El borrado de la rama '%{branch_name}' no podrá deshacerse. ¿Está seguro?" msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" -msgstr "" +msgstr "El borrado de las ramas fusionadas no podrá deshacerse. ¿Está usted seguro?" msgid "Branches|Filter by branch name" -msgstr "" +msgstr "Filtrar por nombre de rama" msgid "Branches|Merged into %{default_branch}" msgstr "" @@ -499,10 +592,10 @@ msgid "ByAuthor|by" msgstr "por" msgid "CI / CD" -msgstr "" +msgstr "CI / CD" msgid "CI/CD configuration" -msgstr "" +msgstr "Configuración de CI/CD" msgid "CICD|Jobs" msgstr "" @@ -511,13 +604,13 @@ msgid "Cancel" msgstr "Cancelar" msgid "Cancel edit" -msgstr "" +msgstr "Cancelar edición" msgid "Cannot modify managed Kubernetes cluster" msgstr "" msgid "Change Weight" -msgstr "" +msgstr "Cambiar peso" msgid "ChangeTypeActionLabel|Pick into branch" msgstr "Escoger en la rama" @@ -550,10 +643,10 @@ msgid "Check interval" msgstr "" msgid "Checking %{text} availability…" -msgstr "" +msgstr "Comprobando disponibilidad de %{text}..." msgid "Checking branch availability..." -msgstr "" +msgstr "Verificando disponibilidad de la rama..." msgid "Cherry-pick this commit" msgstr "Escoger este cambio" @@ -568,13 +661,13 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s msgstr "" msgid "Choose file..." -msgstr "" +msgstr "Elegir archivo..." msgid "Choose which groups you wish to synchronize to this secondary node." -msgstr "" +msgstr "Elija qué grupos desea sincronizar a este nodo secundario." msgid "Choose which shards you wish to synchronize to this secondary node." -msgstr "" +msgstr "Elija qué fragmentos desea sincronizar a este nodo secundario." msgid "CiStatusLabel|canceled" msgstr "cancelado" @@ -669,17 +762,20 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" -msgid "Click to expand text" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" msgstr "" +msgid "Click to expand text" +msgstr "Haga clic para expandir el texto" + msgid "Clone repository" msgstr "" msgid "Close" -msgstr "" +msgstr "Cerrar" msgid "Closed" -msgstr "" +msgstr "Cerrado" msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster" msgstr "" @@ -721,16 +817,19 @@ msgid "ClusterIntegration|Copy API URL" msgstr "" msgid "ClusterIntegration|Copy CA Certificate" +msgstr "Copiar Certificado CA" + +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" msgstr "" msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" msgid "ClusterIntegration|Copy Token" -msgstr "" +msgstr "Copiar Token" msgid "ClusterIntegration|Create Kubernetes cluster" -msgstr "" +msgstr "Crear cluster de Kubernetes" msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine" msgstr "" @@ -739,10 +838,10 @@ msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes E msgstr "" msgid "ClusterIntegration|Create on GKE" -msgstr "" +msgstr "Crear en GKE" msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster" -msgstr "" +msgstr "Ingrese los detalles para un cluster Kubernetes existente" msgid "ClusterIntegration|Enter the details for your Kubernetes cluster" msgstr "" @@ -751,49 +850,52 @@ msgid "ClusterIntegration|Environment scope" msgstr "" msgid "ClusterIntegration|GitLab Integration" -msgstr "" +msgstr "Integración GitLab" msgid "ClusterIntegration|GitLab Runner" -msgstr "" +msgstr "GitLab Runner" msgid "ClusterIntegration|Google Cloud Platform project ID" -msgstr "" +msgstr "ID del proyecto de Google Cloud Platform" msgid "ClusterIntegration|Google Kubernetes Engine" -msgstr "" +msgstr "Google Kubernetes Engine" msgid "ClusterIntegration|Google Kubernetes Engine project" -msgstr "" +msgstr "Proyecto Google Kubernetes Engine" msgid "ClusterIntegration|Helm Tiller" -msgstr "" +msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "" -msgid "ClusterIntegration|Install" +msgid "ClusterIntegration|Ingress IP Address" msgstr "" +msgid "ClusterIntegration|Install" +msgstr "Instalar" + msgid "ClusterIntegration|Installed" -msgstr "" +msgstr "Instalado" msgid "ClusterIntegration|Installing" -msgstr "" +msgstr "Instalando" msgid "ClusterIntegration|Integrate Kubernetes cluster automation" msgstr "" msgid "ClusterIntegration|Integration status" -msgstr "" +msgstr "Estado de integración" msgid "ClusterIntegration|Kubernetes cluster" -msgstr "" +msgstr "cluster de Kubernetes" msgid "ClusterIntegration|Kubernetes cluster details" -msgstr "" +msgstr "Detalles del cluster de Kubernetes" msgid "ClusterIntegration|Kubernetes cluster integration" -msgstr "" +msgstr "Integración de cluster de Kubernetes" msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project." msgstr "" @@ -808,7 +910,7 @@ msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernet msgstr "" msgid "ClusterIntegration|Kubernetes cluster name" -msgstr "" +msgstr "Nombre de cluster de Kubernetes" msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details" msgstr "" @@ -820,25 +922,22 @@ msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" -msgstr "" - -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" +msgstr "Conozca más sobre %{link_to_documentation}" msgid "ClusterIntegration|Learn more about environments" -msgstr "" +msgstr "Conozca más sobre los entornos" msgid "ClusterIntegration|Machine type" -msgstr "" +msgstr "Tipo de máquina" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters" msgstr "" msgid "ClusterIntegration|Manage" -msgstr "" +msgstr "Administrar" msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}" -msgstr "" +msgstr "Administre su cluster de Kubernetes visitando %{link_gke}" msgid "ClusterIntegration|More information" msgstr "" @@ -847,19 +946,19 @@ msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab E msgstr "" msgid "ClusterIntegration|Note:" -msgstr "" +msgstr "Nota:" msgid "ClusterIntegration|Number of nodes" -msgstr "" +msgstr "Número de nodos" msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes" msgstr "" msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" -msgstr "" +msgstr "Asegúrese de que su cuenta de Google cumpla con los siguientes requisitos:" msgid "ClusterIntegration|Project ID" -msgstr "" +msgstr "ID de Proyecto" msgid "ClusterIntegration|Project namespace" msgstr "" @@ -877,43 +976,43 @@ msgid "ClusterIntegration|Remove Kubernetes cluster integration" msgstr "" msgid "ClusterIntegration|Remove integration" -msgstr "" +msgstr "Eliminar integración" msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster." msgstr "" msgid "ClusterIntegration|Request to begin installing failed" -msgstr "" +msgstr "Falló la solicitud para iniciar la instalación" msgid "ClusterIntegration|Save changes" -msgstr "" +msgstr "Guardar cambios" msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster" msgstr "" msgid "ClusterIntegration|See machine types" -msgstr "" +msgstr "Ver tipos de máquina" msgid "ClusterIntegration|See your projects" -msgstr "" +msgstr "Ver tus proyectos" msgid "ClusterIntegration|See zones" -msgstr "" +msgstr "Ver zonas" msgid "ClusterIntegration|Service token" msgstr "" msgid "ClusterIntegration|Show" -msgstr "" +msgstr "Mostrar" msgid "ClusterIntegration|Something went wrong on our end." -msgstr "" +msgstr "Algo salió mal de nuestro lado." msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine" msgstr "" msgid "ClusterIntegration|Something went wrong while installing %{title}" -msgstr "" +msgstr "Algo salió mal durante la instalación de %{title}" msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below" msgstr "" @@ -925,51 +1024,62 @@ msgid "ClusterIntegration|Toggle Kubernetes cluster" msgstr "" msgid "ClusterIntegration|Token" -msgstr "" +msgstr "Token" msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" -msgstr "" +msgstr "Su cuenta debe tener %{link_to_kubernetes_engine}" msgid "ClusterIntegration|Zone" -msgstr "" +msgstr "Zona" msgid "ClusterIntegration|access to Google Kubernetes Engine" -msgstr "" +msgstr "acceso a Google Kubernetes Engine" msgid "ClusterIntegration|check the pricing here" msgstr "" msgid "ClusterIntegration|documentation" -msgstr "" +msgstr "documentación" msgid "ClusterIntegration|help page" -msgstr "" +msgstr "página de ayuda" msgid "ClusterIntegration|installing applications" -msgstr "" +msgstr "Instalando aplicaciones" msgid "ClusterIntegration|meets the requirements" -msgstr "" +msgstr "cumple con los requisitos" msgid "ClusterIntegration|properly configured" msgstr "" msgid "Collapse" +msgstr "Contraer" + +msgid "Comment and resolve discussion" msgstr "" -msgid "Comments" +msgid "Comment and unresolve discussion" msgstr "" +msgid "Comments" +msgstr "Comentarios" + msgid "Commit" msgid_plural "Commits" msgstr[0] "Cambio" msgstr[1] "Cambios" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" -msgstr "" +msgstr "Mensaje del commit" msgid "Commit duration in minutes for last 30 commits" msgstr "Duración de los cambios en minutos para los últimos 30" @@ -980,6 +1090,9 @@ msgstr "Mensaje del cambio" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Cambio" @@ -1041,49 +1154,49 @@ msgid "CompareBranches|There isn't anything to compare." msgstr "" msgid "Confidentiality" -msgstr "" +msgstr "Confidencialidad" msgid "Container Registry" msgstr "" msgid "ContainerRegistry|Created" -msgstr "" +msgstr "Creado" msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" msgstr "" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" +msgstr "Gitlab soporta hasta 3 niveles para nombres de imágenes. Los siguientes ejemplos de imágenes son válidos para tu proyecto:" msgid "ContainerRegistry|How to use the Container Registry" msgstr "" msgid "ContainerRegistry|Learn more about" -msgstr "" +msgstr "Conozca más sobre" msgid "ContainerRegistry|No tags in Container Registry for this container image." -msgstr "" +msgstr "No hay etiquetas en el Container Registry para esta imagen de contenedor." msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" -msgstr "" +msgstr "Una vez que inicies sesión, eres libre de crear y cargar una imagen de contenedor utilizando los comandos comunes %{build} y %{push}" msgid "ContainerRegistry|Remove repository" -msgstr "" +msgstr "Borrar repositorio" msgid "ContainerRegistry|Remove tag" -msgstr "" +msgstr "Borrar etiqueta" msgid "ContainerRegistry|Size" -msgstr "" +msgstr "Tamaño" msgid "ContainerRegistry|Tag" -msgstr "" +msgstr "Etiqueta" msgid "ContainerRegistry|Tag ID" -msgstr "" +msgstr "Etiqueta ID" msgid "ContainerRegistry|Use different image names" -msgstr "" +msgstr "Usar nombres de imagen diferentes" msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." msgstr "" @@ -1113,7 +1226,7 @@ msgid "Control the maximum concurrency of repository backfill for this secondary msgstr "" msgid "Copy SSH public key to clipboard" -msgstr "" +msgstr "Copiar la clave pública SSH al portapapeles" msgid "Copy URL to clipboard" msgstr "Copiar URL al portapapeles" @@ -1121,6 +1234,9 @@ msgstr "Copiar URL al portapapeles" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Copiar SHA del cambio al portapapeles" @@ -1128,14 +1244,23 @@ msgid "Copy reference to clipboard" msgstr "" msgid "Create" -msgstr "" +msgstr "Crear" msgid "Create New Directory" msgstr "Crear Nuevo Directorio" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Crear un token de acceso personal en tu cuenta para actualizar o enviar a través de %{protocol}." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Crear directorio" @@ -1143,10 +1268,10 @@ msgid "Create empty bare repository" msgstr "Crear repositorio vacÃo" msgid "Create epic" -msgstr "" +msgstr "Crear epic" msgid "Create file" -msgstr "" +msgstr "Crear archivo" msgid "Create lists from labels. Issues with that label appear in that list." msgstr "" @@ -1154,17 +1279,20 @@ msgstr "" msgid "Create merge request" msgstr "Crear solicitud de fusión" -msgid "Create new branch" +msgid "Create merge request and branch" msgstr "" +msgid "Create new branch" +msgstr "Crear una nueva rama" + msgid "Create new directory" -msgstr "" +msgstr "Crear nuevo directorio" msgid "Create new file" -msgstr "" +msgstr "Crear nuevo archivo" msgid "Create new label" -msgstr "" +msgstr "Crear nueva etiqueta" msgid "Create new..." msgstr "Crear nuevo..." @@ -1178,9 +1306,15 @@ msgstr "Etiqueta" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "crear un token de acceso personal" -msgid "Creating epic" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" msgstr "" +msgid "Creating epic" +msgstr "Creando epic" + msgid "Cron Timezone" msgstr "Zona horaria del Cron" @@ -1188,7 +1322,7 @@ msgid "Cron syntax" msgstr "Sintaxis de Cron" msgid "Current node" -msgstr "" +msgstr "Nodo actual" msgid "Custom notification events" msgstr "Eventos de notificaciones personalizadas" @@ -1221,15 +1355,18 @@ msgid "CycleAnalyticsStage|Test" msgstr "Pruebas" msgid "DashboardProjects|All" -msgstr "" +msgstr "Todos" msgid "DashboardProjects|Personal" -msgstr "" +msgstr "Personales" msgid "Dec" -msgstr "" +msgstr "Dic" msgid "December" +msgstr "Diciembre" + +msgid "Default classification label" msgstr "" msgid "Define a custom pattern with cron syntax" @@ -1253,7 +1390,7 @@ msgid "Description templates allow you to define context-specific templates for msgstr "" msgid "Details" -msgstr "" +msgstr "Detalles" msgid "Diffs|No file name available" msgstr "" @@ -1262,9 +1399,9 @@ msgid "Directory name" msgstr "Nombre del directorio" msgid "Disable" -msgstr "" +msgstr "Deshabilitar" -msgid "Discard changes" +msgid "Discard draft" msgstr "" msgid "Discover GitLab Geo." @@ -1322,6 +1459,9 @@ msgid "Emails" msgstr "" msgid "Enable" +msgstr "Habilitar" + +msgid "Enable Auto DevOps" msgstr "" msgid "Environments|An error occurred while fetching the environments." @@ -1367,23 +1507,32 @@ msgid "Environments|Show all" msgstr "" msgid "Environments|Updated" -msgstr "" +msgstr "Actualizado" msgid "Environments|You don't have any environments right now." -msgstr "" +msgstr "No tiene ningún entorno en este momento." msgid "Epic will be removed! Are you sure?" msgstr "" msgid "Epics" +msgstr "Epics" + +msgid "Epics Roadmap" msgstr "" msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" -msgid "Error creating epic" +msgid "Error checking branch data. Please try again." msgstr "" +msgid "Error committing changes. Please try again." +msgstr "" + +msgid "Error creating epic" +msgstr "Error creando epic" + msgid "Error fetching contributors data." msgstr "" @@ -1400,7 +1549,7 @@ msgid "Error fetching usage ping data." msgstr "" msgid "Error occurred when toggling the notification subscription" -msgstr "" +msgstr "Se produjo un error al activar/desactivar la suscripción de notificación" msgid "Error saving label update." msgstr "" @@ -1415,7 +1564,7 @@ msgid "EventFilterBy|Filter by all" msgstr "" msgid "EventFilterBy|Filter by comments" -msgstr "" +msgstr "Filtrar por comentarios" msgid "EventFilterBy|Filter by issue events" msgstr "" @@ -1427,7 +1576,7 @@ msgid "EventFilterBy|Filter by push events" msgstr "" msgid "EventFilterBy|Filter by team" -msgstr "" +msgstr "Filtrar por equipo" msgid "Every day (at 4:00am)" msgstr "Todos los dÃas (a las 4:00 am)" @@ -1439,35 +1588,62 @@ msgid "Every week (Sundays at 4:00am)" msgstr "Todas las semanas (domingos a las 4:00 am)" msgid "Expand" -msgstr "" +msgstr "Expandir" msgid "Explore projects" -msgstr "" +msgstr "Explorar proyectos" msgid "Explore public groups" +msgstr "Explorar grupos públicos" + +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" msgstr "" msgid "Failed to change the owner" msgstr "Error al cambiar el propietario" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Error al eliminar la programación del pipeline" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" msgid "February" -msgstr "" +msgstr "Febrero" msgid "Fields on this page are now uneditable, you can configure" msgstr "" msgid "File name" -msgstr "" +msgstr "Nombre de archivo" msgid "Files" msgstr "Archivos" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Filtrar por mensaje del cambio" @@ -1495,7 +1671,7 @@ msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" msgstr "" msgid "Format" -msgstr "" +msgstr "Formato" msgid "From issue creation until deploy to production" msgstr "Desde la creación de la incidencia hasta el despliegue a producción" @@ -1503,9 +1679,12 @@ msgstr "Desde la creación de la incidencia hasta el despliegue a producción" msgid "From merge request merge until deploy to production" msgstr "Desde la integración de la solicitud de fusión hasta el despliegue a producción" -msgid "GPG Keys" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" msgstr "" +msgid "GPG Keys" +msgstr "Llaves GPG" + msgid "Generate a default set of labels" msgstr "" @@ -1513,10 +1692,10 @@ msgid "Geo Nodes" msgstr "" msgid "GeoNodeSyncStatus|Node is failing or broken." -msgstr "" +msgstr "El nodo está fallando o dañado." msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage." -msgstr "" +msgstr "El nodo está lento, sobrecargado o se esta recuperando de una interrupción." msgid "GeoNodes|Database replication lag:" msgstr "" @@ -1603,7 +1782,7 @@ msgid "Geo|All projects" msgstr "" msgid "Geo|File sync capacity" -msgstr "" +msgstr "Capacidad de sincronización de archivos" msgid "Geo|Groups to synchronize" msgstr "" @@ -1615,10 +1794,10 @@ msgid "Geo|Projects in certain storage shards" msgstr "" msgid "Geo|Repository sync capacity" -msgstr "" +msgstr "Capacidad de sincronización del Repositorio" msgid "Geo|Select groups to replicate." -msgstr "" +msgstr "Seleccionar grupos a replicar." msgid "Geo|Shards to synchronize" msgstr "" @@ -1633,7 +1812,7 @@ msgid "Git version" msgstr "" msgid "GitLab Runner section" -msgstr "" +msgstr "Sección GitLab Runner" msgid "Gitaly Servers" msgstr "" @@ -1645,14 +1824,32 @@ msgid "GoToYourFork|Fork" msgstr "Bifurcación" msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." -msgstr "" +msgstr "La autenticación de Google no se encuentra %{link_to_documentation}. Pregúntale a tu administrador de GitLab si quieres usar este servicio." msgid "Got it!" msgstr "" -msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" msgstr "" +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "Prevenir que se comparta un proyecto de %{group} con otros grupos" + msgid "GroupSettings|Share with group lock" msgstr "" @@ -1681,7 +1878,7 @@ msgid "GroupsEmptyState|If you organize your projects under a group, it works li msgstr "" msgid "GroupsEmptyState|No groups found" -msgstr "" +msgstr "No se encuentran grupos" msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." msgstr "" @@ -1690,31 +1887,31 @@ msgid "GroupsTree|Are you sure you want to leave the \"${group.fullName}\" group msgstr "" msgid "GroupsTree|Create a project in this group." -msgstr "" +msgstr "Crear un proyecto en este grupo." msgid "GroupsTree|Create a subgroup in this group." -msgstr "" +msgstr "Crear un sub-grupo en este grupo." msgid "GroupsTree|Edit group" -msgstr "" +msgstr "Editar grupo" msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." -msgstr "" +msgstr "No pudiste dejar el grupo. Por favor, asegúrate que no seas el único propietario." msgid "GroupsTree|Filter by name..." -msgstr "" +msgstr "Filtrar por nombre..." msgid "GroupsTree|Leave this group" -msgstr "" +msgstr "Dejar este grupo" msgid "GroupsTree|Loading groups" -msgstr "" +msgstr "Cargando grupos" msgid "GroupsTree|Sorry, no groups matched your search" -msgstr "" +msgstr "Lo sentimos, no existen grupos que coincidan con su búsqueda" msgid "GroupsTree|Sorry, no groups or projects matched your search" -msgstr "" +msgstr "Lo sentimos, no existen grupos ni proyectos que coincidan con su búsqueda" msgid "Have your users email" msgstr "" @@ -1726,16 +1923,16 @@ msgid "Health information can be retrieved from the following endpoints. More in msgstr "" msgid "HealthCheck|Access token is" -msgstr "" +msgstr "Token de Acceso es" msgid "HealthCheck|Healthy" -msgstr "" +msgstr "Saludable" msgid "HealthCheck|No Health Problems Detected" msgstr "" msgid "HealthCheck|Unhealthy" -msgstr "" +msgstr "Poco Saludable" msgid "Hide value" msgid_plural "Hide values" @@ -1743,30 +1940,36 @@ msgstr[0] "" msgstr[1] "" msgid "History" -msgstr "" +msgstr "Historial" msgid "Housekeeping successfully started" msgstr "Servicio de limpieza iniciado con éxito" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "Importar repositorio" msgid "Improve Issue boards with GitLab Enterprise Edition." -msgstr "" +msgstr "Mejore los tableros de Incidencias con GitLab Enterprise Edition." msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." -msgstr "" +msgstr "Mejore la gestión de incidencias con Peso de Incidencias y GitLab Enterprise Edition." msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" -msgid "Install a Runner compatible with GitLab CI" +msgid "Install Runner on Kubernetes" msgstr "" +msgid "Install a Runner compatible with GitLab CI" +msgstr "Instala un Runner compatible con GitLab CI" + msgid "Instance" msgid_plural "Instances" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Instancia" +msgstr[1] "Instancias" msgid "Instance does not support multiple Kubernetes clusters" msgstr "" @@ -1775,10 +1978,10 @@ msgid "Interested parties can even contribute by pushing commits if they want to msgstr "" msgid "Internal - The group and any internal projects can be viewed by any logged in user." -msgstr "" +msgstr "Interno - cualquier usuario que haya iniciado sesión puede ver el grupo y cualquier proyecto interno." msgid "Internal - The project can be accessed by any logged in user." -msgstr "" +msgstr "Interno - cualquier usuario haya iniciado sesión puede acceder a este proyecto." msgid "Interval Pattern" msgstr "Patrón de intervalo" @@ -1787,16 +1990,16 @@ msgid "Introducing Cycle Analytics" msgstr "Introducción a Cycle Analytics" msgid "Issue board focus mode" -msgstr "" +msgstr "Modo enfocado del Tablero de Incidencias" msgid "Issue events" -msgstr "" +msgstr "Eventos de incidencia" msgid "IssueBoards|Board" -msgstr "" +msgstr "Tablero" msgid "IssueBoards|Boards" -msgstr "" +msgstr "Tableros" msgid "Issues" msgstr "" @@ -1808,6 +2011,9 @@ msgid "Jan" msgstr "" msgid "January" +msgstr "Enero" + +msgid "Jobs" msgstr "" msgid "Jul" @@ -1820,7 +2026,7 @@ msgid "Jun" msgstr "" msgid "June" -msgstr "" +msgstr "Junio" msgid "Kubernetes" msgstr "" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1870,13 +2079,13 @@ msgid "Last edited %{date}" msgstr "" msgid "Last edited by %{name}" -msgstr "" +msgstr "Última edición por %{name}" msgid "Last update" -msgstr "" +msgstr "Última actualización" msgid "Last updated" -msgstr "" +msgstr "Última actualización" msgid "LastPushEvent|You pushed to" msgstr "" @@ -1885,6 +2094,12 @@ msgid "LastPushEvent|at" msgstr "" msgid "Learn more" +msgstr "Conozca más" + +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" msgstr "" msgid "Learn more in the" @@ -1903,28 +2118,37 @@ msgid "Leave project" msgstr "Abandonar proyecto" msgid "License" +msgstr "Licencia" + +msgid "List" msgstr "" msgid "Loading the GitLab IDE..." msgstr "" msgid "Lock" -msgstr "" +msgstr "Bloquear" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" msgid "Locked" -msgstr "" +msgstr "Bloqueado" msgid "Locked Files" +msgstr "Archivos Bloqueados" + +msgid "Locks give the ability to lock specific file or folder." msgstr "" msgid "Login" -msgstr "" +msgstr "Iniciar sesión" msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos." msgstr "" @@ -1936,7 +2160,7 @@ msgid "Mar" msgstr "" msgid "March" -msgstr "" +msgstr "Marzo" msgid "Mark done" msgstr "" @@ -1951,10 +2175,7 @@ msgid "Median" msgstr "Mediana" msgid "Members" -msgstr "" - -msgid "Merge Request" -msgstr "" +msgstr "Miembros" msgid "Merge Requests" msgstr "" @@ -1968,11 +2189,14 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" msgid "Messages" -msgstr "" +msgstr "Mensajes" msgid "Milestone" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "agregar una clave SSH" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2028,19 +2261,19 @@ msgid "New branch" msgstr "Nueva rama" msgid "New branch unavailable" -msgstr "" +msgstr "Nueva rama no disponible" msgid "New directory" msgstr "Nuevo directorio" msgid "New epic" -msgstr "" +msgstr "Nuevo epic" msgid "New file" msgstr "Nuevo archivo" msgid "New group" -msgstr "" +msgstr "Nuevo grupo" msgid "New issue" msgstr "Nueva incidencia" @@ -2052,7 +2285,7 @@ msgid "New merge request" msgstr "Nueva solicitud de fusión" msgid "New project" -msgstr "" +msgstr "Nuevo proyecto" msgid "New schedule" msgstr "Nueva programación" @@ -2061,7 +2294,7 @@ msgid "New snippet" msgstr "Nuevo fragmento de código" msgid "New subgroup" -msgstr "" +msgstr "Nuevo sub-grupo" msgid "New tag" msgstr "Nueva etiqueta" @@ -2090,11 +2323,8 @@ msgstr "No hay repositorio" msgid "No schedules" msgstr "No hay programaciones" -msgid "No time spent" -msgstr "" - msgid "None" -msgstr "" +msgstr "Ninguno" msgid "Not allowed to merge" msgstr "" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "No hay suficientes datos" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Eventos de notificación" @@ -2163,7 +2396,7 @@ msgid "NotificationLevel|Watch" msgstr "Vigilancia" msgid "Notifications" -msgstr "" +msgstr "Notificaciones" msgid "Notifications off" msgstr "" @@ -2175,7 +2408,7 @@ msgid "Nov" msgstr "" msgid "November" -msgstr "" +msgstr "Noviembre" msgid "Number of access attempts" msgstr "" @@ -2187,32 +2420,35 @@ msgid "Oct" msgstr "" msgid "October" -msgstr "" +msgstr "Octubre" msgid "OfSearchInADropdown|Filter" msgstr "Filtrar" msgid "Only project members can comment." -msgstr "" +msgstr "Sólo los miembros de proyecto pueden comentar." msgid "Open" msgstr "" msgid "Opened" -msgstr "" +msgstr "Abierto" msgid "OpenedNDaysAgo|Opened" msgstr "Abierto" msgid "Opens in a new window" -msgstr "" +msgstr "Abre en una nueva ventana" msgid "Options" msgstr "Opciones" -msgid "Overview" +msgid "Otherwise it is recommended you start with one of the options below." msgstr "" +msgid "Overview" +msgstr "Resumen" + msgid "Owner" msgstr "Propietario" @@ -2229,10 +2465,10 @@ msgid "Pagination|« First" msgstr "" msgid "Password" -msgstr "" +msgstr "Contraseña" msgid "Pipeline" -msgstr "" +msgstr "Pipeline" msgid "Pipeline Health" msgstr "Estado del Pipeline" @@ -2295,7 +2531,7 @@ msgid "PipelineSheduleIntervalPattern|Custom" msgstr "Personalizado" msgid "Pipelines" -msgstr "" +msgstr "Pipelines" msgid "Pipelines charts" msgstr "Gráficos de los pipelines" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "todos" @@ -2337,19 +2591,22 @@ msgid "Please solve the reCAPTCHA" msgstr "" msgid "Preferences" -msgstr "" +msgstr "Preferencias" msgid "Primary" msgstr "" msgid "Private - Project access must be granted explicitly to each user." -msgstr "" +msgstr "Privado - El acceso al proyecto debe ser concedido explÃcitamente para cada usuario." msgid "Private - The group and its projects can only be viewed by members." +msgstr "Privado - El grupo y sus proyectos sólo pueden ser vistos por sus miembros." + +msgid "Private projects can be created in your personal namespace with:" msgstr "" msgid "Profile" -msgstr "" +msgstr "Perfil" msgid "Profiles|Account scheduled for removal." msgstr "" @@ -2367,31 +2624,31 @@ msgid "Profiles|Deleting an account has the following effects:" msgstr "" msgid "Profiles|Invalid password" -msgstr "" +msgstr "Contraseña inválida" msgid "Profiles|Invalid username" -msgstr "" +msgstr "Nombre de usuario inválido" msgid "Profiles|Type your %{confirmationValue} to confirm:" -msgstr "" +msgstr "Escribe tu %{confirmationValue} para confirmar:" msgid "Profiles|You don't have access to delete this user." -msgstr "" +msgstr "No tienes acceso para eliminar este usuario." msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." -msgstr "" +msgstr "Debes transferir o eliminar estos grupos antes de que puedas eliminar tu cuenta." msgid "Profiles|Your account is currently an owner in these groups:" -msgstr "" +msgstr "Actualmente su cuenta es propietaria de estos grupos:" msgid "Profiles|your account" -msgstr "" +msgstr "tu cuenta" msgid "Programming languages used in this repository" msgstr "" msgid "Project '%{project_name}' is in the process of being deleted." -msgstr "" +msgstr "Proyecto '%{project_name}' está en proceso de ser eliminado." msgid "Project '%{project_name}' queued for deletion." msgstr "Proyecto ‘%{project_name}’ en cola para eliminación." @@ -2415,7 +2672,7 @@ msgid "Project cache successfully reset." msgstr "" msgid "Project details" -msgstr "" +msgstr "Detalles del Proyecto" msgid "Project export could not be deleted." msgstr "No se pudo eliminar la exportación del proyecto." @@ -2430,7 +2687,7 @@ msgid "Project export started. A download link will be sent by email." msgstr "Se inició la exportación del proyecto. Se enviará un enlace de descarga por correo electrónico." msgid "ProjectActivityRSS|Subscribe" -msgstr "" +msgstr "Suscribirse" msgid "ProjectCreationLevel|Allowed to create projects" msgstr "" @@ -2469,98 +2726,131 @@ msgid "ProjectNetworkGraph|Graph" msgstr "Historial gráfico" msgid "ProjectSettings|Contact an admin to change this setting." -msgstr "" +msgstr "Póngase en contacto con un administrador para cambiar esta opción." msgid "ProjectSettings|Only signed commits can be pushed to this repository." -msgstr "" +msgstr "Solo se pueden enviar commits firmados a este repositorio." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." -msgstr "" +msgstr "Esta configuración se aplica a nivel del servidor y puede ser redefinida por un administrador." msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." -msgstr "" +msgstr "Esta configuración se aplica a nivel del servidor pero se ha redefinido para este proyecto." msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." -msgstr "" +msgstr "Esta configuración se aplicará a todos los proyectos a menos que sea redefinida por un administrador." msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgstr "" msgid "Projects" -msgstr "" +msgstr "Proyectos" msgid "ProjectsDropdown|Frequently visited" msgstr "" msgid "ProjectsDropdown|Loading projects" -msgstr "" +msgstr "Cargando proyectos" msgid "ProjectsDropdown|Projects you visit often will appear here" msgstr "" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "Busca en tus proyectos" msgid "ProjectsDropdown|Something went wrong on our end." -msgstr "" +msgstr "Algo salió mal por nuestra parte." msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" +msgstr "Lo sentimos, no hay proyectos que coincidan con su búsqueda" msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "Esta función requiere que el navegador soporte localStorage" + +msgid "PrometheusService|Active" msgstr "" -msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" msgstr "" +msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." +msgstr "De manera predeterminada, Prometheus escucha en 'http://localhost:9090'. No se recomienda cambiar la dirección y el puerto predeterminados, ya que esto podrÃa afectar o entrar en conflicto con otros servicios que se ejecutan en el servidor de GitLab." + msgid "PrometheusService|Finding and configuring metrics..." +msgstr "Encontrar y configurar métricas..." + +msgid "PrometheusService|Install Prometheus on clusters" msgstr "" -msgid "PrometheusService|Metrics" +msgid "PrometheusService|Manage clusters" msgstr "" -msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters." +msgid "PrometheusService|Manual configuration" msgstr "" +msgid "PrometheusService|Metrics" +msgstr "Métricas" + +msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters." +msgstr "Las métricas se configuran y supervisan automáticamente en función de una biblioteca de métricas de exportadores populares." + msgid "PrometheusService|Missing environment variable" -msgstr "" +msgstr "Falta la variable de entorno" msgid "PrometheusService|Monitored" -msgstr "" +msgstr "Monitoreado" msgid "PrometheusService|More information" -msgstr "" +msgstr "Más información" msgid "PrometheusService|No metrics are being monitored. To start monitoring, deploy to an environment." -msgstr "" +msgstr "No se están supervisando las métricas. Para comenzar a monitorear, despliega en un entorno." msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" +msgstr "URL Base de Prometheus, como http://prometheus.example.com/" + +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" msgstr "" msgid "PrometheusService|Time-series monitoring service" msgstr "" -msgid "PrometheusService|View environments" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" msgstr "" +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + +msgid "PrometheusService|View environments" +msgstr "Ver entornos" + msgid "Protip:" msgstr "" msgid "Public - The group and any public projects can be viewed without any authentication." -msgstr "" +msgstr "Público - El grupo y cualquier proyecto público puede ser visto sin autenticación." msgid "Public - The project can be accessed without any authentication." -msgstr "" +msgstr "Público - El proyecto puede ser accedido sin ninguna autenticación." msgid "Push Rules" -msgstr "" +msgstr "Reglas Push" msgid "Push events" +msgstr "Eventos Push" + +msgid "Push project from command line" msgstr "" -msgid "PushRule|Committer restriction" +msgid "Push to create a project" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "Restricción de Committer" + msgid "Quick actions can be used in the issues description and comment boxes." msgstr "" @@ -2583,7 +2873,7 @@ msgid "Register / Sign In" msgstr "" msgid "Registry" -msgstr "" +msgstr "Registro" msgid "Related Commits" msgstr "Cambios Relacionados" @@ -2619,6 +2909,9 @@ msgid "Repair authentication" msgstr "" msgid "Repository" +msgstr "Repositorio" + +msgid "Repository has no locks." msgstr "" msgid "Request Access" @@ -2631,6 +2924,9 @@ msgid "Reset health check access token" msgstr "" msgid "Reset runners registration token" +msgstr "Reinicializar el token de registro del runner" + +msgid "Resolve discussion" msgstr "" msgid "Reveal value" @@ -2644,11 +2940,14 @@ msgstr "Revertir este cambio" msgid "Revert this merge request" msgstr "Revertir esta solicitud de fusión" -msgid "SSH Keys" +msgid "Roadmap" msgstr "" +msgid "SSH Keys" +msgstr "Llaves SSH" + msgid "Save changes" -msgstr "" +msgstr "Guardar los cambios" msgid "Save pipeline schedule" msgstr "Guardar programación del pipeline" @@ -2681,20 +2980,26 @@ msgid "Search users" msgstr "" msgid "Seconds before reseting failure information" -msgstr "" +msgstr "Segundos antes de reinicializar información de fallas" msgid "Seconds to wait for a storage access attempt" -msgstr "" +msgstr "Segundos a esperar para intentar acceder al almacenamiento" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Seleccionar formato de archivo" msgid "Select a timezone" msgstr "Selecciona una zona horaria" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,16 +3012,22 @@ msgstr "Selecciona una rama de destino" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" msgid "September" -msgstr "" +msgstr "Septiembre" msgid "Server version" msgstr "" msgid "Service Templates" +msgstr "Plantillas de Servicio" + +msgid "Service URL" msgstr "" msgid "Set a password on your account to pull or push via %{protocol}." @@ -2728,13 +3039,13 @@ msgstr "" msgid "Set up Koding" msgstr "Configurar Koding" -msgid "Set up auto deploy" -msgstr "Configurar auto despliegue" - msgid "SetPasswordToCloneLink|set a password" msgstr "establecer una contraseña" msgid "Settings" +msgstr "Configuración" + +msgid "Setup a specific Runner automatically" msgstr "" msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." @@ -2746,9 +3057,12 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" -msgid "Show parent pages" +msgid "Show command" msgstr "" +msgid "Show parent pages" +msgstr "Mostrar páginas padre" + msgid "Show parent subgroups" msgstr "" @@ -2787,17 +3101,29 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" msgid "Sort by" -msgstr "" +msgstr "Ordenar por" msgid "SortOptions|Access level, ascending" msgstr "" @@ -2896,6 +3222,9 @@ msgid "SortOptions|Weight" msgstr "" msgid "Source" +msgstr "Fuente" + +msgid "Source (branch or tag)" msgstr "" msgid "Source code" @@ -2914,7 +3243,7 @@ msgid "StarProject|Star" msgstr "Destacar" msgid "Starred projects" -msgstr "" +msgstr "Proyectos favoritos" msgid "Start a %{new_merge_request} with these changes" msgstr "Iniciar una %{new_merge_request} con estos cambios" @@ -2923,24 +3252,24 @@ msgid "Start the Runner!" msgstr "" msgid "Stopped" -msgstr "" +msgstr "Detenido" msgid "Storage" msgstr "" msgid "Subgroups" -msgstr "" +msgstr "Sub-grupos" msgid "Switch branch/tag" msgstr "Cambiar rama/etiqueta" msgid "System Hooks" -msgstr "" +msgstr "Hooks de sistema" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Etiqueta" -msgstr[1] "Etiquetas" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" msgid "Tags" msgstr "Etiquetas" @@ -3018,10 +3347,10 @@ msgid "Target Branch" msgstr "Rama de destino" msgid "Team" -msgstr "" +msgstr "Equipo" msgid "Thanks! Don't show me this again" -msgstr "" +msgstr "Gracias! No mostrar esto nuevamente" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" @@ -3071,9 +3400,15 @@ msgstr "El proyecto puede accederse sin ninguna autenticación." msgid "The repository for this project does not exist." msgstr "El repositorio para este proyecto no existe." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "La etapa de revisión muestra el tiempo desde la creación de la solicitud de fusión hasta que los cambios se fusionaron. Los datos se añadirán automáticamente después de fusionar su primera solicitud de fusión." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "La etapa de puesta en escena muestra el tiempo entre la fusión y el despliegue de código en el entorno de producción. Los datos se añadirán automáticamente una vez que se despliega a producción por primera vez." @@ -3167,6 +3502,9 @@ msgstr "Esto significa que no puede enviar código hasta que cree un repositorio msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,7 +3674,13 @@ msgstr[1] "mins" msgid "Time|s" msgstr "s" +msgid "Tip:" +msgstr "" + msgid "Title" +msgstr "TÃtulo" + +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." msgstr "" msgid "Todo" @@ -3354,19 +3698,16 @@ msgstr "" msgid "Total Time" msgstr "Tiempo Total" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "Tiempo total de pruebas para todos los cambios o integraciones" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3388,12 +3726,15 @@ msgid "Unknown" msgstr "" msgid "Unlock" -msgstr "" +msgstr "Desbloquear" msgid "Unlock this %{issuableDisplayName}? <strong>Everyone</strong> will be able to comment." msgstr "" msgid "Unlocked" +msgstr "Desbloqueado" + +msgid "Unresolve discussion" msgstr "" msgid "Unstar" @@ -3441,9 +3782,12 @@ msgstr "Utiliza tu configuración de notificación global" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" -msgid "View file @ " +msgid "View epics list" msgstr "" +msgid "View file @ " +msgstr "Ver archivo @ " + msgid "View labels" msgstr "" @@ -3451,7 +3795,7 @@ msgid "View open merge request" msgstr "Ver solicitud de fusión abierta" msgid "View replaced file @ " -msgstr "" +msgstr "Ver archivo reemplazado @ " msgid "VisibilityLevel|Internal" msgstr "Interno" @@ -3477,14 +3821,17 @@ msgstr "No hay suficientes datos para mostrar en esta etapa." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" msgid "Weight" -msgstr "" +msgstr "Peso" msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "WikiClone|Clone your wiki" msgstr "" @@ -3597,6 +3944,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "Retirar Solicitud de Acceso" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Va a eliminar %{group_name}. ¡El grupo eliminado NO puede ser restaurado! ¿Estás TOTALMENTE seguro?" @@ -3609,10 +3959,13 @@ msgstr "Vas a eliminar el enlace de la bifurcación con el proyecto original %{f msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Vas a transferir %{project_name_with_namespace} a otro propietario. ¿Estás TOTALMENTE seguro?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Has alcanzado el lÃmite de tu proyecto" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "Debes iniciar sesión para destacar un proyecto" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "Necesitas permisos." @@ -3667,28 +4032,31 @@ msgid "You'll need to use different branch names to get a valid comparison." msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" +msgstr "La información del cluster de Kubernetes en esta página aún se puede editar, pero se recomienda desactivarla y modificar" + +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" msgstr "" msgid "Your comment will not be visible to the public." -msgstr "" +msgstr "Tus comentarios no serán visibles al público." msgid "Your groups" -msgstr "" +msgstr "Tus grupos" msgid "Your name" msgstr "Tu nombre" msgid "Your projects" -msgstr "" +msgstr "Tus proyectos" msgid "assign yourself" msgstr "" msgid "branch name" -msgstr "" +msgstr "nombre de la rama" msgid "by" -msgstr "" +msgstr "por" msgid "ciReport|Code quality" msgstr "" @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,9 +4112,15 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" -msgid "commit" +msgid "ciReport|no security vulnerabilities" msgstr "" +msgid "command line instructions" +msgstr "" + +msgid "commit" +msgstr "commit" + msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue." msgstr "" @@ -3752,11 +4135,41 @@ msgstr[1] "dÃas" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3901,10 +4323,10 @@ msgstr[0] "padre" msgstr[1] "padres" msgid "password" -msgstr "" +msgstr "contraseña" msgid "personal access token" -msgstr "" +msgstr "token de acceso personal" msgid "remove due date" msgstr "" @@ -3916,11 +4338,14 @@ msgid "spendCommand|%{slash_command} will update the sum of the time spent." msgstr "" msgid "to help your contributors communicate effectively!" -msgstr "" +msgstr "para ayudar a sus colaboradores a comunicarse de manera efectiva!" msgid "username" -msgstr "" +msgstr "usuario" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po new file mode 100644 index 00000000000..1037ec675e9 --- /dev/null +++ b/locale/fil_PH/gitlab.po @@ -0,0 +1,4351 @@ +msgid "" +msgstr "" +"Project-Id-Version: gitlab-ee\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:19-0500\n" +"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" +"Language-Team: Filipino\n" +"Language: fil_PH\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: gitlab-ee\n" +"X-Crowdin-Language: fil\n" +"X-Crowdin-File: /master/locale/gitlab.pot\n" + +msgid " and" +msgstr "" + +msgid "%d commit" +msgid_plural "%d commits" +msgstr[0] "" +msgstr[1] "" + +msgid "%d commit behind" +msgid_plural "%d commits behind" +msgstr[0] "" +msgstr[1] "" + +msgid "%d issue" +msgid_plural "%d issues" +msgstr[0] "" +msgstr[1] "" + +msgid "%d layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +msgid "%d merge request" +msgid_plural "%d merge requests" +msgstr[0] "" +msgstr[1] "" + +msgid "%s additional commit has been omitted to prevent performance issues." +msgid_plural "%s additional commits have been omitted to prevent performance issues." +msgstr[0] "" +msgstr[1] "" + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + +msgid "%{commit_author_link} authored %{commit_timeago}" +msgstr "" + +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgstr "" + +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." +msgstr "" + +msgid "%{openOrClose} %{noteable}" +msgstr "" + +msgid "%{storage_name}: failed storage access attempt on host:" +msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" +msgstr[0] "" +msgstr[1] "" + +msgid "%{text} is available" +msgstr "" + +msgid "(checkout the %{link} for information on how to install it)." +msgstr "" + +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + +msgid "1 pipeline" +msgid_plural "%d pipelines" +msgstr[0] "" +msgstr[1] "" + +msgid "1st contribution!" +msgstr "" + +msgid "2FA enabled" +msgstr "" + +msgid "A collection of graphs regarding Continuous Integration" +msgstr "" + +msgid "About auto deploy" +msgstr "" + +msgid "Abuse Reports" +msgstr "" + +msgid "Access Tokens" +msgstr "" + +msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." +msgstr "" + +msgid "Account" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Activity" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Add Changelog" +msgstr "" + +msgid "Add Contribution guide" +msgstr "" + +msgid "Add Group Webhooks and GitLab Enterprise Edition." +msgstr "" + +msgid "Add Kubernetes cluster" +msgstr "" + +msgid "Add License" +msgstr "" + +msgid "Add Readme" +msgstr "" + +msgid "Add new directory" +msgstr "" + +msgid "Add todo" +msgstr "" + +msgid "AdminArea|Stop all jobs" +msgstr "" + +msgid "AdminArea|Stop all jobs?" +msgstr "" + +msgid "AdminArea|Stop jobs" +msgstr "" + +msgid "AdminArea|Stopping jobs failed" +msgstr "" + +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." +msgstr "" + +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + +msgid "Advanced" +msgstr "" + +msgid "Advanced settings" +msgstr "" + +msgid "All" +msgstr "" + +msgid "All changes are committed" +msgstr "" + +msgid "Allows you to add and manage Kubernetes clusters." +msgstr "" + +msgid "An error occurred previewing the blob" +msgstr "" + +msgid "An error occurred when toggling the notification subscription" +msgstr "" + +msgid "An error occurred when updating the issue weight" +msgstr "" + +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + +msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." +msgstr "" + +msgid "An error occurred while fetching markdown preview" +msgstr "" + +msgid "An error occurred while fetching sidebar data" +msgstr "" + +msgid "An error occurred while fetching the pipeline." +msgstr "" + +msgid "An error occurred while getting projects" +msgstr "" + +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + +msgid "An error occurred while loading filenames" +msgstr "" + +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + +msgid "An error occurred while rendering KaTeX" +msgstr "" + +msgid "An error occurred while rendering preview broadcast message" +msgstr "" + +msgid "An error occurred while retrieving calendar activity" +msgstr "" + +msgid "An error occurred while retrieving diff" +msgstr "" + +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + +msgid "An error occurred while validating username" +msgstr "" + +msgid "An error occurred. Please try again." +msgstr "" + +msgid "Appearance" +msgstr "" + +msgid "Applications" +msgstr "" + +msgid "Apr" +msgstr "" + +msgid "April" +msgstr "" + +msgid "Archived project! Repository is read-only" +msgstr "" + +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "" + +msgid "Are you sure you want to reset registration token?" +msgstr "" + +msgid "Are you sure you want to reset the health check token?" +msgstr "" + +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + +msgid "Are you sure?" +msgstr "" + +msgid "Artifacts" +msgstr "" + +msgid "Assign custom color like #FF0000" +msgstr "" + +msgid "Assign labels" +msgstr "" + +msgid "Assign milestone" +msgstr "" + +msgid "Assign to" +msgstr "" + +msgid "Assignee" +msgstr "" + +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "" + +msgid "Aug" +msgstr "" + +msgid "August" +msgstr "" + +msgid "Authentication Log" +msgstr "" + +msgid "Author" +msgstr "" + +msgid "Authors: %{authors}" +msgstr "" + +msgid "Auto DevOps enabled" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "AutoDevOps|Auto DevOps (Beta)" +msgstr "" + +msgid "AutoDevOps|Auto DevOps documentation" +msgstr "" + +msgid "AutoDevOps|Enable in settings" +msgstr "" + +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "AutoDevOps|Learn more in the %{link_to_documentation}" +msgstr "" + +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Avatar will be removed. Are you sure?" +msgstr "" + +msgid "Average per day: %{average}" +msgstr "" + +msgid "Begin with the selected commit" +msgstr "" + +msgid "Billing" +msgstr "" + +msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." +msgstr "" + +msgid "BillingPlans|Current plan" +msgstr "" + +msgid "BillingPlans|Customer Support" +msgstr "" + +msgid "BillingPlans|Downgrade" +msgstr "" + +msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." +msgstr "" + +msgid "BillingPlans|Manage plan" +msgstr "" + +msgid "BillingPlans|Please contact %{customer_support_link} in that case." +msgstr "" + +msgid "BillingPlans|See all %{plan_name} features" +msgstr "" + +msgid "BillingPlans|This group uses the plan associated with its parent group." +msgstr "" + +msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." +msgstr "" + +msgid "BillingPlans|Upgrade" +msgstr "" + +msgid "BillingPlans|You are currently on the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|frequently asked questions" +msgstr "" + +msgid "BillingPlans|monthly" +msgstr "" + +msgid "BillingPlans|paid annually at %{price_per_year}" +msgstr "" + +msgid "BillingPlans|per user" +msgstr "" + +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" + +msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" +msgstr "" + +msgid "Branch has changed" +msgstr "" + +msgid "Branch is already taken" +msgstr "" + +msgid "Branch name" +msgstr "" + +msgid "BranchSwitcherPlaceholder|Search branches" +msgstr "" + +msgid "BranchSwitcherTitle|Switch branch" +msgstr "" + +msgid "Branches" +msgstr "" + +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + +msgid "Browse Directory" +msgstr "" + +msgid "Browse File" +msgstr "" + +msgid "Browse Files" +msgstr "" + +msgid "Browse files" +msgstr "" + +msgid "ByAuthor|by" +msgstr "" + +msgid "CI / CD" +msgstr "" + +msgid "CI/CD configuration" +msgstr "" + +msgid "CICD|Jobs" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "Cancel edit" +msgstr "" + +msgid "Cannot modify managed Kubernetes cluster" +msgstr "" + +msgid "Change Weight" +msgstr "" + +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "" + +msgid "ChangeTypeAction|Revert" +msgstr "" + +msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes." +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision." +msgstr "" + +msgid "Charts" +msgstr "" + +msgid "Chat" +msgstr "" + +msgid "Check interval" +msgstr "" + +msgid "Checking %{text} availability…" +msgstr "" + +msgid "Checking branch availability..." +msgstr "" + +msgid "Cherry-pick this commit" +msgstr "" + +msgid "Cherry-pick this merge request" +msgstr "" + +msgid "Choose File ..." +msgstr "" + +msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request." +msgstr "" + +msgid "Choose file..." +msgstr "" + +msgid "Choose which groups you wish to synchronize to this secondary node." +msgstr "" + +msgid "Choose which shards you wish to synchronize to this secondary node." +msgstr "" + +msgid "CiStatusLabel|canceled" +msgstr "" + +msgid "CiStatusLabel|created" +msgstr "" + +msgid "CiStatusLabel|failed" +msgstr "" + +msgid "CiStatusLabel|manual action" +msgstr "" + +msgid "CiStatusLabel|passed" +msgstr "" + +msgid "CiStatusLabel|passed with warnings" +msgstr "" + +msgid "CiStatusLabel|pending" +msgstr "" + +msgid "CiStatusLabel|skipped" +msgstr "" + +msgid "CiStatusLabel|waiting for manual action" +msgstr "" + +msgid "CiStatusText|blocked" +msgstr "" + +msgid "CiStatusText|canceled" +msgstr "" + +msgid "CiStatusText|created" +msgstr "" + +msgid "CiStatusText|failed" +msgstr "" + +msgid "CiStatusText|manual" +msgstr "" + +msgid "CiStatusText|passed" +msgstr "" + +msgid "CiStatusText|pending" +msgstr "" + +msgid "CiStatusText|skipped" +msgstr "" + +msgid "CiStatus|running" +msgstr "" + +msgid "CiVariables|Input variable key" +msgstr "" + +msgid "CiVariables|Input variable value" +msgstr "" + +msgid "CiVariables|Remove variable row" +msgstr "" + +msgid "CiVariable|* (All environments)" +msgstr "" + +msgid "CiVariable|All environments" +msgstr "" + +msgid "CiVariable|Create wildcard" +msgstr "" + +msgid "CiVariable|Error occured while saving variables" +msgstr "" + +msgid "CiVariable|New environment" +msgstr "" + +msgid "CiVariable|Protected" +msgstr "" + +msgid "CiVariable|Search environments" +msgstr "" + +msgid "CiVariable|Toggle protected" +msgstr "" + +msgid "CiVariable|Validation failed" +msgstr "" + +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + +msgid "Click to expand text" +msgstr "" + +msgid "Clone repository" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Closed" +msgstr "" + +msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|API URL" +msgstr "" + +msgid "ClusterIntegration|Add Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Add an existing Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration" +msgstr "" + +msgid "ClusterIntegration|Applications" +msgstr "" + +msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|CA Certificate" +msgstr "" + +msgid "ClusterIntegration|Certificate Authority bundle (PEM format)" +msgstr "" + +msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|Control how your Kubernetes cluster integrates with GitLab" +msgstr "" + +msgid "ClusterIntegration|Copy API URL" +msgstr "" + +msgid "ClusterIntegration|Copy CA Certificate" +msgstr "" + +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + +msgid "ClusterIntegration|Copy Kubernetes cluster name" +msgstr "" + +msgid "ClusterIntegration|Copy Token" +msgstr "" + +msgid "ClusterIntegration|Create Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab" +msgstr "" + +msgid "ClusterIntegration|Create on GKE" +msgstr "" + +msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Enter the details for your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Environment scope" +msgstr "" + +msgid "ClusterIntegration|GitLab Integration" +msgstr "" + +msgid "ClusterIntegration|GitLab Runner" +msgstr "" + +msgid "ClusterIntegration|Google Cloud Platform project ID" +msgstr "" + +msgid "ClusterIntegration|Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Google Kubernetes Engine project" +msgstr "" + +msgid "ClusterIntegration|Helm Tiller" +msgstr "" + +msgid "ClusterIntegration|Ingress" +msgstr "" + +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + +msgid "ClusterIntegration|Install" +msgstr "" + +msgid "ClusterIntegration|Installed" +msgstr "" + +msgid "ClusterIntegration|Installing" +msgstr "" + +msgid "ClusterIntegration|Integrate Kubernetes cluster automation" +msgstr "" + +msgid "ClusterIntegration|Integration status" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster details" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster name" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details" +msgstr "" + +msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}" +msgstr "" + +msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project" +msgstr "" + +msgid "ClusterIntegration|Learn more about %{link_to_documentation}" +msgstr "" + +msgid "ClusterIntegration|Learn more about environments" +msgstr "" + +msgid "ClusterIntegration|Machine type" +msgstr "" + +msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters" +msgstr "" + +msgid "ClusterIntegration|Manage" +msgstr "" + +msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}" +msgstr "" + +msgid "ClusterIntegration|More information" +msgstr "" + +msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate" +msgstr "" + +msgid "ClusterIntegration|Note:" +msgstr "" + +msgid "ClusterIntegration|Number of nodes" +msgstr "" + +msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes" +msgstr "" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + +msgid "ClusterIntegration|Project ID" +msgstr "" + +msgid "ClusterIntegration|Project namespace" +msgstr "" + +msgid "ClusterIntegration|Project namespace (optional, unique)" +msgstr "" + +msgid "ClusterIntegration|Prometheus" +msgstr "" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration." +msgstr "" + +msgid "ClusterIntegration|Remove Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Remove integration" +msgstr "" + +msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|Request to begin installing failed" +msgstr "" + +msgid "ClusterIntegration|Save changes" +msgstr "" + +msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" +msgstr "" + +msgid "ClusterIntegration|See your projects" +msgstr "" + +msgid "ClusterIntegration|See zones" +msgstr "" + +msgid "ClusterIntegration|Service token" +msgstr "" + +msgid "ClusterIntegration|Show" +msgstr "" + +msgid "ClusterIntegration|Something went wrong on our end." +msgstr "" + +msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Something went wrong while installing %{title}" +msgstr "" + +msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below" +msgstr "" + +msgid "ClusterIntegration|Toggle Kubernetes Cluster" +msgstr "" + +msgid "ClusterIntegration|Toggle Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Token" +msgstr "" + +msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." +msgstr "" + +msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" +msgstr "" + +msgid "ClusterIntegration|Zone" +msgstr "" + +msgid "ClusterIntegration|access to Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|check the pricing here" +msgstr "" + +msgid "ClusterIntegration|documentation" +msgstr "" + +msgid "ClusterIntegration|help page" +msgstr "" + +msgid "ClusterIntegration|installing applications" +msgstr "" + +msgid "ClusterIntegration|meets the requirements" +msgstr "" + +msgid "ClusterIntegration|properly configured" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + +msgid "Comments" +msgstr "" + +msgid "Commit" +msgid_plural "Commits" +msgstr[0] "" +msgstr[1] "" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + +msgid "Commit Message" +msgstr "" + +msgid "Commit duration in minutes for last 30 commits" +msgstr "" + +msgid "Commit message" +msgstr "" + +msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" +msgstr "" + +msgid "Commit to %{branchName} branch" +msgstr "" + +msgid "CommitBoxTitle|Commit" +msgstr "" + +msgid "CommitMessage|Add %{file_name}" +msgstr "" + +msgid "Commits" +msgstr "" + +msgid "Commits feed" +msgstr "" + +msgid "Commits per day hour (UTC)" +msgstr "" + +msgid "Commits per day of month" +msgstr "" + +msgid "Commits per weekday" +msgstr "" + +msgid "Commits|An error occurred while fetching merge requests data." +msgstr "" + +msgid "Commits|Commit: %{commitText}" +msgstr "" + +msgid "Commits|History" +msgstr "" + +msgid "Commits|No related merge requests found" +msgstr "" + +msgid "Committed by" +msgstr "" + +msgid "Compare" +msgstr "" + +msgid "Compare Git revisions" +msgstr "" + +msgid "Compare Revisions" +msgstr "" + +msgid "CompareBranches|%{source_branch} and %{target_branch} are the same." +msgstr "" + +msgid "CompareBranches|Compare" +msgstr "" + +msgid "CompareBranches|Source" +msgstr "" + +msgid "CompareBranches|Target" +msgstr "" + +msgid "CompareBranches|There isn't anything to compare." +msgstr "" + +msgid "Confidentiality" +msgstr "" + +msgid "Container Registry" +msgstr "" + +msgid "ContainerRegistry|Created" +msgstr "" + +msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" +msgstr "" + +msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" +msgstr "" + +msgid "ContainerRegistry|How to use the Container Registry" +msgstr "" + +msgid "ContainerRegistry|Learn more about" +msgstr "" + +msgid "ContainerRegistry|No tags in Container Registry for this container image." +msgstr "" + +msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" +msgstr "" + +msgid "ContainerRegistry|Remove repository" +msgstr "" + +msgid "ContainerRegistry|Remove tag" +msgstr "" + +msgid "ContainerRegistry|Size" +msgstr "" + +msgid "ContainerRegistry|Tag" +msgstr "" + +msgid "ContainerRegistry|Tag ID" +msgstr "" + +msgid "ContainerRegistry|Use different image names" +msgstr "" + +msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." +msgstr "" + +msgid "Contribution guide" +msgstr "" + +msgid "Contributors" +msgstr "" + +msgid "ContributorsPage|%{startDate} – %{endDate}" +msgstr "" + +msgid "ContributorsPage|Building repository graph." +msgstr "" + +msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limited to 6,000 commits." +msgstr "" + +msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready." +msgstr "" + +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + +msgid "Copy SSH public key to clipboard" +msgstr "" + +msgid "Copy URL to clipboard" +msgstr "" + +msgid "Copy branch name to clipboard" +msgstr "" + +msgid "Copy command to clipboard" +msgstr "" + +msgid "Copy commit SHA to clipboard" +msgstr "" + +msgid "Copy reference to clipboard" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Create New Directory" +msgstr "" + +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + +msgid "Create a personal access token on your account to pull or push via %{protocol}." +msgstr "" + +msgid "Create branch" +msgstr "" + +msgid "Create directory" +msgstr "" + +msgid "Create empty bare repository" +msgstr "" + +msgid "Create epic" +msgstr "" + +msgid "Create file" +msgstr "" + +msgid "Create lists from labels. Issues with that label appear in that list." +msgstr "" + +msgid "Create merge request" +msgstr "" + +msgid "Create merge request and branch" +msgstr "" + +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + +msgid "Create new label" +msgstr "" + +msgid "Create new..." +msgstr "" + +msgid "CreateNewFork|Fork" +msgstr "" + +msgid "CreateTag|Tag" +msgstr "" + +msgid "CreateTokenToCloneLink|create a personal access token" +msgstr "" + +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + +msgid "Creating epic" +msgstr "" + +msgid "Cron Timezone" +msgstr "" + +msgid "Cron syntax" +msgstr "" + +msgid "Current node" +msgstr "" + +msgid "Custom notification events" +msgstr "" + +msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}." +msgstr "" + +msgid "Cycle Analytics" +msgstr "" + +msgid "CycleAnalyticsStage|Code" +msgstr "" + +msgid "CycleAnalyticsStage|Issue" +msgstr "" + +msgid "CycleAnalyticsStage|Plan" +msgstr "" + +msgid "CycleAnalyticsStage|Production" +msgstr "" + +msgid "CycleAnalyticsStage|Review" +msgstr "" + +msgid "CycleAnalyticsStage|Staging" +msgstr "" + +msgid "CycleAnalyticsStage|Test" +msgstr "" + +msgid "DashboardProjects|All" +msgstr "" + +msgid "DashboardProjects|Personal" +msgstr "" + +msgid "Dec" +msgstr "" + +msgid "December" +msgstr "" + +msgid "Default classification label" +msgstr "" + +msgid "Define a custom pattern with cron syntax" +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "Deploy" +msgid_plural "Deploys" +msgstr[0] "" +msgstr[1] "" + +msgid "Deploy Keys" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." +msgstr "" + +msgid "Details" +msgstr "" + +msgid "Diffs|No file name available" +msgstr "" + +msgid "Directory name" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Discard draft" +msgstr "" + +msgid "Discover GitLab Geo." +msgstr "" + +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + +msgid "Dismiss Merge Request promotion" +msgstr "" + +msgid "Don't show again" +msgstr "" + +msgid "Download" +msgstr "" + +msgid "Download tar" +msgstr "" + +msgid "Download tar.bz2" +msgstr "" + +msgid "Download tar.gz" +msgstr "" + +msgid "Download zip" +msgstr "" + +msgid "DownloadArtifacts|Download" +msgstr "" + +msgid "DownloadCommit|Email Patches" +msgstr "" + +msgid "DownloadCommit|Plain Diff" +msgstr "" + +msgid "DownloadSource|Download" +msgstr "" + +msgid "Due date" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Edit Pipeline Schedule %{id}" +msgstr "" + +msgid "Edit files in the editor and commit changes here" +msgstr "" + +msgid "Emails" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "Enable Auto DevOps" +msgstr "" + +msgid "Environments|An error occurred while fetching the environments." +msgstr "" + +msgid "Environments|An error occurred while making the request." +msgstr "" + +msgid "Environments|Commit" +msgstr "" + +msgid "Environments|Deployment" +msgstr "" + +msgid "Environments|Environment" +msgstr "" + +msgid "Environments|Environments" +msgstr "" + +msgid "Environments|Job" +msgstr "" + +msgid "Environments|New environment" +msgstr "" + +msgid "Environments|No deployments yet" +msgstr "" + +msgid "Environments|Open" +msgstr "" + +msgid "Environments|Re-deploy" +msgstr "" + +msgid "Environments|Read more about environments" +msgstr "" + +msgid "Environments|Rollback" +msgstr "" + +msgid "Environments|Show all" +msgstr "" + +msgid "Environments|Updated" +msgstr "" + +msgid "Environments|You don't have any environments right now." +msgstr "" + +msgid "Epic will be removed! Are you sure?" +msgstr "" + +msgid "Epics" +msgstr "" + +msgid "Epics Roadmap" +msgstr "" + +msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + +msgid "Error creating epic" +msgstr "" + +msgid "Error fetching contributors data." +msgstr "" + +msgid "Error fetching labels." +msgstr "" + +msgid "Error fetching network graph." +msgstr "" + +msgid "Error fetching refs" +msgstr "" + +msgid "Error fetching usage ping data." +msgstr "" + +msgid "Error occurred when toggling the notification subscription" +msgstr "" + +msgid "Error saving label update." +msgstr "" + +msgid "Error updating status for all todos." +msgstr "" + +msgid "Error updating todo status." +msgstr "" + +msgid "EventFilterBy|Filter by all" +msgstr "" + +msgid "EventFilterBy|Filter by comments" +msgstr "" + +msgid "EventFilterBy|Filter by issue events" +msgstr "" + +msgid "EventFilterBy|Filter by merge events" +msgstr "" + +msgid "EventFilterBy|Filter by push events" +msgstr "" + +msgid "EventFilterBy|Filter by team" +msgstr "" + +msgid "Every day (at 4:00am)" +msgstr "" + +msgid "Every month (on the 1st at 4:00am)" +msgstr "" + +msgid "Every week (Sundays at 4:00am)" +msgstr "" + +msgid "Expand" +msgstr "" + +msgid "Explore projects" +msgstr "" + +msgid "Explore public groups" +msgstr "" + +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + +msgid "Failed to change the owner" +msgstr "" + +msgid "Failed to remove issue from board, please try again." +msgstr "" + +msgid "Failed to remove the pipeline schedule" +msgstr "" + +msgid "Failed to update issues, please try again." +msgstr "" + +msgid "Feb" +msgstr "" + +msgid "February" +msgstr "" + +msgid "Fields on this page are now uneditable, you can configure" +msgstr "" + +msgid "File name" +msgstr "" + +msgid "Files" +msgstr "" + +msgid "Files (%{human_size})" +msgstr "" + +msgid "Filter by commit message" +msgstr "" + +msgid "Find by path" +msgstr "" + +msgid "Find file" +msgstr "" + +msgid "FirstPushedBy|First" +msgstr "" + +msgid "FirstPushedBy|pushed by" +msgstr "" + +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "" +msgstr[1] "" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "" + +msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" +msgstr "" + +msgid "Format" +msgstr "" + +msgid "From issue creation until deploy to production" +msgstr "" + +msgid "From merge request merge until deploy to production" +msgstr "" + +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + +msgid "GPG Keys" +msgstr "" + +msgid "Generate a default set of labels" +msgstr "" + +msgid "Geo Nodes" +msgstr "" + +msgid "GeoNodeSyncStatus|Node is failing or broken." +msgstr "" + +msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage." +msgstr "" + +msgid "GeoNodes|Database replication lag:" +msgstr "" + +msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?" +msgstr "" + +msgid "GeoNodes|Does not match the primary storage configuration" +msgstr "" + +msgid "GeoNodes|Failed" +msgstr "" + +msgid "GeoNodes|Full" +msgstr "" + +msgid "GeoNodes|GitLab version does not match the primary node version" +msgstr "" + +msgid "GeoNodes|GitLab version:" +msgstr "" + +msgid "GeoNodes|Health status:" +msgstr "" + +msgid "GeoNodes|Last event ID processed by cursor:" +msgstr "" + +msgid "GeoNodes|Last event ID seen from primary:" +msgstr "" + +msgid "GeoNodes|Loading nodes" +msgstr "" + +msgid "GeoNodes|Local Attachments:" +msgstr "" + +msgid "GeoNodes|Local LFS objects:" +msgstr "" + +msgid "GeoNodes|Local job artifacts:" +msgstr "" + +msgid "GeoNodes|New node" +msgstr "" + +msgid "GeoNodes|Out of sync" +msgstr "" + +msgid "GeoNodes|Replication slot WAL:" +msgstr "" + +msgid "GeoNodes|Replication slots:" +msgstr "" + +msgid "GeoNodes|Repositories:" +msgstr "" + +msgid "GeoNodes|Selective" +msgstr "" + +msgid "GeoNodes|Storage config:" +msgstr "" + +msgid "GeoNodes|Sync settings:" +msgstr "" + +msgid "GeoNodes|Synced" +msgstr "" + +msgid "GeoNodes|Unused slots" +msgstr "" + +msgid "GeoNodes|Used slots" +msgstr "" + +msgid "GeoNodes|Wikis:" +msgstr "" + +msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS." +msgstr "" + +msgid "Geo|All projects" +msgstr "" + +msgid "Geo|File sync capacity" +msgstr "" + +msgid "Geo|Groups to synchronize" +msgstr "" + +msgid "Geo|Projects in certain groups" +msgstr "" + +msgid "Geo|Projects in certain storage shards" +msgstr "" + +msgid "Geo|Repository sync capacity" +msgstr "" + +msgid "Geo|Select groups to replicate." +msgstr "" + +msgid "Geo|Shards to synchronize" +msgstr "" + +msgid "Git revision" +msgstr "" + +msgid "Git storage health information has been reset" +msgstr "" + +msgid "Git version" +msgstr "" + +msgid "GitLab Runner section" +msgstr "" + +msgid "Gitaly Servers" +msgstr "" + +msgid "Go to your fork" +msgstr "" + +msgid "GoToYourFork|Fork" +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 "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" +msgstr "" + +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + +msgid "Have your users email" +msgstr "" + +msgid "Health Check" +msgstr "" + +msgid "Health information can be retrieved from the following endpoints. More information is available" +msgstr "" + +msgid "HealthCheck|Access token is" +msgstr "" + +msgid "HealthCheck|Healthy" +msgstr "" + +msgid "HealthCheck|No Health Problems Detected" +msgstr "" + +msgid "HealthCheck|Unhealthy" +msgstr "" + +msgid "Hide value" +msgid_plural "Hide values" +msgstr[0] "" +msgstr[1] "" + +msgid "History" +msgstr "" + +msgid "Housekeeping successfully started" +msgstr "" + +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + +msgid "Import repository" +msgstr "" + +msgid "Improve Issue boards with GitLab Enterprise Edition." +msgstr "" + +msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." +msgstr "" + +msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." +msgstr "" + +msgid "Install Runner on Kubernetes" +msgstr "" + +msgid "Install a Runner compatible with GitLab CI" +msgstr "" + +msgid "Instance" +msgid_plural "Instances" +msgstr[0] "" +msgstr[1] "" + +msgid "Instance does not support multiple Kubernetes clusters" +msgstr "" + +msgid "Interested parties can even contribute by pushing commits if they want to." +msgstr "" + +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + +msgid "Interval Pattern" +msgstr "" + +msgid "Introducing Cycle Analytics" +msgstr "" + +msgid "Issue board focus mode" +msgstr "" + +msgid "Issue events" +msgstr "" + +msgid "IssueBoards|Board" +msgstr "" + +msgid "IssueBoards|Boards" +msgstr "" + +msgid "Issues" +msgstr "" + +msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable." +msgstr "" + +msgid "Jan" +msgstr "" + +msgid "January" +msgstr "" + +msgid "Jobs" +msgstr "" + +msgid "Jul" +msgstr "" + +msgid "July" +msgstr "" + +msgid "Jun" +msgstr "" + +msgid "June" +msgstr "" + +msgid "Kubernetes" +msgstr "" + +msgid "Kubernetes Cluster" +msgstr "" + +msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}" +msgstr "" + +msgid "Kubernetes cluster integration was not removed." +msgstr "" + +msgid "Kubernetes cluster integration was successfully removed." +msgstr "" + +msgid "Kubernetes cluster was successfully updated." +msgstr "" + +msgid "Kubernetes configured" +msgstr "" + +msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" +msgstr "" + +msgid "LFSStatus|Disabled" +msgstr "" + +msgid "LFSStatus|Enabled" +msgstr "" + +msgid "Labels" +msgstr "" + +msgid "Labels can be applied to issues and merge requests to categorize them." +msgstr "" + +msgid "Last %d day" +msgid_plural "Last %d days" +msgstr[0] "" +msgstr[1] "" + +msgid "Last Pipeline" +msgstr "" + +msgid "Last commit" +msgstr "" + +msgid "Last edited %{date}" +msgstr "" + +msgid "Last edited by %{name}" +msgstr "" + +msgid "Last update" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "LastPushEvent|You pushed to" +msgstr "" + +msgid "LastPushEvent|at" +msgstr "" + +msgid "Learn more" +msgstr "" + +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + +msgid "Learn more in the" +msgstr "" + +msgid "Learn more in the|pipeline schedules documentation" +msgstr "" + +msgid "Leave" +msgstr "" + +msgid "Leave group" +msgstr "" + +msgid "Leave project" +msgstr "" + +msgid "License" +msgstr "" + +msgid "List" +msgstr "" + +msgid "Loading the GitLab IDE..." +msgstr "" + +msgid "Lock" +msgstr "" + +msgid "Lock %{issuableDisplayName}" +msgstr "" + +msgid "Lock not found" +msgstr "" + +msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." +msgstr "" + +msgid "Locked" +msgstr "" + +msgid "Locked Files" +msgstr "" + +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + +msgid "Login" +msgstr "" + +msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos." +msgstr "" + +msgid "Manage labels" +msgstr "" + +msgid "Mar" +msgstr "" + +msgid "March" +msgstr "" + +msgid "Mark done" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + +msgid "May" +msgstr "" + +msgid "Median" +msgstr "" + +msgid "Members" +msgstr "" + +msgid "Merge Requests" +msgstr "" + +msgid "Merge events" +msgstr "" + +msgid "Merge request" +msgstr "" + +msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" +msgstr "" + +msgid "MergeRequest|Approved" +msgstr "" + +msgid "Merged" +msgstr "" + +msgid "Messages" +msgstr "" + +msgid "Milestone" +msgstr "" + +msgid "Milestones|Delete milestone" +msgstr "" + +msgid "Milestones|Delete milestone %{milestoneTitle}?" +msgstr "" + +msgid "Milestones|Failed to delete milestone %{milestoneTitle}" +msgstr "" + +msgid "Milestones|Milestone %{milestoneTitle} was not found" +msgstr "" + +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "" + +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + +msgid "Monitoring" +msgstr "" + +msgid "More information" +msgstr "" + +msgid "More information is available|here" +msgstr "" + +msgid "Move" +msgstr "" + +msgid "Move issue" +msgstr "" + +msgid "Multiple issue boards" +msgstr "" + +msgid "Name new label" +msgstr "" + +msgid "New Issue" +msgid_plural "New Issues" +msgstr[0] "" +msgstr[1] "" + +msgid "New Kubernetes Cluster" +msgstr "" + +msgid "New Kubernetes cluster" +msgstr "" + +msgid "New Pipeline Schedule" +msgstr "" + +msgid "New branch" +msgstr "" + +msgid "New branch unavailable" +msgstr "" + +msgid "New directory" +msgstr "" + +msgid "New epic" +msgstr "" + +msgid "New file" +msgstr "" + +msgid "New group" +msgstr "" + +msgid "New issue" +msgstr "" + +msgid "New label" +msgstr "" + +msgid "New merge request" +msgstr "" + +msgid "New project" +msgstr "" + +msgid "New schedule" +msgstr "" + +msgid "New snippet" +msgstr "" + +msgid "New subgroup" +msgstr "" + +msgid "New tag" +msgstr "" + +msgid "No assignee" +msgstr "" + +msgid "No changes" +msgstr "" + +msgid "No connection could be made to a Gitaly Server, please check your logs!" +msgstr "" + +msgid "No due date" +msgstr "" + +msgid "No estimate or time spent" +msgstr "" + +msgid "No file chosen" +msgstr "" + +msgid "No repository" +msgstr "" + +msgid "No schedules" +msgstr "" + +msgid "None" +msgstr "" + +msgid "Not allowed to merge" +msgstr "" + +msgid "Not available" +msgstr "" + +msgid "Not confidential" +msgstr "" + +msgid "Not enough data" +msgstr "" + +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + +msgid "Notification events" +msgstr "" + +msgid "NotificationEvent|Close issue" +msgstr "" + +msgid "NotificationEvent|Close merge request" +msgstr "" + +msgid "NotificationEvent|Failed pipeline" +msgstr "" + +msgid "NotificationEvent|Merge merge request" +msgstr "" + +msgid "NotificationEvent|New issue" +msgstr "" + +msgid "NotificationEvent|New merge request" +msgstr "" + +msgid "NotificationEvent|New note" +msgstr "" + +msgid "NotificationEvent|Reassign issue" +msgstr "" + +msgid "NotificationEvent|Reassign merge request" +msgstr "" + +msgid "NotificationEvent|Reopen issue" +msgstr "" + +msgid "NotificationEvent|Successful pipeline" +msgstr "" + +msgid "NotificationLevel|Custom" +msgstr "" + +msgid "NotificationLevel|Disabled" +msgstr "" + +msgid "NotificationLevel|Global" +msgstr "" + +msgid "NotificationLevel|On mention" +msgstr "" + +msgid "NotificationLevel|Participate" +msgstr "" + +msgid "NotificationLevel|Watch" +msgstr "" + +msgid "Notifications" +msgstr "" + +msgid "Notifications off" +msgstr "" + +msgid "Notifications on" +msgstr "" + +msgid "Nov" +msgstr "" + +msgid "November" +msgstr "" + +msgid "Number of access attempts" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "Oct" +msgstr "" + +msgid "October" +msgstr "" + +msgid "OfSearchInADropdown|Filter" +msgstr "" + +msgid "Only project members can comment." +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Opened" +msgstr "" + +msgid "OpenedNDaysAgo|Opened" +msgstr "" + +msgid "Opens in a new window" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "Owner" +msgstr "" + +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Pipeline" +msgstr "" + +msgid "Pipeline Health" +msgstr "" + +msgid "Pipeline Schedule" +msgstr "" + +msgid "Pipeline Schedules" +msgstr "" + +msgid "Pipeline quota" +msgstr "" + +msgid "PipelineCharts|Failed:" +msgstr "" + +msgid "PipelineCharts|Overall statistics" +msgstr "" + +msgid "PipelineCharts|Success ratio:" +msgstr "" + +msgid "PipelineCharts|Successful:" +msgstr "" + +msgid "PipelineCharts|Total:" +msgstr "" + +msgid "PipelineSchedules|Activated" +msgstr "" + +msgid "PipelineSchedules|Active" +msgstr "" + +msgid "PipelineSchedules|All" +msgstr "" + +msgid "PipelineSchedules|Inactive" +msgstr "" + +msgid "PipelineSchedules|Next Run" +msgstr "" + +msgid "PipelineSchedules|None" +msgstr "" + +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "" + +msgid "PipelineSchedules|Take ownership" +msgstr "" + +msgid "PipelineSchedules|Target" +msgstr "" + +msgid "PipelineSchedules|Variables" +msgstr "" + +msgid "PipelineSheduleIntervalPattern|Custom" +msgstr "" + +msgid "Pipelines" +msgstr "" + +msgid "Pipelines charts" +msgstr "" + +msgid "Pipelines for last month" +msgstr "" + +msgid "Pipelines for last week" +msgstr "" + +msgid "Pipelines for last year" +msgstr "" + +msgid "Pipelines|Build with confidence" +msgstr "" + +msgid "Pipelines|Get started with Pipelines" +msgstr "" + +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|all" +msgstr "" + +msgid "Pipeline|success" +msgstr "" + +msgid "Pipeline|with stage" +msgstr "" + +msgid "Pipeline|with stages" +msgstr "" + +msgid "Play" +msgstr "" + +msgid "Please <a href=%{link_to_billing} target=\"_blank\" rel=\"noopener noreferrer\">enable billing for one of your projects to be able to create a Kubernetes cluster</a>, then try again." +msgstr "" + +msgid "Please solve the reCAPTCHA" +msgstr "" + +msgid "Preferences" +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + +msgid "Profile" +msgstr "" + +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Programming languages used in this repository" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + +msgid "Project '%{project_name}' queued for deletion." +msgstr "" + +msgid "Project '%{project_name}' was successfully created." +msgstr "" + +msgid "Project '%{project_name}' was successfully updated." +msgstr "" + +msgid "Project access must be granted explicitly to each user." +msgstr "" + +msgid "Project avatar" +msgstr "" + +msgid "Project avatar in repository: %{link}" +msgstr "" + +msgid "Project cache successfully reset." +msgstr "" + +msgid "Project details" +msgstr "" + +msgid "Project export could not be deleted." +msgstr "" + +msgid "Project export has been deleted." +msgstr "" + +msgid "Project export link has expired. Please generate a new export from your project settings." +msgstr "" + +msgid "Project export started. A download link will be sent by email." +msgstr "" + +msgid "ProjectActivityRSS|Subscribe" +msgstr "" + +msgid "ProjectCreationLevel|Allowed to create projects" +msgstr "" + +msgid "ProjectCreationLevel|Default project creation protection" +msgstr "" + +msgid "ProjectCreationLevel|Developers + Masters" +msgstr "" + +msgid "ProjectCreationLevel|Masters" +msgstr "" + +msgid "ProjectCreationLevel|No one" +msgstr "" + +msgid "ProjectFeature|Disabled" +msgstr "" + +msgid "ProjectFeature|Everyone with access" +msgstr "" + +msgid "ProjectFeature|Only team members" +msgstr "" + +msgid "ProjectFileTree|Name" +msgstr "" + +msgid "ProjectLastActivity|Never" +msgstr "" + +msgid "ProjectLifecycle|Stage" +msgstr "" + +msgid "ProjectNetworkGraph|Graph" +msgstr "" + +msgid "ProjectSettings|Contact an admin to change this setting." +msgstr "" + +msgid "ProjectSettings|Only signed commits can be pushed to this repository." +msgstr "" + +msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." +msgstr "" + +msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." +msgstr "" + +msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." +msgstr "" + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + +msgid "ProjectsDropdown|Frequently visited" +msgstr "" + +msgid "ProjectsDropdown|Loading projects" +msgstr "" + +msgid "ProjectsDropdown|Projects you visit often will appear here" +msgstr "" + +msgid "ProjectsDropdown|Search your projects" +msgstr "" + +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "" + +msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "" + +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + +msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." +msgstr "" + +msgid "PrometheusService|Finding and configuring metrics..." +msgstr "" + +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + +msgid "PrometheusService|Metrics" +msgstr "" + +msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters." +msgstr "" + +msgid "PrometheusService|Missing environment variable" +msgstr "" + +msgid "PrometheusService|Monitored" +msgstr "" + +msgid "PrometheusService|More information" +msgstr "" + +msgid "PrometheusService|No metrics are being monitored. To start monitoring, deploy to an environment." +msgstr "" + +msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" +msgstr "" + +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + +msgid "PrometheusService|Time-series monitoring service" +msgstr "" + +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + +msgid "PrometheusService|View environments" +msgstr "" + +msgid "Protip:" +msgstr "" + +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + +msgid "Push Rules" +msgstr "" + +msgid "Push events" +msgstr "" + +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + +msgid "PushRule|Committer restriction" +msgstr "" + +msgid "Quick actions can be used in the issues description and comment boxes." +msgstr "" + +msgid "Read more" +msgstr "" + +msgid "Readme" +msgstr "" + +msgid "RefSwitcher|Branches" +msgstr "" + +msgid "RefSwitcher|Tags" +msgstr "" + +msgid "Reference:" +msgstr "" + +msgid "Register / Sign In" +msgstr "" + +msgid "Registry" +msgstr "" + +msgid "Related Commits" +msgstr "" + +msgid "Related Deployed Jobs" +msgstr "" + +msgid "Related Issues" +msgstr "" + +msgid "Related Jobs" +msgstr "" + +msgid "Related Merge Requests" +msgstr "" + +msgid "Related Merged Requests" +msgstr "" + +msgid "Remind later" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Remove avatar" +msgstr "" + +msgid "Remove project" +msgstr "" + +msgid "Repair authentication" +msgstr "" + +msgid "Repository" +msgstr "" + +msgid "Repository has no locks." +msgstr "" + +msgid "Request Access" +msgstr "" + +msgid "Reset git storage health information" +msgstr "" + +msgid "Reset health check access token" +msgstr "" + +msgid "Reset runners registration token" +msgstr "" + +msgid "Resolve discussion" +msgstr "" + +msgid "Reveal value" +msgid_plural "Reveal values" +msgstr[0] "" +msgstr[1] "" + +msgid "Revert this commit" +msgstr "" + +msgid "Revert this merge request" +msgstr "" + +msgid "Roadmap" +msgstr "" + +msgid "SSH Keys" +msgstr "" + +msgid "Save changes" +msgstr "" + +msgid "Save pipeline schedule" +msgstr "" + +msgid "Save variables" +msgstr "" + +msgid "Schedule a new pipeline" +msgstr "" + +msgid "Schedules" +msgstr "" + +msgid "Scheduling Pipelines" +msgstr "" + +msgid "Scoped issue boards" +msgstr "" + +msgid "Search branches and tags" +msgstr "" + +msgid "Search milestones" +msgstr "" + +msgid "Search project" +msgstr "" + +msgid "Search users" +msgstr "" + +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + +msgid "Secret variables" +msgstr "" + +msgid "Security report" +msgstr "" + +msgid "Select Archive Format" +msgstr "" + +msgid "Select a timezone" +msgstr "" + +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + +msgid "Select assignee" +msgstr "" + +msgid "Select branch/tag" +msgstr "" + +msgid "Select target branch" +msgstr "" + +msgid "Selective synchronization" +msgstr "" + +msgid "Send email" +msgstr "" + +msgid "Sep" +msgstr "" + +msgid "September" +msgstr "" + +msgid "Server version" +msgstr "" + +msgid "Service Templates" +msgstr "" + +msgid "Service URL" +msgstr "" + +msgid "Set a password on your account to pull or push via %{protocol}." +msgstr "" + +msgid "Set up CI/CD" +msgstr "" + +msgid "Set up Koding" +msgstr "" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Setup a specific Runner automatically" +msgstr "" + +msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." +msgstr "" + +msgid "SharedRunnersMinutesSettings|Reset pipeline minutes" +msgstr "" + +msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" +msgstr "" + +msgid "Show command" +msgstr "" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + +msgid "Showing %d event" +msgid_plural "Showing %d events" +msgstr[0] "" +msgstr[1] "" + +msgid "Sidebar|Change weight" +msgstr "" + +msgid "Sidebar|No" +msgstr "" + +msgid "Sidebar|None" +msgstr "" + +msgid "Sidebar|Weight" +msgstr "" + +msgid "Snippets" +msgstr "" + +msgid "Something went wrong on our end" +msgstr "" + +msgid "Something went wrong on our end." +msgstr "" + +msgid "Something went wrong trying to change the confidentiality of this issue" +msgstr "" + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName}" +msgstr "" + +msgid "Something went wrong when toggling the button" +msgstr "" + +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + +msgid "Something went wrong while fetching the projects." +msgstr "" + +msgid "Something went wrong while fetching the registry list." +msgstr "" + +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + +msgid "Something went wrong. Please try again." +msgstr "" + +msgid "Sort by" +msgstr "" + +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Source (branch or tag)" +msgstr "" + +msgid "Source code" +msgstr "" + +msgid "Source is not available" +msgstr "" + +msgid "Spam Logs" +msgstr "" + +msgid "Specify the following URL during the Runner setup:" +msgstr "" + +msgid "StarProject|Star" +msgstr "" + +msgid "Starred projects" +msgstr "" + +msgid "Start a %{new_merge_request} with these changes" +msgstr "" + +msgid "Start the Runner!" +msgstr "" + +msgid "Stopped" +msgstr "" + +msgid "Storage" +msgstr "" + +msgid "Subgroups" +msgstr "" + +msgid "Switch branch/tag" +msgstr "" + +msgid "System Hooks" +msgstr "" + +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" + +msgid "Tags" +msgstr "" + +msgid "TagsPage|Browse commits" +msgstr "" + +msgid "TagsPage|Browse files" +msgstr "" + +msgid "TagsPage|Can't find HEAD commit for this tag" +msgstr "" + +msgid "TagsPage|Cancel" +msgstr "" + +msgid "TagsPage|Create tag" +msgstr "" + +msgid "TagsPage|Delete tag" +msgstr "" + +msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?" +msgstr "" + +msgid "TagsPage|Edit release notes" +msgstr "" + +msgid "TagsPage|Existing branch name, tag, or commit SHA" +msgstr "" + +msgid "TagsPage|Filter by tag name" +msgstr "" + +msgid "TagsPage|New Tag" +msgstr "" + +msgid "TagsPage|New tag" +msgstr "" + +msgid "TagsPage|Optionally, add a message to the tag." +msgstr "" + +msgid "TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page." +msgstr "" + +msgid "TagsPage|Release notes" +msgstr "" + +msgid "TagsPage|Repository has no tags yet." +msgstr "" + +msgid "TagsPage|Sort by" +msgstr "" + +msgid "TagsPage|Tags" +msgstr "" + +msgid "TagsPage|Tags give the ability to mark specific points in history as being important" +msgstr "" + +msgid "TagsPage|This tag has no release notes." +msgstr "" + +msgid "TagsPage|Use git tag command to add a new one:" +msgstr "" + +msgid "TagsPage|Write your release notes or drag files here..." +msgstr "" + +msgid "TagsPage|protected" +msgstr "" + +msgid "Target Branch" +msgstr "" + +msgid "Team" +msgstr "" + +msgid "Thanks! Don't show me this again" +msgstr "" + +msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." +msgstr "" + +msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project" +msgstr "" + +msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project." +msgstr "" + +msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." +msgstr "" + +msgid "The collection of events added to the data gathered for that stage." +msgstr "" + +msgid "The fork relationship has been removed." +msgstr "" + +msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." +msgstr "" + +msgid "The maximum file size allowed is 200KB." +msgstr "" + +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + +msgid "The phase of the development lifecycle." +msgstr "" + +msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." +msgstr "" + +msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." +msgstr "" + +msgid "The project can be accessed by any logged in user." +msgstr "" + +msgid "The project can be accessed without any authentication." +msgstr "" + +msgid "The repository for this project does not exist." +msgstr "" + +msgid "The repository for this project is empty" +msgstr "" + +msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." +msgstr "" + +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + +msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." +msgstr "" + +msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." +msgstr "" + +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + +msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check." +msgstr "" + +msgid "The time taken by each data entry gathered by that stage." +msgstr "" + +msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6." +msgstr "" + +msgid "There are no issues to show" +msgstr "" + +msgid "There are no merge requests to show" +msgstr "" + +msgid "There are problems accessing Git storage: " +msgstr "" + +msgid "There was an error loading users activity calendar." +msgstr "" + +msgid "There was an error saving your notification settings." +msgstr "" + +msgid "There was an error subscribing to this label." +msgstr "" + +msgid "There was an error when reseting email token." +msgstr "" + +msgid "There was an error when subscribing to this label." +msgstr "" + +msgid "There was an error when unsubscribing from this label." +msgstr "" + +msgid "This board\\'s scope is reduced" +msgstr "" + +msgid "This directory" +msgstr "" + +msgid "This is a confidential issue." +msgstr "" + +msgid "This is the author's first Merge Request to this project." +msgstr "" + +msgid "This issue is confidential" +msgstr "" + +msgid "This issue is confidential and locked." +msgstr "" + +msgid "This issue is locked." +msgstr "" + +msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments" +msgstr "" + +msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered" +msgstr "" + +msgid "This job has not been triggered yet" +msgstr "" + +msgid "This job has not started yet" +msgstr "" + +msgid "This job is in pending state and is waiting to be picked by a runner" +msgstr "" + +msgid "This job requires a manual action" +msgstr "" + +msgid "This means you can not push code until you create an empty repository or import existing one." +msgstr "" + +msgid "This merge request is locked." +msgstr "" + +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + +msgid "This project" +msgstr "" + +msgid "This repository" +msgstr "" + +msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here." +msgstr "" + +msgid "Time before an issue gets scheduled" +msgstr "" + +msgid "Time before an issue starts implementation" +msgstr "" + +msgid "Time between merge request creation and merge/close" +msgstr "" + +msgid "Time tracking" +msgstr "" + +msgid "Time until first merge request" +msgstr "" + +msgid "TimeTrackingEstimated|Est" +msgstr "" + +msgid "TimeTracking|Estimated:" +msgstr "" + +msgid "TimeTracking|Spent" +msgstr "" + +msgid "Timeago|%s days ago" +msgstr "" + +msgid "Timeago|%s days remaining" +msgstr "" + +msgid "Timeago|%s hours remaining" +msgstr "" + +msgid "Timeago|%s minutes ago" +msgstr "" + +msgid "Timeago|%s minutes remaining" +msgstr "" + +msgid "Timeago|%s months ago" +msgstr "" + +msgid "Timeago|%s months remaining" +msgstr "" + +msgid "Timeago|%s seconds remaining" +msgstr "" + +msgid "Timeago|%s weeks ago" +msgstr "" + +msgid "Timeago|%s weeks remaining" +msgstr "" + +msgid "Timeago|%s years ago" +msgstr "" + +msgid "Timeago|%s years remaining" +msgstr "" + +msgid "Timeago|1 day remaining" +msgstr "" + +msgid "Timeago|1 hour remaining" +msgstr "" + +msgid "Timeago|1 minute remaining" +msgstr "" + +msgid "Timeago|1 month remaining" +msgstr "" + +msgid "Timeago|1 week remaining" +msgstr "" + +msgid "Timeago|1 year remaining" +msgstr "" + +msgid "Timeago|Past due" +msgstr "" + +msgid "Timeago|a day ago" +msgstr "" + +msgid "Timeago|a month ago" +msgstr "" + +msgid "Timeago|a week ago" +msgstr "" + +msgid "Timeago|a year ago" +msgstr "" + +msgid "Timeago|about %s hours ago" +msgstr "" + +msgid "Timeago|about a minute ago" +msgstr "" + +msgid "Timeago|about an hour ago" +msgstr "" + +msgid "Timeago|in %s days" +msgstr "" + +msgid "Timeago|in %s hours" +msgstr "" + +msgid "Timeago|in %s minutes" +msgstr "" + +msgid "Timeago|in %s months" +msgstr "" + +msgid "Timeago|in %s seconds" +msgstr "" + +msgid "Timeago|in %s weeks" +msgstr "" + +msgid "Timeago|in %s years" +msgstr "" + +msgid "Timeago|in 1 day" +msgstr "" + +msgid "Timeago|in 1 hour" +msgstr "" + +msgid "Timeago|in 1 minute" +msgstr "" + +msgid "Timeago|in 1 month" +msgstr "" + +msgid "Timeago|in 1 week" +msgstr "" + +msgid "Timeago|in 1 year" +msgstr "" + +msgid "Timeago|in a while" +msgstr "" + +msgid "Timeago|less than a minute ago" +msgstr "" + +msgid "Time|hr" +msgid_plural "Time|hrs" +msgstr[0] "" +msgstr[1] "" + +msgid "Time|min" +msgid_plural "Time|mins" +msgstr[0] "" +msgstr[1] "" + +msgid "Time|s" +msgstr "" + +msgid "Tip:" +msgstr "" + +msgid "Title" +msgstr "" + +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + +msgid "Todo" +msgstr "" + +msgid "Toggle sidebar" +msgstr "" + +msgid "ToggleButton|Toggle Status: OFF" +msgstr "" + +msgid "ToggleButton|Toggle Status: ON" +msgstr "" + +msgid "Total Time" +msgstr "" + +msgid "Total test time for all commits/merges" +msgstr "" + +msgid "Total: %{total}" +msgstr "" + +msgid "Track activity with Contribution Analytics." +msgstr "" + +msgid "Track groups of issues that share a theme, across projects and milestones" +msgstr "" + +msgid "Track time with quick actions" +msgstr "" + +msgid "Trigger this manual action" +msgstr "" + +msgid "Turn on Service Desk" +msgstr "" + +msgid "Unable to reset project cache." +msgstr "" + +msgid "Unknown" +msgstr "" + +msgid "Unlock" +msgstr "" + +msgid "Unlock this %{issuableDisplayName}? <strong>Everyone</strong> will be able to comment." +msgstr "" + +msgid "Unlocked" +msgstr "" + +msgid "Unresolve discussion" +msgstr "" + +msgid "Unstar" +msgstr "" + +msgid "Up to date" +msgstr "" + +msgid "Upgrade your plan to activate Advanced Global Search." +msgstr "" + +msgid "Upgrade your plan to activate Contribution Analytics." +msgstr "" + +msgid "Upgrade your plan to activate Group Webhooks." +msgstr "" + +msgid "Upgrade your plan to activate Issue weight." +msgstr "" + +msgid "Upgrade your plan to improve Issue boards." +msgstr "" + +msgid "Upload New File" +msgstr "" + +msgid "Upload file" +msgstr "" + +msgid "Upload new avatar" +msgstr "" + +msgid "UploadLink|click to upload" +msgstr "" + +msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab" +msgstr "" + +msgid "Use the following registration token during setup:" +msgstr "" + +msgid "Use your global notification setting" +msgstr "" + +msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." +msgstr "" + +msgid "View epics list" +msgstr "" + +msgid "View file @ " +msgstr "" + +msgid "View labels" +msgstr "" + +msgid "View open merge request" +msgstr "" + +msgid "View replaced file @ " +msgstr "" + +msgid "VisibilityLevel|Internal" +msgstr "" + +msgid "VisibilityLevel|Private" +msgstr "" + +msgid "VisibilityLevel|Public" +msgstr "" + +msgid "VisibilityLevel|Unknown" +msgstr "" + +msgid "Want to see the data? Please ask an administrator for access." +msgstr "" + +msgid "We could not verify that one of your projects on GCP has billing enabled. Please try again." +msgstr "" + +msgid "We don't have enough data to show this stage." +msgstr "" + +msgid "We want to be sure it is you, please confirm you are not a robot." +msgstr "" + +msgid "Web IDE" +msgstr "" + +msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Wiki" +msgstr "" + +msgid "WikiClone|Clone your wiki" +msgstr "" + +msgid "WikiClone|Git Access" +msgstr "" + +msgid "WikiClone|Install Gollum" +msgstr "" + +msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" +msgstr "" + +msgid "WikiClone|Start Gollum and edit locally" +msgstr "" + +msgid "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title." +msgstr "" + +msgid "WikiEdit|There is already a page with the same title in that path." +msgstr "" + +msgid "WikiEmptyPageError|You are not allowed to create wiki pages" +msgstr "" + +msgid "WikiHistoricalPage|This is an old version of this page." +msgstr "" + +msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." +msgstr "" + +msgid "WikiHistoricalPage|history" +msgstr "" + +msgid "WikiHistoricalPage|most recent version" +msgstr "" + +msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" +msgstr "" + +msgid "WikiMarkdownDocs|documentation" +msgstr "" + +msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" +msgstr "" + +msgid "WikiNewPagePlaceholder|how-to-setup" +msgstr "" + +msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." +msgstr "" + +msgid "WikiNewPageTitle|New Wiki Page" +msgstr "" + +msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" +msgstr "" + +msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." +msgstr "" + +msgid "WikiPageConflictMessage|the page" +msgstr "" + +msgid "WikiPageCreate|Create %{page_title}" +msgstr "" + +msgid "WikiPageEdit|Update %{page_title}" +msgstr "" + +msgid "WikiPage|Page slug" +msgstr "" + +msgid "WikiPage|Write your content or drag files here..." +msgstr "" + +msgid "Wiki|Create Page" +msgstr "" + +msgid "Wiki|Create page" +msgstr "" + +msgid "Wiki|Edit Page" +msgstr "" + +msgid "Wiki|Empty page" +msgstr "" + +msgid "Wiki|More Pages" +msgstr "" + +msgid "Wiki|New page" +msgstr "" + +msgid "Wiki|Page history" +msgstr "" + +msgid "Wiki|Page version" +msgstr "" + +msgid "Wiki|Pages" +msgstr "" + +msgid "Wiki|Wiki Pages" +msgstr "" + +msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." +msgstr "" + +msgid "Withdraw Access Request" +msgstr "" + +msgid "Write a commit message..." +msgstr "" + +msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You can also create a project from the command line." +msgstr "" + +msgid "You can also star a label to make it a priority label." +msgstr "" + +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" +msgstr "" + +msgid "You can move around the graph by using the arrow keys." +msgstr "" + +msgid "You can only add files when you are on a branch" +msgstr "" + +msgid "You can only edit files when you are on a branch" +msgstr "" + +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + +msgid "You have reached your project limit" +msgstr "" + +msgid "You must have master access to force delete a lock" +msgstr "" + +msgid "You must sign in to star a project" +msgstr "" + +msgid "You need a different license to enable FileLocks feature" +msgstr "" + +msgid "You need permission." +msgstr "" + +msgid "You will not get any notifications via email" +msgstr "" + +msgid "You will only receive notifications for the events you choose" +msgstr "" + +msgid "You will only receive notifications for threads you have participated in" +msgstr "" + +msgid "You will receive notifications for any activity" +msgstr "" + +msgid "You will receive notifications only for comments in which you were @mentioned" +msgstr "" + +msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account" +msgstr "" + +msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile" +msgstr "" + +msgid "You won't be able to pull or push project code via SSH until you add an SSH key to your profile" +msgstr "" + +msgid "You'll need to use different branch names to get a valid comparison." +msgstr "" + +msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" +msgstr "" + +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + +msgid "Your comment will not be visible to the public." +msgstr "" + +msgid "Your groups" +msgstr "" + +msgid "Your name" +msgstr "" + +msgid "Your projects" +msgstr "" + +msgid "assign yourself" +msgstr "" + +msgid "branch name" +msgstr "" + +msgid "by" +msgstr "" + +msgid "ciReport|Code quality" +msgstr "" + +msgid "ciReport|DAST detected no alerts by analyzing the review app" +msgstr "" + +msgid "ciReport|Failed to load %{reportName} report" +msgstr "" + +msgid "ciReport|Fixed:" +msgstr "" + +msgid "ciReport|Instances" +msgstr "" + +msgid "ciReport|Learn more about whitelisting" +msgstr "" + +msgid "ciReport|Loading %{reportName} report" +msgstr "" + +msgid "ciReport|No changes to code quality" +msgstr "" + +msgid "ciReport|No changes to performance metrics" +msgstr "" + +msgid "ciReport|Performance metrics" +msgstr "" + +msgid "ciReport|SAST" +msgstr "" + +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + +msgid "ciReport|SAST detected no security vulnerabilities" +msgstr "" + +msgid "ciReport|SAST:container no vulnerabilities were found" +msgstr "" + +msgid "ciReport|Show complete code vulnerabilities report" +msgstr "" + +msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" +msgstr "" + +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + +msgid "commit" +msgstr "" + +msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue." +msgstr "" + +msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with <strong>at least Reporter access</strong> are able to see and leave comments on the issue." +msgstr "" + +msgid "day" +msgid_plural "days" +msgstr[0] "" +msgstr[1] "" + +msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." +msgstr "" + +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + +msgid "merge request" +msgid_plural "merge requests" +msgstr[0] "" +msgstr[1] "" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + +msgid "mrWidget|Cancel automatic merge" +msgstr "" + +msgid "mrWidget|Check out branch" +msgstr "" + +msgid "mrWidget|Checking ability to merge automatically" +msgstr "" + +msgid "mrWidget|Cherry-pick" +msgstr "" + +msgid "mrWidget|Cherry-pick this merge request in a new merge request" +msgstr "" + +msgid "mrWidget|Closed" +msgstr "" + +msgid "mrWidget|Closed by" +msgstr "" + +msgid "mrWidget|Closes" +msgstr "" + +msgid "mrWidget|Did not close" +msgstr "" + +msgid "mrWidget|Email patches" +msgstr "" + +msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" +msgstr "" + +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + +msgid "mrWidget|Mentions" +msgstr "" + +msgid "mrWidget|Merge" +msgstr "" + +msgid "mrWidget|Merge failed." +msgstr "" + +msgid "mrWidget|Merge locally" +msgstr "" + +msgid "mrWidget|Merged by" +msgstr "" + +msgid "mrWidget|Plain diff" +msgstr "" + +msgid "mrWidget|Refresh" +msgstr "" + +msgid "mrWidget|Refresh now" +msgstr "" + +msgid "mrWidget|Refreshing now" +msgstr "" + +msgid "mrWidget|Remove Source Branch" +msgstr "" + +msgid "mrWidget|Remove source branch" +msgstr "" + +msgid "mrWidget|Remove your approval" +msgstr "" + +msgid "mrWidget|Request to merge" +msgstr "" + +msgid "mrWidget|Resolve conflicts" +msgstr "" + +msgid "mrWidget|Revert" +msgstr "" + +msgid "mrWidget|Revert this merge request in a new merge request" +msgstr "" + +msgid "mrWidget|Set by" +msgstr "" + +msgid "mrWidget|The changes were merged into" +msgstr "" + +msgid "mrWidget|The changes were not merged into" +msgstr "" + +msgid "mrWidget|The changes will be merged into" +msgstr "" + +msgid "mrWidget|The source branch has been removed" +msgstr "" + +msgid "mrWidget|The source branch is being removed" +msgstr "" + +msgid "mrWidget|The source branch will be removed" +msgstr "" + +msgid "mrWidget|The source branch will not be removed" +msgstr "" + +msgid "mrWidget|There are merge conflicts" +msgstr "" + +msgid "mrWidget|This merge request failed to be merged automatically" +msgstr "" + +msgid "mrWidget|This merge request is in the process of being merged" +msgstr "" + +msgid "mrWidget|This project is archived, write access has been disabled" +msgstr "" + +msgid "mrWidget|You can merge this merge request manually using the" +msgstr "" + +msgid "mrWidget|You can remove source branch now" +msgstr "" + +msgid "mrWidget|branch does not exist." +msgstr "" + +msgid "mrWidget|command line" +msgstr "" + +msgid "mrWidget|into" +msgstr "" + +msgid "mrWidget|to be merged automatically when the pipeline succeeds" +msgstr "" + +msgid "new merge request" +msgstr "" + +msgid "notification emails" +msgstr "" + +msgid "or" +msgstr "" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "" +msgstr[1] "" + +msgid "password" +msgstr "" + +msgid "personal access token" +msgstr "" + +msgid "remove due date" +msgstr "" + +msgid "source" +msgstr "" + +msgid "spendCommand|%{slash_command} will update the sum of the time spent." +msgstr "" + +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + +msgid "uses Kubernetes clusters to deploy your code!" +msgstr "" + +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po index d176e67937f..85fe26b83a7 100644 --- a/locale/fr/gitlab.po +++ b/locale/fr/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:59-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 06:24-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: French\n" "Language: fr_FR\n" @@ -17,7 +17,7 @@ msgstr "" "X-Crowdin-File: /master/locale/gitlab.pot\n" msgid " and" -msgstr "" +msgstr " et" msgid "%d commit" msgid_plural "%d commits" @@ -26,13 +26,13 @@ msgstr[1] "%d commits" msgid "%d commit behind" msgid_plural "%d commits behind" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d commit de retard" +msgstr[1] "%d commits de retard" msgid "%d issue" msgid_plural "%d issues" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d ticket" +msgstr[1] "%d tickets" msgid "%d layer" msgid_plural "%d layers" @@ -41,24 +41,30 @@ msgstr[1] "%d couches" msgid "%d merge request" msgid_plural "%d merge requests" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d demande de fusion" +msgstr[1] "%d demandes de fusion" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "%s validation supplémentaire a été masquée afin d'éviter de créer de problèmes de performances." -msgstr[1] "%s validations supplémentaires ont été masquées afin d'éviter de créer de problèmes de performances." +msgstr[1] "%s commits supplémentaires ont été masqués afin d'éviter un problème de performance." + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "%{actionText} et %{openOrClose} %{noteable}" msgid "%{commit_author_link} authored %{commit_timeago}" -msgstr "" +msgstr "%{commit_author_link} a créé %{commit_timeago}" msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "%{count} participant•e" msgstr[1] "%{count} participant•e•s" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "%{lock_path} est verrouillé par l’utilisateur GitLab %{lock_user_id}" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" -msgstr "%{number_commits_behind} validations de retard sur %{default_branch}, %{number_commits_ahead} validations d'avance" +msgstr "%{number_commits_behind} commits de retard sur %{default_branch}, %{number_commits_ahead} commits d'avance" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgstr "%{number_of_failures} sur %{maximum_failures} tentative(s). GitLab va vous permettre d'accéder à la prochaine tentative." @@ -66,6 +72,9 @@ msgstr "%{number_of_failures} sur %{maximum_failures} tentative(s). GitLab va vo msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} échecs sur %{maximum_failures}. GitLab ne va plus réessayer automatiquement. Réinitialisez les informations de stockage lorsque le problème est résolu." +msgid "%{openOrClose} %{noteable}" +msgstr "%{openOrClose} %{noteable}" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name} : la tentative d’accès au stockage a échouée sur l’hôte :" @@ -130,35 +139,74 @@ msgstr "Ajouter un guide de contribution" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "Ajouter des Webhooks de groupe et GitLab Enterprise Edition." +msgid "Add Kubernetes cluster" +msgstr "Ajouter un cluster Kubernetes" + msgid "Add License" msgstr "Ajouter une licence" +msgid "Add Readme" +msgstr "Ajouter un fichier Readme" + msgid "Add new directory" msgstr "Ajouter un nouveau dossier" msgid "Add todo" -msgstr "" +msgstr "Ajouter à la liste à faire" msgid "AdminArea|Stop all jobs" -msgstr "" +msgstr "Arrêtez tous les travaux" msgid "AdminArea|Stop all jobs?" -msgstr "" +msgstr "Arrêtez tous les travaux?" msgid "AdminArea|Stop jobs" -msgstr "" +msgstr "Arrêtez les travaux" msgid "AdminArea|Stopping jobs failed" -msgstr "" +msgstr "L’arrêt des travaux a échoué" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." -msgstr "" +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." +msgstr "Vous êtes sur le point d’arrêter tous les travaux. Tous les travaux en cours seront interrompus." msgid "AdminHealthPageLink|health page" msgstr "État des services" +msgid "AdminProjects|Delete" +msgstr "Supprimer" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "Supprimer le projet %{projectName} ?" + +msgid "AdminProjects|Delete project" +msgstr "Supprimer le projet" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "Spécifiez un domaine à utiliser par défaut pour les étapes Auto Review Apps et Auto Deploy de chaque projet." + +msgid "AdminUsers|Block user" +msgstr "Bloquer l’utilisateur•rice" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "Supprimer l’utilisateur•rice %{username} et ses contributions ?" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "Supprimer l’utilisateur•rice %{username} ?" + +msgid "AdminUsers|Delete user" +msgstr "Supprimer un•e utilisateur•rice" + +msgid "AdminUsers|Delete user and contributions" +msgstr "Supprimer l’utilisateur•rice et ses contributions" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "Pour confirmer, veuillez saisir %{projectName}" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "Pour confirmer, veuillez saisir %{username}" + msgid "Advanced" -msgstr "" +msgstr "Avancé" msgid "Advanced settings" msgstr "Paramètres avancés" @@ -167,13 +215,13 @@ msgid "All" msgstr "Tous" msgid "All changes are committed" -msgstr "" +msgstr "Toutes les modifications sont validées" msgid "Allows you to add and manage Kubernetes clusters." -msgstr "" +msgstr "Vous permet d’ajouter et de gérer des clusters Kubernetes." msgid "An error occurred previewing the blob" -msgstr "" +msgstr "Une erreur s’est produite lors de la prévisualisation du blob" msgid "An error occurred when toggling the notification subscription" msgstr "Une erreur s’est produite lors de l’activation/désactivation de l’abonnement aux notifications" @@ -181,38 +229,74 @@ msgstr "Une erreur s’est produite lors de l’activation/désactivation de l†msgid "An error occurred when updating the issue weight" msgstr "Une erreur s'est produite lors de la mise à jour du poids du ticket" +msgid "An error occurred while adding approver" +msgstr "Une erreur s’est produite lors de l’ajout de l'approbateur•rice" + +msgid "An error occurred while detecting host keys" +msgstr "Une erreur s’est produite lors de la détection des clés de l'hôte" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." -msgstr "" +msgstr "Une erreur s’est produite lors de la révocation de la mise en avant de la fonctionnalité. Actualisez la page et essayez de la révoquer à nouveau." msgid "An error occurred while fetching markdown preview" -msgstr "" +msgstr "Une erreur s'est produite lors de la prévisualisation markdown" msgid "An error occurred while fetching sidebar data" msgstr "Une erreur s'est produite lors de la récupération des données de la barre latérale" +msgid "An error occurred while fetching the pipeline." +msgstr "Une erreur est survenue pendant la récupération du pipeline." + msgid "An error occurred while getting projects" -msgstr "" +msgstr "Une erreur s’est produite lors de la récupération des projets" + +msgid "An error occurred while importing project" +msgstr "Une erreur s’est produite lors de l’importation du projet" + +msgid "An error occurred while initializing path locks" +msgstr "Une erreur s’est produite lors de l’initialisation des verrous de chemin" + +msgid "An error occurred while loading commits" +msgstr "Une erreur s’est produite lors du chargement des commits" + +msgid "An error occurred while loading diff" +msgstr "Une erreur s’est produite lors du chargement du diff" msgid "An error occurred while loading filenames" -msgstr "" +msgstr "Une erreur s’est produite lors du chargement des noms de fichiers" + +msgid "An error occurred while loading the file" +msgstr "Une erreur s’est produite lors du chargement du fichier" + +msgid "An error occurred while making the request." +msgstr "Une erreur s’est produite lors de la requête." + +msgid "An error occurred while removing approver" +msgstr "Une erreur s’est produite lors de la suppression de l’approbateur•rice" msgid "An error occurred while rendering KaTeX" -msgstr "" +msgstr "Une erreur s’est produite lors du rendu de KaTeX" msgid "An error occurred while rendering preview broadcast message" -msgstr "" +msgstr "Une erreur s’est produite lors de la prévisualisation de la bannière" msgid "An error occurred while retrieving calendar activity" -msgstr "" +msgstr "Une erreur s’est produite lors de la récupération de l’activité du calendrier" msgid "An error occurred while retrieving diff" -msgstr "" +msgstr "Une erreur s’est produite lors de la récupération du diff" + +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "Une erreur s’est produite lors de l’enregistrement du statut de remplacement LDAP. Veuillez réessayer." + +msgid "An error occurred while saving assignees" +msgstr "Une erreur s’est produite lors de l’enregistrement des destinataires" msgid "An error occurred while validating username" -msgstr "" +msgstr "Une erreur s’est produite lors de la validation du nom d’utilisateur•rice" msgid "An error occurred. Please try again." -msgstr "Une erreur est survenue. Merci de réessayer." +msgstr "Une erreur s’est produite. Veuillez réessayer." msgid "Appearance" msgstr "Apparence" @@ -232,15 +316,15 @@ msgstr "Projet archivé ! Le dépôt est en lecture seule" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Êtes-vous sûr·e de vouloir supprimer ce pipeline programmé ?" -msgid "Are you sure you want to discard your changes?" -msgstr "Êtes-vous sûr·e de vouloir annuler vos modifications ?" - msgid "Are you sure you want to reset registration token?" msgstr "Êtes-vous sûr·e de vouloir réinitialiser le jeton d’inscription ?" msgid "Are you sure you want to reset the health check token?" msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton de bilan de santé ?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "Êtes-vous sûr•e de vouloir déverrouiller %{path_lock_path} ?" + msgid "Are you sure?" msgstr "Êtes-vous certain ?" @@ -248,19 +332,19 @@ msgid "Artifacts" msgstr "Artéfacts" msgid "Assign custom color like #FF0000" -msgstr "" +msgstr "Attribuer une couleur personnalisée comme #FF0000" msgid "Assign labels" -msgstr "" +msgstr "Attribuer des labels" msgid "Assign milestone" -msgstr "" +msgstr "Attribuer un jalon" msgid "Assign to" -msgstr "" +msgstr "Assigner à " msgid "Assignee" -msgstr "" +msgstr "Assigné•e" msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Attachez un fichier par glisser & déposer ou %{upload_link}" @@ -278,13 +362,16 @@ msgid "Author" msgstr "Auteur" msgid "Authors: %{authors}" -msgstr "" +msgstr "Auteur•e•s : %{authors}" + +msgid "Auto DevOps enabled" +msgstr "Auto DevOps activé" msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." -msgstr "" +msgstr "Auto Review Apps et Auto Deploy ont besoin d’un %{kubernetes} qui fonctionne correctement." msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly." -msgstr "" +msgstr "Auto Review Apps et Auto Deploy ont besoin d’un nom de domaine et d’un %{kubernetes} qui fonctionne correctement." msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." msgstr "Les applications de révision automatique et de déploiement automatique requièrent un nom de domaine pour fonctionner correctement." @@ -304,17 +391,26 @@ msgstr "AutoDevOps vous permet de construire, tester et déployer automatiquemen msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "En savoir plus dans %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "Vous pouvez activer %{link_to_settings} pour ce projet." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "Vous pouvez automatiquement générer et tester votre application si vous %{link_to_auto_devops_settings} pour ce projet. Vous pouvez aussi la déployer automatiquement, si vous %{link_to_add_kubernetes_cluster}." + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "ajouter un cluster Kubernetes" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "activer Auto DevOps (Bêta)" msgid "Available" msgstr "Disponible" msgid "Avatar will be removed. Are you sure?" -msgstr "" +msgstr "L’avatar sera supprimé. Êtes-vous sûr•e ?" msgid "Average per day: %{average}" -msgstr "" +msgstr "Moyenne par jour : %{average}" + +msgid "Begin with the selected commit" +msgstr "Commencer avec le commit sélectionné" msgid "Billing" msgstr "Facturation" @@ -370,13 +466,10 @@ msgstr "payé annuellement pour %{price_per_year}" msgid "BillingPlans|per user" msgstr "par utilisateur" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Branche" -msgstr[1] "Branches" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "Branche (%{branch_count})" +msgstr[1] "Branches (%{branch_count})" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La branche <strong>%{branch_name}</strong> a été créée. Pour mettre en place le déploiement automatisé, sélectionnez un modèle de fichier Yaml pour l'intégration continue (CI) de GitLab, et validez les modifications. %{link_to_autodeploy_doc}" @@ -400,7 +493,7 @@ msgid "Branches" msgstr "Branches" msgid "Branches|Cant find HEAD commit for this branch" -msgstr "Impossible de trouver la validation HEAD pour cette branche" +msgstr "Impossible de trouver le commit HEAD pour cette branche" msgid "Branches|Compare" msgstr "Comparer" @@ -502,7 +595,7 @@ msgid "CI / CD" msgstr "Intégration continu / Déploiement continu" msgid "CI/CD configuration" -msgstr "" +msgstr "Configuration CI/CD" msgid "CICD|Jobs" msgstr "Tâches" @@ -514,7 +607,7 @@ msgid "Cancel edit" msgstr "Annuler modification" msgid "Cannot modify managed Kubernetes cluster" -msgstr "" +msgstr "Impossible de modifier le cluster géré par Kubernetes" msgid "Change Weight" msgstr "Changer le poids" @@ -532,13 +625,13 @@ msgid "ChangeTypeAction|Revert" msgstr "Défaire" msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes." -msgstr "" +msgstr "Cela va créer un nouveau commit afin de défaire les modifications existantes." msgid "Changelog" msgstr "Journal des modifications" msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision." -msgstr "" +msgstr "Les modifications sont affichées comme si la révision <b>source</b> était fusionnée dans la révision<b>cible</b>." msgid "Charts" msgstr "Statistiques" @@ -547,7 +640,7 @@ msgid "Chat" msgstr "Chat" msgid "Check interval" -msgstr "" +msgstr "Intervalle de vérification" msgid "Checking %{text} availability…" msgstr "Vérification de la disponibilité de %{text}…" @@ -556,25 +649,25 @@ msgid "Checking branch availability..." msgstr "Vérification de la disponibilité du nom de branche..." msgid "Cherry-pick this commit" -msgstr "Picorer cette validation" +msgstr "Picorer ce commit" msgid "Cherry-pick this merge request" msgstr "Picorer cette demande de fusion" msgid "Choose File ..." -msgstr "" +msgstr "Choisir le fichier…" msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request." -msgstr "" +msgstr "Choisissez une branche / tag (par exemple %{master}) ou entrez un commit (par exemple %{sha}) pour voir ce qui a changé ou pour créer une demande de fusion." msgid "Choose file..." -msgstr "" +msgstr "Choisir le fichier…" msgid "Choose which groups you wish to synchronize to this secondary node." -msgstr "" +msgstr "Choisissez les groupes que vous souhaitez synchroniser avec ce nÅ“ud secondaire." msgid "Choose which shards you wish to synchronize to this secondary node." -msgstr "" +msgstr "Choisissez les partitions que vous souhaitez synchroniser avec ce nÅ“ud secondaire." msgid "CiStatusLabel|canceled" msgstr "annulé" @@ -631,46 +724,49 @@ msgid "CiStatus|running" msgstr "en cours" msgid "CiVariables|Input variable key" -msgstr "" +msgstr "Nom de la variable" msgid "CiVariables|Input variable value" -msgstr "" +msgstr "Valeur de la variable" msgid "CiVariables|Remove variable row" -msgstr "" +msgstr "Supprimer cette variable" msgid "CiVariable|* (All environments)" -msgstr "" +msgstr "* (Tous les environnements)" msgid "CiVariable|All environments" -msgstr "" +msgstr "Tous les environnements" msgid "CiVariable|Create wildcard" -msgstr "" +msgstr "Créer un caractère générique" msgid "CiVariable|Error occured while saving variables" -msgstr "" +msgstr "Une erreur s’est produite pendant la sauvegarde des variables" msgid "CiVariable|New environment" -msgstr "" +msgstr "Nouvel environnement" msgid "CiVariable|Protected" -msgstr "" +msgstr "Protégée" msgid "CiVariable|Search environments" -msgstr "" +msgstr "Chercher dans les environnements" msgid "CiVariable|Toggle protected" -msgstr "" +msgstr "Changer l’état de protection" msgid "CiVariable|Validation failed" -msgstr "" +msgstr "La validation a échoué" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "CircuitBreaker API" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "Cliquez sur le bouton ci-dessous pour lancer le processus d’installation en accédant à la page Kubernetes" + msgid "Click to expand text" -msgstr "" +msgstr "Cliquez pour agrandir le texte" msgid "Clone repository" msgstr "Cloner le dépôt" @@ -679,28 +775,28 @@ msgid "Close" msgstr "Fermer" msgid "Closed" -msgstr "" +msgstr "Fermée" msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster" -msgstr "" +msgstr "%{appList} a été installé avec succès sur votre cluster Kubernetes" msgid "ClusterIntegration|API URL" msgstr "URL de l'API" msgid "ClusterIntegration|Add Kubernetes cluster" -msgstr "" +msgstr "Ajouter un cluster Kubernetes" msgid "ClusterIntegration|Add an existing Kubernetes cluster" -msgstr "" +msgstr "Ajouter un cluster Kubernetes existant" msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration" -msgstr "" +msgstr "Options avancées sur l’intégration de ce cluster Kubernetes" msgid "ClusterIntegration|Applications" msgstr "Applications" msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster." -msgstr "" +msgstr "Êtes-vous sûr•e de vouloir supprimer l'intégration de ce cluster Kubernetes? Cela ne supprimera pas votre cluster Kubernetes." msgid "ClusterIntegration|CA Certificate" msgstr "Certificat d‘autorité de certification" @@ -709,13 +805,13 @@ msgid "ClusterIntegration|Certificate Authority bundle (PEM format)" msgstr "Paquet de l‘Autorité de certification (format PEM)" msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration" -msgstr "" +msgstr "Choisissez comment configurer l’intégration de cluster Kubernetes" msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster." -msgstr "" +msgstr "Choisissez les environnements de votre projet qui utiliseront ce cluster Kubernetes." msgid "ClusterIntegration|Control how your Kubernetes cluster integrates with GitLab" -msgstr "" +msgstr "Contrôlez l’intégration de votre cluster Kubernetes avec GitLab" msgid "ClusterIntegration|Copy API URL" msgstr "Copier l’URL de l’API" @@ -723,20 +819,23 @@ msgstr "Copier l’URL de l’API" msgid "ClusterIntegration|Copy CA Certificate" msgstr "Copier le certificat CA" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "Copier l’adresse IP entrante dans le presse-papiers" + msgid "ClusterIntegration|Copy Kubernetes cluster name" -msgstr "" +msgstr "Copier le nom du cluster Kubernetes" msgid "ClusterIntegration|Copy Token" msgstr "Copier le jeton" msgid "ClusterIntegration|Create Kubernetes cluster" -msgstr "" +msgstr "Créer un cluster Kubernetes" msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine" -msgstr "" +msgstr "Créer un cluster Kubernetes sur Google Kubernetes Engine" msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab" -msgstr "" +msgstr "Créer un nouveau cluster Kubernetes sur Google Kubernetes Engine directement depuis GitLab" msgid "ClusterIntegration|Create on GKE" msgstr "Créer sur GKE" @@ -745,13 +844,13 @@ msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster" msgstr "Entrer les détails pour le cluster Kubernetes existant" msgid "ClusterIntegration|Enter the details for your Kubernetes cluster" -msgstr "" +msgstr "Entrez les détails de votre cluster Kubernetes" msgid "ClusterIntegration|Environment scope" -msgstr "" +msgstr "Portée de l’environnement" msgid "ClusterIntegration|GitLab Integration" -msgstr "" +msgstr "Intégration GitLab" msgid "ClusterIntegration|GitLab Runner" msgstr "Éxécuteur GitLab" @@ -771,6 +870,9 @@ msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "Ingress" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "Adresse IP entrante" + msgid "ClusterIntegration|Install" msgstr "Installer" @@ -781,70 +883,67 @@ msgid "ClusterIntegration|Installing" msgstr "En cours d’installation" msgid "ClusterIntegration|Integrate Kubernetes cluster automation" -msgstr "" +msgstr "Intégrez l’automatisation du cluster Kubernetes" msgid "ClusterIntegration|Integration status" -msgstr "" +msgstr "Statut d’intégration" msgid "ClusterIntegration|Kubernetes cluster" -msgstr "" +msgstr "Cluster Kubernetes" msgid "ClusterIntegration|Kubernetes cluster details" -msgstr "" +msgstr "Détails du cluster Kubernetes" msgid "ClusterIntegration|Kubernetes cluster integration" -msgstr "" +msgstr "Intégration d’un cluster Kubernetes" msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project." -msgstr "" +msgstr "L’intégration de cluster Kubernetes est désactivée pour ce projet." msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project." -msgstr "" +msgstr "L’intégration de cluster Kubernetes est activée pour ce projet." msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "L’intégration de cluster Kubernetes est activée pour ce projet. La désactivation de cette intégration n’affectera pas votre cluster Kubernetes, elle ne désactivera que temporairement la connexion de GitLab." msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..." -msgstr "" +msgstr "Le cluster Kubernetes est en cours de création sur Google Kubernetes Engine…" msgid "ClusterIntegration|Kubernetes cluster name" -msgstr "" +msgstr "Nom du cluster Kubernetes" msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details" -msgstr "" +msgstr "Le cluster Kubernetes a été créé avec succès sur Google Kubernetes Engine. Actualisez la page pour voir les détails du cluster Kubernetes" msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}" -msgstr "" +msgstr "Les clusters Kubernetes vous permettent d’utiliser des applications de révision, de déployer vos applications, d’exécuter vos pipelines et bien plus encore. %{link_to_help_page}" msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project" -msgstr "" +msgstr "Les clusters Kubernetes peuvent être utilisés pour déployer des applications et fournir des applications de révision pour ce projet" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "En savoir plus sur %{link_to_documentation}" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" -msgstr "" +msgstr "En savoir plus sur les environnements" msgid "ClusterIntegration|Machine type" msgstr "Type de machine" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters" -msgstr "" +msgstr "Assurez-vous que votre compte %{link_to_requirements} pour créer des clusters Kubernetes" msgid "ClusterIntegration|Manage" -msgstr "" +msgstr "Gérer" msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}" -msgstr "" +msgstr "Gérez votre cluster Kubernetes en visitant %{link_gke}" msgid "ClusterIntegration|More information" -msgstr "" +msgstr "Plus d’informations" msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate" -msgstr "" +msgstr "Plusieurs clusters Kubernetes sont disponibles dans GitLab Enterprise Edition Premium et Ultimate" msgid "ClusterIntegration|Note:" msgstr "Remarque :" @@ -853,7 +952,7 @@ msgid "ClusterIntegration|Number of nodes" msgstr "Nombre de nÅ“uds" msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes" -msgstr "" +msgstr "Veuillez entrer les informations d’accès de votre cluster Kubernetes. Si vous avez besoin d'aide, vous pouvez lire notre %{link_to_help_page} sur Kubernetes" msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" msgstr "Veuillez vous assurer que votre compte Google répond aux exigences suivantes : " @@ -868,19 +967,19 @@ msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "Espace de noms du projet (facultatif, unique)" msgid "ClusterIntegration|Prometheus" -msgstr "" +msgstr "Prometheus" msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration." -msgstr "" +msgstr "Lisez notre %{link_to_help_page} sur l’intégration d’un cluster Kubernetes." msgid "ClusterIntegration|Remove Kubernetes cluster integration" -msgstr "" +msgstr "Supprimer l’intégration du cluster Kubernetes" msgid "ClusterIntegration|Remove integration" msgstr "Retirer l’intégration" msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster." -msgstr "" +msgstr "Supprimer la configuration de ce cluster Kubernetes de ce projet. Cela ne supprimera pas votre cluster Kubernetes actuel." msgid "ClusterIntegration|Request to begin installing failed" msgstr "La demande de lancement d'installation a échoué" @@ -889,7 +988,7 @@ msgid "ClusterIntegration|Save changes" msgstr "Enregistrer les modifications" msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster" -msgstr "" +msgstr "Voir et modifier les détails de votre cluster Kubernetes" msgid "ClusterIntegration|See machine types" msgstr "Voir les types de machine" @@ -910,25 +1009,25 @@ msgid "ClusterIntegration|Something went wrong on our end." msgstr "Un problème est survenu de notre côté." msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine" -msgstr "" +msgstr "Une erreur s’est produite lors de la création de votre cluster Kubernetes sur Google Kubernetes Engine" msgid "ClusterIntegration|Something went wrong while installing %{title}" msgstr "Une erreur s’est produite lors de l'installation de %{title}" msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below" -msgstr "" +msgstr "Ce compte doit disposer des autorisations pour créer un cluster Kubernetes dans le %{link_to_container_project} spécifié ci-dessous" msgid "ClusterIntegration|Toggle Kubernetes Cluster" -msgstr "" +msgstr "Activer le cluster Kubernetes" msgid "ClusterIntegration|Toggle Kubernetes cluster" -msgstr "" +msgstr "Activer/désactiver le cluster Kubernetes" msgid "ClusterIntegration|Token" msgstr "Jeton" msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "Avec un cluster Kubernetes associé à ce projet, vous pouvez utiliser des applications de révision, déployer vos applications, exécuter vos pipelines, et bien plus encore." msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" msgstr "Votre compte doit disposer de %{link_to_kubernetes_engine}" @@ -940,7 +1039,7 @@ msgid "ClusterIntegration|access to Google Kubernetes Engine" msgstr "Accèder à Google Kubernetes Engine" msgid "ClusterIntegration|check the pricing here" -msgstr "" +msgstr "vérifiez le prix ici" msgid "ClusterIntegration|documentation" msgstr "documentation" @@ -958,6 +1057,12 @@ msgid "ClusterIntegration|properly configured" msgstr "correctement configuré" msgid "Collapse" +msgstr "Réduire" + +msgid "Comment and resolve discussion" +msgstr "Commenter et résoudre la discussion" + +msgid "Comment and unresolve discussion" msgstr "" msgid "Comments" @@ -965,53 +1070,61 @@ msgstr "Commentaires" msgid "Commit" msgid_plural "Commits" -msgstr[0] "Validation" -msgstr[1] "Validations" +msgstr[0] "Commit" +msgstr[1] "Commits" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "Commit (%{commit_count})" +msgstr[1] "Commits (%{commit_count})" msgid "Commit Message" -msgstr "Message de validation" +msgstr "Message du commit" msgid "Commit duration in minutes for last 30 commits" msgstr "Durée des 30 derniers pipelines en minutes" msgid "Commit message" -msgstr "Message de validation" +msgstr "Message de commit" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" +msgstr "Statistiques des commits pour %{ref} %{start_time} - %{end_time}" + +msgid "Commit to %{branchName} branch" msgstr "" msgid "CommitBoxTitle|Commit" -msgstr "Validation" +msgstr "Commit" msgid "CommitMessage|Add %{file_name}" msgstr "Ajout de %{file_name}" msgid "Commits" -msgstr "Validations" +msgstr "Commits" msgid "Commits feed" -msgstr "Flux de validations" +msgstr "Flux des commits" msgid "Commits per day hour (UTC)" -msgstr "" +msgstr "Commits par heure du jour (UTC)" msgid "Commits per day of month" -msgstr "" +msgstr "Commits par jour du mois" msgid "Commits per weekday" -msgstr "" +msgstr "Commits par jour de la semaine" msgid "Commits|An error occurred while fetching merge requests data." -msgstr "" +msgstr "Une erreur s'est produite lors de la récupération des données de demandes de fusion." msgid "Commits|Commit: %{commitText}" -msgstr "" +msgstr "Commit : %{commitText}" msgid "Commits|History" msgstr "Historique" msgid "Commits|No related merge requests found" -msgstr "" +msgstr "Aucune demande de fusion associée trouvée" msgid "Committed by" msgstr "Validé par" @@ -1020,28 +1133,28 @@ msgid "Compare" msgstr "Comparer" msgid "Compare Git revisions" -msgstr "" +msgstr "Comparer les révisions Git" msgid "Compare Revisions" -msgstr "" +msgstr "Comparer les révisions" msgid "CompareBranches|%{source_branch} and %{target_branch} are the same." -msgstr "" +msgstr "%{source_branch} et %{target_branch} sont identiques." msgid "CompareBranches|Compare" -msgstr "" +msgstr "Comparer" msgid "CompareBranches|Source" -msgstr "" +msgstr "Source" msgid "CompareBranches|Target" -msgstr "" +msgstr "Cible" msgid "CompareBranches|There isn't anything to compare." -msgstr "" +msgstr "Il n’y a rien à comparer." msgid "Confidentiality" -msgstr "" +msgstr "Confidentialité" msgid "Container Registry" msgstr "Registre de conteneur" @@ -1095,13 +1208,13 @@ msgid "Contributors" msgstr "Contributeurs" msgid "ContributorsPage|%{startDate} – %{endDate}" -msgstr "" +msgstr "%{startDate} - %{endDate}" msgid "ContributorsPage|Building repository graph." msgstr "Construction du graphique du dépôt." msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limited to 6,000 commits." -msgstr "Validations sur %{branch_name}, à l’exclusion des validations de fusion. Limité à 6 000 validations." +msgstr "Commit sur %{branch_name}, à l'exclusion des commits de fusion. Limité à 6 000 commits." msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready." msgstr "Veuillez patienter, cette page va être automatiquement actualisée." @@ -1119,23 +1232,35 @@ msgid "Copy URL to clipboard" msgstr "Copier l'URL dans le presse-papier" msgid "Copy branch name to clipboard" -msgstr "" +msgstr "Copier le nom de la branche dans le presse-papiers" + +msgid "Copy command to clipboard" +msgstr "Copier la commande dans le presse-papiers" msgid "Copy commit SHA to clipboard" -msgstr "Copier le SHA de la validation" +msgstr "Copier le SHA du commit" msgid "Copy reference to clipboard" -msgstr "" +msgstr "Copier la référence dans le presse-papiers" msgid "Create" -msgstr "" +msgstr "Créer" msgid "Create New Directory" msgstr "Créer un nouveau dossier" +msgid "Create a new branch" +msgstr "Créer une nouvelle branche" + +msgid "Create a new branch and merge request" +msgstr "Créer une nouvelle branche et demande de fusion" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Créer un jeton d’accès personnel pour votre compte afin de récupérer ou pousser par %{protocol}." +msgid "Create branch" +msgstr "Créer une branche" + msgid "Create directory" msgstr "Créer un dossier" @@ -1149,11 +1274,14 @@ msgid "Create file" msgstr "Créer un fichier" msgid "Create lists from labels. Issues with that label appear in that list." -msgstr "" +msgstr "Créer des listes à partir de labels. Les tickets avec ce label apparaissent dans cette liste." msgid "Create merge request" msgstr "Créer une demande de fusion" +msgid "Create merge request and branch" +msgstr "Créer une demande de fusion et une branche" + msgid "Create new branch" msgstr "Créer une nouvelle branche" @@ -1164,7 +1292,7 @@ msgid "Create new file" msgstr "Créer un nouveau fichier" msgid "Create new label" -msgstr "" +msgstr "Créer un nouveau label" msgid "Create new..." msgstr "Créer nouveau..." @@ -1178,6 +1306,12 @@ msgstr "Tag" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "Créer un jeton d'accès personnel" +msgid "Creates a new branch from %{branchName}" +msgstr "Crée une nouvelle branche à partir de %{branchName}" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "Crée une nouvelle branche à partir de %{branchName} et redirige pour créer une nouvelle demande de fusion" + msgid "Creating epic" msgstr "Création de l'épopée en cours" @@ -1188,7 +1322,7 @@ msgid "Cron syntax" msgstr "Syntaxe Cron" msgid "Current node" -msgstr "" +msgstr "NÅ“ud actuel" msgid "Custom notification events" msgstr "Événements de notification personnalisés" @@ -1232,6 +1366,9 @@ msgstr "Déc." msgid "December" msgstr "Décembre" +msgid "Default classification label" +msgstr "Label de classement par défaut" + msgid "Define a custom pattern with cron syntax" msgstr "Définir un schéma personnalisé avec une syntaxe Cron" @@ -1256,19 +1393,19 @@ msgid "Details" msgstr "Détails" msgid "Diffs|No file name available" -msgstr "" +msgstr "Aucun nom de fichier disponible" msgid "Directory name" msgstr "Nom du dossier" msgid "Disable" -msgstr "" +msgstr "Désactiver" -msgid "Discard changes" -msgstr "Supprimer les modifications" +msgid "Discard draft" +msgstr "Supprimer le brouillon" msgid "Discover GitLab Geo." -msgstr "" +msgstr "Découvrez GitLab Geo." msgid "Dismiss Cycle Analytics introduction box" msgstr "Passer l’introduction Cycle Analytics" @@ -1307,7 +1444,7 @@ msgid "DownloadSource|Download" msgstr "Télécharger" msgid "Due date" -msgstr "" +msgstr "Date d’échéance" msgid "Edit" msgstr "Éditer" @@ -1316,13 +1453,16 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "Éditer le pipeline programmé %{id}" msgid "Edit files in the editor and commit changes here" -msgstr "" +msgstr "Modifier les fichiers dans l'éditeur et valider les modifications ici" msgid "Emails" msgstr "Courriels" msgid "Enable" -msgstr "" +msgstr "Activer" + +msgid "Enable Auto DevOps" +msgstr "Activer Auto DevOps" msgid "Environments|An error occurred while fetching the environments." msgstr "Une erreur s‘est produite lors de la récupération des environnements." @@ -1331,7 +1471,7 @@ msgid "Environments|An error occurred while making the request." msgstr "Une erreur s’est produite lors de la requête." msgid "Environments|Commit" -msgstr "Validation" +msgstr "Commit" msgid "Environments|Deployment" msgstr "Déploiement" @@ -1378,38 +1518,47 @@ msgstr "L’épopée sera supprimée ! Êtes-vous sûr•e ?" msgid "Epics" msgstr "Épopées" +msgid "Epics Roadmap" +msgstr "Feuille de route des épopées" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "Les épopées vous permettent de gérer votre portefeuille de projets plus efficacement et avec moins d'effort" +msgid "Error checking branch data. Please try again." +msgstr "Erreur lors de la vérification des données de branche. Veuillez réessayer." + +msgid "Error committing changes. Please try again." +msgstr "Erreur lors de la validation des modifications. Veuillez réessayer." + msgid "Error creating epic" msgstr "Erreur lors de la création de l’épopée" msgid "Error fetching contributors data." -msgstr "" +msgstr "Erreur lors de l’extraction des données des contributeur•rice•s." msgid "Error fetching labels." -msgstr "" +msgstr "Erreur lors de la récupération des labels." msgid "Error fetching network graph." -msgstr "" +msgstr "Erreur lors de la récupération du graphique du réseau." msgid "Error fetching refs" -msgstr "" +msgstr "Erreur lors de la récupération des refs" msgid "Error fetching usage ping data." -msgstr "" +msgstr "Erreur lors de la récupération des données d’utilisation." msgid "Error occurred when toggling the notification subscription" msgstr "Une erreur s’est produite lors de l’activation/désactivation de l’abonnement aux notifications" msgid "Error saving label update." -msgstr "" +msgstr "Erreur lors de la mise à jour du label." msgid "Error updating status for all todos." -msgstr "" +msgstr "Erreur lors de la mise à jour de l’état de la liste de tâches à faire." msgid "Error updating todo status." -msgstr "" +msgstr "Erreur lors de la mise à jour du statut de la tâche à faire." msgid "EventFilterBy|Filter by all" msgstr "Aucun filtre" @@ -1439,7 +1588,7 @@ msgid "Every week (Sundays at 4:00am)" msgstr "Chaque semaine (dimanche à 4h00 du matin)" msgid "Expand" -msgstr "" +msgstr "Ouvrir" msgid "Explore projects" msgstr "Explorer les projets" @@ -1447,12 +1596,36 @@ msgstr "Explorer les projets" msgid "Explore public groups" msgstr "Explorer les groupes publics" +msgid "External Classification Policy Authorization" +msgstr "Autorisation de politique de classification externe" + +msgid "External authorization denied access to this project" +msgstr "L’autorisation externe a refusé l’accès à ce projet" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "Label de classification" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "Label de classification" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "Quand aucun label de classification n’est défini, le label par défaut `%{default_label}` sera utilisé." + +msgid "Failed Jobs" +msgstr "Travaux ayant échoué" + msgid "Failed to change the owner" msgstr "Échec du changement de propriétaire" +msgid "Failed to remove issue from board, please try again." +msgstr "Impossible de supprimer le ticket du tableau, veuillez réessayer." + msgid "Failed to remove the pipeline schedule" msgstr "Échec de la suppression du pipeline programmé" +msgid "Failed to update issues, please try again." +msgstr "Échec de la mise à jour du ticket. Veuillez réessayer." + msgid "Feb" msgstr "Févr." @@ -1460,7 +1633,7 @@ msgid "February" msgstr "Février" msgid "Fields on this page are now uneditable, you can configure" -msgstr "" +msgstr "Les champs sur cette page sont désormais non modifiables, vous pouvez configurer" msgid "File name" msgstr "Nom du fichier" @@ -1468,8 +1641,11 @@ msgstr "Nom du fichier" msgid "Files" msgstr "Fichiers" +msgid "Files (%{human_size})" +msgstr "Fichiers (%{human_size})" + msgid "Filter by commit message" -msgstr "Filtrer par message de validation" +msgstr "Filtrer par message de commit" msgid "Find by path" msgstr "Rechercher par chemin" @@ -1503,11 +1679,14 @@ msgstr "Depuis la création du ticket jusqu'au déploiement en production" msgid "From merge request merge until deploy to production" msgstr "Depuis la fusion de la demande de fusion jusqu'au déploiement en production" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "À partir de l’affichage des détails du cluster Kubernetes, installez un Exécuteur à partir de la liste des applications" + msgid "GPG Keys" msgstr "Clés GPG" msgid "Generate a default set of labels" -msgstr "" +msgstr "Générer un ensemble de labels par défaut" msgid "Geo Nodes" msgstr "NÅ“uds Geo" @@ -1519,100 +1698,100 @@ msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an msgstr "Le nÅ“ud est lent, surchargé, ou il vient juste de récupérer après un problème." msgid "GeoNodes|Database replication lag:" -msgstr "" +msgstr "Retard de réplication de la base de données :" msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?" -msgstr "" +msgstr "La désactivation d’un nÅ“ud arrête le processus de synchronisation. Êtes-vous sûr•e?" msgid "GeoNodes|Does not match the primary storage configuration" -msgstr "" +msgstr "Ne correspond pas à la configuration de stockage principale" msgid "GeoNodes|Failed" -msgstr "" +msgstr "Échec" msgid "GeoNodes|Full" -msgstr "" +msgstr "Complet" msgid "GeoNodes|GitLab version does not match the primary node version" -msgstr "" +msgstr "La version de GitLab ne correspond pas à la version du nÅ“ud principal" msgid "GeoNodes|GitLab version:" -msgstr "" +msgstr "Version de GitLab :" msgid "GeoNodes|Health status:" -msgstr "" +msgstr "État :" msgid "GeoNodes|Last event ID processed by cursor:" -msgstr "" +msgstr "Dernier ID d’événement traité par le curseur :" msgid "GeoNodes|Last event ID seen from primary:" -msgstr "" +msgstr "Dernier événement vu du nÅ“ud primaire :" msgid "GeoNodes|Loading nodes" -msgstr "" +msgstr "Chargement des nÅ“uds" msgid "GeoNodes|Local Attachments:" -msgstr "" +msgstr "Pièces jointes locales :" msgid "GeoNodes|Local LFS objects:" -msgstr "" +msgstr "Objets LFS locaux :" msgid "GeoNodes|Local job artifacts:" -msgstr "" +msgstr "Artefacts de tâches locaux :" msgid "GeoNodes|New node" -msgstr "" +msgstr "Nouveau nÅ“ud" msgid "GeoNodes|Out of sync" -msgstr "" +msgstr "Désynchronisé" msgid "GeoNodes|Replication slot WAL:" -msgstr "" +msgstr "Emplacement de réplication WAL :" msgid "GeoNodes|Replication slots:" -msgstr "" +msgstr "Emplacements de réplication :" msgid "GeoNodes|Repositories:" -msgstr "" +msgstr "Dépôts :" msgid "GeoNodes|Selective" -msgstr "" +msgstr "Sélectif" msgid "GeoNodes|Storage config:" -msgstr "" +msgstr "Configuration de stockage :" msgid "GeoNodes|Sync settings:" -msgstr "" +msgstr "Paramètres de synchronisation :" msgid "GeoNodes|Synced" -msgstr "" +msgstr "Synchronisé" msgid "GeoNodes|Unused slots" -msgstr "" +msgstr "Emplacements non utilisés" msgid "GeoNodes|Used slots" -msgstr "" +msgstr "Emplacements utilisés" msgid "GeoNodes|Wikis:" -msgstr "" +msgstr "Wikis :" msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS." -msgstr "" +msgstr "Vous avez configuré des nÅ“uds Geo en utilisant une connexion HTTP non sécurisée. Nous recommandons l’utilisation de HTTPS." msgid "Geo|All projects" -msgstr "" +msgstr "Tous les projets" msgid "Geo|File sync capacity" msgstr "Capacité de synchronisation de fichier" msgid "Geo|Groups to synchronize" -msgstr "" +msgstr "Groupes à synchroniser" msgid "Geo|Projects in certain groups" -msgstr "" +msgstr "Projets dans certains groupes" msgid "Geo|Projects in certain storage shards" -msgstr "" +msgstr "Projets dans certains fragments de stockage" msgid "Geo|Repository sync capacity" msgstr "Capacité de synchronisation du dépôt" @@ -1621,22 +1800,22 @@ msgid "Geo|Select groups to replicate." msgstr "Sélectionner les groupes à répliquer." msgid "Geo|Shards to synchronize" -msgstr "" +msgstr "Fragments à synchroniser" msgid "Git revision" -msgstr "" +msgstr "Révision de Git" msgid "Git storage health information has been reset" msgstr "Les informations de santé du stockage Git ont été réinitialisées" msgid "Git version" -msgstr "" +msgstr "Version de Git" msgid "GitLab Runner section" msgstr "Section de l'Exécuteur GitLab" msgid "Gitaly Servers" -msgstr "" +msgstr "Serveurs Gitaly" msgid "Go to your fork" msgstr "Aller à votre fourche" @@ -1648,7 +1827,25 @@ msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab ad msgstr "L’authentification Google n’est pas %{link_to_documentation}. Demandez à votre administrateur GitLab si vous souhaitez utiliser ce service." msgid "Got it!" -msgstr "" +msgstr "Compris !" + +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "Les épopées vous permettent de gérer votre portefeuille de projets plus efficacement et avec moins d’effort" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "À partir de %{dateWord}" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "Chargement de la feuille de route" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "Une erreur s’est produite lors de la récupération des épopées" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "Pour afficher la feuille de route, ajoutez une date de début ou de fin planifiée à l'une de vos épopées dans ce groupe ou ses sous-groupes. Seules les épopées des 3 derniers mois et des 3 prochains mois sont affichées – de %{startDate} à %{endDate}." + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "Jusqu’au %{dateWord}" msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "Empêcher le partage d'un projet de %{group} avec d'autres groupes" @@ -1687,7 +1884,7 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc msgstr "Vous pouvez gérer les autorisations des membres de votre groupe et accéder à chacun de ses projets." msgid "GroupsTree|Are you sure you want to leave the \"${group.fullName}\" group?" -msgstr "" +msgstr "Êtes-vous sûr•e de vouloir quitter le groupe \"${group.fullName}\" ?" msgid "GroupsTree|Create a project in this group." msgstr "Créez un projet dans ce groupe." @@ -1739,8 +1936,8 @@ msgstr "En mauvaise santé" msgid "Hide value" msgid_plural "Hide values" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Masquer la valeur" +msgstr[1] "Masquer les valeurs" msgid "History" msgstr "Historique" @@ -1748,6 +1945,9 @@ msgstr "Historique" msgid "Housekeeping successfully started" msgstr "Maintenance démarrée avec succès" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "Si vous avez déjà des fichiers, vous pouvez les pousser à l’aide de la %{link_to_cli} ci-dessous." + msgid "Import repository" msgstr "Importer un dépôt" @@ -1760,6 +1960,9 @@ msgstr "Améliorer la gestion des tickets avec les poids de ticket et GitLab Ent msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "Améliorer la recherche avec la Recherche Globale Avancée et GitLab Enterprise Edition." +msgid "Install Runner on Kubernetes" +msgstr "Installez un Exécuteur sur Kubernetes" + msgid "Install a Runner compatible with GitLab CI" msgstr "Installez un Exécuteur compatible avec l'intégration continue de GitLab" @@ -1769,10 +1972,10 @@ msgstr[0] "Instance" msgstr[1] "Instances" msgid "Instance does not support multiple Kubernetes clusters" -msgstr "" +msgstr "L’instance ne prend pas en charge plusieurs clusters Kubernetes" msgid "Interested parties can even contribute by pushing commits if they want to." -msgstr "" +msgstr "Les parties intéressées peuvent même contribuer en poussant des commits si elles le souhaitent." msgid "Internal - The group and any internal projects can be viewed by any logged in user." msgstr "Interne - Le groupe ainsi que tous les projets internes sont accessibles pour n’importe quel·le utilisa·teur·trice connecté·e." @@ -1802,7 +2005,7 @@ msgid "Issues" msgstr "Tickets" msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable." -msgstr "" +msgstr "Les tickets peuvent être des bugs, des tâches ou des idées à discuter. De plus, les tickets sont consultables et filtrables." msgid "Jan" msgstr "Janv." @@ -1810,6 +2013,9 @@ msgstr "Janv." msgid "January" msgstr "Janvier" +msgid "Jobs" +msgstr "Tâches" + msgid "Jul" msgstr "Juill." @@ -1823,25 +2029,28 @@ msgid "June" msgstr "Juin" msgid "Kubernetes" -msgstr "" +msgstr "Kubernetes" msgid "Kubernetes Cluster" -msgstr "" +msgstr "Cluster Kubernetes" msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}" -msgstr "" +msgstr "Le temps de création du cluster Kubernetes dépasse le délai d’expiration ; %{timeout}" msgid "Kubernetes cluster integration was not removed." -msgstr "" +msgstr "L’intégration du cluster Kubernetes n’a pas été supprimée." msgid "Kubernetes cluster integration was successfully removed." -msgstr "" +msgstr "L’intégration du cluster Kubernetes a été supprimée avec succès." msgid "Kubernetes cluster was successfully updated." -msgstr "" +msgstr "Le cluster Kubernetes a été mis à jour avec succès." + +msgid "Kubernetes configured" +msgstr "Kubernetes configuré" msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" -msgstr "" +msgstr "L’intégration du service Kubernetes est obsolète. %{deprecated_message_content} vos clusters Kubernetes en utilisant la nouvelle page <a href=\"%{url}\"/>Clusters Kubernetes</a>" msgid "LFSStatus|Disabled" msgstr "Désactivé" @@ -1853,7 +2062,7 @@ msgid "Labels" msgstr "Labels" msgid "Labels can be applied to issues and merge requests to categorize them." -msgstr "" +msgstr "Les labels peuvent être appliqués aux tickets et aux demandes de fusion pour les classer." msgid "Last %d day" msgid_plural "Last %d days" @@ -1864,7 +2073,7 @@ msgid "Last Pipeline" msgstr "Dernier pipeline" msgid "Last commit" -msgstr "Dernière validation" +msgstr "Dernier commit" msgid "Last edited %{date}" msgstr "Dernière modification le %{date}" @@ -1885,7 +2094,13 @@ msgid "LastPushEvent|at" msgstr "à " msgid "Learn more" -msgstr "" +msgstr "En savoir plus" + +msgid "Learn more about Kubernetes" +msgstr "En savoir plus sur Kubernetes" + +msgid "Learn more about protected branches" +msgstr "En savoir plus sur les branches protégées" msgid "Learn more in the" msgstr "En apprendre plus dans le" @@ -1905,17 +2120,23 @@ msgstr "Quitter le projet" msgid "License" msgstr "Licence" +msgid "List" +msgstr "Liste" + msgid "Loading the GitLab IDE..." -msgstr "" +msgstr "Chargement de l’IDE GitLab…" msgid "Lock" msgstr "Verrouiller" msgid "Lock %{issuableDisplayName}" -msgstr "" +msgstr "Verrouiller %{issuableDisplayName}" + +msgid "Lock not found" +msgstr "Verrou non trouvé" msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." -msgstr "" +msgstr "Verrouiller ce•tte %{issuableDisplayName} ? Seul•e•s les <strong>membres du projet</strong> seront en mesure de commenter." msgid "Locked" msgstr "Verrouillé" @@ -1923,14 +2144,17 @@ msgstr "Verrouillé" msgid "Locked Files" msgstr "Fichiers verrouillés" +msgid "Locks give the ability to lock specific file or folder." +msgstr "Les verrous donnent la possibilité de verrouiller un fichier ou un dossier spécifique." + msgid "Login" msgstr "Se connecter" msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos." -msgstr "" +msgstr "Rendez votre équipe plus productive quel que soit son emplacement. GitLab Geo crée des miroirs en lecture seule de votre instance GitLab afin que vous puissiez réduire le temps nécessaire pour cloner et récupérer de gros dépôts." msgid "Manage labels" -msgstr "" +msgstr "Gérer les labels" msgid "Mar" msgstr "Mars" @@ -1939,7 +2163,7 @@ msgid "March" msgstr "Mars" msgid "Mark done" -msgstr "" +msgstr "Marquer comme fait" msgid "Maximum git storage failures" msgstr "Nombre maximum d’échecs du stockage git" @@ -1953,9 +2177,6 @@ msgstr "Médian" msgid "Members" msgstr "Membres" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "Demandes de fusion" @@ -1966,49 +2187,61 @@ msgid "Merge request" msgstr "Demande de fusion" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" -msgstr "" +msgstr "Les demandes de fusion permettent de proposer les modifications que vous avez apportées à un projet et de discuter de ces modifications avec les autres" + +msgid "MergeRequest|Approved" +msgstr "Approuvée" msgid "Merged" -msgstr "" +msgstr "Fusionnée" msgid "Messages" msgstr "Messages" msgid "Milestone" -msgstr "" +msgstr "Jalon" msgid "Milestones|Delete milestone" -msgstr "" +msgstr "Supprimer le jalon" msgid "Milestones|Delete milestone %{milestoneTitle}?" -msgstr "" +msgstr "Supprimer le jalon %{milestoneTitle} ?" msgid "Milestones|Failed to delete milestone %{milestoneTitle}" -msgstr "" +msgstr "Impossible de supprimer le jalon %{milestoneTitle}" msgid "Milestones|Milestone %{milestoneTitle} was not found" -msgstr "" +msgstr "Le jalon %{milestoneTitle} est introuvable" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "ajouter une clé SSH" +msgid "Modal|Cancel" +msgstr "Annuler" + +msgid "Modal|Close" +msgstr "Fermer" + msgid "Monitoring" msgstr "Surveillance" +msgid "More information" +msgstr "Plus d’informations" + msgid "More information is available|here" msgstr "ici" msgid "Move" -msgstr "" +msgstr "Déplacer" msgid "Move issue" -msgstr "" +msgstr "Déplacer le ticket" msgid "Multiple issue boards" msgstr "Multiple tableaux de tickets" msgid "Name new label" -msgstr "" +msgstr "Nommez le nouveau label" msgid "New Issue" msgid_plural "New Issues" @@ -2016,10 +2249,10 @@ msgstr[0] "Nouveau ticket" msgstr[1] "Nouveaux tickets" msgid "New Kubernetes Cluster" -msgstr "" +msgstr "Nouveau cluster Kubernetes" msgid "New Kubernetes cluster" -msgstr "" +msgstr "Nouveau cluster Kubernetes" msgid "New Pipeline Schedule" msgstr "Nouveau pipeline programmé" @@ -2046,7 +2279,7 @@ msgid "New issue" msgstr "Nouveau ticket" msgid "New label" -msgstr "" +msgstr "Nouveau label" msgid "New merge request" msgstr "Nouvelle demande de fusion" @@ -2067,22 +2300,22 @@ msgid "New tag" msgstr "Nouveau tag" msgid "No assignee" -msgstr "" +msgstr "Aucune personne assignée" msgid "No changes" -msgstr "" +msgstr "Aucun changement" msgid "No connection could be made to a Gitaly Server, please check your logs!" -msgstr "" +msgstr "Aucune connexion n’a pu être établie avec un serveur Gitaly, veuillez vérifier vos logs !" msgid "No due date" -msgstr "" +msgstr "Aucune date d’échéance" msgid "No estimate or time spent" -msgstr "" +msgstr "Aucune estimation ou temps passé" msgid "No file chosen" -msgstr "" +msgstr "Aucun fichier sélectionné" msgid "No repository" msgstr "Pas de dépôt" @@ -2090,24 +2323,24 @@ msgstr "Pas de dépôt" msgid "No schedules" msgstr "Aucun programme" -msgid "No time spent" -msgstr "Pas de temps passé" - msgid "None" msgstr "Aucun·e" msgid "Not allowed to merge" -msgstr "" +msgstr "Non autorisé•e à fusionner" msgid "Not available" msgstr "Indisponible" msgid "Not confidential" -msgstr "" +msgstr "Pas confidentiel•le" msgid "Not enough data" msgstr "Données insuffisantes" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "Notez que la branche principale est automatiquement protégée. %{link_to_protected_branches}" + msgid "Notification events" msgstr "Événement de notifications" @@ -2166,10 +2399,10 @@ msgid "Notifications" msgstr "Notifications" msgid "Notifications off" -msgstr "" +msgstr "Notifications désactivées" msgid "Notifications on" -msgstr "" +msgstr "Notifications activées" msgid "Nov" msgstr "Nov." @@ -2181,7 +2414,7 @@ msgid "Number of access attempts" msgstr "Nombre de tentatives d'accès" msgid "OK" -msgstr "" +msgstr "OK" msgid "Oct" msgstr "Oct." @@ -2196,7 +2429,7 @@ msgid "Only project members can comment." msgstr "Seuls les membres du projet peuvent commenter." msgid "Open" -msgstr "" +msgstr "Ouvrir" msgid "Opened" msgstr "Ouvert" @@ -2210,6 +2443,9 @@ msgstr "Ouvrir dans une nouvelle fenêtre" msgid "Options" msgstr "Paramètres" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "Sinon, il est recommandé de commencer avec l’une des options ci-dessous." + msgid "Overview" msgstr "Vue d'ensemble" @@ -2310,10 +2546,28 @@ msgid "Pipelines for last year" msgstr "Pipelines de l’année dernière" msgid "Pipelines|Build with confidence" -msgstr "" +msgstr "Construire en toute confiance" msgid "Pipelines|Get started with Pipelines" -msgstr "" +msgstr "Premiers pas avec les Pipelines" + +msgid "Pipeline|Retry pipeline" +msgstr "Relancer le pipeline" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "Relancer le pipeline #%{pipelineId} ?" + +msgid "Pipeline|Stop pipeline" +msgstr "Arrêter le pipeline" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "Arrêter le pipeline #%{pipelineId} ?" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "Vous êtes sur le point de relancer le pipeline %{pipelineId}." + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "Vous êtes sur le point d’arrêter le pipeline %{pipelineId}." msgid "Pipeline|all" msgstr "Tous" @@ -2328,10 +2582,10 @@ msgid "Pipeline|with stages" msgstr "avec les étapes" msgid "Play" -msgstr "" +msgstr "Lancer" msgid "Please <a href=%{link_to_billing} target=\"_blank\" rel=\"noopener noreferrer\">enable billing for one of your projects to be able to create a Kubernetes cluster</a>, then try again." -msgstr "" +msgstr "Merci d’<a href=%{link_to_billing} target=\"_blank\" rel=\"noopener noreferrer\">activer la facturation pour un de vos projets afin d’être en mesure de créer un cluster Kubernetes</a>, puis essayez à nouveau." msgid "Please solve the reCAPTCHA" msgstr "Veuillez résoudre le reCAPTCHA" @@ -2340,7 +2594,7 @@ msgid "Preferences" msgstr "Préférences" msgid "Primary" -msgstr "" +msgstr "Principal" msgid "Private - Project access must be granted explicitly to each user." msgstr "Privé - L’accès au projet doit être autorisé explicitement pour chaque utilisa·teur·trice." @@ -2348,6 +2602,9 @@ msgstr "Privé - L’accès au projet doit être autorisé explicitement pour ch msgid "Private - The group and its projects can only be viewed by members." msgstr "Privé - Le groupe ainsi que ses projets ne sont accessibles qu’à ses membres." +msgid "Private projects can be created in your personal namespace with:" +msgstr "Des projets privés peuvent être créés dans votre espace de noms personnel avec :" + msgid "Profile" msgstr "Profil" @@ -2388,7 +2645,7 @@ msgid "Profiles|your account" msgstr "votre compte" msgid "Programming languages used in this repository" -msgstr "" +msgstr "Langages de programmation utilisés dans ce dépôt" msgid "Project '%{project_name}' is in the process of being deleted." msgstr "Le projet “%{project_name}†est en train d’être supprimé." @@ -2406,13 +2663,13 @@ msgid "Project access must be granted explicitly to each user." msgstr "L’accès au projet doit être explicitement accordé à chaque utilisateur." msgid "Project avatar" -msgstr "" +msgstr "Avatar du projet" msgid "Project avatar in repository: %{link}" -msgstr "" +msgstr "Avatar du project dans le dépôt : %{link}" msgid "Project cache successfully reset." -msgstr "" +msgstr "Le cache du projet a bien été réinitialisé." msgid "Project details" msgstr "Détails du projet" @@ -2433,19 +2690,19 @@ msgid "ProjectActivityRSS|Subscribe" msgstr "S’abonner" msgid "ProjectCreationLevel|Allowed to create projects" -msgstr "" +msgstr "Autorisé•e à créer des projets" msgid "ProjectCreationLevel|Default project creation protection" -msgstr "" +msgstr "Protection de création de projet par défaut" msgid "ProjectCreationLevel|Developers + Masters" -msgstr "" +msgstr "Développeur•euse•s + Expert•e•s" msgid "ProjectCreationLevel|Masters" -msgstr "" +msgstr "Expert•e•s" msgid "ProjectCreationLevel|No one" -msgstr "" +msgstr "Personne" msgid "ProjectFeature|Disabled" msgstr "Désactivé" @@ -2472,7 +2729,7 @@ msgid "ProjectSettings|Contact an admin to change this setting." msgstr "Contactez un administrateur pour modifier ce paramètre." msgid "ProjectSettings|Only signed commits can be pushed to this repository." -msgstr "Seules les validations signées peuvent être poussées sur ce dépôt." +msgstr "Seules les commits signés peuvent être poussés sur ce dépôt." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." msgstr "Ce paramètre est appliqué au niveau du serveur et peut être modifié par un administrateur." @@ -2484,7 +2741,7 @@ msgid "ProjectSettings|This setting will be applied to all projects unless overr msgstr "Ce paramètre s’appliquera à tous les projets à moins qu’un•e administrat•eur•rice ne le modifie." msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." -msgstr "Les utilisateurs peuvent uniquement pousser sur ce dépôt des validations qui ont été validées avec une de leurs adresses courriels vérifiées." +msgstr "Les utilisateurs peuvent uniquement pousser sur ce dépôt des commits qui ont été validés avec une de leurs adresses courriels vérifiées." msgid "Projects" msgstr "Projets" @@ -2510,12 +2767,30 @@ msgstr "Désolé, aucun projet ne correspond à votre recherche" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Cette fonctionnalité requiert le support du localStorage par votre navigateur" +msgid "PrometheusService|Active" +msgstr "Actif" + +msgid "PrometheusService|Auto configuration" +msgstr "Configuration automatique" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "Déployer et configurer automatiquement Prometheus sur vos clusters pour surveiller les environnements de vos projets" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "Par défaut, Prometheus écoute sur 'http://localhost:9090'. Il n’est pas recommandé de changer l’adresse et le port par défaut car cela pourrait affecter ou entrer en conflit avec d'autres services fonctionnant sur le serveur GitLab." msgid "PrometheusService|Finding and configuring metrics..." msgstr "Recherche et configuration des métriques en cours…" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "Installer Prometheus sur les clusters" + +msgid "PrometheusService|Manage clusters" +msgstr "Gérer les clusters" + +msgid "PrometheusService|Manual configuration" +msgstr "Configuration manuelle" + msgid "PrometheusService|Metrics" msgstr "Métriques" @@ -2537,14 +2812,23 @@ msgstr "Aucune métrique n’est surveillée. Pour démarrer la surveillance, dà msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "URL de base de l’API Prometheus, comme http://prometheus.example.com/" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "Prometheus est géré automatiquement sur vos clusters" + msgid "PrometheusService|Time-series monitoring service" -msgstr "" +msgstr "Service de surveillance de séries temporelles" + +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "Pour activer la configuration manuelle, désinstallez Prometheus de vos clusters" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "Pour activer l’installation de Prometheus sur vos clusters, désactivez la configuration manuelle ci-dessous" msgid "PrometheusService|View environments" msgstr "Afficher les environnements" msgid "Protip:" -msgstr "" +msgstr "Astuce :" msgid "Public - The group and any public projects can be viewed without any authentication." msgstr "Public - Le groupe ainsi que n’importe quel projet public est accessible sans authentification." @@ -2558,11 +2842,17 @@ msgstr "Règles de poussée" msgid "Push events" msgstr "Évènements de poussée" +msgid "Push project from command line" +msgstr "Pousser le projet en ligne de commande" + +msgid "Push to create a project" +msgstr "Pousser pour créer un projet" + msgid "PushRule|Committer restriction" msgstr "Restriction du validateur" msgid "Quick actions can be used in the issues description and comment boxes." -msgstr "" +msgstr "Les actions rapides peuvent être utilisées dans la description des tickets et dans les zones de commentaire." msgid "Read more" msgstr "Lire plus" @@ -2577,16 +2867,16 @@ msgid "RefSwitcher|Tags" msgstr "Tags" msgid "Reference:" -msgstr "" +msgstr "Référence :" msgid "Register / Sign In" -msgstr "" +msgstr "Inscription / Connexion" msgid "Registry" msgstr "Registre" msgid "Related Commits" -msgstr "Validations liées" +msgstr "Commits liés" msgid "Related Deployed Jobs" msgstr "Tâches de déploiement liées" @@ -2607,20 +2897,23 @@ msgid "Remind later" msgstr "Me le rappeler ultérieurement" msgid "Remove" -msgstr "" +msgstr "Supprimer" msgid "Remove avatar" -msgstr "" +msgstr "Supprimer l’avatar" msgid "Remove project" msgstr "Supprimer le projet" msgid "Repair authentication" -msgstr "" +msgstr "Réparer l’authentification" msgid "Repository" msgstr "Dépôt" +msgid "Repository has no locks." +msgstr "Le dépôt n’a pas de verrous." + msgid "Request Access" msgstr "Demander l'accès" @@ -2633,17 +2926,23 @@ msgstr "Réinitialiser le jeton d’accès au bilan de santé" msgid "Reset runners registration token" msgstr "Réinitialiser le jeton d’inscription des exécuteurs" +msgid "Resolve discussion" +msgstr "Résoudre la discussion" + msgid "Reveal value" msgid_plural "Reveal values" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Révéler la valeur" +msgstr[1] "Révéler les valeurs" msgid "Revert this commit" -msgstr "Défaire cette validation" +msgstr "Défaire ce commit" msgid "Revert this merge request" msgstr "Défaire cette demande de fusion" +msgid "Roadmap" +msgstr "Feuille de route" + msgid "SSH Keys" msgstr "Clés SSH" @@ -2654,7 +2953,7 @@ msgid "Save pipeline schedule" msgstr "Sauvegarder le pipeline programmé" msgid "Save variables" -msgstr "" +msgstr "Enregistrer les variables" msgid "Schedule a new pipeline" msgstr "Programmer un nouveau pipeline" @@ -2672,13 +2971,13 @@ msgid "Search branches and tags" msgstr "Rechercher dans les branches et les étiquettes" msgid "Search milestones" -msgstr "" +msgstr "Recherche de jalons" msgid "Search project" -msgstr "" +msgstr "Recherche de projets" msgid "Search users" -msgstr "" +msgstr "Recherche d’utilisateur•rice•s" msgid "Seconds before reseting failure information" msgstr "Nombre de secondes avant de réinitialiser les informations d’échec" @@ -2687,7 +2986,10 @@ msgid "Seconds to wait for a storage access attempt" msgstr "Nombre de secondes d’attente pour un essai d'accès au stockage" msgid "Secret variables" -msgstr "" +msgstr "Variables secrètes" + +msgid "Security report" +msgstr "Rapport de sécurité" msgid "Select Archive Format" msgstr "Sélectionnez le format de l'archive" @@ -2695,17 +2997,23 @@ msgstr "Sélectionnez le format de l'archive" msgid "Select a timezone" msgstr "Sélectionnez un fuseau horaire" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "Sélectionnez un cluster Kubernetes existant ou créez-en un nouveau" + msgid "Select assignee" -msgstr "" +msgstr "Sélectionner une personne assignée" msgid "Select branch/tag" -msgstr "" +msgstr "Sélectionnez une branche / un tag" msgid "Select target branch" msgstr "Sélectionnez une branche cible" msgid "Selective synchronization" -msgstr "" +msgstr "Synchronisation sélective" + +msgid "Send email" +msgstr "Envoyer un courriel" msgid "Sep" msgstr "Sept." @@ -2714,37 +3022,43 @@ msgid "September" msgstr "Septembre" msgid "Server version" -msgstr "" +msgstr "Version du serveur" msgid "Service Templates" msgstr "Modèles de service" +msgid "Service URL" +msgstr "URL du service" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Définissez un mot de passe pour votre compte pour pouvoir tirer ou pousser par %{protocol}." msgid "Set up CI/CD" -msgstr "" +msgstr "Configurer CI/CD" msgid "Set up Koding" msgstr "Mettre en place Koding" -msgid "Set up auto deploy" -msgstr "Mettre en place l’auto-déploiement" - msgid "SetPasswordToCloneLink|set a password" msgstr "définir un mot de passe" msgid "Settings" msgstr "Paramètres" +msgid "Setup a specific Runner automatically" +msgstr "Configurer un Exécuteur spécifique automatiquement" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." -msgstr "" +msgstr "En réinitialisant les minutes du pipeline pour cet espace de noms, les minutes actuellement utilisées seront remises à zéro." msgid "SharedRunnersMinutesSettings|Reset pipeline minutes" -msgstr "" +msgstr "Réinitialiser les minutes du pipeline" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" -msgstr "" +msgstr "Réinitialiser les minutes de pipeline utilisées" + +msgid "Show command" +msgstr "Afficher la commande" msgid "Show parent pages" msgstr "Afficher les pages parentes" @@ -2773,19 +3087,25 @@ msgid "Snippets" msgstr "Extraits de code" msgid "Something went wrong on our end" -msgstr "" +msgstr "Une erreur est survenue de notre côté" msgid "Something went wrong on our end." msgstr "Une erreur est survenue de notre côté." msgid "Something went wrong trying to change the confidentiality of this issue" -msgstr "" +msgstr "Quelque chose s’est mal passé en essayant de changer la confidentialité de ce ticket" msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName}" msgstr "Quelque chose ne s‘est pas bien passé en essayant de changer l’état de verrouillage de cette ${this.issuableDisplayName}" msgid "Something went wrong when toggling the button" -msgstr "" +msgstr "Une erreur s’est produite lors du basculement du bouton" + +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "Une erreur s’est produite lors de la fermeture du/de la %{issuable}. Veuillez réessayer plus tard" + +msgid "Something went wrong while fetching SAST." +msgstr "Une erreur s’est produite lors de la récupération de la SAST." msgid "Something went wrong while fetching the projects." msgstr "Une erreur s'est produite lors de la récupération des projets." @@ -2793,9 +3113,15 @@ msgstr "Une erreur s'est produite lors de la récupération des projets." msgid "Something went wrong while fetching the registry list." msgstr "Une erreur s'est produite lors de la récupération de la liste du registre." -msgid "Something went wrong. Please try again." +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "Une erreur s’est produite lors de la réouverture du / de la %{issuable}. Veuillez réessayer plus tard" + +msgid "Something went wrong while resolving this discussion. Please try again." msgstr "" +msgid "Something went wrong. Please try again." +msgstr "Quelque chose s’est mal passé. Veuillez réessayer." + msgid "Sort by" msgstr "Trier par" @@ -2898,6 +3224,9 @@ msgstr "Poids" msgid "Source" msgstr "Source" +msgid "Source (branch or tag)" +msgstr "Source (branche ou tag)" + msgid "Source code" msgstr "Code source" @@ -2926,7 +3255,7 @@ msgid "Stopped" msgstr "Arrêté" msgid "Storage" -msgstr "" +msgstr "Stockage" msgid "Subgroups" msgstr "Sous-groupes" @@ -2937,22 +3266,22 @@ msgstr "Changer de branche / tag" msgid "System Hooks" msgstr "Crochets système" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Étiquette" -msgstr[1] "Tags" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "Tag (%{tag_count})" +msgstr[1] "Tags (%{tag_count})" msgid "Tags" msgstr "Tags" msgid "TagsPage|Browse commits" -msgstr "Parcourir les validations" +msgstr "Parcourir les commits" msgid "TagsPage|Browse files" msgstr "Parcourir les fichiers" msgid "TagsPage|Can't find HEAD commit for this tag" -msgstr "Impossible de trouver la validation HEAD pour ce tag" +msgstr "Impossible de trouver le commit HEAD pour ce tag" msgid "TagsPage|Cancel" msgstr "Annuler" @@ -2970,7 +3299,7 @@ msgid "TagsPage|Edit release notes" msgstr "Modifier les notes de version" msgid "TagsPage|Existing branch name, tag, or commit SHA" -msgstr "Nom de branche, tag, ou SHA de validation existant" +msgstr "Nom de branche, tag, ou SHA de commit existant" msgid "TagsPage|Filter by tag name" msgstr "Filtrer par nom de tag" @@ -3027,13 +3356,13 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa msgstr "La Recherche Globale Avancée de Gitlab est un outils puissant qui vous fait gagner du temps. Au lieu de créer du code similaire et perdre du temps, vous pouvez maintenant chercher dans le code d'autres équipes pour vous aider sur votre projet." msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project" -msgstr "" +msgstr "Le suivi des tickets est l’endroit où ajouter des éléments à améliorer ou à résoudre dans un projet" msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project." -msgstr "" +msgstr "Le suivi des tickets est l’endroit où ajouter des éléments à améliorer ou à résoudre dans un projet. Vous pouvez vous inscrire ou vous connecter pour créer des tickets pour ce projet." msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." -msgstr "L’étape de développement montre le temps entre la première validation et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion." +msgstr "L’étape de développement montre le temps entre le premier commit et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion." msgid "The collection of events added to the data gathered for that stage." msgstr "L’ensemble d’évènements ajoutés aux données récupérées pour cette étape." @@ -3045,7 +3374,7 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni msgstr "L'étape des tickets montre le temps nécessaire entre la création d'un ticket et son assignation à un jalon, ou son ajout à une liste d'un tableau de tickets. Commencez par créer des tickets pour voir des données pour cette étape." msgid "The maximum file size allowed is 200KB." -msgstr "" +msgstr "La taille de fichier maximale autorisée est de 200 Ko." msgid "The number of attempts GitLab will make to access a storage." msgstr "Le nombre de tentatives que GitLab va effectuer pour accéder au stockage." @@ -3057,7 +3386,7 @@ msgid "The phase of the development lifecycle." msgstr "Les étapes du cycle de développement." msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." -msgstr "L’étape de planification montre le temps entre l’étape précédente et l’envoi de votre première validation. Ce temps sera automatiquement ajouté quand vous pousserez votre première validation." +msgstr "L’étape de planification montre le temps entre l’étape précédente et l’envoi de votre premier commit. Ce temps sera automatiquement ajouté quand vous pousserez votre premier commit." msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." msgstr "L’étape de mise en production montre le temps nécessaire entre la création d’un ticket et le déploiement du code en production. Les données seront automatiquement ajoutées une fois que vous aurez complété le cycle complet, depuis l’idée jusqu’à la mise en production." @@ -3071,9 +3400,15 @@ msgstr "Votre projet peut être accédé sans aucune authentification." msgid "The repository for this project does not exist." msgstr "Le dépôt pour ce projet n'existe pas." +msgid "The repository for this project is empty" +msgstr "Le dépôt de ce projet est vide" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "L’étape d’évaluation montre le temps entre la création de la demande de fusion et la fusion effective de celle-ci. Ces données seront automatiquement ajoutées après que vous ayez fusionné votre première demande de fusion." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "La feuille de route montre la progression de vos épopées dans le temps" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "L’étape de pré-production indique le temps entre la fusion de la DF et le déploiement du code dans l’environnent de production. Les données seront automatiquement ajoutées une fois que vous déploierez en production pour la première fois." @@ -3087,7 +3422,7 @@ msgid "The time in seconds GitLab will try to access storage. After this time a msgstr "Temps en secondes pendant lequel GitLab essaiera d’accéder au stockage. Après ce délai, une erreur d’expiration d’attente sera déclenchée." msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check." -msgstr "" +msgstr "Le temps en secondes entre les vérifications de stockage. GitLab ne débute pas de nouvelle vérification si une vérification est déjà en cours." msgid "The time taken by each data entry gathered by that stage." msgstr "Le temps pris par chaque entrée récoltée durant cette étape." @@ -3096,37 +3431,37 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet msgstr "La valeur située au point médian d’une série de valeur observée. C.à .d., entre 3, 5, 9, le médian est 5. Entre 3, 5, 7, 8, le médian est (5+7)/2 = 6." msgid "There are no issues to show" -msgstr "" +msgstr "Il n’y a aucun ticket à afficher" msgid "There are no merge requests to show" -msgstr "" +msgstr "Il n’y a aucune demande de fusion à afficher" msgid "There are problems accessing Git storage: " msgstr "Il y a des difficultés à accéder aux données Git : " msgid "There was an error loading users activity calendar." -msgstr "" +msgstr "Une erreur s’est produite lors du chargement du calendrier d’activité des utilisateurs." msgid "There was an error saving your notification settings." -msgstr "" +msgstr "Une erreur s’est produite lors de l’enregistrement de vos paramètres de notification." msgid "There was an error subscribing to this label." -msgstr "" +msgstr "Une erreur s’est produite lors de l’abonnement à ce label." msgid "There was an error when reseting email token." -msgstr "" +msgstr "Une erreur s’est produite lors de la réinitialisation du jeton de courriel." msgid "There was an error when subscribing to this label." -msgstr "" +msgstr "Une erreur s’est produite lors de l’abonnement à ce label." msgid "There was an error when unsubscribing from this label." -msgstr "" +msgstr "Une erreur s’est produite lors de la désinscription à ce label." msgid "This board\\'s scope is reduced" msgstr "La portée de ce tableau est limitée" msgid "This directory" -msgstr "" +msgstr "Ce répertoire" msgid "This is a confidential issue." msgstr "Ce ticket est confidentiel." @@ -3135,7 +3470,7 @@ msgid "This is the author's first Merge Request to this project." msgstr "C’est la première demande de fusion de cet auteur pour ce projet." msgid "This issue is confidential" -msgstr "" +msgstr "Ce ticket est confidentiel" msgid "This issue is confidential and locked." msgstr "Ce ticket est confidentiel et verrouillé." @@ -3144,22 +3479,22 @@ msgid "This issue is locked." msgstr "Ce ticket est verrouillé." msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments" -msgstr "" +msgstr "Cette tâche dépend de l’utilisateur•rice pour déclencher son processus. Elles sont souvent utilisées pour déployer du code dans des environnements de production" msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered" -msgstr "" +msgstr "Cette tâche dépend des tâches en amont qui doivent réussir pour que celle-ci soit déclenchée" msgid "This job has not been triggered yet" -msgstr "" +msgstr "Cette tâche n’a pas encore été déclenchée" msgid "This job has not started yet" -msgstr "" +msgstr "Cete tâche n’a pas encore commencée" msgid "This job is in pending state and is waiting to be picked by a runner" -msgstr "" +msgstr "Cette tâche est en attente et attend d’être choisie par un exécuteur" msgid "This job requires a manual action" -msgstr "" +msgstr "Cette tâche nécessite une action manuelle" msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’avez pas créé un dépôt vide, ou que vous n’avez pas importé un dépôt existant." @@ -3167,11 +3502,14 @@ msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’a msgid "This merge request is locked." msgstr "Cette demande de fusion est verrouillée." +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "Cette page n’est pas disponible car vous n’êtes pas autorisé à lire des informations dans plusieurs projets." + msgid "This project" -msgstr "" +msgstr "Ce projet" msgid "This repository" -msgstr "" +msgstr "Ce dépôt" msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here." msgstr "Ces emails deviennent automatiquement des tickets (les commentaires étant extrait de la conversation par email) répertoriés ici." @@ -3186,19 +3524,19 @@ msgid "Time between merge request creation and merge/close" msgstr "Temps entre la création d'une demande de fusion et sa fusion/clôture" msgid "Time tracking" -msgstr "" +msgstr "Suivi du temps" msgid "Time until first merge request" msgstr "Temps jusqu’à la première demande de fusion" msgid "TimeTrackingEstimated|Est" -msgstr "" +msgstr "Est" msgid "TimeTracking|Estimated:" -msgstr "" +msgstr "Estimé :" msgid "TimeTracking|Spent" -msgstr "" +msgstr "Passé" msgid "Timeago|%s days ago" msgstr "il y a %s jours" @@ -3336,29 +3674,35 @@ msgstr[1] "mins" msgid "Time|s" msgstr "s" +msgid "Tip:" +msgstr "Astuce :" + msgid "Title" msgstr "Titre" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "Pour afficher la feuille de route, ajoutez une date de début ou de fin planifiée à l’une de vos épopées dans ce groupe ou ses sous-groupes. Seules les épopées des 3 derniers mois et des 3 prochains mois sont affichées." + msgid "Todo" -msgstr "" +msgstr "Tâche" msgid "Toggle sidebar" -msgstr "" +msgstr "Afficher/masquer la barre latérale" msgid "ToggleButton|Toggle Status: OFF" -msgstr "" +msgstr "État du commutateur : Inactif" msgid "ToggleButton|Toggle Status: ON" -msgstr "" +msgstr "État du commutateur : Actif" msgid "Total Time" msgstr "Temps total" -msgid "Total issue time spent" -msgstr "Temps total passé sur les tickets" - msgid "Total test time for all commits/merges" -msgstr "Temps total de test pour toutes les validations/fusions" +msgstr "Temps total de test pour tous les commits/fusions" + +msgid "Total: %{total}" +msgstr "Total : %{total}" msgid "Track activity with Contribution Analytics." msgstr "Suivre l’activité avec Contribution Analytics." @@ -3366,41 +3710,38 @@ msgstr "Suivre l’activité avec Contribution Analytics." msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "Suivez les groupes de tickets qui partagent un thème, entre projets et jalons" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" -msgstr "" +msgstr "Suivre le temps estimé/passé avec les actions rapides" msgid "Trigger this manual action" -msgstr "" +msgstr "Déclencher cette action manuelle" msgid "Turn on Service Desk" msgstr "Activer le Service Desk" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." -msgstr "" +msgstr "Impossible de réinitialiser le cache du projet." msgid "Unknown" -msgstr "" +msgstr "Inconnu" msgid "Unlock" msgstr "Déverrouiller" msgid "Unlock this %{issuableDisplayName}? <strong>Everyone</strong> will be able to comment." -msgstr "" +msgstr "Débloquez le•a %{issuableDisplayName} ? <strong>Tout le monde</strong> sera en mesure de commenter." msgid "Unlocked" msgstr "Déverrouillé" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "Supprimer des favoris" msgid "Up to date" -msgstr "" +msgstr "À jour" msgid "Upgrade your plan to activate Advanced Global Search." msgstr "Mettez à jour votre abonnement pour activer la Recherche Globale Avancée." @@ -3424,7 +3765,7 @@ msgid "Upload file" msgstr "Téléverser un fichier" msgid "Upload new avatar" -msgstr "" +msgstr "Importer un nouvel avatar" msgid "UploadLink|click to upload" msgstr "Cliquez pour envoyer" @@ -3439,13 +3780,16 @@ msgid "Use your global notification setting" msgstr "Utiliser vos paramètres de notification globaux" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." -msgstr "" +msgstr "Les variables sont appliquées aux environnements via l’exécuteur. Elles peuvent être protégées en les exposant uniquement à des branches ou des tags protégées. Vous pouvez utiliser des variables pour les mots de passe, les clés secrètes ou tout ce que vous voulez." + +msgid "View epics list" +msgstr "Afficher la liste des épopées" msgid "View file @ " msgstr "Voir le fichier @ " msgid "View labels" -msgstr "" +msgstr "Afficher les labels" msgid "View open merge request" msgstr "Afficher la demande de fusion" @@ -3469,7 +3813,7 @@ msgid "Want to see the data? Please ask an administrator for access." msgstr "Vous voulez voir les données ? Merci de contacter un administrateur pour en obtenir l’accès." msgid "We could not verify that one of your projects on GCP has billing enabled. Please try again." -msgstr "" +msgstr "Nous n’avons pas pu vérifier que l’un de vos projets sur GCP est activé pour la facturation. Veuillez réessayer." msgid "We don't have enough data to show this stage." msgstr "Nous n'avons pas suffisamment de données pour afficher cette étape." @@ -3477,6 +3821,9 @@ msgstr "Nous n'avons pas suffisamment de données pour afficher cette étape." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "Nous voulons être sûrs que c'est bien vous, merci de confirmer que vous n’êtes pas un robot." +msgid "Web IDE" +msgstr "Web IDE" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "Les webhooks vous permettent d’appeler une URL si, par exemple, du nouveau code est poussé ou un nouveau ticket est créé. Vous pouvez configurer les webhooks pour écouter les événements spécifiques comme des poussées de code, des tickets ou des demandes de fusion. Les webhooks de groupes s’appliqueront à tous les projets dans un groupe, ce qui vous permet de normaliser la fonctionnalité du webhook dans votre groupe entier." @@ -3502,10 +3849,10 @@ msgid "WikiClone|Start Gollum and edit locally" msgstr "Démarrer Gollum et modifier localement" msgid "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title." -msgstr "" +msgstr "Astuce : Vous pouvez déplacer cette page en ajoutant le chemin au début du titre." msgid "WikiEdit|There is already a page with the same title in that path." -msgstr "" +msgstr "Il y a déjà une page avec le même titre pour ce chemin." msgid "WikiEmptyPageError|You are not allowed to create wiki pages" msgstr "Vous n’êtes pas autorisé·e à créer des pages wiki" @@ -3597,6 +3944,9 @@ msgstr "Avec Contribution Analytics vous pouvez avoir un aperçu de l’actività msgid "Withdraw Access Request" msgstr "Retirer la demande d'accès" +msgid "Write a commit message..." +msgstr "Écrire un message de commit…" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Vous êtes sur le point de supprimer %{group_name}. Les groupes supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr·e ?" @@ -3609,20 +3959,23 @@ msgstr "Vous allez supprimer la relation de fourche avec le projet source %{fork msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Vous allez transférer %{project_name_with_namespace} à un nouveau propriétaire. Êtes vous ABSOLUMENT sûr·e ?" +msgid "You can also create a project from the command line." +msgstr "Vous pouvez également créer un projet en ligne de commande." + msgid "You can also star a label to make it a priority label." -msgstr "" +msgstr "Vous pouvez marquer un label comme important pour en faire un label prioritaire." -msgid "You can move around the graph by using the arrow keys." -msgstr "" +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" +msgstr "Vous pouvez facilement installer un Exécuteur sur un cluster Kubernetes. %{link_to_help_page}" msgid "You can move around the graph by using the arrow keys." -msgstr "" +msgstr "Vous pouvez vous déplacer dans le graphique en utilisant les touches fléchées." msgid "You can only add files when you are on a branch" msgstr "Vous ne pouvez ajouter de fichier que dans une branche" msgid "You can only edit files when you are on a branch" -msgstr "" +msgstr "Vous ne pouvez éditer de fichier que dans une branche" msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." msgstr "Vous ne pouvez pas écrire sur une instance GitLab Geo secondaire en lecture-seule. Veuillez utiliser le %{link_to_primary_node} à la place." @@ -3630,12 +3983,24 @@ msgstr "Vous ne pouvez pas écrire sur une instance GitLab Geo secondaire en lec msgid "You cannot write to this read-only GitLab instance." msgstr "Vous ne pouvez pas écrire sur cette instance GitLab en lecture-seule." +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "Vous ne disposez pas des autorisations appropriées pour remplacer les paramètres de synchronisation du groupe LDAP." + +msgid "You have no permissions" +msgstr "Vous n’avez pas les autorisations" + msgid "You have reached your project limit" msgstr "Vous avez atteint votre limite de projet" +msgid "You must have master access to force delete a lock" +msgstr "Vous devez avoir un accès Expert pour forcer la suppression d’un verrou" + msgid "You must sign in to star a project" msgstr "Vous devez vous connecter pour mettre un projet en favori" +msgid "You need a different license to enable FileLocks feature" +msgstr "Vous avez besoin d’une licence différente pour activer la fonctionnalité FileLocks" + msgid "You need permission." msgstr "Vous avez besoin d’une autorisation." @@ -3664,10 +4029,13 @@ msgid "You won't be able to pull or push project code via SSH until you add an S msgstr "Vous ne pourrez pas récupérer ou pousser de code par SSH tant que vous n’aurez pas ajouté de clé SSH à votre profil" msgid "You'll need to use different branch names to get a valid comparison." -msgstr "" +msgstr "Vous devrez utiliser différents noms de branches pour obtenir une comparaison valide." msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" -msgstr "" +msgstr "Vos informations de cluster Kubernetes sur cette page sont toujours modifiables, mais il est conseillé de désactiver et reconfigurer" + +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "Vos modifications ont été validées. Commit %{commitId} %{commitStats}" msgid "Your comment will not be visible to the public." msgstr "Votre commentaire ne sera pas visible publiquement." @@ -3682,7 +4050,7 @@ msgid "Your projects" msgstr "Vos projets" msgid "assign yourself" -msgstr "" +msgstr "assignez vous" msgid "branch name" msgstr "nom de la branche" @@ -3691,58 +4059,73 @@ msgid "by" msgstr "par" msgid "ciReport|Code quality" -msgstr "" +msgstr "Qualité du code" msgid "ciReport|DAST detected no alerts by analyzing the review app" -msgstr "" +msgstr "DAST n’a détecté aucune alerte en analysant l’application de revue" -msgid "ciReport|Failed to load ${type} report" -msgstr "" +msgid "ciReport|Failed to load %{reportName} report" +msgstr "Impossible de charger le rapport %{reportName}" msgid "ciReport|Fixed:" -msgstr "" +msgstr "Réparé :" msgid "ciReport|Instances" -msgstr "" +msgstr "Instances" msgid "ciReport|Learn more about whitelisting" -msgstr "" +msgstr "En savoir plus sur la liste blanche" -msgid "ciReport|Loading ${type} report" -msgstr "" +msgid "ciReport|Loading %{reportName} report" +msgstr "Chargement du rapport %{reportName}" msgid "ciReport|No changes to code quality" -msgstr "" +msgstr "Aucun changement dans la qualité du code" msgid "ciReport|No changes to performance metrics" -msgstr "" +msgstr "Aucun changement dans les indicateurs de performance" msgid "ciReport|Performance metrics" -msgstr "" +msgstr "Indicateurs de performance" msgid "ciReport|SAST" -msgstr "" +msgstr "SAST" + +msgid "ciReport|SAST degraded on" +msgstr "SAST dégradée sur" + +msgid "ciReport|SAST detected" +msgstr "SAST détectée" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "SAST n’a détecté aucune nouvelle vulnérabilité de sécurité" msgid "ciReport|SAST detected no security vulnerabilities" -msgstr "" +msgstr "SAST n’a détecté aucune vulnérabilité de sécurité" msgid "ciReport|SAST:container no vulnerabilities were found" -msgstr "" +msgstr "SAST:conteneur aucune vulnérabilité n’a été trouvée" msgid "ciReport|Show complete code vulnerabilities report" -msgstr "" +msgstr "Afficher le rapport complet sur les vulnérabilités du code" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" -msgstr "" +msgstr "Les vulnérabilités non approuvées (en rouge) peuvent être marquées comme approuvées. %{helpLink}" + +msgid "ciReport|no security vulnerabilities" +msgstr "aucune vulnérabilité de sécurité" + +msgid "command line instructions" +msgstr "instructions en ligne de commande" msgid "commit" msgstr "validation" msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue." -msgstr "" +msgstr "Vous allez désactiver la confidentialité. Cela signifie que <strong>tout le monde</strong> sera en mesure de voir et de laisser un commentaire sur ce ticket." msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with <strong>at least Reporter access</strong> are able to see and leave comments on the issue." -msgstr "" +msgstr "Vous allez activer la confidentialité. Cela signifie que seuls les membres de l’équipe avec <strong>au moins un accès Reporter</strong> sont capables de voir et de laisser des commentaires sur le ticket." msgid "day" msgid_plural "days" @@ -3750,141 +4133,180 @@ msgstr[0] "jour" msgstr[1] "jours" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." -msgstr "" +msgstr "%{slash_command} mettra à jour la durée estimée avec la dernière commande." + +msgid "is invalid because there is downstream lock" +msgstr "est invalide car il y a un verrou en aval" + +msgid "is invalid because there is upstream lock" +msgstr "est invalide car il y a un verrou en amont" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "verrouillé par %{path_lock_user_name} %{created_at}" msgid "merge request" msgid_plural "merge requests" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "demande de fusion" +msgstr[1] "demandes de fusion" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "Veuillez la restaurer ou utiliser une autre branche %{missingBranchName}" + +msgid "mrWidget|Add approval" +msgstr "Ajouter une approbation" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "Une erreur est survenue lors de la suppression de votre approbation." + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "Une erreur s’est produite lors de la récupération des données d’approbation pour cette demande de fusion." + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "Une erreur est survenue pendant l’envoi de votre approbation." + +msgid "mrWidget|Approve" +msgstr "Approuver" + +msgid "mrWidget|Approved by" +msgstr "Approuvée par" msgid "mrWidget|Cancel automatic merge" -msgstr "" +msgstr "Annuler la fusion automatique" msgid "mrWidget|Check out branch" -msgstr "" +msgstr "Récupérer la branche" msgid "mrWidget|Checking ability to merge automatically" -msgstr "" +msgstr "Vérification de la possibilité de fusion automatique" msgid "mrWidget|Cherry-pick" -msgstr "" +msgstr "Picorer" msgid "mrWidget|Cherry-pick this merge request in a new merge request" -msgstr "" +msgstr "Picorer cette demande de fusion dans une nouvelle demande de fusion" msgid "mrWidget|Closed" -msgstr "" +msgstr "Fermée" msgid "mrWidget|Closed by" -msgstr "" +msgstr "Fermée par" msgid "mrWidget|Closes" -msgstr "" +msgstr "Résout" msgid "mrWidget|Did not close" -msgstr "" +msgstr "N’a pas résolu" msgid "mrWidget|Email patches" -msgstr "" +msgstr "Patchs par courriel" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" -msgstr "" +msgstr "Si la branche %{branch} existe dans votre dépôt local, vous pouvez fusionner cette demande de fusion manuellement à l’aide de" + +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "Si la branche %{missingBranchName} existe dans votre dépôt local, vous pouvez fusionner cette demande de fusion manuellement en ligne de commande" msgid "mrWidget|Mentions" -msgstr "" +msgstr "Mentionne" msgid "mrWidget|Merge" -msgstr "" +msgstr "Fusionner" msgid "mrWidget|Merge failed." -msgstr "" +msgstr "La fusion a échoué." msgid "mrWidget|Merge locally" -msgstr "" +msgstr "Fusionner localement" msgid "mrWidget|Merged by" -msgstr "" +msgstr "Fusionnée par" msgid "mrWidget|Plain diff" -msgstr "" +msgstr "Diff simple" msgid "mrWidget|Refresh" -msgstr "" +msgstr "Actualiser" msgid "mrWidget|Refresh now" -msgstr "" +msgstr "Actualiser maintenant" msgid "mrWidget|Refreshing now" -msgstr "" +msgstr "Actualisation en cours" msgid "mrWidget|Remove Source Branch" -msgstr "" +msgstr "Supprimer la branche source" msgid "mrWidget|Remove source branch" -msgstr "" +msgstr "Supprimer la branche source" + +msgid "mrWidget|Remove your approval" +msgstr "Supprimer votre approbation" msgid "mrWidget|Request to merge" -msgstr "" +msgstr "Demander la fusion" msgid "mrWidget|Resolve conflicts" -msgstr "" +msgstr "Résoudre les conflits" msgid "mrWidget|Revert" -msgstr "" +msgstr "Défaire" msgid "mrWidget|Revert this merge request in a new merge request" -msgstr "" +msgstr "Défaire cette demande de fusion dans une nouvelle demande de fusion" msgid "mrWidget|Set by" -msgstr "" +msgstr "Marqué par" msgid "mrWidget|The changes were merged into" -msgstr "" +msgstr "Les modifications ont été fusionnées dans" msgid "mrWidget|The changes were not merged into" -msgstr "" +msgstr "Les modifications n’ont pas été fusionnées dans" msgid "mrWidget|The changes will be merged into" -msgstr "" +msgstr "Les modifications seront fusionnées dans" msgid "mrWidget|The source branch has been removed" -msgstr "" +msgstr "La branche source a été supprimée" msgid "mrWidget|The source branch is being removed" -msgstr "" +msgstr "La branche source est en cours de suppression" msgid "mrWidget|The source branch will be removed" -msgstr "" +msgstr "La branche source sera supprimée" msgid "mrWidget|The source branch will not be removed" -msgstr "" +msgstr "La branche source ne sera pas supprimée" msgid "mrWidget|There are merge conflicts" -msgstr "" +msgstr "Il y a des conflits de fusion" msgid "mrWidget|This merge request failed to be merged automatically" -msgstr "" +msgstr "Cette demande de fusion n’a pas pu être fusionnée automatiquement" msgid "mrWidget|This merge request is in the process of being merged" -msgstr "" +msgstr "Cette demande de fusion est en cours de fusion" msgid "mrWidget|This project is archived, write access has been disabled" -msgstr "" +msgstr "Ce projet est archivé, l’accès en écriture a été désactivé" msgid "mrWidget|You can merge this merge request manually using the" -msgstr "" +msgstr "Vous pouvez fusionner cette demande de fusion manuellement à l’aide de la" msgid "mrWidget|You can remove source branch now" -msgstr "" +msgstr "Vous pouvez maintenant supprimer la branche source" + +msgid "mrWidget|branch does not exist." +msgstr "la branche n’existe pas." msgid "mrWidget|command line" -msgstr "" +msgstr "ligne de commande" msgid "mrWidget|into" -msgstr "" +msgstr "dans" msgid "mrWidget|to be merged automatically when the pipeline succeeds" -msgstr "" +msgstr "pour être fusionnée automatiquement lorsque le pipeline réussit" msgid "new merge request" msgstr "nouvelle demande de fusion" @@ -3893,7 +4315,7 @@ msgid "notification emails" msgstr "courriels de notification" msgid "or" -msgstr "" +msgstr "ou" msgid "parent" msgid_plural "parents" @@ -3907,13 +4329,13 @@ msgid "personal access token" msgstr "jeton d’accès personnel" msgid "remove due date" -msgstr "" +msgstr "supprimer la date d’échéance" msgid "source" msgstr "source" msgid "spendCommand|%{slash_command} will update the sum of the time spent." -msgstr "" +msgstr "%{slash_command} mettra à jour la somme du temps passé." msgid "to help your contributors communicate effectively!" msgstr "pour aider vos contributeurs à communiquer efficacement !" @@ -3922,5 +4344,8 @@ msgid "username" msgstr "nom d’utilisateur" msgid "uses Kubernetes clusters to deploy your code!" -msgstr "" +msgstr "utilise les clusters Kubernetes pour déployer votre code !" + +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "avec %{additions} ajouts, %{deletions} suppressions." diff --git a/locale/gitlab.pot b/locale/gitlab.pot index c9b17f1e826..8a2176a4d72 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-01 18:03+0100\n" -"PO-Revision-Date: 2018-03-01 18:03+0100\n" +"POT-Creation-Date: 2018-03-05 13:02-0600\n" +"PO-Revision-Date: 2018-03-05 13:02-0600\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "Language: \n" @@ -102,6 +102,9 @@ msgstr "" msgid "A collection of graphs regarding Continuous Integration" msgstr "" +msgid "A project is where you house your files (repository), plan your work (issues), and publish your documentation (wiki), %{among_other_things_link}." +msgstr "" + msgid "About auto deploy" msgstr "" @@ -201,6 +204,9 @@ msgstr "" msgid "All" msgstr "" +msgid "All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings." +msgstr "" + msgid "Allows you to add and manage Kubernetes clusters." msgstr "" @@ -698,6 +704,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -746,6 +755,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -1444,6 +1456,9 @@ msgstr "" msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" msgstr "" +msgid "Forking in progress" +msgstr "" + msgid "Format" msgstr "" @@ -1462,6 +1477,9 @@ msgstr "" msgid "Generate a default set of labels" msgstr "" +msgid "Git repository URL" +msgstr "" + msgid "Git revision" msgstr "" @@ -1587,6 +1605,12 @@ msgstr "" msgid "If you already have files you can push them using the %{link_to_cli} below." msgstr "" +msgid "If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>." +msgstr "" + +msgid "Import in progress" +msgstr "" + msgid "Import repository" msgstr "" @@ -1823,6 +1847,9 @@ msgstr "" msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2164,6 +2191,9 @@ msgstr "" msgid "Please solve the reCAPTCHA" msgstr "" +msgid "Please wait while we import the repository for you. Refresh at will." +msgstr "" + msgid "Preferences" msgstr "" @@ -2520,6 +2550,9 @@ msgstr "" msgid "Select target branch" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2833,6 +2866,9 @@ msgstr "" msgid "The fork relationship has been removed." msgstr "" +msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination." +msgstr "" + msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "" @@ -2866,6 +2902,9 @@ msgstr "" msgid "The repository for this project is empty" msgstr "" +msgid "The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>." +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "" @@ -3131,6 +3170,9 @@ msgstr "" msgid "Tip:" msgstr "" +msgid "To import an SVN repository, check out %{svn_link}." +msgstr "" + msgid "Todo" msgstr "" @@ -3437,6 +3479,9 @@ msgstr "" msgid "Your projects" msgstr "" +msgid "among other things" +msgstr "" + msgid "assign yourself" msgstr "" @@ -3632,6 +3677,9 @@ msgstr "" msgid "spendCommand|%{slash_command} will update the sum of the time spent." msgstr "" +msgid "this document" +msgstr "" + msgid "username" msgstr "" diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po new file mode 100644 index 00000000000..183cb996b0a --- /dev/null +++ b/locale/id_ID/gitlab.po @@ -0,0 +1,4325 @@ +msgid "" +msgstr "" +"Project-Id-Version: gitlab-ee\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:23-0500\n" +"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" +"Language-Team: Indonesian\n" +"Language: id_ID\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: gitlab-ee\n" +"X-Crowdin-Language: id\n" +"X-Crowdin-File: /master/locale/gitlab.pot\n" + +msgid " and" +msgstr "" + +msgid "%d commit" +msgid_plural "%d commits" +msgstr[0] "" + +msgid "%d commit behind" +msgid_plural "%d commits behind" +msgstr[0] "" + +msgid "%d issue" +msgid_plural "%d issues" +msgstr[0] "" + +msgid "%d layer" +msgid_plural "%d layers" +msgstr[0] "" + +msgid "%d merge request" +msgid_plural "%d merge requests" +msgstr[0] "" + +msgid "%s additional commit has been omitted to prevent performance issues." +msgid_plural "%s additional commits have been omitted to prevent performance issues." +msgstr[0] "" + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + +msgid "%{commit_author_link} authored %{commit_timeago}" +msgstr "" + +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" + +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgstr "" + +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." +msgstr "" + +msgid "%{openOrClose} %{noteable}" +msgstr "" + +msgid "%{storage_name}: failed storage access attempt on host:" +msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" +msgstr[0] "" + +msgid "%{text} is available" +msgstr "" + +msgid "(checkout the %{link} for information on how to install it)." +msgstr "" + +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + +msgid "1 pipeline" +msgid_plural "%d pipelines" +msgstr[0] "" + +msgid "1st contribution!" +msgstr "" + +msgid "2FA enabled" +msgstr "" + +msgid "A collection of graphs regarding Continuous Integration" +msgstr "" + +msgid "About auto deploy" +msgstr "" + +msgid "Abuse Reports" +msgstr "" + +msgid "Access Tokens" +msgstr "" + +msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." +msgstr "" + +msgid "Account" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Activity" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Add Changelog" +msgstr "" + +msgid "Add Contribution guide" +msgstr "" + +msgid "Add Group Webhooks and GitLab Enterprise Edition." +msgstr "" + +msgid "Add Kubernetes cluster" +msgstr "" + +msgid "Add License" +msgstr "" + +msgid "Add Readme" +msgstr "" + +msgid "Add new directory" +msgstr "" + +msgid "Add todo" +msgstr "" + +msgid "AdminArea|Stop all jobs" +msgstr "" + +msgid "AdminArea|Stop all jobs?" +msgstr "" + +msgid "AdminArea|Stop jobs" +msgstr "" + +msgid "AdminArea|Stopping jobs failed" +msgstr "" + +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." +msgstr "" + +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + +msgid "Advanced" +msgstr "" + +msgid "Advanced settings" +msgstr "" + +msgid "All" +msgstr "" + +msgid "All changes are committed" +msgstr "" + +msgid "Allows you to add and manage Kubernetes clusters." +msgstr "" + +msgid "An error occurred previewing the blob" +msgstr "" + +msgid "An error occurred when toggling the notification subscription" +msgstr "" + +msgid "An error occurred when updating the issue weight" +msgstr "" + +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + +msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." +msgstr "" + +msgid "An error occurred while fetching markdown preview" +msgstr "" + +msgid "An error occurred while fetching sidebar data" +msgstr "" + +msgid "An error occurred while fetching the pipeline." +msgstr "" + +msgid "An error occurred while getting projects" +msgstr "" + +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + +msgid "An error occurred while loading filenames" +msgstr "" + +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + +msgid "An error occurred while rendering KaTeX" +msgstr "" + +msgid "An error occurred while rendering preview broadcast message" +msgstr "" + +msgid "An error occurred while retrieving calendar activity" +msgstr "" + +msgid "An error occurred while retrieving diff" +msgstr "" + +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + +msgid "An error occurred while validating username" +msgstr "" + +msgid "An error occurred. Please try again." +msgstr "" + +msgid "Appearance" +msgstr "" + +msgid "Applications" +msgstr "" + +msgid "Apr" +msgstr "" + +msgid "April" +msgstr "" + +msgid "Archived project! Repository is read-only" +msgstr "" + +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "" + +msgid "Are you sure you want to reset registration token?" +msgstr "" + +msgid "Are you sure you want to reset the health check token?" +msgstr "" + +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + +msgid "Are you sure?" +msgstr "" + +msgid "Artifacts" +msgstr "" + +msgid "Assign custom color like #FF0000" +msgstr "" + +msgid "Assign labels" +msgstr "" + +msgid "Assign milestone" +msgstr "" + +msgid "Assign to" +msgstr "" + +msgid "Assignee" +msgstr "" + +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "" + +msgid "Aug" +msgstr "" + +msgid "August" +msgstr "" + +msgid "Authentication Log" +msgstr "" + +msgid "Author" +msgstr "" + +msgid "Authors: %{authors}" +msgstr "" + +msgid "Auto DevOps enabled" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "AutoDevOps|Auto DevOps (Beta)" +msgstr "" + +msgid "AutoDevOps|Auto DevOps documentation" +msgstr "" + +msgid "AutoDevOps|Enable in settings" +msgstr "" + +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "AutoDevOps|Learn more in the %{link_to_documentation}" +msgstr "" + +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" + +msgid "Available" +msgstr "" + +msgid "Avatar will be removed. Are you sure?" +msgstr "" + +msgid "Average per day: %{average}" +msgstr "" + +msgid "Begin with the selected commit" +msgstr "" + +msgid "Billing" +msgstr "" + +msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." +msgstr "" + +msgid "BillingPlans|Current plan" +msgstr "" + +msgid "BillingPlans|Customer Support" +msgstr "" + +msgid "BillingPlans|Downgrade" +msgstr "" + +msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." +msgstr "" + +msgid "BillingPlans|Manage plan" +msgstr "" + +msgid "BillingPlans|Please contact %{customer_support_link} in that case." +msgstr "" + +msgid "BillingPlans|See all %{plan_name} features" +msgstr "" + +msgid "BillingPlans|This group uses the plan associated with its parent group." +msgstr "" + +msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." +msgstr "" + +msgid "BillingPlans|Upgrade" +msgstr "" + +msgid "BillingPlans|You are currently on the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|frequently asked questions" +msgstr "" + +msgid "BillingPlans|monthly" +msgstr "" + +msgid "BillingPlans|paid annually at %{price_per_year}" +msgstr "" + +msgid "BillingPlans|per user" +msgstr "" + +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" + +msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" +msgstr "" + +msgid "Branch has changed" +msgstr "" + +msgid "Branch is already taken" +msgstr "" + +msgid "Branch name" +msgstr "" + +msgid "BranchSwitcherPlaceholder|Search branches" +msgstr "" + +msgid "BranchSwitcherTitle|Switch branch" +msgstr "" + +msgid "Branches" +msgstr "" + +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + +msgid "Browse Directory" +msgstr "" + +msgid "Browse File" +msgstr "" + +msgid "Browse Files" +msgstr "" + +msgid "Browse files" +msgstr "" + +msgid "ByAuthor|by" +msgstr "" + +msgid "CI / CD" +msgstr "" + +msgid "CI/CD configuration" +msgstr "" + +msgid "CICD|Jobs" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "Cancel edit" +msgstr "" + +msgid "Cannot modify managed Kubernetes cluster" +msgstr "" + +msgid "Change Weight" +msgstr "" + +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "" + +msgid "ChangeTypeAction|Revert" +msgstr "" + +msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes." +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision." +msgstr "" + +msgid "Charts" +msgstr "" + +msgid "Chat" +msgstr "" + +msgid "Check interval" +msgstr "" + +msgid "Checking %{text} availability…" +msgstr "" + +msgid "Checking branch availability..." +msgstr "" + +msgid "Cherry-pick this commit" +msgstr "" + +msgid "Cherry-pick this merge request" +msgstr "" + +msgid "Choose File ..." +msgstr "" + +msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request." +msgstr "" + +msgid "Choose file..." +msgstr "" + +msgid "Choose which groups you wish to synchronize to this secondary node." +msgstr "" + +msgid "Choose which shards you wish to synchronize to this secondary node." +msgstr "" + +msgid "CiStatusLabel|canceled" +msgstr "" + +msgid "CiStatusLabel|created" +msgstr "" + +msgid "CiStatusLabel|failed" +msgstr "" + +msgid "CiStatusLabel|manual action" +msgstr "" + +msgid "CiStatusLabel|passed" +msgstr "" + +msgid "CiStatusLabel|passed with warnings" +msgstr "" + +msgid "CiStatusLabel|pending" +msgstr "" + +msgid "CiStatusLabel|skipped" +msgstr "" + +msgid "CiStatusLabel|waiting for manual action" +msgstr "" + +msgid "CiStatusText|blocked" +msgstr "" + +msgid "CiStatusText|canceled" +msgstr "" + +msgid "CiStatusText|created" +msgstr "" + +msgid "CiStatusText|failed" +msgstr "" + +msgid "CiStatusText|manual" +msgstr "" + +msgid "CiStatusText|passed" +msgstr "" + +msgid "CiStatusText|pending" +msgstr "" + +msgid "CiStatusText|skipped" +msgstr "" + +msgid "CiStatus|running" +msgstr "" + +msgid "CiVariables|Input variable key" +msgstr "" + +msgid "CiVariables|Input variable value" +msgstr "" + +msgid "CiVariables|Remove variable row" +msgstr "" + +msgid "CiVariable|* (All environments)" +msgstr "" + +msgid "CiVariable|All environments" +msgstr "" + +msgid "CiVariable|Create wildcard" +msgstr "" + +msgid "CiVariable|Error occured while saving variables" +msgstr "" + +msgid "CiVariable|New environment" +msgstr "" + +msgid "CiVariable|Protected" +msgstr "" + +msgid "CiVariable|Search environments" +msgstr "" + +msgid "CiVariable|Toggle protected" +msgstr "" + +msgid "CiVariable|Validation failed" +msgstr "" + +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + +msgid "Click to expand text" +msgstr "" + +msgid "Clone repository" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Closed" +msgstr "" + +msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|API URL" +msgstr "" + +msgid "ClusterIntegration|Add Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Add an existing Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration" +msgstr "" + +msgid "ClusterIntegration|Applications" +msgstr "" + +msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|CA Certificate" +msgstr "" + +msgid "ClusterIntegration|Certificate Authority bundle (PEM format)" +msgstr "" + +msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|Control how your Kubernetes cluster integrates with GitLab" +msgstr "" + +msgid "ClusterIntegration|Copy API URL" +msgstr "" + +msgid "ClusterIntegration|Copy CA Certificate" +msgstr "" + +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + +msgid "ClusterIntegration|Copy Kubernetes cluster name" +msgstr "" + +msgid "ClusterIntegration|Copy Token" +msgstr "" + +msgid "ClusterIntegration|Create Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab" +msgstr "" + +msgid "ClusterIntegration|Create on GKE" +msgstr "" + +msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Enter the details for your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Environment scope" +msgstr "" + +msgid "ClusterIntegration|GitLab Integration" +msgstr "" + +msgid "ClusterIntegration|GitLab Runner" +msgstr "" + +msgid "ClusterIntegration|Google Cloud Platform project ID" +msgstr "" + +msgid "ClusterIntegration|Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Google Kubernetes Engine project" +msgstr "" + +msgid "ClusterIntegration|Helm Tiller" +msgstr "" + +msgid "ClusterIntegration|Ingress" +msgstr "" + +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + +msgid "ClusterIntegration|Install" +msgstr "" + +msgid "ClusterIntegration|Installed" +msgstr "" + +msgid "ClusterIntegration|Installing" +msgstr "" + +msgid "ClusterIntegration|Integrate Kubernetes cluster automation" +msgstr "" + +msgid "ClusterIntegration|Integration status" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster details" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster name" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details" +msgstr "" + +msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}" +msgstr "" + +msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project" +msgstr "" + +msgid "ClusterIntegration|Learn more about %{link_to_documentation}" +msgstr "" + +msgid "ClusterIntegration|Learn more about environments" +msgstr "" + +msgid "ClusterIntegration|Machine type" +msgstr "" + +msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters" +msgstr "" + +msgid "ClusterIntegration|Manage" +msgstr "" + +msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}" +msgstr "" + +msgid "ClusterIntegration|More information" +msgstr "" + +msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate" +msgstr "" + +msgid "ClusterIntegration|Note:" +msgstr "" + +msgid "ClusterIntegration|Number of nodes" +msgstr "" + +msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes" +msgstr "" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + +msgid "ClusterIntegration|Project ID" +msgstr "" + +msgid "ClusterIntegration|Project namespace" +msgstr "" + +msgid "ClusterIntegration|Project namespace (optional, unique)" +msgstr "" + +msgid "ClusterIntegration|Prometheus" +msgstr "" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration." +msgstr "" + +msgid "ClusterIntegration|Remove Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Remove integration" +msgstr "" + +msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|Request to begin installing failed" +msgstr "" + +msgid "ClusterIntegration|Save changes" +msgstr "" + +msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" +msgstr "" + +msgid "ClusterIntegration|See your projects" +msgstr "" + +msgid "ClusterIntegration|See zones" +msgstr "" + +msgid "ClusterIntegration|Service token" +msgstr "" + +msgid "ClusterIntegration|Show" +msgstr "" + +msgid "ClusterIntegration|Something went wrong on our end." +msgstr "" + +msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Something went wrong while installing %{title}" +msgstr "" + +msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below" +msgstr "" + +msgid "ClusterIntegration|Toggle Kubernetes Cluster" +msgstr "" + +msgid "ClusterIntegration|Toggle Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Token" +msgstr "" + +msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." +msgstr "" + +msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" +msgstr "" + +msgid "ClusterIntegration|Zone" +msgstr "" + +msgid "ClusterIntegration|access to Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|check the pricing here" +msgstr "" + +msgid "ClusterIntegration|documentation" +msgstr "" + +msgid "ClusterIntegration|help page" +msgstr "" + +msgid "ClusterIntegration|installing applications" +msgstr "" + +msgid "ClusterIntegration|meets the requirements" +msgstr "" + +msgid "ClusterIntegration|properly configured" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + +msgid "Comments" +msgstr "" + +msgid "Commit" +msgid_plural "Commits" +msgstr[0] "" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" + +msgid "Commit Message" +msgstr "" + +msgid "Commit duration in minutes for last 30 commits" +msgstr "" + +msgid "Commit message" +msgstr "" + +msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" +msgstr "" + +msgid "Commit to %{branchName} branch" +msgstr "" + +msgid "CommitBoxTitle|Commit" +msgstr "" + +msgid "CommitMessage|Add %{file_name}" +msgstr "" + +msgid "Commits" +msgstr "" + +msgid "Commits feed" +msgstr "" + +msgid "Commits per day hour (UTC)" +msgstr "" + +msgid "Commits per day of month" +msgstr "" + +msgid "Commits per weekday" +msgstr "" + +msgid "Commits|An error occurred while fetching merge requests data." +msgstr "" + +msgid "Commits|Commit: %{commitText}" +msgstr "" + +msgid "Commits|History" +msgstr "" + +msgid "Commits|No related merge requests found" +msgstr "" + +msgid "Committed by" +msgstr "" + +msgid "Compare" +msgstr "" + +msgid "Compare Git revisions" +msgstr "" + +msgid "Compare Revisions" +msgstr "" + +msgid "CompareBranches|%{source_branch} and %{target_branch} are the same." +msgstr "" + +msgid "CompareBranches|Compare" +msgstr "" + +msgid "CompareBranches|Source" +msgstr "" + +msgid "CompareBranches|Target" +msgstr "" + +msgid "CompareBranches|There isn't anything to compare." +msgstr "" + +msgid "Confidentiality" +msgstr "" + +msgid "Container Registry" +msgstr "" + +msgid "ContainerRegistry|Created" +msgstr "" + +msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" +msgstr "" + +msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" +msgstr "" + +msgid "ContainerRegistry|How to use the Container Registry" +msgstr "" + +msgid "ContainerRegistry|Learn more about" +msgstr "" + +msgid "ContainerRegistry|No tags in Container Registry for this container image." +msgstr "" + +msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" +msgstr "" + +msgid "ContainerRegistry|Remove repository" +msgstr "" + +msgid "ContainerRegistry|Remove tag" +msgstr "" + +msgid "ContainerRegistry|Size" +msgstr "" + +msgid "ContainerRegistry|Tag" +msgstr "" + +msgid "ContainerRegistry|Tag ID" +msgstr "" + +msgid "ContainerRegistry|Use different image names" +msgstr "" + +msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." +msgstr "" + +msgid "Contribution guide" +msgstr "" + +msgid "Contributors" +msgstr "" + +msgid "ContributorsPage|%{startDate} – %{endDate}" +msgstr "" + +msgid "ContributorsPage|Building repository graph." +msgstr "" + +msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limited to 6,000 commits." +msgstr "" + +msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready." +msgstr "" + +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + +msgid "Copy SSH public key to clipboard" +msgstr "" + +msgid "Copy URL to clipboard" +msgstr "" + +msgid "Copy branch name to clipboard" +msgstr "" + +msgid "Copy command to clipboard" +msgstr "" + +msgid "Copy commit SHA to clipboard" +msgstr "" + +msgid "Copy reference to clipboard" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Create New Directory" +msgstr "" + +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + +msgid "Create a personal access token on your account to pull or push via %{protocol}." +msgstr "" + +msgid "Create branch" +msgstr "" + +msgid "Create directory" +msgstr "" + +msgid "Create empty bare repository" +msgstr "" + +msgid "Create epic" +msgstr "" + +msgid "Create file" +msgstr "" + +msgid "Create lists from labels. Issues with that label appear in that list." +msgstr "" + +msgid "Create merge request" +msgstr "" + +msgid "Create merge request and branch" +msgstr "" + +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + +msgid "Create new label" +msgstr "" + +msgid "Create new..." +msgstr "" + +msgid "CreateNewFork|Fork" +msgstr "" + +msgid "CreateTag|Tag" +msgstr "" + +msgid "CreateTokenToCloneLink|create a personal access token" +msgstr "" + +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + +msgid "Creating epic" +msgstr "" + +msgid "Cron Timezone" +msgstr "" + +msgid "Cron syntax" +msgstr "" + +msgid "Current node" +msgstr "" + +msgid "Custom notification events" +msgstr "" + +msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}." +msgstr "" + +msgid "Cycle Analytics" +msgstr "" + +msgid "CycleAnalyticsStage|Code" +msgstr "" + +msgid "CycleAnalyticsStage|Issue" +msgstr "" + +msgid "CycleAnalyticsStage|Plan" +msgstr "" + +msgid "CycleAnalyticsStage|Production" +msgstr "" + +msgid "CycleAnalyticsStage|Review" +msgstr "" + +msgid "CycleAnalyticsStage|Staging" +msgstr "" + +msgid "CycleAnalyticsStage|Test" +msgstr "" + +msgid "DashboardProjects|All" +msgstr "" + +msgid "DashboardProjects|Personal" +msgstr "" + +msgid "Dec" +msgstr "" + +msgid "December" +msgstr "" + +msgid "Default classification label" +msgstr "" + +msgid "Define a custom pattern with cron syntax" +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "Deploy" +msgid_plural "Deploys" +msgstr[0] "" + +msgid "Deploy Keys" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." +msgstr "" + +msgid "Details" +msgstr "" + +msgid "Diffs|No file name available" +msgstr "" + +msgid "Directory name" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Discard draft" +msgstr "" + +msgid "Discover GitLab Geo." +msgstr "" + +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + +msgid "Dismiss Merge Request promotion" +msgstr "" + +msgid "Don't show again" +msgstr "" + +msgid "Download" +msgstr "" + +msgid "Download tar" +msgstr "" + +msgid "Download tar.bz2" +msgstr "" + +msgid "Download tar.gz" +msgstr "" + +msgid "Download zip" +msgstr "" + +msgid "DownloadArtifacts|Download" +msgstr "" + +msgid "DownloadCommit|Email Patches" +msgstr "" + +msgid "DownloadCommit|Plain Diff" +msgstr "" + +msgid "DownloadSource|Download" +msgstr "" + +msgid "Due date" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Edit Pipeline Schedule %{id}" +msgstr "" + +msgid "Edit files in the editor and commit changes here" +msgstr "" + +msgid "Emails" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "Enable Auto DevOps" +msgstr "" + +msgid "Environments|An error occurred while fetching the environments." +msgstr "" + +msgid "Environments|An error occurred while making the request." +msgstr "" + +msgid "Environments|Commit" +msgstr "" + +msgid "Environments|Deployment" +msgstr "" + +msgid "Environments|Environment" +msgstr "" + +msgid "Environments|Environments" +msgstr "" + +msgid "Environments|Job" +msgstr "" + +msgid "Environments|New environment" +msgstr "" + +msgid "Environments|No deployments yet" +msgstr "" + +msgid "Environments|Open" +msgstr "" + +msgid "Environments|Re-deploy" +msgstr "" + +msgid "Environments|Read more about environments" +msgstr "" + +msgid "Environments|Rollback" +msgstr "" + +msgid "Environments|Show all" +msgstr "" + +msgid "Environments|Updated" +msgstr "" + +msgid "Environments|You don't have any environments right now." +msgstr "" + +msgid "Epic will be removed! Are you sure?" +msgstr "" + +msgid "Epics" +msgstr "" + +msgid "Epics Roadmap" +msgstr "" + +msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + +msgid "Error creating epic" +msgstr "" + +msgid "Error fetching contributors data." +msgstr "" + +msgid "Error fetching labels." +msgstr "" + +msgid "Error fetching network graph." +msgstr "" + +msgid "Error fetching refs" +msgstr "" + +msgid "Error fetching usage ping data." +msgstr "" + +msgid "Error occurred when toggling the notification subscription" +msgstr "" + +msgid "Error saving label update." +msgstr "" + +msgid "Error updating status for all todos." +msgstr "" + +msgid "Error updating todo status." +msgstr "" + +msgid "EventFilterBy|Filter by all" +msgstr "" + +msgid "EventFilterBy|Filter by comments" +msgstr "" + +msgid "EventFilterBy|Filter by issue events" +msgstr "" + +msgid "EventFilterBy|Filter by merge events" +msgstr "" + +msgid "EventFilterBy|Filter by push events" +msgstr "" + +msgid "EventFilterBy|Filter by team" +msgstr "" + +msgid "Every day (at 4:00am)" +msgstr "" + +msgid "Every month (on the 1st at 4:00am)" +msgstr "" + +msgid "Every week (Sundays at 4:00am)" +msgstr "" + +msgid "Expand" +msgstr "" + +msgid "Explore projects" +msgstr "" + +msgid "Explore public groups" +msgstr "" + +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + +msgid "Failed to change the owner" +msgstr "" + +msgid "Failed to remove issue from board, please try again." +msgstr "" + +msgid "Failed to remove the pipeline schedule" +msgstr "" + +msgid "Failed to update issues, please try again." +msgstr "" + +msgid "Feb" +msgstr "" + +msgid "February" +msgstr "" + +msgid "Fields on this page are now uneditable, you can configure" +msgstr "" + +msgid "File name" +msgstr "" + +msgid "Files" +msgstr "" + +msgid "Files (%{human_size})" +msgstr "" + +msgid "Filter by commit message" +msgstr "" + +msgid "Find by path" +msgstr "" + +msgid "Find file" +msgstr "" + +msgid "FirstPushedBy|First" +msgstr "" + +msgid "FirstPushedBy|pushed by" +msgstr "" + +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "" + +msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" +msgstr "" + +msgid "Format" +msgstr "" + +msgid "From issue creation until deploy to production" +msgstr "" + +msgid "From merge request merge until deploy to production" +msgstr "" + +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + +msgid "GPG Keys" +msgstr "" + +msgid "Generate a default set of labels" +msgstr "" + +msgid "Geo Nodes" +msgstr "" + +msgid "GeoNodeSyncStatus|Node is failing or broken." +msgstr "" + +msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage." +msgstr "" + +msgid "GeoNodes|Database replication lag:" +msgstr "" + +msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?" +msgstr "" + +msgid "GeoNodes|Does not match the primary storage configuration" +msgstr "" + +msgid "GeoNodes|Failed" +msgstr "" + +msgid "GeoNodes|Full" +msgstr "" + +msgid "GeoNodes|GitLab version does not match the primary node version" +msgstr "" + +msgid "GeoNodes|GitLab version:" +msgstr "" + +msgid "GeoNodes|Health status:" +msgstr "" + +msgid "GeoNodes|Last event ID processed by cursor:" +msgstr "" + +msgid "GeoNodes|Last event ID seen from primary:" +msgstr "" + +msgid "GeoNodes|Loading nodes" +msgstr "" + +msgid "GeoNodes|Local Attachments:" +msgstr "" + +msgid "GeoNodes|Local LFS objects:" +msgstr "" + +msgid "GeoNodes|Local job artifacts:" +msgstr "" + +msgid "GeoNodes|New node" +msgstr "" + +msgid "GeoNodes|Out of sync" +msgstr "" + +msgid "GeoNodes|Replication slot WAL:" +msgstr "" + +msgid "GeoNodes|Replication slots:" +msgstr "" + +msgid "GeoNodes|Repositories:" +msgstr "" + +msgid "GeoNodes|Selective" +msgstr "" + +msgid "GeoNodes|Storage config:" +msgstr "" + +msgid "GeoNodes|Sync settings:" +msgstr "" + +msgid "GeoNodes|Synced" +msgstr "" + +msgid "GeoNodes|Unused slots" +msgstr "" + +msgid "GeoNodes|Used slots" +msgstr "" + +msgid "GeoNodes|Wikis:" +msgstr "" + +msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS." +msgstr "" + +msgid "Geo|All projects" +msgstr "" + +msgid "Geo|File sync capacity" +msgstr "" + +msgid "Geo|Groups to synchronize" +msgstr "" + +msgid "Geo|Projects in certain groups" +msgstr "" + +msgid "Geo|Projects in certain storage shards" +msgstr "" + +msgid "Geo|Repository sync capacity" +msgstr "" + +msgid "Geo|Select groups to replicate." +msgstr "" + +msgid "Geo|Shards to synchronize" +msgstr "" + +msgid "Git revision" +msgstr "" + +msgid "Git storage health information has been reset" +msgstr "" + +msgid "Git version" +msgstr "" + +msgid "GitLab Runner section" +msgstr "" + +msgid "Gitaly Servers" +msgstr "" + +msgid "Go to your fork" +msgstr "" + +msgid "GoToYourFork|Fork" +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 "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" +msgstr "" + +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + +msgid "Have your users email" +msgstr "" + +msgid "Health Check" +msgstr "" + +msgid "Health information can be retrieved from the following endpoints. More information is available" +msgstr "" + +msgid "HealthCheck|Access token is" +msgstr "" + +msgid "HealthCheck|Healthy" +msgstr "" + +msgid "HealthCheck|No Health Problems Detected" +msgstr "" + +msgid "HealthCheck|Unhealthy" +msgstr "" + +msgid "Hide value" +msgid_plural "Hide values" +msgstr[0] "" + +msgid "History" +msgstr "" + +msgid "Housekeeping successfully started" +msgstr "" + +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + +msgid "Import repository" +msgstr "" + +msgid "Improve Issue boards with GitLab Enterprise Edition." +msgstr "" + +msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." +msgstr "" + +msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." +msgstr "" + +msgid "Install Runner on Kubernetes" +msgstr "" + +msgid "Install a Runner compatible with GitLab CI" +msgstr "" + +msgid "Instance" +msgid_plural "Instances" +msgstr[0] "" + +msgid "Instance does not support multiple Kubernetes clusters" +msgstr "" + +msgid "Interested parties can even contribute by pushing commits if they want to." +msgstr "" + +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + +msgid "Interval Pattern" +msgstr "" + +msgid "Introducing Cycle Analytics" +msgstr "" + +msgid "Issue board focus mode" +msgstr "" + +msgid "Issue events" +msgstr "" + +msgid "IssueBoards|Board" +msgstr "" + +msgid "IssueBoards|Boards" +msgstr "" + +msgid "Issues" +msgstr "" + +msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable." +msgstr "" + +msgid "Jan" +msgstr "" + +msgid "January" +msgstr "" + +msgid "Jobs" +msgstr "" + +msgid "Jul" +msgstr "" + +msgid "July" +msgstr "" + +msgid "Jun" +msgstr "" + +msgid "June" +msgstr "" + +msgid "Kubernetes" +msgstr "" + +msgid "Kubernetes Cluster" +msgstr "" + +msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}" +msgstr "" + +msgid "Kubernetes cluster integration was not removed." +msgstr "" + +msgid "Kubernetes cluster integration was successfully removed." +msgstr "" + +msgid "Kubernetes cluster was successfully updated." +msgstr "" + +msgid "Kubernetes configured" +msgstr "" + +msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" +msgstr "" + +msgid "LFSStatus|Disabled" +msgstr "" + +msgid "LFSStatus|Enabled" +msgstr "" + +msgid "Labels" +msgstr "" + +msgid "Labels can be applied to issues and merge requests to categorize them." +msgstr "" + +msgid "Last %d day" +msgid_plural "Last %d days" +msgstr[0] "" + +msgid "Last Pipeline" +msgstr "" + +msgid "Last commit" +msgstr "" + +msgid "Last edited %{date}" +msgstr "" + +msgid "Last edited by %{name}" +msgstr "" + +msgid "Last update" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "LastPushEvent|You pushed to" +msgstr "" + +msgid "LastPushEvent|at" +msgstr "" + +msgid "Learn more" +msgstr "" + +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + +msgid "Learn more in the" +msgstr "" + +msgid "Learn more in the|pipeline schedules documentation" +msgstr "" + +msgid "Leave" +msgstr "" + +msgid "Leave group" +msgstr "" + +msgid "Leave project" +msgstr "" + +msgid "License" +msgstr "" + +msgid "List" +msgstr "" + +msgid "Loading the GitLab IDE..." +msgstr "" + +msgid "Lock" +msgstr "" + +msgid "Lock %{issuableDisplayName}" +msgstr "" + +msgid "Lock not found" +msgstr "" + +msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." +msgstr "" + +msgid "Locked" +msgstr "" + +msgid "Locked Files" +msgstr "" + +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + +msgid "Login" +msgstr "" + +msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos." +msgstr "" + +msgid "Manage labels" +msgstr "" + +msgid "Mar" +msgstr "" + +msgid "March" +msgstr "" + +msgid "Mark done" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + +msgid "May" +msgstr "" + +msgid "Median" +msgstr "" + +msgid "Members" +msgstr "" + +msgid "Merge Requests" +msgstr "" + +msgid "Merge events" +msgstr "" + +msgid "Merge request" +msgstr "" + +msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" +msgstr "" + +msgid "MergeRequest|Approved" +msgstr "" + +msgid "Merged" +msgstr "" + +msgid "Messages" +msgstr "" + +msgid "Milestone" +msgstr "" + +msgid "Milestones|Delete milestone" +msgstr "" + +msgid "Milestones|Delete milestone %{milestoneTitle}?" +msgstr "" + +msgid "Milestones|Failed to delete milestone %{milestoneTitle}" +msgstr "" + +msgid "Milestones|Milestone %{milestoneTitle} was not found" +msgstr "" + +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "" + +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + +msgid "Monitoring" +msgstr "" + +msgid "More information" +msgstr "" + +msgid "More information is available|here" +msgstr "" + +msgid "Move" +msgstr "" + +msgid "Move issue" +msgstr "" + +msgid "Multiple issue boards" +msgstr "" + +msgid "Name new label" +msgstr "" + +msgid "New Issue" +msgid_plural "New Issues" +msgstr[0] "" + +msgid "New Kubernetes Cluster" +msgstr "" + +msgid "New Kubernetes cluster" +msgstr "" + +msgid "New Pipeline Schedule" +msgstr "" + +msgid "New branch" +msgstr "" + +msgid "New branch unavailable" +msgstr "" + +msgid "New directory" +msgstr "" + +msgid "New epic" +msgstr "" + +msgid "New file" +msgstr "" + +msgid "New group" +msgstr "" + +msgid "New issue" +msgstr "" + +msgid "New label" +msgstr "" + +msgid "New merge request" +msgstr "" + +msgid "New project" +msgstr "" + +msgid "New schedule" +msgstr "" + +msgid "New snippet" +msgstr "" + +msgid "New subgroup" +msgstr "" + +msgid "New tag" +msgstr "" + +msgid "No assignee" +msgstr "" + +msgid "No changes" +msgstr "" + +msgid "No connection could be made to a Gitaly Server, please check your logs!" +msgstr "" + +msgid "No due date" +msgstr "" + +msgid "No estimate or time spent" +msgstr "" + +msgid "No file chosen" +msgstr "" + +msgid "No repository" +msgstr "" + +msgid "No schedules" +msgstr "" + +msgid "None" +msgstr "" + +msgid "Not allowed to merge" +msgstr "" + +msgid "Not available" +msgstr "" + +msgid "Not confidential" +msgstr "" + +msgid "Not enough data" +msgstr "" + +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + +msgid "Notification events" +msgstr "" + +msgid "NotificationEvent|Close issue" +msgstr "" + +msgid "NotificationEvent|Close merge request" +msgstr "" + +msgid "NotificationEvent|Failed pipeline" +msgstr "" + +msgid "NotificationEvent|Merge merge request" +msgstr "" + +msgid "NotificationEvent|New issue" +msgstr "" + +msgid "NotificationEvent|New merge request" +msgstr "" + +msgid "NotificationEvent|New note" +msgstr "" + +msgid "NotificationEvent|Reassign issue" +msgstr "" + +msgid "NotificationEvent|Reassign merge request" +msgstr "" + +msgid "NotificationEvent|Reopen issue" +msgstr "" + +msgid "NotificationEvent|Successful pipeline" +msgstr "" + +msgid "NotificationLevel|Custom" +msgstr "" + +msgid "NotificationLevel|Disabled" +msgstr "" + +msgid "NotificationLevel|Global" +msgstr "" + +msgid "NotificationLevel|On mention" +msgstr "" + +msgid "NotificationLevel|Participate" +msgstr "" + +msgid "NotificationLevel|Watch" +msgstr "" + +msgid "Notifications" +msgstr "" + +msgid "Notifications off" +msgstr "" + +msgid "Notifications on" +msgstr "" + +msgid "Nov" +msgstr "" + +msgid "November" +msgstr "" + +msgid "Number of access attempts" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "Oct" +msgstr "" + +msgid "October" +msgstr "" + +msgid "OfSearchInADropdown|Filter" +msgstr "" + +msgid "Only project members can comment." +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Opened" +msgstr "" + +msgid "OpenedNDaysAgo|Opened" +msgstr "" + +msgid "Opens in a new window" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "Owner" +msgstr "" + +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Pipeline" +msgstr "" + +msgid "Pipeline Health" +msgstr "" + +msgid "Pipeline Schedule" +msgstr "" + +msgid "Pipeline Schedules" +msgstr "" + +msgid "Pipeline quota" +msgstr "" + +msgid "PipelineCharts|Failed:" +msgstr "" + +msgid "PipelineCharts|Overall statistics" +msgstr "" + +msgid "PipelineCharts|Success ratio:" +msgstr "" + +msgid "PipelineCharts|Successful:" +msgstr "" + +msgid "PipelineCharts|Total:" +msgstr "" + +msgid "PipelineSchedules|Activated" +msgstr "" + +msgid "PipelineSchedules|Active" +msgstr "" + +msgid "PipelineSchedules|All" +msgstr "" + +msgid "PipelineSchedules|Inactive" +msgstr "" + +msgid "PipelineSchedules|Next Run" +msgstr "" + +msgid "PipelineSchedules|None" +msgstr "" + +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "" + +msgid "PipelineSchedules|Take ownership" +msgstr "" + +msgid "PipelineSchedules|Target" +msgstr "" + +msgid "PipelineSchedules|Variables" +msgstr "" + +msgid "PipelineSheduleIntervalPattern|Custom" +msgstr "" + +msgid "Pipelines" +msgstr "" + +msgid "Pipelines charts" +msgstr "" + +msgid "Pipelines for last month" +msgstr "" + +msgid "Pipelines for last week" +msgstr "" + +msgid "Pipelines for last year" +msgstr "" + +msgid "Pipelines|Build with confidence" +msgstr "" + +msgid "Pipelines|Get started with Pipelines" +msgstr "" + +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|all" +msgstr "" + +msgid "Pipeline|success" +msgstr "" + +msgid "Pipeline|with stage" +msgstr "" + +msgid "Pipeline|with stages" +msgstr "" + +msgid "Play" +msgstr "" + +msgid "Please <a href=%{link_to_billing} target=\"_blank\" rel=\"noopener noreferrer\">enable billing for one of your projects to be able to create a Kubernetes cluster</a>, then try again." +msgstr "" + +msgid "Please solve the reCAPTCHA" +msgstr "" + +msgid "Preferences" +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + +msgid "Profile" +msgstr "" + +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Programming languages used in this repository" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + +msgid "Project '%{project_name}' queued for deletion." +msgstr "" + +msgid "Project '%{project_name}' was successfully created." +msgstr "" + +msgid "Project '%{project_name}' was successfully updated." +msgstr "" + +msgid "Project access must be granted explicitly to each user." +msgstr "" + +msgid "Project avatar" +msgstr "" + +msgid "Project avatar in repository: %{link}" +msgstr "" + +msgid "Project cache successfully reset." +msgstr "" + +msgid "Project details" +msgstr "" + +msgid "Project export could not be deleted." +msgstr "" + +msgid "Project export has been deleted." +msgstr "" + +msgid "Project export link has expired. Please generate a new export from your project settings." +msgstr "" + +msgid "Project export started. A download link will be sent by email." +msgstr "" + +msgid "ProjectActivityRSS|Subscribe" +msgstr "" + +msgid "ProjectCreationLevel|Allowed to create projects" +msgstr "" + +msgid "ProjectCreationLevel|Default project creation protection" +msgstr "" + +msgid "ProjectCreationLevel|Developers + Masters" +msgstr "" + +msgid "ProjectCreationLevel|Masters" +msgstr "" + +msgid "ProjectCreationLevel|No one" +msgstr "" + +msgid "ProjectFeature|Disabled" +msgstr "" + +msgid "ProjectFeature|Everyone with access" +msgstr "" + +msgid "ProjectFeature|Only team members" +msgstr "" + +msgid "ProjectFileTree|Name" +msgstr "" + +msgid "ProjectLastActivity|Never" +msgstr "" + +msgid "ProjectLifecycle|Stage" +msgstr "" + +msgid "ProjectNetworkGraph|Graph" +msgstr "" + +msgid "ProjectSettings|Contact an admin to change this setting." +msgstr "" + +msgid "ProjectSettings|Only signed commits can be pushed to this repository." +msgstr "" + +msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." +msgstr "" + +msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." +msgstr "" + +msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." +msgstr "" + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + +msgid "ProjectsDropdown|Frequently visited" +msgstr "" + +msgid "ProjectsDropdown|Loading projects" +msgstr "" + +msgid "ProjectsDropdown|Projects you visit often will appear here" +msgstr "" + +msgid "ProjectsDropdown|Search your projects" +msgstr "" + +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "" + +msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "" + +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + +msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." +msgstr "" + +msgid "PrometheusService|Finding and configuring metrics..." +msgstr "" + +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + +msgid "PrometheusService|Metrics" +msgstr "" + +msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters." +msgstr "" + +msgid "PrometheusService|Missing environment variable" +msgstr "" + +msgid "PrometheusService|Monitored" +msgstr "" + +msgid "PrometheusService|More information" +msgstr "" + +msgid "PrometheusService|No metrics are being monitored. To start monitoring, deploy to an environment." +msgstr "" + +msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" +msgstr "" + +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + +msgid "PrometheusService|Time-series monitoring service" +msgstr "" + +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + +msgid "PrometheusService|View environments" +msgstr "" + +msgid "Protip:" +msgstr "" + +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + +msgid "Push Rules" +msgstr "" + +msgid "Push events" +msgstr "" + +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + +msgid "PushRule|Committer restriction" +msgstr "" + +msgid "Quick actions can be used in the issues description and comment boxes." +msgstr "" + +msgid "Read more" +msgstr "" + +msgid "Readme" +msgstr "" + +msgid "RefSwitcher|Branches" +msgstr "" + +msgid "RefSwitcher|Tags" +msgstr "" + +msgid "Reference:" +msgstr "" + +msgid "Register / Sign In" +msgstr "" + +msgid "Registry" +msgstr "" + +msgid "Related Commits" +msgstr "" + +msgid "Related Deployed Jobs" +msgstr "" + +msgid "Related Issues" +msgstr "" + +msgid "Related Jobs" +msgstr "" + +msgid "Related Merge Requests" +msgstr "" + +msgid "Related Merged Requests" +msgstr "" + +msgid "Remind later" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Remove avatar" +msgstr "" + +msgid "Remove project" +msgstr "" + +msgid "Repair authentication" +msgstr "" + +msgid "Repository" +msgstr "" + +msgid "Repository has no locks." +msgstr "" + +msgid "Request Access" +msgstr "" + +msgid "Reset git storage health information" +msgstr "" + +msgid "Reset health check access token" +msgstr "" + +msgid "Reset runners registration token" +msgstr "" + +msgid "Resolve discussion" +msgstr "" + +msgid "Reveal value" +msgid_plural "Reveal values" +msgstr[0] "" + +msgid "Revert this commit" +msgstr "" + +msgid "Revert this merge request" +msgstr "" + +msgid "Roadmap" +msgstr "" + +msgid "SSH Keys" +msgstr "" + +msgid "Save changes" +msgstr "" + +msgid "Save pipeline schedule" +msgstr "" + +msgid "Save variables" +msgstr "" + +msgid "Schedule a new pipeline" +msgstr "" + +msgid "Schedules" +msgstr "" + +msgid "Scheduling Pipelines" +msgstr "" + +msgid "Scoped issue boards" +msgstr "" + +msgid "Search branches and tags" +msgstr "" + +msgid "Search milestones" +msgstr "" + +msgid "Search project" +msgstr "" + +msgid "Search users" +msgstr "" + +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + +msgid "Secret variables" +msgstr "" + +msgid "Security report" +msgstr "" + +msgid "Select Archive Format" +msgstr "" + +msgid "Select a timezone" +msgstr "" + +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + +msgid "Select assignee" +msgstr "" + +msgid "Select branch/tag" +msgstr "" + +msgid "Select target branch" +msgstr "" + +msgid "Selective synchronization" +msgstr "" + +msgid "Send email" +msgstr "" + +msgid "Sep" +msgstr "" + +msgid "September" +msgstr "" + +msgid "Server version" +msgstr "" + +msgid "Service Templates" +msgstr "" + +msgid "Service URL" +msgstr "" + +msgid "Set a password on your account to pull or push via %{protocol}." +msgstr "" + +msgid "Set up CI/CD" +msgstr "" + +msgid "Set up Koding" +msgstr "" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Setup a specific Runner automatically" +msgstr "" + +msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." +msgstr "" + +msgid "SharedRunnersMinutesSettings|Reset pipeline minutes" +msgstr "" + +msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" +msgstr "" + +msgid "Show command" +msgstr "" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + +msgid "Showing %d event" +msgid_plural "Showing %d events" +msgstr[0] "" + +msgid "Sidebar|Change weight" +msgstr "" + +msgid "Sidebar|No" +msgstr "" + +msgid "Sidebar|None" +msgstr "" + +msgid "Sidebar|Weight" +msgstr "" + +msgid "Snippets" +msgstr "" + +msgid "Something went wrong on our end" +msgstr "" + +msgid "Something went wrong on our end." +msgstr "" + +msgid "Something went wrong trying to change the confidentiality of this issue" +msgstr "" + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName}" +msgstr "" + +msgid "Something went wrong when toggling the button" +msgstr "" + +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + +msgid "Something went wrong while fetching the projects." +msgstr "" + +msgid "Something went wrong while fetching the registry list." +msgstr "" + +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + +msgid "Something went wrong. Please try again." +msgstr "" + +msgid "Sort by" +msgstr "" + +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Source (branch or tag)" +msgstr "" + +msgid "Source code" +msgstr "" + +msgid "Source is not available" +msgstr "" + +msgid "Spam Logs" +msgstr "" + +msgid "Specify the following URL during the Runner setup:" +msgstr "" + +msgid "StarProject|Star" +msgstr "" + +msgid "Starred projects" +msgstr "" + +msgid "Start a %{new_merge_request} with these changes" +msgstr "" + +msgid "Start the Runner!" +msgstr "" + +msgid "Stopped" +msgstr "" + +msgid "Storage" +msgstr "" + +msgid "Subgroups" +msgstr "" + +msgid "Switch branch/tag" +msgstr "" + +msgid "System Hooks" +msgstr "" + +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" + +msgid "Tags" +msgstr "" + +msgid "TagsPage|Browse commits" +msgstr "" + +msgid "TagsPage|Browse files" +msgstr "" + +msgid "TagsPage|Can't find HEAD commit for this tag" +msgstr "" + +msgid "TagsPage|Cancel" +msgstr "" + +msgid "TagsPage|Create tag" +msgstr "" + +msgid "TagsPage|Delete tag" +msgstr "" + +msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?" +msgstr "" + +msgid "TagsPage|Edit release notes" +msgstr "" + +msgid "TagsPage|Existing branch name, tag, or commit SHA" +msgstr "" + +msgid "TagsPage|Filter by tag name" +msgstr "" + +msgid "TagsPage|New Tag" +msgstr "" + +msgid "TagsPage|New tag" +msgstr "" + +msgid "TagsPage|Optionally, add a message to the tag." +msgstr "" + +msgid "TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page." +msgstr "" + +msgid "TagsPage|Release notes" +msgstr "" + +msgid "TagsPage|Repository has no tags yet." +msgstr "" + +msgid "TagsPage|Sort by" +msgstr "" + +msgid "TagsPage|Tags" +msgstr "" + +msgid "TagsPage|Tags give the ability to mark specific points in history as being important" +msgstr "" + +msgid "TagsPage|This tag has no release notes." +msgstr "" + +msgid "TagsPage|Use git tag command to add a new one:" +msgstr "" + +msgid "TagsPage|Write your release notes or drag files here..." +msgstr "" + +msgid "TagsPage|protected" +msgstr "" + +msgid "Target Branch" +msgstr "" + +msgid "Team" +msgstr "" + +msgid "Thanks! Don't show me this again" +msgstr "" + +msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." +msgstr "" + +msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project" +msgstr "" + +msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project." +msgstr "" + +msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." +msgstr "" + +msgid "The collection of events added to the data gathered for that stage." +msgstr "" + +msgid "The fork relationship has been removed." +msgstr "" + +msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." +msgstr "" + +msgid "The maximum file size allowed is 200KB." +msgstr "" + +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + +msgid "The phase of the development lifecycle." +msgstr "" + +msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." +msgstr "" + +msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." +msgstr "" + +msgid "The project can be accessed by any logged in user." +msgstr "" + +msgid "The project can be accessed without any authentication." +msgstr "" + +msgid "The repository for this project does not exist." +msgstr "" + +msgid "The repository for this project is empty" +msgstr "" + +msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." +msgstr "" + +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + +msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." +msgstr "" + +msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." +msgstr "" + +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + +msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check." +msgstr "" + +msgid "The time taken by each data entry gathered by that stage." +msgstr "" + +msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6." +msgstr "" + +msgid "There are no issues to show" +msgstr "" + +msgid "There are no merge requests to show" +msgstr "" + +msgid "There are problems accessing Git storage: " +msgstr "" + +msgid "There was an error loading users activity calendar." +msgstr "" + +msgid "There was an error saving your notification settings." +msgstr "" + +msgid "There was an error subscribing to this label." +msgstr "" + +msgid "There was an error when reseting email token." +msgstr "" + +msgid "There was an error when subscribing to this label." +msgstr "" + +msgid "There was an error when unsubscribing from this label." +msgstr "" + +msgid "This board\\'s scope is reduced" +msgstr "" + +msgid "This directory" +msgstr "" + +msgid "This is a confidential issue." +msgstr "" + +msgid "This is the author's first Merge Request to this project." +msgstr "" + +msgid "This issue is confidential" +msgstr "" + +msgid "This issue is confidential and locked." +msgstr "" + +msgid "This issue is locked." +msgstr "" + +msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments" +msgstr "" + +msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered" +msgstr "" + +msgid "This job has not been triggered yet" +msgstr "" + +msgid "This job has not started yet" +msgstr "" + +msgid "This job is in pending state and is waiting to be picked by a runner" +msgstr "" + +msgid "This job requires a manual action" +msgstr "" + +msgid "This means you can not push code until you create an empty repository or import existing one." +msgstr "" + +msgid "This merge request is locked." +msgstr "" + +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + +msgid "This project" +msgstr "" + +msgid "This repository" +msgstr "" + +msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here." +msgstr "" + +msgid "Time before an issue gets scheduled" +msgstr "" + +msgid "Time before an issue starts implementation" +msgstr "" + +msgid "Time between merge request creation and merge/close" +msgstr "" + +msgid "Time tracking" +msgstr "" + +msgid "Time until first merge request" +msgstr "" + +msgid "TimeTrackingEstimated|Est" +msgstr "" + +msgid "TimeTracking|Estimated:" +msgstr "" + +msgid "TimeTracking|Spent" +msgstr "" + +msgid "Timeago|%s days ago" +msgstr "" + +msgid "Timeago|%s days remaining" +msgstr "" + +msgid "Timeago|%s hours remaining" +msgstr "" + +msgid "Timeago|%s minutes ago" +msgstr "" + +msgid "Timeago|%s minutes remaining" +msgstr "" + +msgid "Timeago|%s months ago" +msgstr "" + +msgid "Timeago|%s months remaining" +msgstr "" + +msgid "Timeago|%s seconds remaining" +msgstr "" + +msgid "Timeago|%s weeks ago" +msgstr "" + +msgid "Timeago|%s weeks remaining" +msgstr "" + +msgid "Timeago|%s years ago" +msgstr "" + +msgid "Timeago|%s years remaining" +msgstr "" + +msgid "Timeago|1 day remaining" +msgstr "" + +msgid "Timeago|1 hour remaining" +msgstr "" + +msgid "Timeago|1 minute remaining" +msgstr "" + +msgid "Timeago|1 month remaining" +msgstr "" + +msgid "Timeago|1 week remaining" +msgstr "" + +msgid "Timeago|1 year remaining" +msgstr "" + +msgid "Timeago|Past due" +msgstr "" + +msgid "Timeago|a day ago" +msgstr "" + +msgid "Timeago|a month ago" +msgstr "" + +msgid "Timeago|a week ago" +msgstr "" + +msgid "Timeago|a year ago" +msgstr "" + +msgid "Timeago|about %s hours ago" +msgstr "" + +msgid "Timeago|about a minute ago" +msgstr "" + +msgid "Timeago|about an hour ago" +msgstr "" + +msgid "Timeago|in %s days" +msgstr "" + +msgid "Timeago|in %s hours" +msgstr "" + +msgid "Timeago|in %s minutes" +msgstr "" + +msgid "Timeago|in %s months" +msgstr "" + +msgid "Timeago|in %s seconds" +msgstr "" + +msgid "Timeago|in %s weeks" +msgstr "" + +msgid "Timeago|in %s years" +msgstr "" + +msgid "Timeago|in 1 day" +msgstr "" + +msgid "Timeago|in 1 hour" +msgstr "" + +msgid "Timeago|in 1 minute" +msgstr "" + +msgid "Timeago|in 1 month" +msgstr "" + +msgid "Timeago|in 1 week" +msgstr "" + +msgid "Timeago|in 1 year" +msgstr "" + +msgid "Timeago|in a while" +msgstr "" + +msgid "Timeago|less than a minute ago" +msgstr "" + +msgid "Time|hr" +msgid_plural "Time|hrs" +msgstr[0] "" + +msgid "Time|min" +msgid_plural "Time|mins" +msgstr[0] "" + +msgid "Time|s" +msgstr "" + +msgid "Tip:" +msgstr "" + +msgid "Title" +msgstr "" + +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + +msgid "Todo" +msgstr "" + +msgid "Toggle sidebar" +msgstr "" + +msgid "ToggleButton|Toggle Status: OFF" +msgstr "" + +msgid "ToggleButton|Toggle Status: ON" +msgstr "" + +msgid "Total Time" +msgstr "" + +msgid "Total test time for all commits/merges" +msgstr "" + +msgid "Total: %{total}" +msgstr "" + +msgid "Track activity with Contribution Analytics." +msgstr "" + +msgid "Track groups of issues that share a theme, across projects and milestones" +msgstr "" + +msgid "Track time with quick actions" +msgstr "" + +msgid "Trigger this manual action" +msgstr "" + +msgid "Turn on Service Desk" +msgstr "" + +msgid "Unable to reset project cache." +msgstr "" + +msgid "Unknown" +msgstr "" + +msgid "Unlock" +msgstr "" + +msgid "Unlock this %{issuableDisplayName}? <strong>Everyone</strong> will be able to comment." +msgstr "" + +msgid "Unlocked" +msgstr "" + +msgid "Unresolve discussion" +msgstr "" + +msgid "Unstar" +msgstr "" + +msgid "Up to date" +msgstr "" + +msgid "Upgrade your plan to activate Advanced Global Search." +msgstr "" + +msgid "Upgrade your plan to activate Contribution Analytics." +msgstr "" + +msgid "Upgrade your plan to activate Group Webhooks." +msgstr "" + +msgid "Upgrade your plan to activate Issue weight." +msgstr "" + +msgid "Upgrade your plan to improve Issue boards." +msgstr "" + +msgid "Upload New File" +msgstr "" + +msgid "Upload file" +msgstr "" + +msgid "Upload new avatar" +msgstr "" + +msgid "UploadLink|click to upload" +msgstr "" + +msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab" +msgstr "" + +msgid "Use the following registration token during setup:" +msgstr "" + +msgid "Use your global notification setting" +msgstr "" + +msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." +msgstr "" + +msgid "View epics list" +msgstr "" + +msgid "View file @ " +msgstr "" + +msgid "View labels" +msgstr "" + +msgid "View open merge request" +msgstr "" + +msgid "View replaced file @ " +msgstr "" + +msgid "VisibilityLevel|Internal" +msgstr "" + +msgid "VisibilityLevel|Private" +msgstr "" + +msgid "VisibilityLevel|Public" +msgstr "" + +msgid "VisibilityLevel|Unknown" +msgstr "" + +msgid "Want to see the data? Please ask an administrator for access." +msgstr "" + +msgid "We could not verify that one of your projects on GCP has billing enabled. Please try again." +msgstr "" + +msgid "We don't have enough data to show this stage." +msgstr "" + +msgid "We want to be sure it is you, please confirm you are not a robot." +msgstr "" + +msgid "Web IDE" +msgstr "" + +msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Wiki" +msgstr "" + +msgid "WikiClone|Clone your wiki" +msgstr "" + +msgid "WikiClone|Git Access" +msgstr "" + +msgid "WikiClone|Install Gollum" +msgstr "" + +msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" +msgstr "" + +msgid "WikiClone|Start Gollum and edit locally" +msgstr "" + +msgid "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title." +msgstr "" + +msgid "WikiEdit|There is already a page with the same title in that path." +msgstr "" + +msgid "WikiEmptyPageError|You are not allowed to create wiki pages" +msgstr "" + +msgid "WikiHistoricalPage|This is an old version of this page." +msgstr "" + +msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." +msgstr "" + +msgid "WikiHistoricalPage|history" +msgstr "" + +msgid "WikiHistoricalPage|most recent version" +msgstr "" + +msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" +msgstr "" + +msgid "WikiMarkdownDocs|documentation" +msgstr "" + +msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" +msgstr "" + +msgid "WikiNewPagePlaceholder|how-to-setup" +msgstr "" + +msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." +msgstr "" + +msgid "WikiNewPageTitle|New Wiki Page" +msgstr "" + +msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" +msgstr "" + +msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." +msgstr "" + +msgid "WikiPageConflictMessage|the page" +msgstr "" + +msgid "WikiPageCreate|Create %{page_title}" +msgstr "" + +msgid "WikiPageEdit|Update %{page_title}" +msgstr "" + +msgid "WikiPage|Page slug" +msgstr "" + +msgid "WikiPage|Write your content or drag files here..." +msgstr "" + +msgid "Wiki|Create Page" +msgstr "" + +msgid "Wiki|Create page" +msgstr "" + +msgid "Wiki|Edit Page" +msgstr "" + +msgid "Wiki|Empty page" +msgstr "" + +msgid "Wiki|More Pages" +msgstr "" + +msgid "Wiki|New page" +msgstr "" + +msgid "Wiki|Page history" +msgstr "" + +msgid "Wiki|Page version" +msgstr "" + +msgid "Wiki|Pages" +msgstr "" + +msgid "Wiki|Wiki Pages" +msgstr "" + +msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." +msgstr "" + +msgid "Withdraw Access Request" +msgstr "" + +msgid "Write a commit message..." +msgstr "" + +msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You can also create a project from the command line." +msgstr "" + +msgid "You can also star a label to make it a priority label." +msgstr "" + +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" +msgstr "" + +msgid "You can move around the graph by using the arrow keys." +msgstr "" + +msgid "You can only add files when you are on a branch" +msgstr "" + +msgid "You can only edit files when you are on a branch" +msgstr "" + +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + +msgid "You have reached your project limit" +msgstr "" + +msgid "You must have master access to force delete a lock" +msgstr "" + +msgid "You must sign in to star a project" +msgstr "" + +msgid "You need a different license to enable FileLocks feature" +msgstr "" + +msgid "You need permission." +msgstr "" + +msgid "You will not get any notifications via email" +msgstr "" + +msgid "You will only receive notifications for the events you choose" +msgstr "" + +msgid "You will only receive notifications for threads you have participated in" +msgstr "" + +msgid "You will receive notifications for any activity" +msgstr "" + +msgid "You will receive notifications only for comments in which you were @mentioned" +msgstr "" + +msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account" +msgstr "" + +msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile" +msgstr "" + +msgid "You won't be able to pull or push project code via SSH until you add an SSH key to your profile" +msgstr "" + +msgid "You'll need to use different branch names to get a valid comparison." +msgstr "" + +msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" +msgstr "" + +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + +msgid "Your comment will not be visible to the public." +msgstr "" + +msgid "Your groups" +msgstr "" + +msgid "Your name" +msgstr "" + +msgid "Your projects" +msgstr "" + +msgid "assign yourself" +msgstr "" + +msgid "branch name" +msgstr "" + +msgid "by" +msgstr "" + +msgid "ciReport|Code quality" +msgstr "" + +msgid "ciReport|DAST detected no alerts by analyzing the review app" +msgstr "" + +msgid "ciReport|Failed to load %{reportName} report" +msgstr "" + +msgid "ciReport|Fixed:" +msgstr "" + +msgid "ciReport|Instances" +msgstr "" + +msgid "ciReport|Learn more about whitelisting" +msgstr "" + +msgid "ciReport|Loading %{reportName} report" +msgstr "" + +msgid "ciReport|No changes to code quality" +msgstr "" + +msgid "ciReport|No changes to performance metrics" +msgstr "" + +msgid "ciReport|Performance metrics" +msgstr "" + +msgid "ciReport|SAST" +msgstr "" + +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + +msgid "ciReport|SAST detected no security vulnerabilities" +msgstr "" + +msgid "ciReport|SAST:container no vulnerabilities were found" +msgstr "" + +msgid "ciReport|Show complete code vulnerabilities report" +msgstr "" + +msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" +msgstr "" + +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + +msgid "commit" +msgstr "" + +msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue." +msgstr "" + +msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with <strong>at least Reporter access</strong> are able to see and leave comments on the issue." +msgstr "" + +msgid "day" +msgid_plural "days" +msgstr[0] "" + +msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." +msgstr "" + +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + +msgid "merge request" +msgid_plural "merge requests" +msgstr[0] "" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + +msgid "mrWidget|Cancel automatic merge" +msgstr "" + +msgid "mrWidget|Check out branch" +msgstr "" + +msgid "mrWidget|Checking ability to merge automatically" +msgstr "" + +msgid "mrWidget|Cherry-pick" +msgstr "" + +msgid "mrWidget|Cherry-pick this merge request in a new merge request" +msgstr "" + +msgid "mrWidget|Closed" +msgstr "" + +msgid "mrWidget|Closed by" +msgstr "" + +msgid "mrWidget|Closes" +msgstr "" + +msgid "mrWidget|Did not close" +msgstr "" + +msgid "mrWidget|Email patches" +msgstr "" + +msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" +msgstr "" + +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + +msgid "mrWidget|Mentions" +msgstr "" + +msgid "mrWidget|Merge" +msgstr "" + +msgid "mrWidget|Merge failed." +msgstr "" + +msgid "mrWidget|Merge locally" +msgstr "" + +msgid "mrWidget|Merged by" +msgstr "" + +msgid "mrWidget|Plain diff" +msgstr "" + +msgid "mrWidget|Refresh" +msgstr "" + +msgid "mrWidget|Refresh now" +msgstr "" + +msgid "mrWidget|Refreshing now" +msgstr "" + +msgid "mrWidget|Remove Source Branch" +msgstr "" + +msgid "mrWidget|Remove source branch" +msgstr "" + +msgid "mrWidget|Remove your approval" +msgstr "" + +msgid "mrWidget|Request to merge" +msgstr "" + +msgid "mrWidget|Resolve conflicts" +msgstr "" + +msgid "mrWidget|Revert" +msgstr "" + +msgid "mrWidget|Revert this merge request in a new merge request" +msgstr "" + +msgid "mrWidget|Set by" +msgstr "" + +msgid "mrWidget|The changes were merged into" +msgstr "" + +msgid "mrWidget|The changes were not merged into" +msgstr "" + +msgid "mrWidget|The changes will be merged into" +msgstr "" + +msgid "mrWidget|The source branch has been removed" +msgstr "" + +msgid "mrWidget|The source branch is being removed" +msgstr "" + +msgid "mrWidget|The source branch will be removed" +msgstr "" + +msgid "mrWidget|The source branch will not be removed" +msgstr "" + +msgid "mrWidget|There are merge conflicts" +msgstr "" + +msgid "mrWidget|This merge request failed to be merged automatically" +msgstr "" + +msgid "mrWidget|This merge request is in the process of being merged" +msgstr "" + +msgid "mrWidget|This project is archived, write access has been disabled" +msgstr "" + +msgid "mrWidget|You can merge this merge request manually using the" +msgstr "" + +msgid "mrWidget|You can remove source branch now" +msgstr "" + +msgid "mrWidget|branch does not exist." +msgstr "" + +msgid "mrWidget|command line" +msgstr "" + +msgid "mrWidget|into" +msgstr "" + +msgid "mrWidget|to be merged automatically when the pipeline succeeds" +msgstr "" + +msgid "new merge request" +msgstr "" + +msgid "notification emails" +msgstr "" + +msgid "or" +msgstr "" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "" + +msgid "password" +msgstr "" + +msgid "personal access token" +msgstr "" + +msgid "remove due date" +msgstr "" + +msgid "source" +msgstr "" + +msgid "spendCommand|%{slash_command} will update the sum of the time spent." +msgstr "" + +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + +msgid "uses Kubernetes clusters to deploy your code!" +msgstr "" + +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po index 62a6da1604a..0cb814ac59c 100644 --- a/locale/it/gitlab.po +++ b/locale/it/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:00-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:21-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s commit aggiuntivo è stato omesso per evitare degradi di prestazioni negli issues." msgstr[1] "%s commit aggiuntivi sono stati omessi per evitare degradi di prestazioni negli issues." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "%{count} partecipante" msgstr[1] "%{count} partecipanti" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} commits precedenti %{default_branch}, %{number_commits_ahead} commits avanti" @@ -66,6 +72,9 @@ msgstr "%{number_of_failures} di %{maximum_failures} fallimenti. GitLab consenti msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} di %{maximum_failures} fallimenti. Gitlab non ritenterà automaticamente. Ripristina l'informazioni d'archiviazione quando il problema è risolto." +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}: tentativo d'accesso all'archiviazione fallito da parte dell'host:" @@ -130,9 +139,15 @@ msgstr "Aggiungi Guida per contribuire" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Aggiungi Licenza" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Aggiungi una directory (cartella)" @@ -151,12 +166,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "Pagina di stato" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -181,6 +229,12 @@ msgstr "Errore durante l'attivazione/disattivazione della sottoscrizione per l'i msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "Errore durante il recupero dei dati della barra laterale" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "Progetto archiviato! La Repository è sola-lettura" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Sei sicuro di voler cancellare questa pipeline programmata?" -msgid "Are you sure you want to discard your changes?" -msgstr "Vuoi davvero ignorare le modifiche?" - msgid "Are you sure you want to reset registration token?" msgstr "Sei sicuro di voler ripristinare il token di registrazione?" msgid "Are you sure you want to reset the health check token?" msgstr "Confermi di voler resettare il token di controllo di stato?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "Sei sicuro?" @@ -280,6 +364,9 @@ msgstr "Autore" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -304,8 +391,14 @@ msgstr "Farà automaticamente le build, i test e i rilasci della tua applicazion msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "Approfondisci: %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "Puoi attivare %{link_to_settings} per questo progetto." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" msgid "Available" msgstr "Disponibile" @@ -316,6 +409,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -370,11 +466,8 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" msgstr[0] "" msgstr[1] "" @@ -669,6 +762,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "api circuitbreaker" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -723,6 +819,9 @@ msgstr "Copia URL API" msgid "ClusterIntegration|Copy CA Certificate" msgstr "Copia Certificato CA" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -771,6 +870,9 @@ msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "Ingresso" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "Installa" @@ -822,9 +924,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -960,6 +1059,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "Commenti" @@ -968,6 +1073,11 @@ msgid_plural "Commits" msgstr[0] "" msgstr[1] "" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "Messaggio di commit" @@ -980,6 +1090,9 @@ msgstr "Messaggio del commit" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Commit" @@ -1121,6 +1234,9 @@ msgstr "Copia URL negli appunti" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Copia l'SHA del commit negli appunti" @@ -1133,9 +1249,18 @@ msgstr "" msgid "Create New Directory" msgstr "Crea una nuova cartella" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Creare un token di accesso sul tuo account per eseguire pull o push tramite %{protocol}" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Crea cartella" @@ -1154,6 +1279,9 @@ msgstr "" msgid "Create merge request" msgstr "Crea una richiesta di merge" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "Crea un nuova branch" @@ -1178,6 +1306,12 @@ msgstr "Tag" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "Crea token d'accesso personale" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1232,6 +1366,9 @@ msgstr "Dic" msgid "December" msgstr "Dicembre" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Definisci un patter personalizzato mediante la sintassi cron" @@ -1264,8 +1401,8 @@ msgstr "Nome cartella" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "Annulla modifiche" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1324,6 +1461,9 @@ msgstr "E-mail" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "Errore durante il fetch degli ambienti." @@ -1378,9 +1518,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1447,12 +1596,36 @@ msgstr "Esplora progetti" msgid "Explore public groups" msgstr "Esplora gruppi pubblici" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "Impossibile cambiare owner" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Impossibile rimuovere la pipeline pianificata" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "Feb" @@ -1468,6 +1641,9 @@ msgstr "Nome file" msgid "Files" msgstr "Files" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Filtra per messaggio di commit" @@ -1503,6 +1679,9 @@ msgstr "Dalla creazione di un issue fino al rilascio in produzione" msgid "From merge request merge until deploy to production" msgstr "Dalla richiesta di merge fino effettua il merge fino al rilascio in produzione" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "Chiavi GPG" @@ -1650,6 +1829,24 @@ msgstr "L'autenticazione Google non è %{link_to_documentation}. Richiedi al tuo msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "Blocca la condivisione di un progetto di %{group} con altri gruppi" @@ -1748,6 +1945,9 @@ msgstr "Cronologia" msgid "Housekeeping successfully started" msgstr "Housekeeping iniziato con successo" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "Importa repository" @@ -1760,6 +1960,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "" @@ -1810,6 +2013,9 @@ msgstr "Gen" msgid "January" msgstr "Gennaio" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "Lug" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1887,6 +2096,12 @@ msgstr "" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "Leggi di più su" @@ -1905,6 +2120,9 @@ msgstr "Abbandona il progetto" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1914,6 +2132,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1923,6 +2144,9 @@ msgstr "Bloccato" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "Login" @@ -1953,9 +2177,6 @@ msgstr "Mediano" msgid "Members" msgstr "Membri" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "Richieste di merge" @@ -1968,6 +2189,9 @@ msgstr "Richiesta di merge" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "aggiungi una chiave SSH" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "Monitoraggio" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "Ulteriori informazioni sono disponibili | qui" @@ -2090,9 +2323,6 @@ msgstr "Nessuna Repository" msgid "No schedules" msgstr "Nessuna pianificazione" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "Nessuno" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "Dati insufficienti " +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Notifica eventi" @@ -2210,6 +2443,9 @@ msgstr "Si apre in una nuova finestra" msgid "Options" msgstr "Opzioni" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "Panoramica" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "tutto" @@ -2348,6 +2602,9 @@ msgstr "Privato - L'accesso al progetto deve essere fornito esplicitamente ad og msgid "Private - The group and its projects can only be viewed by members." msgstr "Privato - Il gruppo e i suoi progetti possono essere visualizzati solo dai membri." +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "Profilo" @@ -2510,12 +2767,30 @@ msgstr "Siamo spiacenti, non ci sono progetti che corrispondono alla tua ricerca msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Questa feature richiede il supporto del localStorage del browser" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "Di default, Prometheus è in ascolto su ‘http://localhost:9090‘. Non è consigliabile cambiare l'indirizzo e la porta di default in quanto ciò potrebbe influenzare o causare conflitto con altri servizi in esecuzione sul server GitLab." msgid "PrometheusService|Finding and configuring metrics..." msgstr "Ricerco e configuro le metriche..." +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "Metriche" @@ -2537,9 +2812,18 @@ msgstr "Nessuna metrica è stata monitorata. Per iniziare a monitorare, rilascia msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2558,6 +2842,12 @@ msgstr "" msgid "Push events" msgstr "" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2621,6 +2911,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "Richiedi accesso" @@ -2633,6 +2926,9 @@ msgstr "" msgid "Reset runners registration token" msgstr "" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2644,6 +2940,9 @@ msgstr "Ripristina questo commit" msgid "Revert this merge request" msgstr "Ripristina questa richiesta di merge" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "Chiavi SSH" @@ -2689,12 +2988,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Seleziona formato d'archivio" msgid "Select a timezone" msgstr "Seleziona una timezone" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,6 +3012,9 @@ msgstr "Seleziona una branch di destinazione" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "Set" @@ -2719,6 +3027,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Establezca una contraseña en su cuenta para actualizar o enviar a través de %{protocol}." @@ -2728,15 +3039,15 @@ msgstr "" msgid "Set up Koding" msgstr "Configura Koding" -msgid "Set up auto deploy" -msgstr "Configura il rilascio automatico" - msgid "SetPasswordToCloneLink|set a password" msgstr "imposta una password" msgid "Settings" msgstr "Impostazioni" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2746,6 +3057,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2787,12 +3101,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "Qualcosa è andato storto durante il fetch dei progetti." msgid "Something went wrong while fetching the registry list." msgstr "Qualcosa è andato storto durante il recupero dell'elenco dei registri." +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2898,6 +3224,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "Codice Sorgente" @@ -2937,8 +3266,8 @@ msgstr "Cambia branch/tag" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" msgstr[0] "" msgstr[1] "" @@ -3071,9 +3400,15 @@ msgstr "Chiunque può accedere a questo progetto (senza alcuna autenticazione)." msgid "The repository for this project does not exist." msgstr "La repository di questo progetto non esiste." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "Lo stadio di revisione mostra il tempo tra una richiesta di merge al suo svolgimento effettivo. Questo dato sarà disponibile appena avrai completato una MR (Merger Request)" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "Lo stadio di pre-rilascio mostra il tempo che trascorre da una MR (Richiesta di Merge) completata al suo rilascio in ambiente di produzione. Questa informazione sarà disponibile dal tuo primo rilascio in produzione" @@ -3167,6 +3502,9 @@ msgstr "Questo significa che non è possibile effettuare push di codice fino a c msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,9 +3674,15 @@ msgstr[1] "mins" msgid "Time|s" msgstr "s" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3354,19 +3698,16 @@ msgstr "" msgid "Total Time" msgstr "Tempo Totale" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "Tempo totale di test per tutti i commits/merges" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3396,6 +3734,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "" @@ -3441,6 +3782,9 @@ msgstr "Usa le tue impostazioni globali " msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3477,6 +3821,9 @@ msgstr "Non ci sono sufficienti dati da mostrare su questo stadio" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3597,6 +3944,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "Ritira richiesta d'accesso" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Stai per rimuovere il gruppo %{group_name}. I gruppi rimossi NON POSSONO esser ripristinati! Sei ASSOLUTAMENTE sicuro?" @@ -3609,10 +3959,13 @@ msgstr "Stai per rimuovere la relazione con il progetto sorgente %{forked_from_p msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Stai per trasferire %{project_name_with_namespace} ad un altro owner. Sei ASSOLUTAMENTE sicuro?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Hai raggiunto il tuo limite di progetto" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "Devi accedere per porre una star al progetto" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "Necessiti del permesso." @@ -3669,6 +4034,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,6 +4112,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3752,11 +4135,41 @@ msgstr[1] "giorni" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,3 +4346,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po index 31c4422c928..180f1f0fbe7 100644 --- a/locale/ja/gitlab.po +++ b/locale/ja/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:00-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:21-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -43,6 +43,9 @@ msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "パフォーマンス低下をé¿ã‘ã‚‹ãŸã‚ %s 個ã®ã‚³ãƒŸãƒƒãƒˆã‚’çœç•¥ã—ã¾ã—ãŸã€‚" +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -50,6 +53,9 @@ msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -59,6 +65,9 @@ msgstr "" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "" @@ -121,9 +130,15 @@ msgstr "貢献者å‘ã‘ã‚¬ã‚¤ãƒ‰ã‚’è¿½åŠ " msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’è¿½åŠ " +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’è¿½åŠ " @@ -142,12 +157,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -172,6 +220,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -181,12 +235,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -199,6 +277,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -223,15 +307,15 @@ msgstr "アーカイブ済ã¿ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆï¼ï¼ˆãƒ¬ãƒã‚¸ãƒˆãƒªãƒ¼ã¯èªã¿ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "ã“ã®ãƒ‘イプラインスケジュールを削除ã—ã¾ã™ã‹ï¼Ÿ" -msgid "Are you sure you want to discard your changes?" -msgstr "" - msgid "Are you sure you want to reset registration token?" msgstr "" msgid "Are you sure you want to reset the health check token?" msgstr "" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "" @@ -271,6 +355,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -295,7 +382,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -307,6 +400,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -361,12 +457,9 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "ブランãƒ" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "<strong>%{branch_name}</strong> ブランãƒãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚自動デプãƒã‚¤ã‚’è¨å®šã™ã‚‹ã«ã¯ã€GitLab CI Yaml テンプレートをé¸æŠžã—ã¦ã€å¤‰æ›´ã‚’コミットã—ã¦ãã ã•ã„。 %{link_to_autodeploy_doc}" @@ -659,6 +752,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -713,6 +809,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -761,6 +860,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -812,9 +914,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -950,6 +1049,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "" @@ -957,6 +1062,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "コミット" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" + msgid "Commit Message" msgstr "" @@ -969,6 +1078,9 @@ msgstr "コミットメッセージ" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "コミット" @@ -1110,6 +1222,9 @@ msgstr "クリップボードã«URLをコピー" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "コミットã®SHAをクリップボードã«ã‚³ãƒ”ー" @@ -1122,9 +1237,18 @@ msgstr "" msgid "Create New Directory" msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆ" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "%{protocol} ã§ãƒ—ッシュやプルã™ã‚‹ãŸã‚ã®ã‚ãªãŸå€‹äººç”¨ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’作æˆ" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "ディレクトリを作æˆ" @@ -1143,6 +1267,9 @@ msgstr "" msgid "Create merge request" msgstr "マージリクエストを作æˆ" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1167,6 +1294,12 @@ msgstr "ã‚¿ã‚°" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "個人用アクセストークンを作æˆ" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1221,6 +1354,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Cron 構文ã§ã‚«ã‚¹ã‚¿ãƒ ãªãƒ‘ターンを指定ã™ã‚‹" @@ -1252,7 +1388,7 @@ msgstr "ディレクトリå" msgid "Disable" msgstr "" -msgid "Discard changes" +msgid "Discard draft" msgstr "" msgid "Discover GitLab Geo." @@ -1312,6 +1448,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1366,9 +1505,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1435,12 +1583,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "オーナーを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "パイプラインスケジュールを削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1456,6 +1628,9 @@ msgstr "" msgid "Files" msgstr "ファイル" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "コミットメッセージã§çµžã‚Šè¾¼ã¿" @@ -1490,6 +1665,9 @@ msgstr "課題ãŒç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒ—ãƒãƒ€ã‚¯ã‚·ãƒ§ãƒ³ã«ãƒ‡ãƒ—ãƒã‚¤ã•ã‚Œ msgid "From merge request merge until deploy to production" msgstr "マージリクエストãŒãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã‹ã‚‰ãƒ—ãƒãƒ€ã‚¯ã‚·ãƒ§ãƒ³ã«ãƒ‡ãƒ—ãƒã‚¤ã•ã‚Œã‚‹ã¾ã§" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1637,6 +1815,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1734,6 +1930,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "ãƒã‚¦ã‚¹ã‚ーピングã¯æ£å¸¸ã«èµ·å‹•ã—ã¾ã—ãŸã€‚" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "レãƒã‚¸ãƒˆãƒªãƒ¼ã‚’インãƒãƒ¼ãƒˆ" @@ -1746,6 +1945,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "" @@ -1795,6 +1997,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1825,6 +2030,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1871,6 +2079,12 @@ msgstr "" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "詳ã—ã見る:" @@ -1889,6 +2103,9 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’離脱" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1898,6 +2115,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1907,6 +2127,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1937,9 +2160,6 @@ msgstr "ä¸å¤®å€¤" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1952,6 +2172,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1976,9 +2199,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "SSH éµã‚’è¿½åŠ " +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2073,9 +2305,6 @@ msgstr "レãƒã‚¸ãƒˆãƒªãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“" msgid "No schedules" msgstr "スケジュールãªã—" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2091,6 +2320,9 @@ msgstr "" msgid "Not enough data" msgstr "データä¸è¶³" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "イベント通知" @@ -2193,6 +2425,9 @@ msgstr "" msgid "Options" msgstr "オプション" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2298,6 +2533,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "全件" @@ -2331,6 +2584,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2493,12 +2749,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2520,9 +2794,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2541,6 +2824,12 @@ msgstr "" msgid "Push events" msgstr "" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2604,6 +2893,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "アクセス権é™ã‚’リクエストã™ã‚‹" @@ -2616,6 +2908,9 @@ msgstr "" msgid "Reset runners registration token" msgstr "" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2626,6 +2921,9 @@ msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã‚’リãƒãƒ¼ãƒˆ" msgid "Revert this merge request" msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’リãƒãƒ¼ãƒˆ" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2671,12 +2969,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "アーカイブã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’é¸æŠž" msgid "Select a timezone" msgstr "タイムゾーンをé¸æŠž" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2689,6 +2993,9 @@ msgstr "ターゲットブランãƒã‚’é¸æŠž" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2701,6 +3008,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "%{protocol} プãƒã‚³ãƒˆãƒ«çµŒç”±ã§ãƒ—ルã€ãƒ—ッシュã™ã‚‹ãŸã‚ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ‘スワードをè¨å®šã€‚" @@ -2710,15 +3020,15 @@ msgstr "" msgid "Set up Koding" msgstr "Koding ã‚’è¨å®š" -msgid "Set up auto deploy" -msgstr "自動デプãƒã‚¤ã‚’è¨å®š" - msgid "SetPasswordToCloneLink|set a password" msgstr "パスワードをè¨å®š" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2728,6 +3038,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2768,12 +3081,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2879,6 +3204,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "ソースコード" @@ -2918,9 +3246,9 @@ msgstr "ブランãƒãƒ»ã‚¿ã‚°åˆ‡ã‚Šæ›¿ãˆ" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "ã‚¿ã‚°" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" msgid "Tags" msgstr "ã‚¿ã‚°" @@ -3051,9 +3379,15 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã¯ã€ãƒã‚°ã‚¤ãƒ³ãªã—ã«èª°ã§ã‚‚アクセスã§ã msgid "The repository for this project does not exist." msgstr "ã“ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã«ãƒ¬ãƒã‚¸ãƒˆãƒªãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。" +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "レビューステージã¨ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’作æˆã—ã¦ã‹ã‚‰ãƒžãƒ¼ã‚¸ã™ã‚‹ã¾ã§ã®æ™‚é–“ã§ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ã‚¸ã•ã‚ŒãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "ステージングステージã§ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã‹ã‚‰ã‚³ãƒ¼ãƒ‰ãŒãƒ—ãƒãƒ€ã‚¯ã‚·ãƒ§ãƒ³ç’°å¢ƒã«ãƒ‡ãƒ—ãƒã‚¤ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã«ãƒ—ãƒãƒ€ã‚¯ã‚·ãƒ§ãƒ³ã«ãƒ‡ãƒ—ãƒã‚¤ã—ãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚" @@ -3147,6 +3481,9 @@ msgstr "空レãƒã‚¸ãƒˆãƒªãƒ¼ã‚’作æˆã¾ãŸã¯æ—¢å˜ãƒ¬ãƒã‚¸ãƒˆãƒªãƒ¼ã‚’イン msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3314,9 +3651,15 @@ msgstr[0] "分" msgid "Time|s" msgstr "秒" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3332,19 +3675,16 @@ msgstr "" msgid "Total Time" msgstr "åˆè¨ˆæ™‚é–“" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "ã™ã¹ã¦ã®ã‚³ãƒŸãƒƒãƒˆ/マージã®åˆè¨ˆãƒ†ã‚¹ãƒˆæ™‚é–“" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3356,9 +3696,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3374,6 +3711,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "スターを外ã™" @@ -3419,6 +3759,9 @@ msgstr "全体通知è¨å®šã‚’利用" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3455,6 +3798,9 @@ msgstr "データä¸è¶³ã®ãŸã‚ã€ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã®è¡¨ç¤ºã¯ã§ãã¾ã›ã‚“ msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3575,6 +3921,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "アクセスリクエストをå–り消ã™" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "%{group_name} グループを削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ 削除ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã¯çµ¶å¯¾ã«å…ƒã«æˆ»ã›ã¾ã›ã‚“ï¼æœ¬å½“ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ" @@ -3587,10 +3936,13 @@ msgstr "å…ƒã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ (%{forked_from_project}) ã¨ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ã msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "%{project_name_with_namespace} プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’別ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ç§»è²ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3608,12 +3960,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆæ•°ã®ä¸Šé™ã«é”ã—ã¦ã„ã¾ã™" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã«ã‚¹ã‚¿ãƒ¼ã‚’ã¤ã‘ãŸã„å ´åˆã¯ãƒã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "権é™ãŒå¿…è¦ã§ã™" @@ -3647,6 +4011,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3674,7 +4041,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3686,7 +4053,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3701,6 +4068,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3713,6 +4089,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3729,10 +4111,40 @@ msgstr[0] "æ—¥" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3766,6 +4178,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3799,6 +4214,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3853,6 +4271,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3899,3 +4320,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po index 73909e6f6de..13634091ed7 100644 --- a/locale/ko/gitlab.po +++ b/locale/ko/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:00-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:19-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Korean\n" "Language: ko_KR\n" @@ -43,6 +43,9 @@ msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "%s 추가 ì»¤ë°‹ì€ ì„±ëŠ¥ ì´ìŠˆë¥¼ 방지하기 위해 ìƒëžµë˜ì—ˆìŠµë‹ˆë‹¤." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -50,6 +53,9 @@ msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -59,6 +65,9 @@ msgstr "%{number_of_failures} / %{maximum_failures} 실패. GitLab ì€ ë‹¤ìŒ ì‹ msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} / %{maximum_failures} 실패. GitLab ì€ ìžë™ìœ¼ë¡œ 다시 ì‹œë„하지 않습니다. ë¬¸ì œê°€ í•´ê²°ë˜ë©´ ì €ìž¥ 공간 ì •ë³´ë¥¼ 초기화 해주세요. " +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "" @@ -121,9 +130,15 @@ msgstr "기여 ê°€ì´ë“œ 추가" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "ë¼ì´ì„ 스 추가" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "새 ë””ë ‰í† ë¦¬ 추가" @@ -142,12 +157,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -172,6 +220,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -181,12 +235,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -199,6 +277,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -223,15 +307,15 @@ msgstr "프로ì 트가 ë³´ê´€ë˜ì—ˆìŠµë‹ˆë‹¤! ì €ìž¥ì†ŒëŠ” ì½ê¸°ë§Œ 가능합ë msgid "Are you sure you want to delete this pipeline schedule?" msgstr "ì´ íŒŒì´í”„ë¼ì¸ ìŠ¤ì¼€ì¥´ì„ ì‚ì œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" -msgid "Are you sure you want to discard your changes?" -msgstr "변경 ë‚´ìš©ì„ ì·¨ì†Œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" - msgid "Are you sure you want to reset registration token?" msgstr "ë“±ë¡ í† í°ì„ 초기화 í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" msgid "Are you sure you want to reset the health check token?" msgstr "헬스 ì²´í¬ í† í°ì„ 초기화 í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "확실합니까?" @@ -271,6 +355,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -295,7 +382,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -307,6 +400,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -361,12 +457,9 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "브랜치" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "<strong>%{branch_name}</strong> 브랜치가 ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤. ìžë™ ë°°í¬ë¥¼ ì„¤ì •í•˜ë ¤ë©´ GitLab CI Yaml í…œí”Œë¦¿ì„ ì„ íƒí•˜ê³ 변경 사í•ì„ ì 용하ì‹ì‹œì˜¤. %{link_to_autodeploy_doc}" @@ -659,6 +752,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -713,6 +809,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -761,6 +860,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -812,9 +914,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -950,6 +1049,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "" @@ -957,6 +1062,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "커밋" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" + msgid "Commit Message" msgstr "" @@ -969,6 +1078,9 @@ msgstr "커밋 메시지" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "커밋" @@ -1110,6 +1222,9 @@ msgstr "URLì„ í´ë¦½ë³´ë“œì— 복사" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "ì»¤ë°‹ì˜ SHA를 í´ë¦½ë³´ë“œë¡œ 복사합니다" @@ -1122,9 +1237,18 @@ msgstr "" msgid "Create New Directory" msgstr "새 ë””ë ‰í† ë¦¬ 만들기" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "%{protocol}ì„ (를) 통해 Pull 하거나 Push í• ê°œì¸ ì•¡ì„¸ìŠ¤ í† í°ì„ 만드ì‹ì‹œì˜¤." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "ë””ë ‰í† ë¦¬ 만들기" @@ -1143,6 +1267,9 @@ msgstr "" msgid "Create merge request" msgstr "머지 리퀘스트 만들기" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1167,6 +1294,12 @@ msgstr "태그" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "ê°œì¸ ì•¡ì„¸ìŠ¤ í† í° ë§Œë“¤ê¸°" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1221,6 +1354,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "cron êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ ì‚¬ìš©ìž ì •ì˜ íŒ¨í„´ ì •ì˜" @@ -1252,8 +1388,8 @@ msgstr "ë””ë ‰í† ë¦¬ ì´ë¦„" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "변경 ë‚´ìš© 취소" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1312,6 +1448,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1366,9 +1505,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1435,12 +1583,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "ì†Œìœ ìžë¥¼ 변경하지 못했습니다" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "파ì´í”„ë¼ì¸ ìŠ¤ì¼€ì¤„ì„ ì œê±°í•˜ì§€ 못했습니다." +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1456,6 +1628,9 @@ msgstr "" msgid "Files" msgstr "파ì¼" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "커밋 메시지로 í•„í„°" @@ -1490,6 +1665,9 @@ msgstr "ì´ìŠˆ ìƒì„±ì—ì„œ 프로ë•ì…˜ ë°°í¬ê¹Œì§€" msgid "From merge request merge until deploy to production" msgstr "머지 리퀘스트 머지ì—ì„œ 프로ë•ì…˜ í™˜ê²½ì— ë°°í¬ê¹Œì§€" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1637,6 +1815,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1734,6 +1930,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "Housekeepingì´ ì„±ê³µì 으로 시작ë˜ì—ˆìŠµë‹ˆë‹¤" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "ì €ìž¥ì†Œ ê°€ì ¸ 오기" @@ -1746,6 +1945,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "GitLab CI 와 호환ë˜ëŠ” Runner 설치" @@ -1795,6 +1997,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1825,6 +2030,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1871,6 +2079,12 @@ msgstr "at" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "ë” ìžì„¸ížˆ 알아보기" @@ -1889,6 +2103,9 @@ msgstr "프로ì 트ì—ì„œ 나가기" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1898,6 +2115,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1907,6 +2127,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1937,9 +2160,6 @@ msgstr "중앙값" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1952,6 +2172,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1976,9 +2199,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "SSH 키 추가" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "여기" @@ -2073,9 +2305,6 @@ msgstr "ì €ìž¥ì†Œ ì—†ìŒ" msgid "No schedules" msgstr "ì¼ì • ì—†ìŒ" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2091,6 +2320,9 @@ msgstr "" msgid "Not enough data" msgstr "ë°ì´í„°ê°€ 충분하지 않습니다." +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "알림 ì´ë²¤íŠ¸" @@ -2193,6 +2425,9 @@ msgstr "" msgid "Options" msgstr "옵션 " +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2298,6 +2533,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "모ë‘" @@ -2331,6 +2584,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2493,12 +2749,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2520,9 +2794,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2541,6 +2824,12 @@ msgstr "" msgid "Push events" msgstr "푸쉬 ì´ë²¤íŠ¸" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2604,6 +2893,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "액세스 ìš”ì²" @@ -2616,6 +2908,9 @@ msgstr "헬스 ì²´í¬ ì ‘ê·¼ í† í° ì´ˆê¸°í™”" msgid "Reset runners registration token" msgstr "runner ë“±ë¡ í† í° ì´ˆê¸°í™”" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2626,6 +2921,9 @@ msgstr "ì´ ì»¤ë°‹ ë˜ëŒë¦¬ê¸°" msgid "Revert this merge request" msgstr "ì´ ë¨¸ì§€ 리퀘스트 ë˜ëŒë¦¬ê¸°" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2671,12 +2969,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "ì•„ì¹´ì´ë¸Œ í¬ë§· ì„ íƒ" msgid "Select a timezone" msgstr "시간대 ì„ íƒ" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2689,6 +2993,9 @@ msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ ì„ íƒ" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2701,6 +3008,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "%{protocol} í”„ë¡œí† ì½œì„ í†µí•´ Pull 하거나 Pushí•˜ë ¤ë©´ ê³„ì •ì— íŒ¨ìŠ¤ì›Œë“œë¥¼ ì„¤ì •í•˜ì‹ì‹œì˜¤." @@ -2710,15 +3020,15 @@ msgstr "" msgid "Set up Koding" msgstr "Koding ì„¤ì •" -msgid "Set up auto deploy" -msgstr "ìžë™ ë°°í¬ ì„¤ì •" - msgid "SetPasswordToCloneLink|set a password" msgstr "패스워드 ì„¤ì •" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2728,6 +3038,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2768,12 +3081,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2879,6 +3204,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "소스 코드" @@ -2918,9 +3246,9 @@ msgstr "스위치 브랜치/태그" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "태그" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" msgid "Tags" msgstr "태그 " @@ -3051,9 +3379,15 @@ msgstr "ì´ í”„ë¡œì 트는 ì¸ì¦ì—†ì´ 액세스 í• ìˆ˜ 있습니다." msgid "The repository for this project does not exist." msgstr "ì´ í”„ë¡œì íŠ¸ì˜ ì €ìž¥ì†Œê°€ 존재하지 않습니다." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "Review 단계ì—서는 머지 리퀘스트를 작성한 후 ë¨¸ì§€í•˜ê¸°ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ëŠ” 첫 번째 머지 ë¦¬í€˜ìŠ¤íŠ¸ì„ ë¨¸ì§€ í•œ í›„ì— ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "Staging 단계ì—서는 MR 머지과 프로ë•ì…˜ í™˜ê²½ì— ì½”ë“œ ë°°í¬ ì‚¬ì´ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ë¥¼ Production í™˜ê²½ì— ì²˜ìŒ ë°°í¬í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤." @@ -3147,6 +3481,9 @@ msgstr "즉, 빈 ì €ìž¥ì†Œë¥¼ 만들거나 기존 ì €ìž¥ì†Œë¥¼ ê°€ì ¸ì˜¬ 때까ì msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3314,9 +3651,15 @@ msgstr[0] "분" msgid "Time|s" msgstr "ì´ˆ" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3332,19 +3675,16 @@ msgstr "" msgid "Total Time" msgstr "시간 합계:" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "ëª¨ë“ ì»¤ë°‹ / ë¨¸ì§€ì˜ ì´ í…ŒìŠ¤íŠ¸ 시간" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3356,9 +3696,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3374,6 +3711,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "별표 ì œê±°" @@ -3419,6 +3759,9 @@ msgstr "ì „ì²´ 알림 ì„¤ì • 사용" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3455,6 +3798,9 @@ msgstr "ì´ ë‹¨ê³„ë¥¼ ë³´ì—¬ì£¼ê¸°ì— ì¶©ë¶„í•œ ë°ì´í„°ê°€ 없습니다." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3575,6 +3921,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "액세스 ìš”ì² ì² íšŒ" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "%{group_name} ê·¸ë£¹ì„ ì œê±°í•˜ë ¤ê³ í•©ë‹ˆë‹¤. \\\"ì •ë§ë¡œ\\\" 확실합니까?" @@ -3587,10 +3936,13 @@ msgstr "í¬í¬ 관계를 소스 프로ì 트 %{forked_from_project}ì— ëŒ€í•´ ì msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "%{project_name_with_namespace}ì„ ë‹¤ë¥¸ ì†Œìœ ìžì—게 ì´ì „í•˜ë ¤ê³ í•©ë‹ˆë‹¤. \"ì •ë§ë¡œ\" 확실합니까?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3608,12 +3960,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "프로ì 트 ìˆ«ìž í•œë„ì— ë„달했습니다." +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "프로ì íŠ¸ì— ë³„í‘œë¥¼ í‘œì‹œí•˜ë ¤ë©´ ë¡œê·¸ì¸ í•´ì•¼ 합니다." +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "ê¶Œí•œì´ í•„ìš”í•©ë‹ˆë‹¤." @@ -3647,6 +4011,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3674,7 +4041,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3686,7 +4053,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3701,6 +4068,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3713,6 +4089,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3729,10 +4111,40 @@ msgstr[0] "ì¼" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3766,6 +4178,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3799,6 +4214,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3853,6 +4271,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3899,3 +4320,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po index 451be6434db..ce3f2e5627e 100644 --- a/locale/nl_NL/gitlab.po +++ b/locale/nl_NL/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:59-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:22-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s andere commit is weggelaten om prestatieproblemen te voorkomen." msgstr[1] "%s andere commits zijn weggelaten om prestatieproblemen te voorkomen." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -66,6 +72,9 @@ msgstr "" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "" @@ -130,9 +139,15 @@ msgstr "" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Licentie toevoegen" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Nieuwe map toevoegen" @@ -151,12 +166,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -181,6 +229,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "" -msgid "Are you sure you want to discard your changes?" -msgstr "" - msgid "Are you sure you want to reset registration token?" msgstr "" msgid "Are you sure you want to reset the health check token?" msgstr "" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "" @@ -280,6 +364,9 @@ msgstr "Auteur" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -304,7 +391,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -316,6 +409,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -370,11 +466,8 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" msgstr[0] "" msgstr[1] "" @@ -669,6 +762,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -723,6 +819,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -771,6 +870,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -822,9 +924,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -960,6 +1059,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "Opmerkingen" @@ -968,6 +1073,11 @@ msgid_plural "Commits" msgstr[0] "" msgstr[1] "" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -980,6 +1090,9 @@ msgstr "" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Commit" @@ -1121,6 +1234,9 @@ msgstr "" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "" @@ -1133,9 +1249,18 @@ msgstr "" msgid "Create New Directory" msgstr "" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Maak map aan" @@ -1154,6 +1279,9 @@ msgstr "" msgid "Create merge request" msgstr "" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1178,6 +1306,12 @@ msgstr "" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1232,6 +1366,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "" @@ -1264,7 +1401,7 @@ msgstr "" msgid "Disable" msgstr "" -msgid "Discard changes" +msgid "Discard draft" msgstr "" msgid "Discover GitLab Geo." @@ -1324,6 +1461,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1378,9 +1518,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1447,12 +1596,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1468,6 +1641,9 @@ msgstr "" msgid "Files" msgstr "" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "" @@ -1503,6 +1679,9 @@ msgstr "" msgid "From merge request merge until deploy to production" msgstr "" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1650,6 +1829,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1748,6 +1945,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "" @@ -1760,6 +1960,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "" @@ -1810,6 +2013,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1887,6 +2096,12 @@ msgstr "" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "" @@ -1905,6 +2120,9 @@ msgstr "" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1914,6 +2132,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1923,6 +2144,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1953,9 +2177,6 @@ msgstr "" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1968,6 +2189,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2090,9 +2323,6 @@ msgstr "" msgid "No schedules" msgstr "" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "" @@ -2210,6 +2443,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "" @@ -2348,6 +2602,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2510,12 +2767,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2537,9 +2812,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2558,6 +2842,12 @@ msgstr "" msgid "Push events" msgstr "" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2621,6 +2911,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "" @@ -2633,6 +2926,9 @@ msgstr "" msgid "Reset runners registration token" msgstr "" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2644,6 +2940,9 @@ msgstr "" msgid "Revert this merge request" msgstr "" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2689,12 +2988,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "" msgid "Select a timezone" msgstr "" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,6 +3012,9 @@ msgstr "" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2719,6 +3027,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "" @@ -2728,15 +3039,15 @@ msgstr "" msgid "Set up Koding" msgstr "" -msgid "Set up auto deploy" -msgstr "" - msgid "SetPasswordToCloneLink|set a password" msgstr "" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2746,6 +3057,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2787,12 +3101,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2898,6 +3224,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "" @@ -2937,8 +3266,8 @@ msgstr "" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" msgstr[0] "" msgstr[1] "" @@ -3071,9 +3400,15 @@ msgstr "" msgid "The repository for this project does not exist." msgstr "" +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "" @@ -3167,6 +3502,9 @@ msgstr "" msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,9 +3674,15 @@ msgstr[1] "" msgid "Time|s" msgstr "s" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3354,10 +3698,10 @@ msgstr "" msgid "Total Time" msgstr "" -msgid "Total issue time spent" +msgid "Total test time for all commits/merges" msgstr "" -msgid "Total test time for all commits/merges" +msgid "Total: %{total}" msgstr "" msgid "Track activity with Contribution Analytics." @@ -3366,9 +3710,6 @@ msgstr "" msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" msgstr "" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3396,6 +3734,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "" @@ -3441,6 +3782,9 @@ msgstr "" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3477,6 +3821,9 @@ msgstr "" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3597,6 +3944,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "" @@ -3609,10 +3959,13 @@ msgstr "" msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "" @@ -3669,6 +4034,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,6 +4112,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3752,11 +4135,41 @@ msgstr[1] "" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,3 +4346,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po index 9c5455eac67..8e414d0d07b 100644 --- a/locale/pl_PL/gitlab.po +++ b/locale/pl_PL/gitlab.po @@ -2,15 +2,15 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:01-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:21-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Polish\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=((n == 1) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || n%10 == 1 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 12 && n%100 <= 14)) ? 2 : 3));\n" "X-Generator: crowdin.com\n" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: pl\n" @@ -24,36 +24,45 @@ msgid_plural "%d commits" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "%d commit behind" msgid_plural "%d commits behind" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "%d issue" msgid_plural "%d issues" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "%d layer" msgid_plural "%d layers" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "%d merge request" msgid_plural "%d merge requests" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -63,6 +72,10 @@ msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" + +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -73,11 +86,15 @@ msgstr "" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "%{text} is available" msgstr "" @@ -96,6 +113,7 @@ msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "1st contribution!" msgstr "" @@ -139,9 +157,15 @@ msgstr "" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "" @@ -160,12 +184,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -190,6 +247,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -199,12 +262,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -217,6 +304,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -241,15 +334,15 @@ msgstr "" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "" -msgid "Are you sure you want to discard your changes?" -msgstr "" - msgid "Are you sure you want to reset registration token?" msgstr "" msgid "Are you sure you want to reset the health check token?" msgstr "" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "" @@ -289,6 +382,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -313,7 +409,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -325,6 +427,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -379,14 +484,12 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "" @@ -679,6 +782,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -733,6 +839,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -781,6 +890,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -832,9 +944,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -970,6 +1079,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "" @@ -978,6 +1093,14 @@ msgid_plural "Commits" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Commit Message" msgstr "" @@ -991,6 +1114,9 @@ msgstr "" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "" @@ -1132,6 +1258,9 @@ msgstr "" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "" @@ -1144,9 +1273,18 @@ msgstr "" msgid "Create New Directory" msgstr "" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "" @@ -1165,6 +1303,9 @@ msgstr "" msgid "Create merge request" msgstr "" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1189,6 +1330,12 @@ msgstr "" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1243,6 +1390,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "" @@ -1254,6 +1404,7 @@ msgid_plural "Deploys" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Deploy Keys" msgstr "" @@ -1276,7 +1427,7 @@ msgstr "" msgid "Disable" msgstr "" -msgid "Discard changes" +msgid "Discard draft" msgstr "" msgid "Discover GitLab Geo." @@ -1336,6 +1487,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1390,9 +1544,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1459,12 +1622,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1480,6 +1667,9 @@ msgstr "" msgid "Files" msgstr "" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "" @@ -1500,6 +1690,7 @@ msgid_plural "Forks" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "ForkedFromProjectPath|Forked from" msgstr "" @@ -1516,6 +1707,9 @@ msgstr "" msgid "From merge request merge until deploy to production" msgstr "" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1663,6 +1857,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1755,6 +1967,7 @@ msgid_plural "Hide values" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "History" msgstr "" @@ -1762,6 +1975,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "" @@ -1774,6 +1990,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "" @@ -1782,6 +2001,7 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Instance does not support multiple Kubernetes clusters" msgstr "" @@ -1825,6 +2045,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1855,6 +2078,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1875,6 +2101,7 @@ msgid_plural "Last %d days" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Last Pipeline" msgstr "" @@ -1903,6 +2130,12 @@ msgstr "" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "" @@ -1921,6 +2154,9 @@ msgstr "" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1930,6 +2166,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1939,6 +2178,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1969,9 +2211,6 @@ msgstr "" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1984,6 +2223,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -2008,9 +2250,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "" @@ -2031,6 +2282,7 @@ msgid_plural "New Issues" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "New Kubernetes Cluster" msgstr "" @@ -2107,9 +2359,6 @@ msgstr "" msgid "No schedules" msgstr "" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2125,6 +2374,9 @@ msgstr "" msgid "Not enough data" msgstr "" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "" @@ -2227,6 +2479,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2332,6 +2587,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "" @@ -2365,6 +2638,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2527,12 +2803,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2554,9 +2848,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2575,6 +2878,12 @@ msgstr "" msgid "Push events" msgstr "" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2638,6 +2947,9 @@ msgstr "" msgid "Repository" msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "" @@ -2650,11 +2962,15 @@ msgstr "" msgid "Reset runners registration token" msgstr "" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Revert this commit" msgstr "" @@ -2662,6 +2978,9 @@ msgstr "" msgid "Revert this merge request" msgstr "" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2707,12 +3026,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "" msgid "Select a timezone" msgstr "" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2725,6 +3050,9 @@ msgstr "" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2737,6 +3065,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "" @@ -2746,15 +3077,15 @@ msgstr "" msgid "Set up Koding" msgstr "" -msgid "Set up auto deploy" -msgstr "" - msgid "SetPasswordToCloneLink|set a password" msgstr "" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2764,6 +3095,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2775,6 +3109,7 @@ msgid_plural "Showing %d events" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Sidebar|Change weight" msgstr "" @@ -2806,12 +3141,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2917,6 +3264,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "" @@ -2956,11 +3306,12 @@ msgstr "" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Tags" msgstr "" @@ -3091,9 +3442,15 @@ msgstr "" msgid "The repository for this project does not exist." msgstr "" +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "" @@ -3187,6 +3544,9 @@ msgstr "" msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3348,19 +3708,27 @@ msgid_plural "Time|hrs" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Time|min" msgid_plural "Time|mins" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Time|s" msgstr "" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3376,10 +3744,10 @@ msgstr "" msgid "Total Time" msgstr "" -msgid "Total issue time spent" +msgid "Total test time for all commits/merges" msgstr "" -msgid "Total test time for all commits/merges" +msgid "Total: %{total}" msgstr "" msgid "Track activity with Contribution Analytics." @@ -3388,9 +3756,6 @@ msgstr "" msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" msgstr "" @@ -3400,9 +3765,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3418,6 +3780,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "" @@ -3463,6 +3828,9 @@ msgstr "" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3499,6 +3867,9 @@ msgstr "" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3619,6 +3990,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "" @@ -3631,10 +4005,13 @@ msgstr "" msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3652,12 +4029,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "" @@ -3691,6 +4080,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3718,7 +4110,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3730,7 +4122,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3745,6 +4137,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3757,6 +4158,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3771,15 +4178,47 @@ msgid_plural "days" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3814,6 +4253,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3847,6 +4289,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3901,6 +4346,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,6 +4372,7 @@ msgid_plural "parents" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "password" msgstr "" @@ -3949,3 +4398,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po index 5aef8f45234..277552a8d02 100644 --- a/locale/pt_BR/gitlab.po +++ b/locale/pt_BR/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:01-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:20-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -49,6 +49,9 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss msgstr[0] "%s commit adicional foi omitido para prevenir problemas de performance." msgstr[1] "%s commits adicionais foram omitidos para prevenir problemas de performance." +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -57,6 +60,9 @@ msgid_plural "%{count} participants" msgstr[0] "%{count} participante" msgstr[1] "%{count} participantes" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} commits atrás de %{default_branch}, %{number_commits_ahead} commits à frente" @@ -66,6 +72,9 @@ msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab permitirá msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab não tentará mais automaticamente. Redefina as informações de storage quando o problema for resolvido." +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}: falha na tentativa de acesso ao storage no host:" @@ -130,9 +139,15 @@ msgstr "Adicionar Guia de contribuição" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "Adicione o Webhooks de Grupos e GitLab Enterprise Edition." +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Adicionar Licença" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Adicionar novo diretório" @@ -151,12 +166,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "página de saúde" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -181,6 +229,12 @@ msgstr "Erro ao modificar notificação de assinatura" msgid "An error occurred when updating the issue weight" msgstr "Um erro aconteceu ao atualizar o peso da issue" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -190,12 +244,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "Erro ao recuperar informações da barra lateral" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -208,6 +286,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -232,15 +316,15 @@ msgstr "Projeto arquivado! O repositório é somente leitura" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Tem certeza que deseja excluir este agendamento de pipeline?" -msgid "Are you sure you want to discard your changes?" -msgstr "Você tem certeza que deseja descartar suas alterações?" - msgid "Are you sure you want to reset registration token?" msgstr "Você tem certeza que quer recriar o token de registro?" msgid "Are you sure you want to reset the health check token?" msgstr "Você tem certeza que quer reiniciar o token de status de saúde?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "Você tem certeza?" @@ -280,6 +364,9 @@ msgstr "Autor" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -304,8 +391,14 @@ msgstr "Ele gerará a build, testará e fará deploy de sua aplicação automati msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "Saiba mais em %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "Você pode ativar %{link_to_settings} para esse projeto." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" msgid "Available" msgstr "DisponÃvel" @@ -316,6 +409,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "Cobrança" @@ -370,13 +466,10 @@ msgstr "pago %{price_per_year} anualmente" msgid "BillingPlans|per user" msgstr "por usuário" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Branch" -msgstr[1] "Branches" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "O branch <strong>%{branch_name}</strong> foi criado. Para configurar o deploy automático, selecione um modelo de Yaml do GitLab CI e commit suas mudanças. %{link_to_autodeploy_doc}" @@ -669,6 +762,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "interruptor da api" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -723,6 +819,9 @@ msgstr "Copiar URL da API" msgid "ClusterIntegration|Copy CA Certificate" msgstr "Copiar certificado CA" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -771,6 +870,9 @@ msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "Ingressar" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "Instalar" @@ -822,9 +924,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "Leia mais sobre %{link_to_documentation}" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -960,6 +1059,12 @@ msgstr "configurado corretamente" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "Comentários" @@ -968,6 +1073,11 @@ msgid_plural "Commits" msgstr[0] "Commit" msgstr[1] "Commits" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "Mensagem de Commit" @@ -980,6 +1090,9 @@ msgstr "Mensagem de commit" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Commit" @@ -1121,6 +1234,9 @@ msgstr "Copiar URL para área de transferência" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Copiar SHA do commit para a área de transferência" @@ -1133,9 +1249,18 @@ msgstr "" msgid "Create New Directory" msgstr "Criar Novo Diretório" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Crie um token de acesso pessoal na sua conta para dar pull ou push via %{protocol}." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Criar diretório" @@ -1154,6 +1279,9 @@ msgstr "" msgid "Create merge request" msgstr "Criar merge request" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "Criar novo branch" @@ -1178,6 +1306,12 @@ msgstr "Tag" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "criar um token de acesso pessoal" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "Criando épico" @@ -1232,6 +1366,9 @@ msgstr "Dez" msgid "December" msgstr "Dezembro" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Defina um padrão personalizado utilizando a sintaxe do cron" @@ -1264,8 +1401,8 @@ msgstr "Nome do diretório" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "Descartar alterações" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1324,6 +1461,9 @@ msgstr "Emails" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "Um erro ocorreu ao recuperar ambientes." @@ -1378,9 +1518,18 @@ msgstr "Épico será removido! Tem certeza?" msgid "Epics" msgstr "Épicos" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "Epics permite que você gerencie seu portfólio de projetos de forma mais eficiente e com menos esforço" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "Erro ao criar épico" @@ -1447,12 +1596,36 @@ msgstr "Explorar projetos" msgid "Explore public groups" msgstr "Explorar grupos públicos" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "Erro ao alterar o proprietário" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Erro ao excluir o agendamento do pipeline" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "Fev" @@ -1468,6 +1641,9 @@ msgstr "Nome do arquivo" msgid "Files" msgstr "Arquivos" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Filtrar por mensagem de commit" @@ -1503,6 +1679,9 @@ msgstr "Da abertura de tarefas até a implantação para a produção" msgid "From merge request merge until deploy to production" msgstr "Do merge request até a implantação em produção" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "Chaves GPG" @@ -1650,6 +1829,24 @@ msgstr "Autenticação do Google não está %{link_to_documentation}. Peça ao a msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "Bloquear compartilhamento de projetos do grupo %{group} com outros grupos" @@ -1748,6 +1945,9 @@ msgstr "Histórico" msgid "Housekeeping successfully started" msgstr "Manutenção iniciada com sucesso" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "Importar repositório" @@ -1760,6 +1960,9 @@ msgstr "Melhore a gerência de issues com pesos no GitLab Enterprise Edition." msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "Encontre o que precisa mais facilmente com a pesquisa global avançada com GitLab Enterprise Edition." +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "Instalar um Runner compatÃvel com o GitLab CI" @@ -1810,6 +2013,9 @@ msgstr "Jan" msgid "January" msgstr "Janeiro" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "Jul" @@ -1840,6 +2046,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1887,6 +2096,12 @@ msgstr "em" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "Saiba mais em" @@ -1905,6 +2120,9 @@ msgstr "Sair do projeto" msgid "License" msgstr "Licença" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1914,6 +2132,9 @@ msgstr "Bloquear" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1923,6 +2144,9 @@ msgstr "Bloqueado" msgid "Locked Files" msgstr "Arquivos bloqueados" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "Entrar" @@ -1953,9 +2177,6 @@ msgstr "Mediana" msgid "Members" msgstr "Membros" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "Merge Requests" @@ -1968,6 +2189,9 @@ msgstr "Merge requests" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1992,9 +2216,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "adicione uma chave SSH" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "Monitoramento" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "Mais informações estão disponÃveis|aqui" @@ -2090,9 +2323,6 @@ msgstr "Nenhum repositório" msgid "No schedules" msgstr "Nenhum agendamento" -msgid "No time spent" -msgstr "Nenhum tempo gasto" - msgid "None" msgstr "Nenhum" @@ -2108,6 +2338,9 @@ msgstr "" msgid "Not enough data" msgstr "Dados insuficientes" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Eventos de notificação" @@ -2210,6 +2443,9 @@ msgstr "Abrir em nova janela" msgid "Options" msgstr "Opções" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "Visão geral" @@ -2315,6 +2551,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "todos" @@ -2348,6 +2602,9 @@ msgstr "Privado - O acesso ao projeto deve ser concedido explicitamente para cad msgid "Private - The group and its projects can only be viewed by members." msgstr "Privado - O grupo e seus projetos só podem ser vistos por seus membros." +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "Perfil" @@ -2510,12 +2767,30 @@ msgstr "Desculpe, nenhum projeto corresponde a sua pesquisa" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Esta funcionalidade necessita de suporte à localStorage do navegador" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "Por padrão, Prometheus escuta em 'http://localhost:9090'. Não é recomendado mudar o endereço padrão e sua porta, porque pode conflitar com outros serviços que estão executando no sevidor do Gitlab." msgid "PrometheusService|Finding and configuring metrics..." msgstr "Encontrando e configurando métricas..." +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "Métricas" @@ -2537,9 +2812,18 @@ msgstr "Nenhuma métrica está sendo monitorada. Para inicar o monitoramento, fa msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "URL da API base do Prometheus. como http://prometheus.example.com/" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "Ver ambientes" @@ -2558,6 +2842,12 @@ msgstr "Regras de push" msgid "Push events" msgstr "Eventos de push" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "Restrição de commit" @@ -2621,6 +2911,9 @@ msgstr "" msgid "Repository" msgstr "Repositório" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "Solicitar acesso" @@ -2633,6 +2926,9 @@ msgstr "Recriar o token de status de saúde" msgid "Reset runners registration token" msgstr "Recriar o token de registro de runners" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2644,6 +2940,9 @@ msgstr "Reverter este commit" msgid "Revert this merge request" msgstr "Reverter esse merge request" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "Chaves SSH" @@ -2689,12 +2988,18 @@ msgstr "Segundo de espera para tentativa de acesso ao storage" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Selecionar Formato do Arquivo" msgid "Select a timezone" msgstr "Selecionar fuso horário" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2707,6 +3012,9 @@ msgstr "Selecionar branch de destino" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "Set" @@ -2719,6 +3027,9 @@ msgstr "" msgid "Service Templates" msgstr "Modelos de serviço" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Defina uma senha para sua conta para aceitar ou entregar código via %{protocol}." @@ -2728,15 +3039,15 @@ msgstr "" msgid "Set up Koding" msgstr "Configurar Koding" -msgid "Set up auto deploy" -msgstr "Configurar implantação automática" - msgid "SetPasswordToCloneLink|set a password" msgstr "defina uma senha" msgid "Settings" msgstr "Configurações" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2746,6 +3057,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "Mostrar páginas acima" @@ -2787,12 +3101,24 @@ msgstr "Algo deu errado ao tentar mudar o estado de ${this.issuableDisplayName}" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "Algo deu errado ao recuperar os projetos." msgid "Something went wrong while fetching the registry list." msgstr "Algo deu errado ao recuperar a lista de registro." +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2898,6 +3224,9 @@ msgstr "Peso" msgid "Source" msgstr "Origem" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "Código-fonte" @@ -2937,10 +3266,10 @@ msgstr "Trocar branch/tag" msgid "System Hooks" msgstr "Hooks do sistema" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Tag" -msgstr[1] "Tags" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" msgid "Tags" msgstr "Tags" @@ -3071,9 +3400,15 @@ msgstr "O projeto pode ser acessado sem a necessidade de autenticação." msgid "The repository for this project does not exist." msgstr "Não existe repositório para este projeto." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "A etapa de revisão mostra o tempo de criação de uma solicitação de incorporação até sua aceitação. Os dados serão automaticamente adicionados depois que sua primeira solicitação de incorporação for aceita." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "A etapa de homologação mostra o tempo entre o aceite da solicitação de incorporação e a implantação do código no ambiente de produção. Os dados serão automaticamente adicionados depois que você implantar em produção pela primeira vez." @@ -3167,6 +3502,9 @@ msgstr "Isto significa que você não pode entregar código até que crie um rep msgid "This merge request is locked." msgstr "Esse merge request está bloqueado." +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3336,9 +3674,15 @@ msgstr[1] "mins" msgid "Time|s" msgstr "s" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "TÃtulo" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3354,21 +3698,18 @@ msgstr "" msgid "Total Time" msgstr "Tempo Total" -msgid "Total issue time spent" -msgstr "Tempo total gasto" - msgid "Total test time for all commits/merges" msgstr "Tempo de teste total para todos os commits/merges" +msgid "Total: %{total}" +msgstr "" + msgid "Track activity with Contribution Analytics." msgstr "Acompanhe a atividade com o Contribution Analytics." msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "Acompanhe grupos de questões que compartilhem um tema, em projetos e milestones" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" msgstr "" @@ -3378,9 +3719,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "Ativar Service Desk" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3396,6 +3734,9 @@ msgstr "" msgid "Unlocked" msgstr "Desbloqueado" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "Desmarcar" @@ -3441,6 +3782,9 @@ msgstr "Utilizar configuração de notificação global" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "Ver arquivo @ " @@ -3477,6 +3821,9 @@ msgstr "Esta etapa não possui dados suficientes para exibição." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "Queremos ter certeza de que é você, confirme que você não é um robô." +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "Webhooks permitem que você acione uma URL se, por exemplo, quando um novo código for feito push ou uma nova issue criada. Você pode configurar os webhooks para escutar eventos especÃficos como push, issue ou merge request. Webhooks de grupo aplicarão para todos os projetos no grupo, permitindo você padronizar o funcionamento em todo o grupo." @@ -3597,6 +3944,9 @@ msgstr "Com a análise de contribuição, você pode ter uma visão geral da ati msgid "Withdraw Access Request" msgstr "Remover Requisição de Acesso" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Você vai remover %{group_name}. Grupos removidos NÃO PODEM ser restaurados! Você está ABSOLUTAMENTE certo?" @@ -3609,10 +3959,13 @@ msgstr "Você está prestes a remover a relação de fork do projeto original %{ msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Você irá transferir %{project_name_with_namespace} para outro proprietário. Tem certeza ABSOLUTA?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3630,12 +3983,24 @@ msgstr "Você não pode escrever numa instância secundária de somente leitura msgid "You cannot write to this read-only GitLab instance." msgstr "Você não pode escrever nesta instância somente-leitura do GitLab." +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Você atingiu o limite de seu projeto" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "Você deve estar autenticado para marcar um projeto" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "Você precisa de permissão." @@ -3669,6 +4034,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "Seu comentário não estará visÃvel ao público." @@ -3696,7 +4064,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3708,7 +4076,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3723,6 +4091,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3735,6 +4112,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "commit" @@ -3752,11 +4135,41 @@ msgstr[1] "dias" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3790,6 +4203,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3823,6 +4239,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3877,6 +4296,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3924,3 +4346,6 @@ msgstr "nome do usuário" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po index 0adb8e5b716..6214460fc21 100644 --- a/locale/ru/gitlab.po +++ b/locale/ru/gitlab.po @@ -2,15 +2,15 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 04:01-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:53-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Russian\n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" "X-Generator: crowdin.com\n" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ru\n" @@ -24,36 +24,45 @@ msgid_plural "%d commits" msgstr[0] "%d коммит" msgstr[1] "%d коммита" msgstr[2] "%d коммитов" +msgstr[3] "%d коммитов" msgid "%d commit behind" msgid_plural "%d commits behind" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "на %d коммит позади" +msgstr[1] "на %d коммита позади" +msgstr[2] "на %d коммитов позади" +msgstr[3] "на %d коммитов позади" msgid "%d issue" msgid_plural "%d issues" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%d обÑуждение" +msgstr[1] "%d обÑуждений" +msgstr[2] "%d обÑуждений" +msgstr[3] "%d обÑуждений" msgid "%d layer" msgid_plural "%d layers" msgstr[0] "%d Ñлой" msgstr[1] "%d ÑлоÑ" -msgstr[2] "%d Ñлоёв" +msgstr[2] "%d Ñлоев" +msgstr[3] "%d Ñлоёв" msgid "%d merge request" msgid_plural "%d merge requests" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%d Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" +msgstr[1] "%d запроÑа на ÑлиÑние" +msgstr[2] "%d запроÑов на ÑлиÑние" +msgstr[3] "%d запроÑов на ÑлиÑние" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." -msgstr[0] "%s добавленный коммит был иÑключен Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." -msgstr[1] "%s добавленных коммита были иÑключены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." -msgstr[2] "%s добавленных коммитов были иÑключены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." +msgstr[0] "%s дополнительный коммит был пропущен Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." +msgstr[1] "%s дополнительных коммита было пропущено Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." +msgstr[2] "%s дополнительных коммитов было пропущено Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." +msgstr[3] "%s дополнительных коммитов было пропущено Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -63,6 +72,10 @@ msgid_plural "%{count} participants" msgstr[0] "%{count} учаÑтник" msgstr[1] "%{count} учаÑтника" msgstr[2] "%{count} учаÑтников" +msgstr[3] "%{count} учаÑтников" + +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "на %{number_commits_behind} коммитов позади %{default_branch}, на %{number_commits_ahead} коммитов впереди" @@ -73,11 +86,15 @@ msgstr "%{number_of_failures} из %{maximum_failures} возможных неу msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} из %{maximum_failures} возможных неудачных попыток. GitLab не будет автоматичеÑки повторÑÑ‚ÑŒ попытку. СброÑьте информацию хранилища поÑле уÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹." +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}: Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° доÑтупа к хранилищу на хоÑте:" -msgstr[1] "%{storage_name}: %{failed_attempts} - неудачные попытки доÑтупа к хранилищу:" -msgstr[2] "%{storage_name}: %{failed_attempts} - неудачные попытки доÑтупа к хранилищу:" +msgstr[1] "%{storage_name}: %{failed_attempts} неудачные попытки доÑтупа к хранилищу:" +msgstr[2] "%{storage_name}: %{failed_attempts} неудачных попыток доÑтупа к хранилищу:" +msgstr[3] "%{storage_name}: %{failed_attempts} неудачных попыток доÑтупа к хранилищу:" msgid "%{text} is available" msgstr "%{text} доÑтупен" @@ -96,6 +113,7 @@ msgid_plural "%d pipelines" msgstr[0] "1 ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ" msgstr[1] "%d Ñборочных линии" msgstr[2] "%d Ñборочных линий" +msgstr[3] "%d Ñборочных линий" msgid "1st contribution!" msgstr "Первый вклад!" @@ -139,9 +157,15 @@ msgstr "Добавить РуководÑтво учаÑтника" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "Добавить групповые веб-обработчики и GitLab Enterprise Edition." +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "Добавить Лицензию" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "Добавить новый каталог" @@ -149,23 +173,56 @@ msgid "Add todo" msgstr "" msgid "AdminArea|Stop all jobs" -msgstr "" +msgstr "ОÑтановить вÑе заданиÑ" msgid "AdminArea|Stop all jobs?" -msgstr "" +msgstr "ОÑтановить вÑе заданиÑ?" msgid "AdminArea|Stop jobs" -msgstr "" +msgstr "ОÑтановить заданиÑ" msgid "AdminArea|Stopping jobs failed" -msgstr "" +msgstr "ОÑтановка заданий не удалаÑÑŒ" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." -msgstr "" +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." +msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ оÑтановить вÑе заданиÑ. Ðто дейÑтвие оÑтановит вÑе текущие заданиÑ, находÑщиеÑÑ Ð² процеÑÑе выполнениÑ." msgid "AdminHealthPageLink|health page" msgstr "Ñтраница работоÑпоÑобноÑти" +msgid "AdminProjects|Delete" +msgstr "Удалить" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "Удалить Проект %{projectName}?" + +msgid "AdminProjects|Delete project" +msgstr "Удалить проект" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "Заблокировать пользователÑ" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "Удалить ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username} и внеÑённые им Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ?" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "Удалить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username} ?" + +msgid "AdminUsers|Delete user" +msgstr "Удалить пользователÑ" + +msgid "AdminUsers|Delete user and contributions" +msgstr "Удалить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ внеÑённые им изменениÑ" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ, введите %{projectName}" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ, введите %{username}" + msgid "Advanced" msgstr "" @@ -182,7 +239,7 @@ msgid "Allows you to add and manage Kubernetes clusters." msgstr "" msgid "An error occurred previewing the blob" -msgstr "" +msgstr "Произошла ошибка при предварительном проÑмотре объекта" msgid "An error occurred when toggling the notification subscription" msgstr "Произошла ошибка при переключении подпиÑки на оповещениÑ" @@ -190,35 +247,71 @@ msgstr "Произошла ошибка при переключении подп msgid "An error occurred when updating the issue weight" msgstr "Произошла ошибка при обновлении веÑа обÑуждениÑ" +msgid "An error occurred while adding approver" +msgstr "Произошла ошибка при добавлении утверждающего" + +msgid "An error occurred while detecting host keys" +msgstr "Произошла ошибка при обнаружении ключей хоÑта" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." -msgstr "" +msgstr "Произошла ошибка при отключении ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ функции. Обновите Ñтраницу и повторите попытку." msgid "An error occurred while fetching markdown preview" -msgstr "" +msgstr "Произошла ошибка при предварительном проÑмотре markdown" msgid "An error occurred while fetching sidebar data" msgstr "Произошла ошибка при получении денег данных Ð´Ð»Ñ Ð±Ð¾ÐºÐ¾Ð²Ð¾Ð¹ панели" +msgid "An error occurred while fetching the pipeline." +msgstr "Произошла ошибка при получении Ñборочной линии." + msgid "An error occurred while getting projects" -msgstr "" +msgstr "Произошла ошибка при получении ÑпиÑка проектов" + +msgid "An error occurred while importing project" +msgstr "Произошла ошибка при импорте проекта" + +msgid "An error occurred while initializing path locks" +msgstr "Произошла ошибка при инициализации блокировок пути" + +msgid "An error occurred while loading commits" +msgstr "Произошла ошибка при загрузке коммитов" + +msgid "An error occurred while loading diff" +msgstr "Произошла ошибка при загрузке различий" msgid "An error occurred while loading filenames" -msgstr "" +msgstr "Произошла ошибка при загрузке ÑпиÑка файлов" + +msgid "An error occurred while loading the file" +msgstr "Произошла ошибка при загрузке файла" + +msgid "An error occurred while making the request." +msgstr "Произошла ошибка при выполнении запроÑа." + +msgid "An error occurred while removing approver" +msgstr "Произошла ошибка при удалении утверждающего" msgid "An error occurred while rendering KaTeX" -msgstr "" +msgstr "Произошла ошибка при рендеринге KaTeX" msgid "An error occurred while rendering preview broadcast message" -msgstr "" +msgstr "Произошла ошибка при визуализации проÑмотра широковещательного ÑообщениÑ" msgid "An error occurred while retrieving calendar activity" -msgstr "" +msgstr "Произошла ошибка при получении ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñти" msgid "An error occurred while retrieving diff" -msgstr "" +msgstr "Произошла ошибка при получении различий" + +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "Произошла ошибка при Ñохранении ÑтатуÑа наÑтроенного LDAP. ПожалуйÑта, попробуйте еще раз." + +msgid "An error occurred while saving assignees" +msgstr "Произошла ошибка при Ñохранении иÑполнителÑ" msgid "An error occurred while validating username" -msgstr "" +msgstr "Произошла ошибка при проверке имени пользователÑ" msgid "An error occurred. Please try again." msgstr "Произошла ошибка. ПожалуйÑта, попробуйте Ñнова." @@ -241,15 +334,15 @@ msgstr "Ðрхивный проект! Репозиторий доÑтупен Ñ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить Ñто раÑпиÑание Ñборочной линии?" -msgid "Are you sure you want to discard your changes?" -msgstr "Ð’Ñ‹ уверены, что хотите отменить ваши изменениÑ?" - msgid "Are you sure you want to reset registration token?" msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот региÑтрационный токен?" msgid "Are you sure you want to reset the health check token?" msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот токен проверки работоÑпоÑобноÑти?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "Ð’Ñ‹ уверены?" @@ -289,6 +382,9 @@ msgstr "Ðвтор" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -313,8 +409,14 @@ msgstr "Ð”Ð»Ñ Ñтого проекта может быть активировРmsgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "Подробнее по ÑÑылке %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "Ð’Ñ‹ можете активировать %{link_to_settings} Ð´Ð»Ñ Ñтого проекта." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" msgid "Available" msgstr "ДоÑтупен" @@ -325,6 +427,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "Тариф" @@ -379,14 +484,12 @@ msgstr "оплачиваетÑÑ ÐµÐ¶ÐµÐ³Ð¾Ð´Ð½Ð¾ в размере %{price_per_ msgid "BillingPlans|per user" msgstr "за пользователÑ" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Ветка" -msgstr[1] "Ветки" -msgstr[2] "Ветки" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "Ветка (%{branch_count})" +msgstr[1] "Ветки (%{branch_count})" +msgstr[2] "Ветки (%{branch_count})" +msgstr[3] "Ветки (%{branch_count})" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Ветка <strong>%{branch_name}</strong> Ñоздана. Ð”Ð»Ñ Ð½Ð°Ñтройки автоматичеÑкого Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ YAML-шаблон Ð´Ð»Ñ GitLab CI и зафикÑируйте Ñвои изменениÑ. %{link_to_autodeploy_doc}" @@ -679,6 +782,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "CircuitBreaker API" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -733,6 +839,9 @@ msgstr "Скопировать Ð°Ð´Ñ€ÐµÑ API" msgid "ClusterIntegration|Copy CA Certificate" msgstr "Копировать Сертификат УдоÑтоверÑющего Центра" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -781,6 +890,9 @@ msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "Ingress" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "УÑтановить" @@ -832,9 +944,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "Узнайте больше на %{link_to_documentation}" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -970,14 +1079,28 @@ msgstr "правильно наÑтроен" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "Комментарии" msgid "Commit" msgid_plural "Commits" msgstr[0] "Коммит" -msgstr[1] "Коммиты" -msgstr[2] "Коммиты" +msgstr[1] "Коммита" +msgstr[2] "Коммитов" +msgstr[3] "Коммиты" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "Коммит (%{commit_count})" +msgstr[1] "Коммита (%{commit_count})" +msgstr[2] "Коммитов (%{commit_count})" +msgstr[3] "Коммитов (%{commit_count})" msgid "Commit Message" msgstr "ОпиÑание Коммита" @@ -991,6 +1114,9 @@ msgstr "ОпиÑание коммита" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "Коммит" @@ -1013,7 +1139,7 @@ msgid "Commits per weekday" msgstr "" msgid "Commits|An error occurred while fetching merge requests data." -msgstr "" +msgstr "Произошла ошибка при получении данных запроÑа на ÑлиÑниÑ." msgid "Commits|Commit: %{commitText}" msgstr "" @@ -1132,6 +1258,9 @@ msgstr "Копировать URL в буфер обмена" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "Копировать SHA коммита в буфер обмена" @@ -1144,9 +1273,18 @@ msgstr "" msgid "Create New Directory" msgstr "Создать Ðовый каталог" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Создать личный токен на аккаунте Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отправки через %{protocol}." +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "Создать каталог" @@ -1165,6 +1303,9 @@ msgstr "" msgid "Create merge request" msgstr "Создать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "Создать новую ветку" @@ -1189,6 +1330,12 @@ msgstr "Тег" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "Ñоздать перÑональный токен доÑтупа" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "Создание Ñпика" @@ -1243,6 +1390,9 @@ msgstr "Дек." msgid "December" msgstr "Декабрь" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Определить наÑтраиваемый шаблон Ñ ÑинтакÑиÑом cron" @@ -1251,9 +1401,10 @@ msgstr "Удалить" msgid "Deploy" msgid_plural "Deploys" -msgstr[0] "Развернуть" -msgstr[1] "Развертывание" -msgstr[2] "Развертывание" +msgstr[0] "Развертывание" +msgstr[1] "РазвертываниÑ" +msgstr[2] "Развертываний" +msgstr[3] "РазвертываниÑ" msgid "Deploy Keys" msgstr "Ключи РазвертываниÑ" @@ -1276,8 +1427,8 @@ msgstr "Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "Отменить изменениÑ" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1336,6 +1487,9 @@ msgstr "Email-адреÑа" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "Произошла ошибка при получении окружений." @@ -1390,9 +1544,18 @@ msgstr "Ðпик будет удален! Ð’Ñ‹ уверены?" msgid "Epics" msgstr "Ðпики" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "Ðпики позволÑÑ‚ вам управлÑÑ‚ÑŒ портфелем проектов более Ñффективно и Ñ Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼Ð¸ уÑилиÑми" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñпика" @@ -1459,12 +1622,36 @@ msgstr "Обзор проектов" msgid "Explore public groups" msgstr "ИÑÑледовать публичные группы" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "Ðевыполненные ЗаданиÑ" + msgid "Failed to change the owner" msgstr "Ðе удалоÑÑŒ изменить владельца" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "Ðе удалоÑÑŒ удалить раÑпиÑание Ñборочной линии" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "Фев." @@ -1480,6 +1667,9 @@ msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" msgid "Files" msgstr "Файлы" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "Фильтр по комментариÑми к коммитам" @@ -1497,9 +1687,10 @@ msgstr "отправлено автором" msgid "Fork" msgid_plural "Forks" -msgstr[0] "Ответвление" -msgstr[1] "ОтветвлениÑ" -msgstr[2] "ОтветвлениÑ" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "ForkedFromProjectPath|Forked from" msgstr "Ответвлено от" @@ -1516,6 +1707,9 @@ msgstr "От ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ развертывани msgid "From merge request merge until deploy to production" msgstr "От запроÑа на ÑлиÑние до Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² рабочей Ñреде" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "GPG Ключи" @@ -1663,6 +1857,24 @@ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Google не %{link_to_documentation}. ПоРmsgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "Запретить публикацию проектов из %{group} в других группах" @@ -1755,6 +1967,7 @@ msgid_plural "Hide values" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "History" msgstr "ИÑториÑ" @@ -1762,6 +1975,9 @@ msgstr "ИÑториÑ" msgid "Housekeeping successfully started" msgstr "ОчиÑтка уÑпешно запущена" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "Импорт репозиториÑ" @@ -1774,14 +1990,18 @@ msgstr "Улучшить управление обÑуждениÑми возмРmsgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "Улучшить поиÑк при помощи РаÑширенного Глобального ПоиÑка и GitLab Enterprise Edition." +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "УÑтановите Gitlab Runner ÑовмеÑтимый Ñ Gitlab CI" msgid "Instance" msgid_plural "Instances" -msgstr[0] "ÐкземплÑÑ€" -msgstr[1] "ÐкземплÑра" -msgstr[2] "ÐкземплÑров" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Instance does not support multiple Kubernetes clusters" msgstr "" @@ -1825,6 +2045,9 @@ msgstr "Янв." msgid "January" msgstr "Январь" +msgid "Jobs" +msgstr "ЗаданиÑ" + msgid "Jul" msgstr "Июл." @@ -1855,6 +2078,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1873,8 +2099,9 @@ msgstr "" msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "ПоÑледний %d день" -msgstr[1] "ПоÑледние %d дни" -msgstr[2] "ПоÑледние %d дни" +msgstr[1] "ПоÑледние %d днÑ" +msgstr[2] "ПоÑледние %d дней" +msgstr[3] "ПоÑледние %d дни" msgid "Last Pipeline" msgstr "ПоÑледнÑÑ Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð›Ð¸Ð½Ð¸Ñ" @@ -1903,6 +2130,12 @@ msgstr "в" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "Узнайте больше в" @@ -1921,6 +2154,9 @@ msgstr "Покинуть проект" msgid "License" msgstr "ЛицензиÑ" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1930,6 +2166,9 @@ msgstr "Блокировка" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1939,6 +2178,9 @@ msgstr "Заблокировано" msgid "Locked Files" msgstr "Заблокированные Файлы" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "Войти" @@ -1969,9 +2211,6 @@ msgstr "Среднее" msgid "Members" msgstr "УчаÑтники" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "ЗапроÑÑ‹ на СлиÑние" @@ -1984,6 +2223,9 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -2008,9 +2250,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "добавить ключ SSH" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "Мониторинг" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "Больше информации доÑтупно|тут" @@ -2031,6 +2282,7 @@ msgid_plural "New Issues" msgstr[0] "Ðовое ОбÑуждение" msgstr[1] "Ðовых ОбÑуждениÑ" msgstr[2] "Ðовых ОбÑуждений" +msgstr[3] "Ðовые ОбÑуждениÑ" msgid "New Kubernetes Cluster" msgstr "" @@ -2107,9 +2359,6 @@ msgstr "Ðет репозиториÑ" msgid "No schedules" msgstr "Ðет раÑпиÑаний" -msgid "No time spent" -msgstr "Ðет затраченного времени" - msgid "None" msgstr "ПуÑто" @@ -2125,6 +2374,9 @@ msgstr "" msgid "Not enough data" msgstr "ÐедоÑтаточно данных" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобытиÑÑ…" @@ -2227,6 +2479,9 @@ msgstr "ОткроетÑÑ Ð² новом окне" msgid "Options" msgstr "ÐаÑтройки" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "Обзор" @@ -2332,6 +2587,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "вÑе" @@ -2365,6 +2638,9 @@ msgstr "Приватный - ДоÑтуп к проекту должен преРmsgid "Private - The group and its projects can only be viewed by members." msgstr "ÐŸÑ€Ð¸Ð²Ð°Ñ‚Ð½Ð°Ñ - Группу и включённые в неё проекты могут видеть только члены группы." +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "Профиль" @@ -2527,12 +2803,30 @@ msgstr "К Ñожалению, по вашему запроÑу проекты Ð msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Ðта функциональноÑÑ‚ÑŒ требует поддержки localStorage в вашем браузере" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "По умолчанию, Prometheus запуÑкаетÑÑ Ð¿Ð¾ адреÑу ‘http://localhost:9090’. Ðе рекомендуетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ Ð°Ð´Ñ€ÐµÑ Ð¸ порт по умолчанию, так как Ñто может привеÑти к конфликту Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ ÑервиÑами запущенными на GitLab Ñервере." msgid "PrometheusService|Finding and configuring metrics..." msgstr "Определение и наÑтройка метрик..." +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "Метрики" @@ -2554,9 +2848,18 @@ msgstr "Ðи одной метрики не отÑлеживаетÑÑ. Ð”Ð»Ñ Ð msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "Базовый Ð°Ð´Ñ€ÐµÑ Prometheus API, например http://prometheus.example.com/" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "ПроÑмотр окружений" @@ -2575,6 +2878,12 @@ msgstr "Правила Отправки" msgid "Push events" msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚ÐµÑ€Ð°" @@ -2606,13 +2915,13 @@ msgid "Related Commits" msgstr "СвÑзанные коммиты" msgid "Related Deployed Jobs" -msgstr "СвÑзанные задачи выгрузки" +msgstr "СвÑзанные Ð—Ð°Ð´Ð°Ð½Ð¸Ñ Ð Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ" msgid "Related Issues" msgstr "СвÑзанные ОбÑуждениÑ" msgid "Related Jobs" -msgstr "СвÑзанные задачи" +msgstr "СвÑзанные ЗаданиÑ" msgid "Related Merge Requests" msgstr "СвÑзанные ЗапроÑÑ‹ на СлиÑние" @@ -2638,6 +2947,9 @@ msgstr "" msgid "Repository" msgstr "Репозиторий" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа" @@ -2650,11 +2962,15 @@ msgstr "СброÑить ключ доÑтупа проверки Ñ€Ð°Ð±Ð¾Ñ‚Ð¾Ñ msgid "Reset runners registration token" msgstr "СброÑить ключ региÑтрации Gitlab Runners" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" msgid "Revert this commit" msgstr "Отменить Ñто коммит" @@ -2662,6 +2978,9 @@ msgstr "Отменить Ñто коммит" msgid "Revert this merge request" msgstr "Отменить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "SSH Ключи" @@ -2707,12 +3026,18 @@ msgstr "Секунд задержки между попытками доÑтуп msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "Выбрать формат архива" msgid "Select a timezone" msgstr "Выбор временной зоны" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2725,6 +3050,9 @@ msgstr "Выбор целевой ветки" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "Сент." @@ -2737,6 +3065,9 @@ msgstr "" msgid "Service Templates" msgstr "Шаблоны Служб" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "УÑтановите пароль в Ñвоем аккаунте, чтобы отправлÑÑ‚ÑŒ или получать код через %{protocol}." @@ -2746,15 +3077,15 @@ msgstr "" msgid "Set up Koding" msgstr "ÐаÑтройка Koding" -msgid "Set up auto deploy" -msgstr "ÐаÑтройка автоматичеÑкого развертываниÑ" - msgid "SetPasswordToCloneLink|set a password" msgstr "уÑтановите пароль" msgid "Settings" msgstr "ÐаÑтройки" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2764,6 +3095,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "Показать родительÑкие Ñтраницы" @@ -2773,8 +3107,9 @@ msgstr "Показать родительÑкие подгруппы" msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показано %d Ñобытие" -msgstr[1] "Показано %d Ñобытий" +msgstr[1] "Показано %d ÑобытиÑ" msgstr[2] "Показано %d Ñобытий" +msgstr[3] "Показано %d Ñобытий" msgid "Sidebar|Change weight" msgstr "Изменить веÑ" @@ -2806,12 +3141,24 @@ msgstr "Что-то пошло не так при попытке измененРmsgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "Что-то пошло не так при получении проектов." msgid "Something went wrong while fetching the registry list." msgstr "Что-то пошло не так при получении ÑпиÑка рееÑтров." +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2917,6 +3264,9 @@ msgstr "ВеÑ" msgid "Source" msgstr "ИÑточник" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "ИÑходный код" @@ -2956,11 +3306,12 @@ msgstr "Переключить ветка/тег" msgid "System Hooks" msgstr "СиÑтемные Обработчики" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Тег" -msgstr[1] "Теги" -msgstr[2] "Теги" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Tags" msgstr "Теги" @@ -3091,9 +3442,15 @@ msgstr "ДоÑтуп к проекту возможен без какой-либ msgid "The repository for this project does not exist." msgstr "Репозиторий Ð´Ð»Ñ Ñтого проекта не ÑущеÑтвует." +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "Ðтап обзора показывает Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа ÑлиÑÐ½Ð¸Ñ Ð´Ð¾ его выполнениÑ. Данные будут автоматичеÑки добавлены поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ запроÑа на ÑлиÑние." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "Ðтап поÑтановки показывает Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ ÑлиÑнием \"MR\" и развертыванием кода в производÑтвенной Ñреде. Данные будут автоматичеÑки добавлены поÑле Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² производÑтве первый раз." @@ -3167,7 +3524,7 @@ msgid "This job depends on a user to trigger its process. Often they are used to msgstr "" msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered" -msgstr "" +msgstr "Ðто задание завиÑит от рабочих заданий на верхнем уровне, которые должны завершитьÑÑ ÑƒÑпешно, чтобы Ñто задание было запущено" msgid "This job has not been triggered yet" msgstr "" @@ -3187,6 +3544,9 @@ msgstr "Ðто означает, что вы не можете Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ñ msgid "This merge request is locked." msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние заблокирован." +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3348,19 +3708,27 @@ msgid_plural "Time|hrs" msgstr[0] "ч" msgstr[1] "ч" msgstr[2] "ч" +msgstr[3] "ч" msgid "Time|min" msgid_plural "Time|mins" msgstr[0] "мин" msgstr[1] "мин" msgstr[2] "мин" +msgstr[3] "мин" msgid "Time|s" msgstr "Ñ" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "Заголовок" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3376,21 +3744,18 @@ msgstr "" msgid "Total Time" msgstr "Общее времÑ" -msgid "Total issue time spent" -msgstr "Общее времÑ, затраченное на обÑуждение" - msgid "Total test time for all commits/merges" msgstr "Общее Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¸ÐºÑаций/ÑлиÑний" +msgid "Total: %{total}" +msgstr "" + msgid "Track activity with Contribution Analytics." msgstr "ОтÑлеживать активноÑÑ‚ÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ðналитики УчаÑтников." msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "Следите за обÑуждениÑми, Ñгруппированными по темам, Ñразу из неÑкольких проектов и Ñтапов" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" msgstr "" @@ -3400,9 +3765,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "Включить Службу Поддержки" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3418,6 +3780,9 @@ msgstr "" msgid "Unlocked" msgstr "Разблокировано" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "СнÑÑ‚ÑŒ отметку" @@ -3463,6 +3828,9 @@ msgstr "ИÑпользуютÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¹ наÑтройки увеРmsgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "ПроÑмотр файла @ " @@ -3499,6 +3867,9 @@ msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ Ñтапу отÑутÑтвует." msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "Мы хотим быть уверены, что Ñто вы, пожалуйÑта, подтвердите, что вы не робот." +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "Веб-обработчики позволÑÑŽÑ‚ вам вызывать Ð°Ð´Ñ€ÐµÑ URL еÑли, например, отправлен новый код или Ñоздано новое обÑуждение. Ð’Ñ‹ можете наÑтроить веб-обработчики так, чтобы они реагировали на определённые ÑобытиÑ, такие как отправки кода, обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ запроÑÑ‹ на ÑлиÑние. Групповые веб-обработчики применÑÑŽÑ‚ÑÑ ÐºÐ¾ вÑем проектам в группе и позволÑÑŽÑ‚ вам Ñтандартизовать функциональноÑÑ‚ÑŒ веб-обработчиков Ð´Ð»Ñ Ð²Ñей вашей группы." @@ -3619,6 +3990,9 @@ msgstr "С аналитикой учаÑтников вы можете изучРmsgid "Withdraw Access Request" msgstr "Отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить %{group_name}. Удаленные группы ÐЕ МОГУТ быть воÑÑтановлены! Ð’Ñ‹ ÐБСОЛЮТÐО уверены?" @@ -3631,10 +4005,13 @@ msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить ÑвÑзь ответвлен msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ передать проект %{project_name_with_namespace} другому владельцу. Ð’Ñ‹ ÐБСОЛЮТÐО уверены?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3652,12 +4029,24 @@ msgstr "Ð’Ñ‹ не можете запиÑывать на подчиненные msgid "You cannot write to this read-only GitLab instance." msgstr "Ð’Ñ‹ не можете запиÑывать на Ñтот ÑкземплÑÑ€ \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab." +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "Ð’Ñ‹ доÑтигли Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² вашем проекте" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "Ðеобходимо войти, чтобы оценить проект" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "Вам нужно разрешение." @@ -3691,6 +4080,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "Ваш комментарий не будет виден вÑем." @@ -3718,7 +4110,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3730,7 +4122,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3745,6 +4137,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3757,6 +4158,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "коммит" @@ -3768,18 +4175,50 @@ msgstr "" msgid "day" msgid_plural "days" -msgstr[0] "день" -msgstr[1] "дней" -msgstr[2] "дней" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" msgstr[1] "" msgstr[2] "" +msgstr[3] "" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3814,6 +4253,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3847,6 +4289,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3901,6 +4346,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3921,9 +4369,10 @@ msgstr "" msgid "parent" msgid_plural "parents" -msgstr[0] "иÑточник" -msgstr[1] "иÑточники" -msgstr[2] "иÑточники" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "password" msgstr "пароль" @@ -3949,3 +4398,6 @@ msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po new file mode 100644 index 00000000000..b4df4c4b1af --- /dev/null +++ b/locale/tr_TR/gitlab.po @@ -0,0 +1,4351 @@ +msgid "" +msgstr "" +"Project-Id-Version: gitlab-ee\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:20-0500\n" +"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" +"Language-Team: Turkish\n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: gitlab-ee\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: /master/locale/gitlab.pot\n" + +msgid " and" +msgstr " ve" + +msgid "%d commit" +msgid_plural "%d commits" +msgstr[0] "" +msgstr[1] "" + +msgid "%d commit behind" +msgid_plural "%d commits behind" +msgstr[0] "" +msgstr[1] "" + +msgid "%d issue" +msgid_plural "%d issues" +msgstr[0] "" +msgstr[1] "" + +msgid "%d layer" +msgid_plural "%d layers" +msgstr[0] "" +msgstr[1] "" + +msgid "%d merge request" +msgid_plural "%d merge requests" +msgstr[0] "" +msgstr[1] "" + +msgid "%s additional commit has been omitted to prevent performance issues." +msgid_plural "%s additional commits have been omitted to prevent performance issues." +msgstr[0] "" +msgstr[1] "" + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + +msgid "%{commit_author_link} authored %{commit_timeago}" +msgstr "" + +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "%{count} katılımcı" +msgstr[1] "%{count} katılımcı" + +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + +msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" +msgstr "" + +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." +msgstr "" + +msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." +msgstr "" + +msgid "%{openOrClose} %{noteable}" +msgstr "" + +msgid "%{storage_name}: failed storage access attempt on host:" +msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" +msgstr[0] "" +msgstr[1] "" + +msgid "%{text} is available" +msgstr "" + +msgid "(checkout the %{link} for information on how to install it)." +msgstr "" + +msgid "+ %{moreCount} more" +msgstr "+ %{moreCount} daha fazla" + +msgid "- show less" +msgstr "- daha az göster" + +msgid "1 pipeline" +msgid_plural "%d pipelines" +msgstr[0] "" +msgstr[1] "" + +msgid "1st contribution!" +msgstr "Ä°lk katkı!" + +msgid "2FA enabled" +msgstr "" + +msgid "A collection of graphs regarding Continuous Integration" +msgstr "" + +msgid "About auto deploy" +msgstr "" + +msgid "Abuse Reports" +msgstr "Kötüye Kullanım Raporları" + +msgid "Access Tokens" +msgstr "EriÅŸim anahtarları" + +msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." +msgstr "" + +msgid "Account" +msgstr "Hesap" + +msgid "Active" +msgstr "Etkin" + +msgid "Activity" +msgstr "Etkinlik" + +msgid "Add" +msgstr "Ekle" + +msgid "Add Changelog" +msgstr "DeÄŸiÅŸiklik Bilgisi Ekle" + +msgid "Add Contribution guide" +msgstr "Katkı kılavuzu ekle" + +msgid "Add Group Webhooks and GitLab Enterprise Edition." +msgstr "" + +msgid "Add Kubernetes cluster" +msgstr "" + +msgid "Add License" +msgstr "Lisans Ekle" + +msgid "Add Readme" +msgstr "" + +msgid "Add new directory" +msgstr "Yeni dizin ekle" + +msgid "Add todo" +msgstr "Yapılacaklara Ekle" + +msgid "AdminArea|Stop all jobs" +msgstr "Tüm iÅŸleri durdur" + +msgid "AdminArea|Stop all jobs?" +msgstr "Tüm iÅŸleri durdur?" + +msgid "AdminArea|Stop jobs" +msgstr "Ä°ÅŸleri durdur" + +msgid "AdminArea|Stopping jobs failed" +msgstr "" + +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." +msgstr "" + +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + +msgid "Advanced" +msgstr "GeliÅŸmiÅŸ" + +msgid "Advanced settings" +msgstr "GeliÅŸmiÅŸ ayarlar" + +msgid "All" +msgstr "Tümü" + +msgid "All changes are committed" +msgstr "" + +msgid "Allows you to add and manage Kubernetes clusters." +msgstr "Kubernetes kümelerini eklemeye ve yönetmenize olanak tanır." + +msgid "An error occurred previewing the blob" +msgstr "" + +msgid "An error occurred when toggling the notification subscription" +msgstr "" + +msgid "An error occurred when updating the issue weight" +msgstr "" + +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + +msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." +msgstr "" + +msgid "An error occurred while fetching markdown preview" +msgstr "Markdown ön izlemesi yüklenirken hata oluÅŸtu" + +msgid "An error occurred while fetching sidebar data" +msgstr "" + +msgid "An error occurred while fetching the pipeline." +msgstr "" + +msgid "An error occurred while getting projects" +msgstr "Projeler yüklenirken bir hata oluÅŸtu" + +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + +msgid "An error occurred while loading filenames" +msgstr "Dosya isimleri yüklenirken bir hata oluÅŸtu" + +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + +msgid "An error occurred while rendering KaTeX" +msgstr "KaTeX'i iÅŸlerken bir hata oluÅŸtu" + +msgid "An error occurred while rendering preview broadcast message" +msgstr "Önizleme yayını iletisi oluÅŸturulurken bir hata oluÅŸtu" + +msgid "An error occurred while retrieving calendar activity" +msgstr "" + +msgid "An error occurred while retrieving diff" +msgstr "DeÄŸiÅŸiklikler yüklenirken bir hata oluÅŸtu" + +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + +msgid "An error occurred while validating username" +msgstr "Kullanıcı adı doÄŸrulanırken bir hata oluÅŸtu" + +msgid "An error occurred. Please try again." +msgstr "Bir hata oluÅŸtu. Lütfen tekrar deneyin." + +msgid "Appearance" +msgstr "Görünüm" + +msgid "Applications" +msgstr "Uygulamalar" + +msgid "Apr" +msgstr "Nis" + +msgid "April" +msgstr "Nisan" + +msgid "Archived project! Repository is read-only" +msgstr "ArÅŸivlenmiÅŸ proje! Sadece okuma yapılabilir" + +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "" + +msgid "Are you sure you want to reset registration token?" +msgstr "" + +msgid "Are you sure you want to reset the health check token?" +msgstr "" + +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + +msgid "Are you sure?" +msgstr "Emin misiniz?" + +msgid "Artifacts" +msgstr "" + +msgid "Assign custom color like #FF0000" +msgstr "#FF0000 gibi özel renk ata" + +msgid "Assign labels" +msgstr "Etiket tanımla" + +msgid "Assign milestone" +msgstr "" + +msgid "Assign to" +msgstr "Ata" + +msgid "Assignee" +msgstr "" + +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "Sürükleyip bırakarak bir dosya ekle veya %{upload_link}" + +msgid "Aug" +msgstr "AÄŸustos" + +msgid "August" +msgstr "AÄŸustos" + +msgid "Authentication Log" +msgstr "Kimlik DoÄŸrulama Günlüğü" + +msgid "Author" +msgstr "Yazar" + +msgid "Authors: %{authors}" +msgstr "Yazarlar: %{authors}" + +msgid "Auto DevOps enabled" +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly." +msgstr "" + +msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." +msgstr "" + +msgid "AutoDevOps|Auto DevOps (Beta)" +msgstr "" + +msgid "AutoDevOps|Auto DevOps documentation" +msgstr "" + +msgid "AutoDevOps|Enable in settings" +msgstr "" + +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + +msgid "AutoDevOps|Learn more in the %{link_to_documentation}" +msgstr "" + +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" + +msgid "Available" +msgstr "Kullanılabilir" + +msgid "Avatar will be removed. Are you sure?" +msgstr "Avatar kaldırılacak. Emin misiniz?" + +msgid "Average per day: %{average}" +msgstr "" + +msgid "Begin with the selected commit" +msgstr "" + +msgid "Billing" +msgstr "" + +msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." +msgstr "" + +msgid "BillingPlans|Current plan" +msgstr "" + +msgid "BillingPlans|Customer Support" +msgstr "" + +msgid "BillingPlans|Downgrade" +msgstr "" + +msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." +msgstr "" + +msgid "BillingPlans|Manage plan" +msgstr "" + +msgid "BillingPlans|Please contact %{customer_support_link} in that case." +msgstr "" + +msgid "BillingPlans|See all %{plan_name} features" +msgstr "" + +msgid "BillingPlans|This group uses the plan associated with its parent group." +msgstr "" + +msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." +msgstr "" + +msgid "BillingPlans|Upgrade" +msgstr "" + +msgid "BillingPlans|You are currently on the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|frequently asked questions" +msgstr "" + +msgid "BillingPlans|monthly" +msgstr "" + +msgid "BillingPlans|paid annually at %{price_per_year}" +msgstr "" + +msgid "BillingPlans|per user" +msgstr "" + +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" +msgstr[1] "" + +msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" +msgstr "" + +msgid "Branch has changed" +msgstr "" + +msgid "Branch is already taken" +msgstr "" + +msgid "Branch name" +msgstr "" + +msgid "BranchSwitcherPlaceholder|Search branches" +msgstr "" + +msgid "BranchSwitcherTitle|Switch branch" +msgstr "" + +msgid "Branches" +msgstr "" + +msgid "Branches|Cant find HEAD commit for this branch" +msgstr "" + +msgid "Branches|Compare" +msgstr "" + +msgid "Branches|Delete all branches that are merged into '%{default_branch}'" +msgstr "" + +msgid "Branches|Delete branch" +msgstr "" + +msgid "Branches|Delete merged branches" +msgstr "" + +msgid "Branches|Delete protected branch" +msgstr "" + +msgid "Branches|Delete protected branch '%{branch_name}'?" +msgstr "" + +msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" +msgstr "" + +msgid "Branches|Filter by branch name" +msgstr "" + +msgid "Branches|Merged into %{default_branch}" +msgstr "" + +msgid "Branches|New branch" +msgstr "" + +msgid "Branches|No branches to show" +msgstr "" + +msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." +msgstr "" + +msgid "Branches|Only a project master or owner can delete a protected branch" +msgstr "" + +msgid "Branches|Protected branches can be managed in %{project_settings_link}" +msgstr "" + +msgid "Branches|Sort by" +msgstr "" + +msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." +msgstr "" + +msgid "Branches|The default branch cannot be deleted" +msgstr "" + +msgid "Branches|This branch hasn’t been merged into %{default_branch}." +msgstr "" + +msgid "Branches|To avoid data loss, consider merging this branch before deleting it." +msgstr "" + +msgid "Branches|To confirm, type %{branch_name_confirmation}:" +msgstr "" + +msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." +msgstr "" + +msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." +msgstr "" + +msgid "Branches|diverged from upstream" +msgstr "" + +msgid "Branches|merged" +msgstr "" + +msgid "Branches|project settings" +msgstr "" + +msgid "Branches|protected" +msgstr "" + +msgid "Browse Directory" +msgstr "" + +msgid "Browse File" +msgstr "" + +msgid "Browse Files" +msgstr "" + +msgid "Browse files" +msgstr "" + +msgid "ByAuthor|by" +msgstr "" + +msgid "CI / CD" +msgstr "" + +msgid "CI/CD configuration" +msgstr "" + +msgid "CICD|Jobs" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "Cancel edit" +msgstr "" + +msgid "Cannot modify managed Kubernetes cluster" +msgstr "" + +msgid "Change Weight" +msgstr "" + +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "" + +msgid "ChangeTypeAction|Revert" +msgstr "" + +msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes." +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision." +msgstr "" + +msgid "Charts" +msgstr "" + +msgid "Chat" +msgstr "" + +msgid "Check interval" +msgstr "" + +msgid "Checking %{text} availability…" +msgstr "" + +msgid "Checking branch availability..." +msgstr "" + +msgid "Cherry-pick this commit" +msgstr "" + +msgid "Cherry-pick this merge request" +msgstr "" + +msgid "Choose File ..." +msgstr "" + +msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request." +msgstr "" + +msgid "Choose file..." +msgstr "" + +msgid "Choose which groups you wish to synchronize to this secondary node." +msgstr "" + +msgid "Choose which shards you wish to synchronize to this secondary node." +msgstr "" + +msgid "CiStatusLabel|canceled" +msgstr "" + +msgid "CiStatusLabel|created" +msgstr "" + +msgid "CiStatusLabel|failed" +msgstr "" + +msgid "CiStatusLabel|manual action" +msgstr "" + +msgid "CiStatusLabel|passed" +msgstr "" + +msgid "CiStatusLabel|passed with warnings" +msgstr "" + +msgid "CiStatusLabel|pending" +msgstr "" + +msgid "CiStatusLabel|skipped" +msgstr "" + +msgid "CiStatusLabel|waiting for manual action" +msgstr "" + +msgid "CiStatusText|blocked" +msgstr "" + +msgid "CiStatusText|canceled" +msgstr "" + +msgid "CiStatusText|created" +msgstr "" + +msgid "CiStatusText|failed" +msgstr "" + +msgid "CiStatusText|manual" +msgstr "" + +msgid "CiStatusText|passed" +msgstr "" + +msgid "CiStatusText|pending" +msgstr "" + +msgid "CiStatusText|skipped" +msgstr "" + +msgid "CiStatus|running" +msgstr "" + +msgid "CiVariables|Input variable key" +msgstr "" + +msgid "CiVariables|Input variable value" +msgstr "" + +msgid "CiVariables|Remove variable row" +msgstr "" + +msgid "CiVariable|* (All environments)" +msgstr "" + +msgid "CiVariable|All environments" +msgstr "" + +msgid "CiVariable|Create wildcard" +msgstr "" + +msgid "CiVariable|Error occured while saving variables" +msgstr "" + +msgid "CiVariable|New environment" +msgstr "" + +msgid "CiVariable|Protected" +msgstr "" + +msgid "CiVariable|Search environments" +msgstr "" + +msgid "CiVariable|Toggle protected" +msgstr "" + +msgid "CiVariable|Validation failed" +msgstr "" + +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + +msgid "Click to expand text" +msgstr "" + +msgid "Clone repository" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Closed" +msgstr "" + +msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|API URL" +msgstr "" + +msgid "ClusterIntegration|Add Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Add an existing Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration" +msgstr "" + +msgid "ClusterIntegration|Applications" +msgstr "" + +msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|CA Certificate" +msgstr "" + +msgid "ClusterIntegration|Certificate Authority bundle (PEM format)" +msgstr "" + +msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|Control how your Kubernetes cluster integrates with GitLab" +msgstr "" + +msgid "ClusterIntegration|Copy API URL" +msgstr "" + +msgid "ClusterIntegration|Copy CA Certificate" +msgstr "" + +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + +msgid "ClusterIntegration|Copy Kubernetes cluster name" +msgstr "" + +msgid "ClusterIntegration|Copy Token" +msgstr "" + +msgid "ClusterIntegration|Create Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab" +msgstr "" + +msgid "ClusterIntegration|Create on GKE" +msgstr "" + +msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Enter the details for your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Environment scope" +msgstr "" + +msgid "ClusterIntegration|GitLab Integration" +msgstr "" + +msgid "ClusterIntegration|GitLab Runner" +msgstr "" + +msgid "ClusterIntegration|Google Cloud Platform project ID" +msgstr "" + +msgid "ClusterIntegration|Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Google Kubernetes Engine project" +msgstr "" + +msgid "ClusterIntegration|Helm Tiller" +msgstr "" + +msgid "ClusterIntegration|Ingress" +msgstr "" + +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + +msgid "ClusterIntegration|Install" +msgstr "" + +msgid "ClusterIntegration|Installed" +msgstr "" + +msgid "ClusterIntegration|Installing" +msgstr "" + +msgid "ClusterIntegration|Integrate Kubernetes cluster automation" +msgstr "" + +msgid "ClusterIntegration|Integration status" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster details" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..." +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster name" +msgstr "" + +msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details" +msgstr "" + +msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}" +msgstr "" + +msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project" +msgstr "" + +msgid "ClusterIntegration|Learn more about %{link_to_documentation}" +msgstr "" + +msgid "ClusterIntegration|Learn more about environments" +msgstr "" + +msgid "ClusterIntegration|Machine type" +msgstr "" + +msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters" +msgstr "" + +msgid "ClusterIntegration|Manage" +msgstr "" + +msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}" +msgstr "" + +msgid "ClusterIntegration|More information" +msgstr "" + +msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate" +msgstr "" + +msgid "ClusterIntegration|Note:" +msgstr "" + +msgid "ClusterIntegration|Number of nodes" +msgstr "" + +msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes" +msgstr "" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + +msgid "ClusterIntegration|Project ID" +msgstr "" + +msgid "ClusterIntegration|Project namespace" +msgstr "" + +msgid "ClusterIntegration|Project namespace (optional, unique)" +msgstr "" + +msgid "ClusterIntegration|Prometheus" +msgstr "" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration." +msgstr "" + +msgid "ClusterIntegration|Remove Kubernetes cluster integration" +msgstr "" + +msgid "ClusterIntegration|Remove integration" +msgstr "" + +msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster." +msgstr "" + +msgid "ClusterIntegration|Request to begin installing failed" +msgstr "" + +msgid "ClusterIntegration|Save changes" +msgstr "" + +msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" +msgstr "" + +msgid "ClusterIntegration|See your projects" +msgstr "" + +msgid "ClusterIntegration|See zones" +msgstr "" + +msgid "ClusterIntegration|Service token" +msgstr "" + +msgid "ClusterIntegration|Show" +msgstr "" + +msgid "ClusterIntegration|Something went wrong on our end." +msgstr "" + +msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|Something went wrong while installing %{title}" +msgstr "" + +msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below" +msgstr "" + +msgid "ClusterIntegration|Toggle Kubernetes Cluster" +msgstr "" + +msgid "ClusterIntegration|Toggle Kubernetes cluster" +msgstr "" + +msgid "ClusterIntegration|Token" +msgstr "" + +msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." +msgstr "" + +msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" +msgstr "" + +msgid "ClusterIntegration|Zone" +msgstr "" + +msgid "ClusterIntegration|access to Google Kubernetes Engine" +msgstr "" + +msgid "ClusterIntegration|check the pricing here" +msgstr "" + +msgid "ClusterIntegration|documentation" +msgstr "" + +msgid "ClusterIntegration|help page" +msgstr "" + +msgid "ClusterIntegration|installing applications" +msgstr "" + +msgid "ClusterIntegration|meets the requirements" +msgstr "" + +msgid "ClusterIntegration|properly configured" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + +msgid "Comments" +msgstr "" + +msgid "Commit" +msgid_plural "Commits" +msgstr[0] "" +msgstr[1] "" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" +msgstr[1] "" + +msgid "Commit Message" +msgstr "" + +msgid "Commit duration in minutes for last 30 commits" +msgstr "" + +msgid "Commit message" +msgstr "" + +msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" +msgstr "" + +msgid "Commit to %{branchName} branch" +msgstr "" + +msgid "CommitBoxTitle|Commit" +msgstr "" + +msgid "CommitMessage|Add %{file_name}" +msgstr "" + +msgid "Commits" +msgstr "" + +msgid "Commits feed" +msgstr "" + +msgid "Commits per day hour (UTC)" +msgstr "" + +msgid "Commits per day of month" +msgstr "" + +msgid "Commits per weekday" +msgstr "" + +msgid "Commits|An error occurred while fetching merge requests data." +msgstr "" + +msgid "Commits|Commit: %{commitText}" +msgstr "" + +msgid "Commits|History" +msgstr "" + +msgid "Commits|No related merge requests found" +msgstr "" + +msgid "Committed by" +msgstr "" + +msgid "Compare" +msgstr "" + +msgid "Compare Git revisions" +msgstr "" + +msgid "Compare Revisions" +msgstr "" + +msgid "CompareBranches|%{source_branch} and %{target_branch} are the same." +msgstr "" + +msgid "CompareBranches|Compare" +msgstr "" + +msgid "CompareBranches|Source" +msgstr "" + +msgid "CompareBranches|Target" +msgstr "" + +msgid "CompareBranches|There isn't anything to compare." +msgstr "" + +msgid "Confidentiality" +msgstr "" + +msgid "Container Registry" +msgstr "" + +msgid "ContainerRegistry|Created" +msgstr "" + +msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" +msgstr "" + +msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" +msgstr "" + +msgid "ContainerRegistry|How to use the Container Registry" +msgstr "" + +msgid "ContainerRegistry|Learn more about" +msgstr "" + +msgid "ContainerRegistry|No tags in Container Registry for this container image." +msgstr "" + +msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" +msgstr "" + +msgid "ContainerRegistry|Remove repository" +msgstr "" + +msgid "ContainerRegistry|Remove tag" +msgstr "" + +msgid "ContainerRegistry|Size" +msgstr "" + +msgid "ContainerRegistry|Tag" +msgstr "" + +msgid "ContainerRegistry|Tag ID" +msgstr "" + +msgid "ContainerRegistry|Use different image names" +msgstr "" + +msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." +msgstr "" + +msgid "Contribution guide" +msgstr "" + +msgid "Contributors" +msgstr "" + +msgid "ContributorsPage|%{startDate} – %{endDate}" +msgstr "" + +msgid "ContributorsPage|Building repository graph." +msgstr "" + +msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limited to 6,000 commits." +msgstr "" + +msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready." +msgstr "" + +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + +msgid "Copy SSH public key to clipboard" +msgstr "" + +msgid "Copy URL to clipboard" +msgstr "" + +msgid "Copy branch name to clipboard" +msgstr "" + +msgid "Copy command to clipboard" +msgstr "" + +msgid "Copy commit SHA to clipboard" +msgstr "" + +msgid "Copy reference to clipboard" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Create New Directory" +msgstr "" + +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + +msgid "Create a personal access token on your account to pull or push via %{protocol}." +msgstr "" + +msgid "Create branch" +msgstr "" + +msgid "Create directory" +msgstr "" + +msgid "Create empty bare repository" +msgstr "" + +msgid "Create epic" +msgstr "" + +msgid "Create file" +msgstr "" + +msgid "Create lists from labels. Issues with that label appear in that list." +msgstr "" + +msgid "Create merge request" +msgstr "" + +msgid "Create merge request and branch" +msgstr "" + +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + +msgid "Create new label" +msgstr "" + +msgid "Create new..." +msgstr "" + +msgid "CreateNewFork|Fork" +msgstr "" + +msgid "CreateTag|Tag" +msgstr "" + +msgid "CreateTokenToCloneLink|create a personal access token" +msgstr "" + +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + +msgid "Creating epic" +msgstr "" + +msgid "Cron Timezone" +msgstr "" + +msgid "Cron syntax" +msgstr "" + +msgid "Current node" +msgstr "" + +msgid "Custom notification events" +msgstr "" + +msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}." +msgstr "" + +msgid "Cycle Analytics" +msgstr "" + +msgid "CycleAnalyticsStage|Code" +msgstr "" + +msgid "CycleAnalyticsStage|Issue" +msgstr "" + +msgid "CycleAnalyticsStage|Plan" +msgstr "" + +msgid "CycleAnalyticsStage|Production" +msgstr "" + +msgid "CycleAnalyticsStage|Review" +msgstr "" + +msgid "CycleAnalyticsStage|Staging" +msgstr "" + +msgid "CycleAnalyticsStage|Test" +msgstr "" + +msgid "DashboardProjects|All" +msgstr "" + +msgid "DashboardProjects|Personal" +msgstr "" + +msgid "Dec" +msgstr "" + +msgid "December" +msgstr "" + +msgid "Default classification label" +msgstr "" + +msgid "Define a custom pattern with cron syntax" +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "Deploy" +msgid_plural "Deploys" +msgstr[0] "" +msgstr[1] "" + +msgid "Deploy Keys" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." +msgstr "" + +msgid "Details" +msgstr "" + +msgid "Diffs|No file name available" +msgstr "" + +msgid "Directory name" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Discard draft" +msgstr "" + +msgid "Discover GitLab Geo." +msgstr "" + +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + +msgid "Dismiss Merge Request promotion" +msgstr "" + +msgid "Don't show again" +msgstr "" + +msgid "Download" +msgstr "" + +msgid "Download tar" +msgstr "" + +msgid "Download tar.bz2" +msgstr "" + +msgid "Download tar.gz" +msgstr "" + +msgid "Download zip" +msgstr "" + +msgid "DownloadArtifacts|Download" +msgstr "" + +msgid "DownloadCommit|Email Patches" +msgstr "" + +msgid "DownloadCommit|Plain Diff" +msgstr "" + +msgid "DownloadSource|Download" +msgstr "" + +msgid "Due date" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Edit Pipeline Schedule %{id}" +msgstr "" + +msgid "Edit files in the editor and commit changes here" +msgstr "" + +msgid "Emails" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "Enable Auto DevOps" +msgstr "" + +msgid "Environments|An error occurred while fetching the environments." +msgstr "" + +msgid "Environments|An error occurred while making the request." +msgstr "" + +msgid "Environments|Commit" +msgstr "" + +msgid "Environments|Deployment" +msgstr "" + +msgid "Environments|Environment" +msgstr "" + +msgid "Environments|Environments" +msgstr "" + +msgid "Environments|Job" +msgstr "" + +msgid "Environments|New environment" +msgstr "" + +msgid "Environments|No deployments yet" +msgstr "" + +msgid "Environments|Open" +msgstr "" + +msgid "Environments|Re-deploy" +msgstr "" + +msgid "Environments|Read more about environments" +msgstr "" + +msgid "Environments|Rollback" +msgstr "" + +msgid "Environments|Show all" +msgstr "" + +msgid "Environments|Updated" +msgstr "" + +msgid "Environments|You don't have any environments right now." +msgstr "" + +msgid "Epic will be removed! Are you sure?" +msgstr "" + +msgid "Epics" +msgstr "" + +msgid "Epics Roadmap" +msgstr "" + +msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + +msgid "Error creating epic" +msgstr "" + +msgid "Error fetching contributors data." +msgstr "" + +msgid "Error fetching labels." +msgstr "" + +msgid "Error fetching network graph." +msgstr "" + +msgid "Error fetching refs" +msgstr "" + +msgid "Error fetching usage ping data." +msgstr "" + +msgid "Error occurred when toggling the notification subscription" +msgstr "" + +msgid "Error saving label update." +msgstr "" + +msgid "Error updating status for all todos." +msgstr "" + +msgid "Error updating todo status." +msgstr "" + +msgid "EventFilterBy|Filter by all" +msgstr "" + +msgid "EventFilterBy|Filter by comments" +msgstr "" + +msgid "EventFilterBy|Filter by issue events" +msgstr "" + +msgid "EventFilterBy|Filter by merge events" +msgstr "" + +msgid "EventFilterBy|Filter by push events" +msgstr "" + +msgid "EventFilterBy|Filter by team" +msgstr "" + +msgid "Every day (at 4:00am)" +msgstr "" + +msgid "Every month (on the 1st at 4:00am)" +msgstr "" + +msgid "Every week (Sundays at 4:00am)" +msgstr "" + +msgid "Expand" +msgstr "" + +msgid "Explore projects" +msgstr "" + +msgid "Explore public groups" +msgstr "" + +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + +msgid "Failed to change the owner" +msgstr "" + +msgid "Failed to remove issue from board, please try again." +msgstr "" + +msgid "Failed to remove the pipeline schedule" +msgstr "" + +msgid "Failed to update issues, please try again." +msgstr "" + +msgid "Feb" +msgstr "" + +msgid "February" +msgstr "" + +msgid "Fields on this page are now uneditable, you can configure" +msgstr "" + +msgid "File name" +msgstr "" + +msgid "Files" +msgstr "" + +msgid "Files (%{human_size})" +msgstr "" + +msgid "Filter by commit message" +msgstr "" + +msgid "Find by path" +msgstr "" + +msgid "Find file" +msgstr "" + +msgid "FirstPushedBy|First" +msgstr "" + +msgid "FirstPushedBy|pushed by" +msgstr "" + +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "" +msgstr[1] "" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "" + +msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" +msgstr "" + +msgid "Format" +msgstr "" + +msgid "From issue creation until deploy to production" +msgstr "" + +msgid "From merge request merge until deploy to production" +msgstr "" + +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + +msgid "GPG Keys" +msgstr "" + +msgid "Generate a default set of labels" +msgstr "" + +msgid "Geo Nodes" +msgstr "" + +msgid "GeoNodeSyncStatus|Node is failing or broken." +msgstr "" + +msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage." +msgstr "" + +msgid "GeoNodes|Database replication lag:" +msgstr "" + +msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?" +msgstr "" + +msgid "GeoNodes|Does not match the primary storage configuration" +msgstr "" + +msgid "GeoNodes|Failed" +msgstr "" + +msgid "GeoNodes|Full" +msgstr "" + +msgid "GeoNodes|GitLab version does not match the primary node version" +msgstr "" + +msgid "GeoNodes|GitLab version:" +msgstr "" + +msgid "GeoNodes|Health status:" +msgstr "" + +msgid "GeoNodes|Last event ID processed by cursor:" +msgstr "" + +msgid "GeoNodes|Last event ID seen from primary:" +msgstr "" + +msgid "GeoNodes|Loading nodes" +msgstr "" + +msgid "GeoNodes|Local Attachments:" +msgstr "" + +msgid "GeoNodes|Local LFS objects:" +msgstr "" + +msgid "GeoNodes|Local job artifacts:" +msgstr "" + +msgid "GeoNodes|New node" +msgstr "" + +msgid "GeoNodes|Out of sync" +msgstr "" + +msgid "GeoNodes|Replication slot WAL:" +msgstr "" + +msgid "GeoNodes|Replication slots:" +msgstr "" + +msgid "GeoNodes|Repositories:" +msgstr "" + +msgid "GeoNodes|Selective" +msgstr "" + +msgid "GeoNodes|Storage config:" +msgstr "" + +msgid "GeoNodes|Sync settings:" +msgstr "" + +msgid "GeoNodes|Synced" +msgstr "" + +msgid "GeoNodes|Unused slots" +msgstr "" + +msgid "GeoNodes|Used slots" +msgstr "" + +msgid "GeoNodes|Wikis:" +msgstr "" + +msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS." +msgstr "" + +msgid "Geo|All projects" +msgstr "" + +msgid "Geo|File sync capacity" +msgstr "" + +msgid "Geo|Groups to synchronize" +msgstr "" + +msgid "Geo|Projects in certain groups" +msgstr "" + +msgid "Geo|Projects in certain storage shards" +msgstr "" + +msgid "Geo|Repository sync capacity" +msgstr "" + +msgid "Geo|Select groups to replicate." +msgstr "" + +msgid "Geo|Shards to synchronize" +msgstr "" + +msgid "Git revision" +msgstr "" + +msgid "Git storage health information has been reset" +msgstr "" + +msgid "Git version" +msgstr "" + +msgid "GitLab Runner section" +msgstr "" + +msgid "Gitaly Servers" +msgstr "" + +msgid "Go to your fork" +msgstr "" + +msgid "GoToYourFork|Fork" +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 "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + +msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" +msgstr "" + +msgid "GroupSettings|Share with group lock" +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." +msgstr "" + +msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." +msgstr "" + +msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" +msgstr "" + +msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" +msgstr "" + +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + +msgid "Have your users email" +msgstr "" + +msgid "Health Check" +msgstr "" + +msgid "Health information can be retrieved from the following endpoints. More information is available" +msgstr "" + +msgid "HealthCheck|Access token is" +msgstr "" + +msgid "HealthCheck|Healthy" +msgstr "" + +msgid "HealthCheck|No Health Problems Detected" +msgstr "" + +msgid "HealthCheck|Unhealthy" +msgstr "" + +msgid "Hide value" +msgid_plural "Hide values" +msgstr[0] "" +msgstr[1] "" + +msgid "History" +msgstr "" + +msgid "Housekeeping successfully started" +msgstr "" + +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + +msgid "Import repository" +msgstr "" + +msgid "Improve Issue boards with GitLab Enterprise Edition." +msgstr "" + +msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." +msgstr "" + +msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." +msgstr "" + +msgid "Install Runner on Kubernetes" +msgstr "" + +msgid "Install a Runner compatible with GitLab CI" +msgstr "" + +msgid "Instance" +msgid_plural "Instances" +msgstr[0] "" +msgstr[1] "" + +msgid "Instance does not support multiple Kubernetes clusters" +msgstr "" + +msgid "Interested parties can even contribute by pushing commits if they want to." +msgstr "" + +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + +msgid "Interval Pattern" +msgstr "" + +msgid "Introducing Cycle Analytics" +msgstr "" + +msgid "Issue board focus mode" +msgstr "" + +msgid "Issue events" +msgstr "" + +msgid "IssueBoards|Board" +msgstr "" + +msgid "IssueBoards|Boards" +msgstr "" + +msgid "Issues" +msgstr "" + +msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable." +msgstr "" + +msgid "Jan" +msgstr "" + +msgid "January" +msgstr "" + +msgid "Jobs" +msgstr "" + +msgid "Jul" +msgstr "" + +msgid "July" +msgstr "" + +msgid "Jun" +msgstr "" + +msgid "June" +msgstr "" + +msgid "Kubernetes" +msgstr "" + +msgid "Kubernetes Cluster" +msgstr "" + +msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}" +msgstr "" + +msgid "Kubernetes cluster integration was not removed." +msgstr "" + +msgid "Kubernetes cluster integration was successfully removed." +msgstr "" + +msgid "Kubernetes cluster was successfully updated." +msgstr "" + +msgid "Kubernetes configured" +msgstr "" + +msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" +msgstr "" + +msgid "LFSStatus|Disabled" +msgstr "" + +msgid "LFSStatus|Enabled" +msgstr "" + +msgid "Labels" +msgstr "" + +msgid "Labels can be applied to issues and merge requests to categorize them." +msgstr "" + +msgid "Last %d day" +msgid_plural "Last %d days" +msgstr[0] "" +msgstr[1] "" + +msgid "Last Pipeline" +msgstr "" + +msgid "Last commit" +msgstr "" + +msgid "Last edited %{date}" +msgstr "" + +msgid "Last edited by %{name}" +msgstr "" + +msgid "Last update" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "LastPushEvent|You pushed to" +msgstr "" + +msgid "LastPushEvent|at" +msgstr "" + +msgid "Learn more" +msgstr "" + +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + +msgid "Learn more in the" +msgstr "" + +msgid "Learn more in the|pipeline schedules documentation" +msgstr "" + +msgid "Leave" +msgstr "" + +msgid "Leave group" +msgstr "" + +msgid "Leave project" +msgstr "" + +msgid "License" +msgstr "" + +msgid "List" +msgstr "" + +msgid "Loading the GitLab IDE..." +msgstr "" + +msgid "Lock" +msgstr "" + +msgid "Lock %{issuableDisplayName}" +msgstr "" + +msgid "Lock not found" +msgstr "" + +msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." +msgstr "" + +msgid "Locked" +msgstr "" + +msgid "Locked Files" +msgstr "" + +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + +msgid "Login" +msgstr "" + +msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos." +msgstr "" + +msgid "Manage labels" +msgstr "" + +msgid "Mar" +msgstr "" + +msgid "March" +msgstr "" + +msgid "Mark done" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + +msgid "May" +msgstr "" + +msgid "Median" +msgstr "" + +msgid "Members" +msgstr "" + +msgid "Merge Requests" +msgstr "" + +msgid "Merge events" +msgstr "" + +msgid "Merge request" +msgstr "" + +msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" +msgstr "" + +msgid "MergeRequest|Approved" +msgstr "" + +msgid "Merged" +msgstr "" + +msgid "Messages" +msgstr "" + +msgid "Milestone" +msgstr "" + +msgid "Milestones|Delete milestone" +msgstr "" + +msgid "Milestones|Delete milestone %{milestoneTitle}?" +msgstr "" + +msgid "Milestones|Failed to delete milestone %{milestoneTitle}" +msgstr "" + +msgid "Milestones|Milestone %{milestoneTitle} was not found" +msgstr "" + +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "" + +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + +msgid "Monitoring" +msgstr "" + +msgid "More information" +msgstr "" + +msgid "More information is available|here" +msgstr "" + +msgid "Move" +msgstr "" + +msgid "Move issue" +msgstr "" + +msgid "Multiple issue boards" +msgstr "" + +msgid "Name new label" +msgstr "" + +msgid "New Issue" +msgid_plural "New Issues" +msgstr[0] "" +msgstr[1] "" + +msgid "New Kubernetes Cluster" +msgstr "" + +msgid "New Kubernetes cluster" +msgstr "" + +msgid "New Pipeline Schedule" +msgstr "" + +msgid "New branch" +msgstr "" + +msgid "New branch unavailable" +msgstr "" + +msgid "New directory" +msgstr "" + +msgid "New epic" +msgstr "" + +msgid "New file" +msgstr "" + +msgid "New group" +msgstr "" + +msgid "New issue" +msgstr "" + +msgid "New label" +msgstr "" + +msgid "New merge request" +msgstr "" + +msgid "New project" +msgstr "" + +msgid "New schedule" +msgstr "" + +msgid "New snippet" +msgstr "" + +msgid "New subgroup" +msgstr "" + +msgid "New tag" +msgstr "" + +msgid "No assignee" +msgstr "" + +msgid "No changes" +msgstr "" + +msgid "No connection could be made to a Gitaly Server, please check your logs!" +msgstr "" + +msgid "No due date" +msgstr "" + +msgid "No estimate or time spent" +msgstr "" + +msgid "No file chosen" +msgstr "" + +msgid "No repository" +msgstr "" + +msgid "No schedules" +msgstr "" + +msgid "None" +msgstr "" + +msgid "Not allowed to merge" +msgstr "" + +msgid "Not available" +msgstr "" + +msgid "Not confidential" +msgstr "" + +msgid "Not enough data" +msgstr "" + +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + +msgid "Notification events" +msgstr "" + +msgid "NotificationEvent|Close issue" +msgstr "" + +msgid "NotificationEvent|Close merge request" +msgstr "" + +msgid "NotificationEvent|Failed pipeline" +msgstr "" + +msgid "NotificationEvent|Merge merge request" +msgstr "" + +msgid "NotificationEvent|New issue" +msgstr "" + +msgid "NotificationEvent|New merge request" +msgstr "" + +msgid "NotificationEvent|New note" +msgstr "" + +msgid "NotificationEvent|Reassign issue" +msgstr "" + +msgid "NotificationEvent|Reassign merge request" +msgstr "" + +msgid "NotificationEvent|Reopen issue" +msgstr "" + +msgid "NotificationEvent|Successful pipeline" +msgstr "" + +msgid "NotificationLevel|Custom" +msgstr "" + +msgid "NotificationLevel|Disabled" +msgstr "" + +msgid "NotificationLevel|Global" +msgstr "" + +msgid "NotificationLevel|On mention" +msgstr "" + +msgid "NotificationLevel|Participate" +msgstr "" + +msgid "NotificationLevel|Watch" +msgstr "" + +msgid "Notifications" +msgstr "" + +msgid "Notifications off" +msgstr "" + +msgid "Notifications on" +msgstr "" + +msgid "Nov" +msgstr "" + +msgid "November" +msgstr "" + +msgid "Number of access attempts" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "Oct" +msgstr "" + +msgid "October" +msgstr "" + +msgid "OfSearchInADropdown|Filter" +msgstr "" + +msgid "Only project members can comment." +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Opened" +msgstr "" + +msgid "OpenedNDaysAgo|Opened" +msgstr "" + +msgid "Opens in a new window" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "Owner" +msgstr "" + +msgid "Pagination|Last »" +msgstr "" + +msgid "Pagination|Next" +msgstr "" + +msgid "Pagination|Prev" +msgstr "" + +msgid "Pagination|« First" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Pipeline" +msgstr "" + +msgid "Pipeline Health" +msgstr "" + +msgid "Pipeline Schedule" +msgstr "" + +msgid "Pipeline Schedules" +msgstr "" + +msgid "Pipeline quota" +msgstr "" + +msgid "PipelineCharts|Failed:" +msgstr "" + +msgid "PipelineCharts|Overall statistics" +msgstr "" + +msgid "PipelineCharts|Success ratio:" +msgstr "" + +msgid "PipelineCharts|Successful:" +msgstr "" + +msgid "PipelineCharts|Total:" +msgstr "" + +msgid "PipelineSchedules|Activated" +msgstr "" + +msgid "PipelineSchedules|Active" +msgstr "" + +msgid "PipelineSchedules|All" +msgstr "" + +msgid "PipelineSchedules|Inactive" +msgstr "" + +msgid "PipelineSchedules|Next Run" +msgstr "" + +msgid "PipelineSchedules|None" +msgstr "" + +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "" + +msgid "PipelineSchedules|Take ownership" +msgstr "" + +msgid "PipelineSchedules|Target" +msgstr "" + +msgid "PipelineSchedules|Variables" +msgstr "" + +msgid "PipelineSheduleIntervalPattern|Custom" +msgstr "" + +msgid "Pipelines" +msgstr "" + +msgid "Pipelines charts" +msgstr "" + +msgid "Pipelines for last month" +msgstr "" + +msgid "Pipelines for last week" +msgstr "" + +msgid "Pipelines for last year" +msgstr "" + +msgid "Pipelines|Build with confidence" +msgstr "" + +msgid "Pipelines|Get started with Pipelines" +msgstr "" + +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|all" +msgstr "" + +msgid "Pipeline|success" +msgstr "" + +msgid "Pipeline|with stage" +msgstr "" + +msgid "Pipeline|with stages" +msgstr "" + +msgid "Play" +msgstr "" + +msgid "Please <a href=%{link_to_billing} target=\"_blank\" rel=\"noopener noreferrer\">enable billing for one of your projects to be able to create a Kubernetes cluster</a>, then try again." +msgstr "" + +msgid "Please solve the reCAPTCHA" +msgstr "" + +msgid "Preferences" +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + +msgid "Profile" +msgstr "" + +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Programming languages used in this repository" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + +msgid "Project '%{project_name}' queued for deletion." +msgstr "" + +msgid "Project '%{project_name}' was successfully created." +msgstr "" + +msgid "Project '%{project_name}' was successfully updated." +msgstr "" + +msgid "Project access must be granted explicitly to each user." +msgstr "" + +msgid "Project avatar" +msgstr "" + +msgid "Project avatar in repository: %{link}" +msgstr "" + +msgid "Project cache successfully reset." +msgstr "" + +msgid "Project details" +msgstr "" + +msgid "Project export could not be deleted." +msgstr "" + +msgid "Project export has been deleted." +msgstr "" + +msgid "Project export link has expired. Please generate a new export from your project settings." +msgstr "" + +msgid "Project export started. A download link will be sent by email." +msgstr "" + +msgid "ProjectActivityRSS|Subscribe" +msgstr "" + +msgid "ProjectCreationLevel|Allowed to create projects" +msgstr "" + +msgid "ProjectCreationLevel|Default project creation protection" +msgstr "" + +msgid "ProjectCreationLevel|Developers + Masters" +msgstr "" + +msgid "ProjectCreationLevel|Masters" +msgstr "" + +msgid "ProjectCreationLevel|No one" +msgstr "" + +msgid "ProjectFeature|Disabled" +msgstr "" + +msgid "ProjectFeature|Everyone with access" +msgstr "" + +msgid "ProjectFeature|Only team members" +msgstr "" + +msgid "ProjectFileTree|Name" +msgstr "" + +msgid "ProjectLastActivity|Never" +msgstr "" + +msgid "ProjectLifecycle|Stage" +msgstr "" + +msgid "ProjectNetworkGraph|Graph" +msgstr "" + +msgid "ProjectSettings|Contact an admin to change this setting." +msgstr "" + +msgid "ProjectSettings|Only signed commits can be pushed to this repository." +msgstr "" + +msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." +msgstr "" + +msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." +msgstr "" + +msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." +msgstr "" + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + +msgid "ProjectsDropdown|Frequently visited" +msgstr "" + +msgid "ProjectsDropdown|Loading projects" +msgstr "" + +msgid "ProjectsDropdown|Projects you visit often will appear here" +msgstr "" + +msgid "ProjectsDropdown|Search your projects" +msgstr "" + +msgid "ProjectsDropdown|Something went wrong on our end." +msgstr "" + +msgid "ProjectsDropdown|Sorry, no projects matched your search" +msgstr "" + +msgid "ProjectsDropdown|This feature requires browser localStorage support" +msgstr "" + +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + +msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." +msgstr "" + +msgid "PrometheusService|Finding and configuring metrics..." +msgstr "" + +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + +msgid "PrometheusService|Metrics" +msgstr "" + +msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters." +msgstr "" + +msgid "PrometheusService|Missing environment variable" +msgstr "" + +msgid "PrometheusService|Monitored" +msgstr "" + +msgid "PrometheusService|More information" +msgstr "" + +msgid "PrometheusService|No metrics are being monitored. To start monitoring, deploy to an environment." +msgstr "" + +msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" +msgstr "" + +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + +msgid "PrometheusService|Time-series monitoring service" +msgstr "" + +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + +msgid "PrometheusService|View environments" +msgstr "" + +msgid "Protip:" +msgstr "" + +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + +msgid "Push Rules" +msgstr "" + +msgid "Push events" +msgstr "" + +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + +msgid "PushRule|Committer restriction" +msgstr "" + +msgid "Quick actions can be used in the issues description and comment boxes." +msgstr "" + +msgid "Read more" +msgstr "" + +msgid "Readme" +msgstr "" + +msgid "RefSwitcher|Branches" +msgstr "" + +msgid "RefSwitcher|Tags" +msgstr "" + +msgid "Reference:" +msgstr "" + +msgid "Register / Sign In" +msgstr "" + +msgid "Registry" +msgstr "" + +msgid "Related Commits" +msgstr "" + +msgid "Related Deployed Jobs" +msgstr "" + +msgid "Related Issues" +msgstr "" + +msgid "Related Jobs" +msgstr "" + +msgid "Related Merge Requests" +msgstr "" + +msgid "Related Merged Requests" +msgstr "" + +msgid "Remind later" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Remove avatar" +msgstr "" + +msgid "Remove project" +msgstr "" + +msgid "Repair authentication" +msgstr "" + +msgid "Repository" +msgstr "" + +msgid "Repository has no locks." +msgstr "" + +msgid "Request Access" +msgstr "" + +msgid "Reset git storage health information" +msgstr "" + +msgid "Reset health check access token" +msgstr "" + +msgid "Reset runners registration token" +msgstr "" + +msgid "Resolve discussion" +msgstr "" + +msgid "Reveal value" +msgid_plural "Reveal values" +msgstr[0] "" +msgstr[1] "" + +msgid "Revert this commit" +msgstr "" + +msgid "Revert this merge request" +msgstr "" + +msgid "Roadmap" +msgstr "" + +msgid "SSH Keys" +msgstr "" + +msgid "Save changes" +msgstr "" + +msgid "Save pipeline schedule" +msgstr "" + +msgid "Save variables" +msgstr "" + +msgid "Schedule a new pipeline" +msgstr "" + +msgid "Schedules" +msgstr "" + +msgid "Scheduling Pipelines" +msgstr "" + +msgid "Scoped issue boards" +msgstr "" + +msgid "Search branches and tags" +msgstr "" + +msgid "Search milestones" +msgstr "" + +msgid "Search project" +msgstr "" + +msgid "Search users" +msgstr "" + +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + +msgid "Secret variables" +msgstr "" + +msgid "Security report" +msgstr "" + +msgid "Select Archive Format" +msgstr "" + +msgid "Select a timezone" +msgstr "" + +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + +msgid "Select assignee" +msgstr "" + +msgid "Select branch/tag" +msgstr "" + +msgid "Select target branch" +msgstr "" + +msgid "Selective synchronization" +msgstr "" + +msgid "Send email" +msgstr "" + +msgid "Sep" +msgstr "" + +msgid "September" +msgstr "" + +msgid "Server version" +msgstr "" + +msgid "Service Templates" +msgstr "" + +msgid "Service URL" +msgstr "" + +msgid "Set a password on your account to pull or push via %{protocol}." +msgstr "" + +msgid "Set up CI/CD" +msgstr "" + +msgid "Set up Koding" +msgstr "" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Setup a specific Runner automatically" +msgstr "" + +msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." +msgstr "" + +msgid "SharedRunnersMinutesSettings|Reset pipeline minutes" +msgstr "" + +msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" +msgstr "" + +msgid "Show command" +msgstr "" + +msgid "Show parent pages" +msgstr "" + +msgid "Show parent subgroups" +msgstr "" + +msgid "Showing %d event" +msgid_plural "Showing %d events" +msgstr[0] "" +msgstr[1] "" + +msgid "Sidebar|Change weight" +msgstr "" + +msgid "Sidebar|No" +msgstr "" + +msgid "Sidebar|None" +msgstr "" + +msgid "Sidebar|Weight" +msgstr "" + +msgid "Snippets" +msgstr "" + +msgid "Something went wrong on our end" +msgstr "" + +msgid "Something went wrong on our end." +msgstr "" + +msgid "Something went wrong trying to change the confidentiality of this issue" +msgstr "" + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName}" +msgstr "" + +msgid "Something went wrong when toggling the button" +msgstr "" + +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + +msgid "Something went wrong while fetching the projects." +msgstr "" + +msgid "Something went wrong while fetching the registry list." +msgstr "" + +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + +msgid "Something went wrong. Please try again." +msgstr "" + +msgid "Sort by" +msgstr "" + +msgid "SortOptions|Access level, ascending" +msgstr "" + +msgid "SortOptions|Access level, descending" +msgstr "" + +msgid "SortOptions|Created date" +msgstr "" + +msgid "SortOptions|Due date" +msgstr "" + +msgid "SortOptions|Due later" +msgstr "" + +msgid "SortOptions|Due soon" +msgstr "" + +msgid "SortOptions|Label priority" +msgstr "" + +msgid "SortOptions|Largest group" +msgstr "" + +msgid "SortOptions|Largest repository" +msgstr "" + +msgid "SortOptions|Last created" +msgstr "" + +msgid "SortOptions|Last joined" +msgstr "" + +msgid "SortOptions|Last updated" +msgstr "" + +msgid "SortOptions|Least popular" +msgstr "" + +msgid "SortOptions|Less weight" +msgstr "" + +msgid "SortOptions|Milestone" +msgstr "" + +msgid "SortOptions|Milestone due later" +msgstr "" + +msgid "SortOptions|Milestone due soon" +msgstr "" + +msgid "SortOptions|More weight" +msgstr "" + +msgid "SortOptions|Most popular" +msgstr "" + +msgid "SortOptions|Name" +msgstr "" + +msgid "SortOptions|Name, ascending" +msgstr "" + +msgid "SortOptions|Name, descending" +msgstr "" + +msgid "SortOptions|Oldest created" +msgstr "" + +msgid "SortOptions|Oldest joined" +msgstr "" + +msgid "SortOptions|Oldest sign in" +msgstr "" + +msgid "SortOptions|Oldest updated" +msgstr "" + +msgid "SortOptions|Popularity" +msgstr "" + +msgid "SortOptions|Priority" +msgstr "" + +msgid "SortOptions|Recent sign in" +msgstr "" + +msgid "SortOptions|Start later" +msgstr "" + +msgid "SortOptions|Start soon" +msgstr "" + +msgid "SortOptions|Weight" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Source (branch or tag)" +msgstr "" + +msgid "Source code" +msgstr "" + +msgid "Source is not available" +msgstr "" + +msgid "Spam Logs" +msgstr "" + +msgid "Specify the following URL during the Runner setup:" +msgstr "" + +msgid "StarProject|Star" +msgstr "" + +msgid "Starred projects" +msgstr "" + +msgid "Start a %{new_merge_request} with these changes" +msgstr "" + +msgid "Start the Runner!" +msgstr "" + +msgid "Stopped" +msgstr "" + +msgid "Storage" +msgstr "" + +msgid "Subgroups" +msgstr "" + +msgid "Switch branch/tag" +msgstr "" + +msgid "System Hooks" +msgstr "" + +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" +msgstr[1] "" + +msgid "Tags" +msgstr "" + +msgid "TagsPage|Browse commits" +msgstr "" + +msgid "TagsPage|Browse files" +msgstr "" + +msgid "TagsPage|Can't find HEAD commit for this tag" +msgstr "" + +msgid "TagsPage|Cancel" +msgstr "" + +msgid "TagsPage|Create tag" +msgstr "" + +msgid "TagsPage|Delete tag" +msgstr "" + +msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?" +msgstr "" + +msgid "TagsPage|Edit release notes" +msgstr "" + +msgid "TagsPage|Existing branch name, tag, or commit SHA" +msgstr "" + +msgid "TagsPage|Filter by tag name" +msgstr "" + +msgid "TagsPage|New Tag" +msgstr "" + +msgid "TagsPage|New tag" +msgstr "" + +msgid "TagsPage|Optionally, add a message to the tag." +msgstr "" + +msgid "TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page." +msgstr "" + +msgid "TagsPage|Release notes" +msgstr "" + +msgid "TagsPage|Repository has no tags yet." +msgstr "" + +msgid "TagsPage|Sort by" +msgstr "" + +msgid "TagsPage|Tags" +msgstr "" + +msgid "TagsPage|Tags give the ability to mark specific points in history as being important" +msgstr "" + +msgid "TagsPage|This tag has no release notes." +msgstr "" + +msgid "TagsPage|Use git tag command to add a new one:" +msgstr "" + +msgid "TagsPage|Write your release notes or drag files here..." +msgstr "" + +msgid "TagsPage|protected" +msgstr "" + +msgid "Target Branch" +msgstr "" + +msgid "Team" +msgstr "" + +msgid "Thanks! Don't show me this again" +msgstr "" + +msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." +msgstr "" + +msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project" +msgstr "" + +msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project." +msgstr "" + +msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." +msgstr "" + +msgid "The collection of events added to the data gathered for that stage." +msgstr "" + +msgid "The fork relationship has been removed." +msgstr "" + +msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." +msgstr "" + +msgid "The maximum file size allowed is 200KB." +msgstr "" + +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + +msgid "The phase of the development lifecycle." +msgstr "" + +msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." +msgstr "" + +msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." +msgstr "" + +msgid "The project can be accessed by any logged in user." +msgstr "" + +msgid "The project can be accessed without any authentication." +msgstr "" + +msgid "The repository for this project does not exist." +msgstr "" + +msgid "The repository for this project is empty" +msgstr "" + +msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." +msgstr "" + +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + +msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." +msgstr "" + +msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." +msgstr "" + +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + +msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check." +msgstr "" + +msgid "The time taken by each data entry gathered by that stage." +msgstr "" + +msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6." +msgstr "" + +msgid "There are no issues to show" +msgstr "" + +msgid "There are no merge requests to show" +msgstr "" + +msgid "There are problems accessing Git storage: " +msgstr "" + +msgid "There was an error loading users activity calendar." +msgstr "" + +msgid "There was an error saving your notification settings." +msgstr "" + +msgid "There was an error subscribing to this label." +msgstr "" + +msgid "There was an error when reseting email token." +msgstr "" + +msgid "There was an error when subscribing to this label." +msgstr "" + +msgid "There was an error when unsubscribing from this label." +msgstr "" + +msgid "This board\\'s scope is reduced" +msgstr "" + +msgid "This directory" +msgstr "" + +msgid "This is a confidential issue." +msgstr "" + +msgid "This is the author's first Merge Request to this project." +msgstr "" + +msgid "This issue is confidential" +msgstr "" + +msgid "This issue is confidential and locked." +msgstr "" + +msgid "This issue is locked." +msgstr "" + +msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments" +msgstr "" + +msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered" +msgstr "" + +msgid "This job has not been triggered yet" +msgstr "" + +msgid "This job has not started yet" +msgstr "" + +msgid "This job is in pending state and is waiting to be picked by a runner" +msgstr "" + +msgid "This job requires a manual action" +msgstr "" + +msgid "This means you can not push code until you create an empty repository or import existing one." +msgstr "" + +msgid "This merge request is locked." +msgstr "" + +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + +msgid "This project" +msgstr "" + +msgid "This repository" +msgstr "" + +msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here." +msgstr "" + +msgid "Time before an issue gets scheduled" +msgstr "" + +msgid "Time before an issue starts implementation" +msgstr "" + +msgid "Time between merge request creation and merge/close" +msgstr "" + +msgid "Time tracking" +msgstr "" + +msgid "Time until first merge request" +msgstr "" + +msgid "TimeTrackingEstimated|Est" +msgstr "" + +msgid "TimeTracking|Estimated:" +msgstr "" + +msgid "TimeTracking|Spent" +msgstr "" + +msgid "Timeago|%s days ago" +msgstr "" + +msgid "Timeago|%s days remaining" +msgstr "" + +msgid "Timeago|%s hours remaining" +msgstr "" + +msgid "Timeago|%s minutes ago" +msgstr "" + +msgid "Timeago|%s minutes remaining" +msgstr "" + +msgid "Timeago|%s months ago" +msgstr "" + +msgid "Timeago|%s months remaining" +msgstr "" + +msgid "Timeago|%s seconds remaining" +msgstr "" + +msgid "Timeago|%s weeks ago" +msgstr "" + +msgid "Timeago|%s weeks remaining" +msgstr "" + +msgid "Timeago|%s years ago" +msgstr "" + +msgid "Timeago|%s years remaining" +msgstr "" + +msgid "Timeago|1 day remaining" +msgstr "" + +msgid "Timeago|1 hour remaining" +msgstr "" + +msgid "Timeago|1 minute remaining" +msgstr "" + +msgid "Timeago|1 month remaining" +msgstr "" + +msgid "Timeago|1 week remaining" +msgstr "" + +msgid "Timeago|1 year remaining" +msgstr "" + +msgid "Timeago|Past due" +msgstr "" + +msgid "Timeago|a day ago" +msgstr "" + +msgid "Timeago|a month ago" +msgstr "" + +msgid "Timeago|a week ago" +msgstr "" + +msgid "Timeago|a year ago" +msgstr "" + +msgid "Timeago|about %s hours ago" +msgstr "" + +msgid "Timeago|about a minute ago" +msgstr "" + +msgid "Timeago|about an hour ago" +msgstr "" + +msgid "Timeago|in %s days" +msgstr "" + +msgid "Timeago|in %s hours" +msgstr "" + +msgid "Timeago|in %s minutes" +msgstr "" + +msgid "Timeago|in %s months" +msgstr "" + +msgid "Timeago|in %s seconds" +msgstr "" + +msgid "Timeago|in %s weeks" +msgstr "" + +msgid "Timeago|in %s years" +msgstr "" + +msgid "Timeago|in 1 day" +msgstr "" + +msgid "Timeago|in 1 hour" +msgstr "" + +msgid "Timeago|in 1 minute" +msgstr "" + +msgid "Timeago|in 1 month" +msgstr "" + +msgid "Timeago|in 1 week" +msgstr "" + +msgid "Timeago|in 1 year" +msgstr "" + +msgid "Timeago|in a while" +msgstr "" + +msgid "Timeago|less than a minute ago" +msgstr "" + +msgid "Time|hr" +msgid_plural "Time|hrs" +msgstr[0] "" +msgstr[1] "" + +msgid "Time|min" +msgid_plural "Time|mins" +msgstr[0] "" +msgstr[1] "" + +msgid "Time|s" +msgstr "" + +msgid "Tip:" +msgstr "" + +msgid "Title" +msgstr "" + +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + +msgid "Todo" +msgstr "" + +msgid "Toggle sidebar" +msgstr "" + +msgid "ToggleButton|Toggle Status: OFF" +msgstr "" + +msgid "ToggleButton|Toggle Status: ON" +msgstr "" + +msgid "Total Time" +msgstr "" + +msgid "Total test time for all commits/merges" +msgstr "" + +msgid "Total: %{total}" +msgstr "" + +msgid "Track activity with Contribution Analytics." +msgstr "" + +msgid "Track groups of issues that share a theme, across projects and milestones" +msgstr "" + +msgid "Track time with quick actions" +msgstr "" + +msgid "Trigger this manual action" +msgstr "" + +msgid "Turn on Service Desk" +msgstr "" + +msgid "Unable to reset project cache." +msgstr "" + +msgid "Unknown" +msgstr "" + +msgid "Unlock" +msgstr "" + +msgid "Unlock this %{issuableDisplayName}? <strong>Everyone</strong> will be able to comment." +msgstr "" + +msgid "Unlocked" +msgstr "" + +msgid "Unresolve discussion" +msgstr "" + +msgid "Unstar" +msgstr "" + +msgid "Up to date" +msgstr "" + +msgid "Upgrade your plan to activate Advanced Global Search." +msgstr "" + +msgid "Upgrade your plan to activate Contribution Analytics." +msgstr "" + +msgid "Upgrade your plan to activate Group Webhooks." +msgstr "" + +msgid "Upgrade your plan to activate Issue weight." +msgstr "" + +msgid "Upgrade your plan to improve Issue boards." +msgstr "" + +msgid "Upload New File" +msgstr "" + +msgid "Upload file" +msgstr "" + +msgid "Upload new avatar" +msgstr "" + +msgid "UploadLink|click to upload" +msgstr "" + +msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab" +msgstr "" + +msgid "Use the following registration token during setup:" +msgstr "" + +msgid "Use your global notification setting" +msgstr "" + +msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." +msgstr "" + +msgid "View epics list" +msgstr "" + +msgid "View file @ " +msgstr "" + +msgid "View labels" +msgstr "" + +msgid "View open merge request" +msgstr "" + +msgid "View replaced file @ " +msgstr "" + +msgid "VisibilityLevel|Internal" +msgstr "" + +msgid "VisibilityLevel|Private" +msgstr "" + +msgid "VisibilityLevel|Public" +msgstr "" + +msgid "VisibilityLevel|Unknown" +msgstr "" + +msgid "Want to see the data? Please ask an administrator for access." +msgstr "" + +msgid "We could not verify that one of your projects on GCP has billing enabled. Please try again." +msgstr "" + +msgid "We don't have enough data to show this stage." +msgstr "" + +msgid "We want to be sure it is you, please confirm you are not a robot." +msgstr "" + +msgid "Web IDE" +msgstr "" + +msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Wiki" +msgstr "" + +msgid "WikiClone|Clone your wiki" +msgstr "" + +msgid "WikiClone|Git Access" +msgstr "" + +msgid "WikiClone|Install Gollum" +msgstr "" + +msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" +msgstr "" + +msgid "WikiClone|Start Gollum and edit locally" +msgstr "" + +msgid "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title." +msgstr "" + +msgid "WikiEdit|There is already a page with the same title in that path." +msgstr "" + +msgid "WikiEmptyPageError|You are not allowed to create wiki pages" +msgstr "" + +msgid "WikiHistoricalPage|This is an old version of this page." +msgstr "" + +msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." +msgstr "" + +msgid "WikiHistoricalPage|history" +msgstr "" + +msgid "WikiHistoricalPage|most recent version" +msgstr "" + +msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" +msgstr "" + +msgid "WikiMarkdownDocs|documentation" +msgstr "" + +msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" +msgstr "" + +msgid "WikiNewPagePlaceholder|how-to-setup" +msgstr "" + +msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." +msgstr "" + +msgid "WikiNewPageTitle|New Wiki Page" +msgstr "" + +msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" +msgstr "" + +msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." +msgstr "" + +msgid "WikiPageConflictMessage|the page" +msgstr "" + +msgid "WikiPageCreate|Create %{page_title}" +msgstr "" + +msgid "WikiPageEdit|Update %{page_title}" +msgstr "" + +msgid "WikiPage|Page slug" +msgstr "" + +msgid "WikiPage|Write your content or drag files here..." +msgstr "" + +msgid "Wiki|Create Page" +msgstr "" + +msgid "Wiki|Create page" +msgstr "" + +msgid "Wiki|Edit Page" +msgstr "" + +msgid "Wiki|Empty page" +msgstr "" + +msgid "Wiki|More Pages" +msgstr "" + +msgid "Wiki|New page" +msgstr "" + +msgid "Wiki|Page history" +msgstr "" + +msgid "Wiki|Page version" +msgstr "" + +msgid "Wiki|Pages" +msgstr "" + +msgid "Wiki|Wiki Pages" +msgstr "" + +msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." +msgstr "" + +msgid "Withdraw Access Request" +msgstr "" + +msgid "Write a commit message..." +msgstr "" + +msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" +msgstr "" + +msgid "You can also create a project from the command line." +msgstr "" + +msgid "You can also star a label to make it a priority label." +msgstr "" + +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" +msgstr "" + +msgid "You can move around the graph by using the arrow keys." +msgstr "" + +msgid "You can only add files when you are on a branch" +msgstr "" + +msgid "You can only edit files when you are on a branch" +msgstr "" + +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + +msgid "You have reached your project limit" +msgstr "" + +msgid "You must have master access to force delete a lock" +msgstr "" + +msgid "You must sign in to star a project" +msgstr "" + +msgid "You need a different license to enable FileLocks feature" +msgstr "" + +msgid "You need permission." +msgstr "" + +msgid "You will not get any notifications via email" +msgstr "" + +msgid "You will only receive notifications for the events you choose" +msgstr "" + +msgid "You will only receive notifications for threads you have participated in" +msgstr "" + +msgid "You will receive notifications for any activity" +msgstr "" + +msgid "You will receive notifications only for comments in which you were @mentioned" +msgstr "" + +msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account" +msgstr "" + +msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile" +msgstr "" + +msgid "You won't be able to pull or push project code via SSH until you add an SSH key to your profile" +msgstr "" + +msgid "You'll need to use different branch names to get a valid comparison." +msgstr "" + +msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" +msgstr "" + +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + +msgid "Your comment will not be visible to the public." +msgstr "" + +msgid "Your groups" +msgstr "" + +msgid "Your name" +msgstr "" + +msgid "Your projects" +msgstr "" + +msgid "assign yourself" +msgstr "" + +msgid "branch name" +msgstr "" + +msgid "by" +msgstr "" + +msgid "ciReport|Code quality" +msgstr "" + +msgid "ciReport|DAST detected no alerts by analyzing the review app" +msgstr "" + +msgid "ciReport|Failed to load %{reportName} report" +msgstr "" + +msgid "ciReport|Fixed:" +msgstr "" + +msgid "ciReport|Instances" +msgstr "" + +msgid "ciReport|Learn more about whitelisting" +msgstr "" + +msgid "ciReport|Loading %{reportName} report" +msgstr "" + +msgid "ciReport|No changes to code quality" +msgstr "" + +msgid "ciReport|No changes to performance metrics" +msgstr "" + +msgid "ciReport|Performance metrics" +msgstr "" + +msgid "ciReport|SAST" +msgstr "" + +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + +msgid "ciReport|SAST detected no security vulnerabilities" +msgstr "" + +msgid "ciReport|SAST:container no vulnerabilities were found" +msgstr "" + +msgid "ciReport|Show complete code vulnerabilities report" +msgstr "" + +msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" +msgstr "" + +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + +msgid "commit" +msgstr "" + +msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue." +msgstr "" + +msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with <strong>at least Reporter access</strong> are able to see and leave comments on the issue." +msgstr "" + +msgid "day" +msgid_plural "days" +msgstr[0] "" +msgstr[1] "" + +msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." +msgstr "" + +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + +msgid "merge request" +msgid_plural "merge requests" +msgstr[0] "" +msgstr[1] "" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + +msgid "mrWidget|Cancel automatic merge" +msgstr "" + +msgid "mrWidget|Check out branch" +msgstr "" + +msgid "mrWidget|Checking ability to merge automatically" +msgstr "" + +msgid "mrWidget|Cherry-pick" +msgstr "" + +msgid "mrWidget|Cherry-pick this merge request in a new merge request" +msgstr "" + +msgid "mrWidget|Closed" +msgstr "" + +msgid "mrWidget|Closed by" +msgstr "" + +msgid "mrWidget|Closes" +msgstr "" + +msgid "mrWidget|Did not close" +msgstr "" + +msgid "mrWidget|Email patches" +msgstr "" + +msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" +msgstr "" + +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + +msgid "mrWidget|Mentions" +msgstr "" + +msgid "mrWidget|Merge" +msgstr "" + +msgid "mrWidget|Merge failed." +msgstr "" + +msgid "mrWidget|Merge locally" +msgstr "" + +msgid "mrWidget|Merged by" +msgstr "" + +msgid "mrWidget|Plain diff" +msgstr "" + +msgid "mrWidget|Refresh" +msgstr "" + +msgid "mrWidget|Refresh now" +msgstr "" + +msgid "mrWidget|Refreshing now" +msgstr "" + +msgid "mrWidget|Remove Source Branch" +msgstr "" + +msgid "mrWidget|Remove source branch" +msgstr "" + +msgid "mrWidget|Remove your approval" +msgstr "" + +msgid "mrWidget|Request to merge" +msgstr "" + +msgid "mrWidget|Resolve conflicts" +msgstr "" + +msgid "mrWidget|Revert" +msgstr "" + +msgid "mrWidget|Revert this merge request in a new merge request" +msgstr "" + +msgid "mrWidget|Set by" +msgstr "" + +msgid "mrWidget|The changes were merged into" +msgstr "" + +msgid "mrWidget|The changes were not merged into" +msgstr "" + +msgid "mrWidget|The changes will be merged into" +msgstr "" + +msgid "mrWidget|The source branch has been removed" +msgstr "" + +msgid "mrWidget|The source branch is being removed" +msgstr "" + +msgid "mrWidget|The source branch will be removed" +msgstr "" + +msgid "mrWidget|The source branch will not be removed" +msgstr "" + +msgid "mrWidget|There are merge conflicts" +msgstr "" + +msgid "mrWidget|This merge request failed to be merged automatically" +msgstr "" + +msgid "mrWidget|This merge request is in the process of being merged" +msgstr "" + +msgid "mrWidget|This project is archived, write access has been disabled" +msgstr "" + +msgid "mrWidget|You can merge this merge request manually using the" +msgstr "" + +msgid "mrWidget|You can remove source branch now" +msgstr "" + +msgid "mrWidget|branch does not exist." +msgstr "" + +msgid "mrWidget|command line" +msgstr "" + +msgid "mrWidget|into" +msgstr "" + +msgid "mrWidget|to be merged automatically when the pipeline succeeds" +msgstr "" + +msgid "new merge request" +msgstr "" + +msgid "notification emails" +msgstr "" + +msgid "or" +msgstr "" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "" +msgstr[1] "" + +msgid "password" +msgstr "" + +msgid "personal access token" +msgstr "" + +msgid "remove due date" +msgstr "" + +msgid "source" +msgstr "" + +msgid "spendCommand|%{slash_command} will update the sum of the time spent." +msgstr "" + +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + +msgid "uses Kubernetes clusters to deploy your code!" +msgstr "" + +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po index f775a511780..44dbbe8141b 100644 --- a/locale/uk/gitlab.po +++ b/locale/uk/gitlab.po @@ -2,15 +2,15 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 06:15-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:20-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" "X-Generator: crowdin.com\n" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: uk\n" @@ -24,36 +24,45 @@ msgid_plural "%d commits" msgstr[0] "%d коміт" msgstr[1] "%d коміта" msgstr[2] "%d комітів" +msgstr[3] "%d комітів" msgid "%d commit behind" msgid_plural "%d commits behind" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%d коміт позаду" +msgstr[1] "%d коміта позаду" +msgstr[2] "%d комітів позаду" +msgstr[3] "%d комітів позаду" msgid "%d issue" msgid_plural "%d issues" msgstr[0] "%d проблема" msgstr[1] "%d проблеми" msgstr[2] "%d проблем" +msgstr[3] "%d проблем" msgid "%d layer" msgid_plural "%d layers" msgstr[0] "%d шар" msgstr[1] "%d шари" msgstr[2] "%d шарів" +msgstr[3] "%d шарів" msgid "%d merge request" msgid_plural "%d merge requests" msgstr[0] "%d запит на злиттÑ" msgstr[1] "%d запита на злиттÑ" msgstr[2] "%d запитів на злиттÑ" +msgstr[3] "%d запитів на злиттÑ" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "%s доданий коміт був виключений Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ із швидкодією." msgstr[1] "%s доданих коміта були виключені Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ із швидкодією." msgstr[2] "%s доданих комітів були виключені Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ із швидкодією." +msgstr[3] "%s доданих комітів були виключені Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ із швидкодією." + +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "%{actionText} Ñ– %{openOrClose} %{noteable}" msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "%{commit_author_link} закомітив %{commit_timeago}" @@ -63,6 +72,10 @@ msgid_plural "%{count} participants" msgstr[0] "%{count} учаÑтник" msgstr[1] "%{count} учаÑтника" msgstr[2] "%{count} учаÑтників" +msgstr[3] "%{count} учаÑтників" + +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "%{lock_path} заблоковано кориÑтувачем GitLab %{lock_user_id}" msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "на %{number_commits_behind} комітів позаду %{default_branch}, на %{number_commits_ahead} комітів попереду" @@ -73,11 +86,15 @@ msgstr "%{number_of_failures} від %{maximum_failures} невдач. GitLab н msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "%{number_of_failures} від %{maximum_failures} невдач. GitLab автоматично не повторюватиме Ñпробу. Скиньте інформацію Ñховища при уÑуненні проблеми." +msgid "%{openOrClose} %{noteable}" +msgstr "%{openOrClose} %{noteable}" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}: Ñпроба невдалого доÑтупу до Ñховища на хоÑÑ‚Ñ–:" msgstr[1] "%{storage_name}: %{failed_attempts} невдалі Ñпроби доÑтупу до Ñховища:" msgstr[2] "%{storage_name}: %{failed_attempts} невдалих Ñпроб доÑтупу до Ñховища:" +msgstr[3] "%{storage_name}: %{failed_attempts} невдалих Ñпроб доÑтупу до Ñховища:" msgid "%{text} is available" msgstr "%{text} доÑтупний" @@ -96,6 +113,7 @@ msgid_plural "%d pipelines" msgstr[0] "1 конвеєр" msgstr[1] "%d конвеєра" msgstr[2] "%d конвеєрів" +msgstr[3] "%d конвеєрів" msgid "1st contribution!" msgstr "Перший внеÑок!" @@ -139,9 +157,15 @@ msgstr "Додати керівництво Ð´Ð»Ñ ÑƒÑ‡Ð°Ñників" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "Додайте групові веб-гуки та GitLab Enterprise Edition." +msgid "Add Kubernetes cluster" +msgstr "Додати Kubernetes-клаÑтер" + msgid "Add License" msgstr "Додати ліцензію" +msgid "Add Readme" +msgstr "Додати інÑтрукцію" + msgid "Add new directory" msgstr "Додати новий каталог" @@ -160,12 +184,45 @@ msgstr "Зупинити завданнÑ" msgid "AdminArea|Stopping jobs failed" msgstr "Зупинка завдань пройшла невдало" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." -msgstr "" +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." +msgstr "Зараз ви зупинете вÑÑ– завданнÑ. Це обірве уÑÑ– запущені завданнÑ." msgid "AdminHealthPageLink|health page" msgstr "Ñторінка ÑтатуÑу" +msgid "AdminProjects|Delete" +msgstr "Видалити" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "Видалити проект %{projectName}?" + +msgid "AdminProjects|Delete project" +msgstr "Видалити проект" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "Вкажіть домен, Ñкий буде викориÑтовуватиÑÑ Ð² проекті за замовчуваннÑм Ð´Ð»Ñ Ñтадій Auto Review Apps Ñ– Auto Deploy." + +msgid "AdminUsers|Block user" +msgstr "Заблоквати кориÑтувача" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "Видалити кориÑтувача %{username} та його внеÑки?" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "Видалити кориÑтувача %{username}?" + +msgid "AdminUsers|Delete user" +msgstr "Видалити кориÑтувача" + +msgid "AdminUsers|Delete user and contributions" +msgstr "Видалити кориÑтувача Ñ– його внеÑки" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð²ÐµÐ´Ñ–Ñ‚ÑŒ %{projectName}" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð²ÐµÐ´Ñ–Ñ‚ÑŒ %{username}" + msgid "Advanced" msgstr "Розширений" @@ -176,13 +233,13 @@ msgid "All" msgstr "Ð’ÑÑ–" msgid "All changes are committed" -msgstr "" +msgstr "Ð’ÑÑ– зміни закомічені" msgid "Allows you to add and manage Kubernetes clusters." -msgstr "" +msgstr "ДозволÑÑ” додавати та керувати клаÑтерами Kubernetes." msgid "An error occurred previewing the blob" -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду об'єкта" msgid "An error occurred when toggling the notification subscription" msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ підпиÑки на ÑповіщеннÑ" @@ -190,36 +247,72 @@ msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ підпиÑки msgid "An error occurred when updating the issue weight" msgstr "Збій під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð³Ð¸ проблеми" +msgid "An error occurred while adding approver" +msgstr "Помилка при додаванні учаÑника Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" msgid "An error occurred while fetching markdown preview" -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при попередньому переглÑді markdown" msgid "An error occurred while fetching sidebar data" msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ð´Ð»Ñ Ð±Ñ–Ñ‡Ð½Ð¾Ñ— панелі" +msgid "An error occurred while fetching the pipeline." +msgstr "Помилка при отриманні данних конвеєра." + msgid "An error occurred while getting projects" -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні проектів" + +msgid "An error occurred while importing project" +msgstr "Помилка при імпорті проекту" + +msgid "An error occurred while initializing path locks" +msgstr "Помилка при ініціалізації Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ… шлÑхів" + +msgid "An error occurred while loading commits" +msgstr "Помилка при завантажені комітів" + +msgid "An error occurred while loading diff" +msgstr "Помилка при завантаженні разниці (diff)" msgid "An error occurred while loading filenames" -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні файлів" + +msgid "An error occurred while loading the file" +msgstr "Помилка при завантаженні файлу" + +msgid "An error occurred while making the request." +msgstr "Помилка при Ñтворенні запиту." + +msgid "An error occurred while removing approver" +msgstr "Помилка при видаленні учаÑника Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ" msgid "An error occurred while rendering KaTeX" -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при рендерингу KaTeX" msgid "An error occurred while rendering preview broadcast message" msgstr "" msgid "An error occurred while retrieving calendar activity" -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ–" msgid "An error occurred while retrieving diff" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні різниці" + +msgid "An error occurred while saving LDAP override status. Please try again." msgstr "" -msgid "An error occurred while validating username" +msgid "An error occurred while saving assignees" msgstr "" +msgid "An error occurred while validating username" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ імені кориÑтувача" + msgid "An error occurred. Please try again." msgstr "СталаÑÑŒ помилка. Спробуйте ще раз." @@ -241,15 +334,15 @@ msgstr "Заархівований проект! Репозиторій доÑÑ‚ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Ви впевнені, що хочете видалити цей розклад Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°?" -msgid "Are you sure you want to discard your changes?" -msgstr "Ви впевнені, що бажаєте ÑкаÑувати ваші зміни?" - msgid "Are you sure you want to reset registration token?" msgstr "Ви впевнені, що бажаєте Ñкинути реєÑтраційний токен?" msgid "Are you sure you want to reset the health check token?" msgstr "Ви впевнені, що хочете Ñкинути цей ключ перевірки працездатноÑÑ‚Ñ–?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "Ви впевнені, що хочете розблокувати %{path_lock_path}?" + msgid "Are you sure?" msgstr "Ви впевнені?" @@ -289,11 +382,14 @@ msgstr "Ðвтор" msgid "Authors: %{authors}" msgstr "Ðвтори: %{authors}" +msgid "Auto DevOps enabled" +msgstr "Auto DevOps увімкнено" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." -msgstr "" +msgstr "Ð”Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи Auto Review Apps та Auto Deploy необхіден %{kubernetes}." msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly." -msgstr "" +msgstr "Ð”Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи Auto Review Apps та Auto Deploy необхідно вказати доменне Ñ–Ð¼â€™Ñ Ñ‚Ð° %{kubernetes}." msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." msgstr "Ð”Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи Auto Review Apps та Auto Deploy необхідно вказати доменне ім’Ñ." @@ -313,8 +409,14 @@ msgstr "AutoDevOps буде автоматично збирати, теÑтувРmsgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ в %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "Ви можете активувати %{link_to_settings} Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "Ви можете автоматично збирати й теÑтувати ваш заÑтоÑунок, Ñкщо %{link_to_auto_devops_settings} Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту. Ви також можете його автоматично розгортати, Ñкщо %{link_to_add_kubernetes_cluster}." + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "додати Kubernetes-клаÑтер" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "Увімкнути Auto DevOps (Beta)" msgid "Available" msgstr "ДоÑтупний" @@ -325,6 +427,9 @@ msgstr "Ðватар буде видалено. Ви впевнені?" msgid "Average per day: %{average}" msgstr "Ð’ Ñередньому за день: %{average}" +msgid "Begin with the selected commit" +msgstr "Почати із виділеного коміту" + msgid "Billing" msgstr "Білінг" @@ -379,14 +484,12 @@ msgstr "ОплачуєтьÑÑ Ñ‰Ð¾Ñ€Ñ–Ñ‡Ð½Ð¾ %{price_per_year}" msgid "BillingPlans|per user" msgstr "за кориÑтувача" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Гілка" -msgstr[1] "Гілки" -msgstr[2] "Гілок" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "Гілка (%{branch_count})" +msgstr[1] "Гілки (%{branch_count})" +msgstr[2] "Гілок (%{branch_count})" +msgstr[3] "Гілок (%{branch_count})" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Гілка <strong>%{branch_name}</strong> Ñтворена. Ð”Ð»Ñ Ð½Ð°Ñтройки автоматичного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²Ð¸Ð±ÐµÑ€Ñ–Ñ‚ÑŒ GitLab CI Yaml-шаблон Ñ– закомітьте зміни. %{link_to_autodeploy_doc}" @@ -491,7 +594,7 @@ msgid "Branches|project settings" msgstr "ÐалаштуваннÑÑ… проекту" msgid "Branches|protected" -msgstr "захищені" +msgstr "захищена" msgid "Browse Directory" msgstr "ПереглÑнути каталог" @@ -524,7 +627,7 @@ msgid "Cancel edit" msgstr "Відмінити правку" msgid "Cannot modify managed Kubernetes cluster" -msgstr "" +msgstr "Ðеможливо змінити керований клаÑтер Kubernetes" msgid "Change Weight" msgstr "Вага зміни" @@ -542,7 +645,7 @@ msgid "ChangeTypeAction|Revert" msgstr "Ðнулювати коміт" msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes." -msgstr "" +msgstr "Це Ñтворить новий коміт, щоб анулювати Ñ–Ñнуючі зміни." msgid "Changelog" msgstr "СпиÑок змін" @@ -575,16 +678,16 @@ msgid "Choose File ..." msgstr "Виберіть файл ..." msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request." -msgstr "" +msgstr "Виберіть гілку чи тег (напр. %{master}) або введіть коміт (напр. %{sha}) Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду змін або Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ." msgid "Choose file..." msgstr "Виберіть файл..." msgid "Choose which groups you wish to synchronize to this secondary node." -msgstr "" +msgstr "Виберіть групи Ð´Ð»Ñ Ñинхронізації на цей вторинний вузол." msgid "Choose which shards you wish to synchronize to this secondary node." -msgstr "" +msgstr "Виберіть Ñегменти Ð´Ð»Ñ Ñинхронізації на цей вторинний вузол." msgid "CiStatusLabel|canceled" msgstr "ÑкаÑовано" @@ -647,7 +750,7 @@ msgid "CiVariables|Input variable value" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¾Ñ— змінної" msgid "CiVariables|Remove variable row" -msgstr "" +msgstr "Видалити Ñ€Ñдок змінних" msgid "CiVariable|* (All environments)" msgstr "* (Ð’ÑÑ– Ñередовища)" @@ -656,10 +759,10 @@ msgid "CiVariable|All environments" msgstr "Ð’ÑÑ– Ñередовища" msgid "CiVariable|Create wildcard" -msgstr "" +msgstr "Створити шаблон" msgid "CiVariable|Error occured while saving variables" -msgstr "" +msgstr "Помилка при збереженні змінних" msgid "CiVariable|New environment" msgstr "Ðове Ñередовище" @@ -668,10 +771,10 @@ msgid "CiVariable|Protected" msgstr "Захищений" msgid "CiVariable|Search environments" -msgstr "" +msgstr "Пошук Ñередовищ" msgid "CiVariable|Toggle protected" -msgstr "" +msgstr "Ввімкнути/вимкнути захиÑÑ‚" msgid "CiVariable|Validation failed" msgstr "Перевірка невдала" @@ -679,6 +782,9 @@ msgstr "Перевірка невдала" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "circuitbreaker api" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "ÐатиÑніть кнопку нижче, щоб розпочати Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²ÑтановленнÑ, перейшовши на Ñторінку Kubernetes" + msgid "Click to expand text" msgstr "ÐатиÑніть, щоб розгорнути текÑÑ‚" @@ -733,6 +839,9 @@ msgstr "Скопіювати URL API" msgid "ClusterIntegration|Copy CA Certificate" msgstr "Скопіювати Ñертифікат центру Ñертифікації" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "Копіювати IP-адреÑу Ingress в буфер обміну" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "Скопіювати Ñ–Ð¼â€™Ñ Kubernetes-клаÑтера" @@ -781,6 +890,9 @@ msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "Ingress" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "Ingress IP-адреÑа" + msgid "ClusterIntegration|Install" msgstr "Ð’Ñтановити" @@ -791,7 +903,7 @@ msgid "ClusterIntegration|Installing" msgstr "Ð’ÑтановленнÑ" msgid "ClusterIntegration|Integrate Kubernetes cluster automation" -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ñтерної автоматизації Kubernetes" msgid "ClusterIntegration|Integration status" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ—" @@ -812,29 +924,26 @@ msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this pro msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· Kubernetes-клаÑтером увімкнена Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту." msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· Kubernetes-клаÑтером увімкнена Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту. Ð’Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— інтеграції не вплине на клаÑтер, а лише тимчаÑово перерве Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· GitLab." msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..." -msgstr "" +msgstr "Kubernetes-клаÑтер ÑтворюєтьÑÑ Ð½Ð° Google Kubernetes Engine..." msgid "ClusterIntegration|Kubernetes cluster name" msgstr "Ð†Ð¼â€™Ñ Kubernetes-клаÑтера" msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details" -msgstr "" +msgstr "Kubernetes-клаÑтер був уÑпішно Ñтворений на Google Kubernetes Engine. Оновіть Ñторінку, щоб побачити параметри клаÑтера" msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}" -msgstr "" +msgstr "Kubernetes-клаÑтери дозволÑÑŽÑ‚ÑŒ вам викориÑтовувати Review Apps, розгортати ваші заÑтоÑунки, запуÑкати конвеєри Ñ– багато іншого проÑтим ÑпоÑобом. %{link_to_help_page}" msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project" -msgstr "" +msgstr "Kubernetes-клаÑтери можуть бути викориÑтані Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°ÑтоÑунків Ñ– викориÑÑ‚Ð°Ð½Ð½Ñ Review Apps Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{link_to_documentation}" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Kubernetes" - msgid "ClusterIntegration|Learn more about environments" msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñередовища" @@ -842,19 +951,19 @@ msgid "ClusterIntegration|Machine type" msgstr "Тип машини" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters" -msgstr "" +msgstr "ВпевнітьÑÑ, що ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð´Ð¾Ð²Ñ–Ð»ÑŒÐ½ÑÑ” %{link_to_requirements} Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Kubernetes-клаÑтерів" msgid "ClusterIntegration|Manage" msgstr "УправліннÑ" msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}" -msgstr "" +msgstr "Керуйте вашим Kubernetes-клаÑтером за допомогою %{link_gke}" msgid "ClusterIntegration|More information" msgstr "Додаткова інформаціÑ" msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate" -msgstr "" +msgstr "Декілька Kubernetes-клаÑтерів доÑтупні в GitLab Enterprise Edition Premium та Ultimate" msgid "ClusterIntegration|Note:" msgstr "Примітка:" @@ -863,7 +972,7 @@ msgid "ClusterIntegration|Number of nodes" msgstr "КількіÑÑ‚ÑŒ вузлів" msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes" -msgstr "" +msgstr "Введіть інформацію про доÑтуп до Ñвого Kubernetes-клаÑтера. Якщо вам потрібна допомога, ви можете прочитати наші %{link_to_help_page} про Kubernetes" msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" msgstr "Будь-лаÑка впевнітьÑÑ, що ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Google задовольнÑÑ” наÑтупним вимогам:" @@ -881,7 +990,7 @@ msgid "ClusterIntegration|Prometheus" msgstr "Prometheus" msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration." -msgstr "" +msgstr "ПереглÑньте нашу %{link_to_help_page} про інтеграцію із Kubernetes." msgid "ClusterIntegration|Remove Kubernetes cluster integration" msgstr "Відалити інтеграцію із Kubernetes-клаÑтером" @@ -890,7 +999,7 @@ msgid "ClusterIntegration|Remove integration" msgstr "Видалити інтеграцію" msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster." -msgstr "" +msgstr "Видалити конфігурацію Kubernetes-клаÑтера Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту. Це не призведе до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñамого клаÑтера." msgid "ClusterIntegration|Request to begin installing failed" msgstr "Запит про початок вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ виконано" @@ -899,7 +1008,7 @@ msgid "ClusterIntegration|Save changes" msgstr "Зберегти зміни" msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster" -msgstr "" +msgstr "ПереглÑнути та редагувати параметри вашого Kubernetes-клаÑтера" msgid "ClusterIntegration|See machine types" msgstr "ПереглÑнути типи машин" @@ -920,13 +1029,13 @@ msgid "ClusterIntegration|Something went wrong on our end." msgstr "ЩоÑÑŒ пішло не так з нашого боку." msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine" -msgstr "" +msgstr "Помилка при Ñтворенні вашого Kubernetes-клаÑтера на Google Kubernetes Engine" msgid "ClusterIntegration|Something went wrong while installing %{title}" msgstr "Під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %{title} ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°" msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below" -msgstr "" +msgstr "Цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ мати наÑтупні права Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Kubernetes-клаÑтера в %{link_to_container_project}" msgid "ClusterIntegration|Toggle Kubernetes Cluster" msgstr "Увімкнути/вимкнути Kubernetes-клаÑтер" @@ -938,7 +1047,7 @@ msgid "ClusterIntegration|Token" msgstr "Токен" msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "За допомогою підключеного до цього проекту Kubernetes-клаÑтера, ви можете викориÑтовувати Review Apps, розгортати ваші проекти, запуÑкати конвеєри збірки тощо." msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}" msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ мати %{link_to_kubernetes_engine}" @@ -950,7 +1059,7 @@ msgid "ClusterIntegration|access to Google Kubernetes Engine" msgstr "доÑтуп до Google Kubernetes Engine" msgid "ClusterIntegration|check the pricing here" -msgstr "" +msgstr "переглÑнути ціни тут" msgid "ClusterIntegration|documentation" msgstr "документації" @@ -970,6 +1079,12 @@ msgstr "правильно налаштований" msgid "Collapse" msgstr "Згорнути" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "Коментарі" @@ -978,6 +1093,14 @@ msgid_plural "Commits" msgstr[0] "Коміт" msgstr[1] "Коміта" msgstr[2] "Комітів" +msgstr[3] "Комітів" + +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "Коміт (%{commit_count})" +msgstr[1] "Коміта (%{commit_count})" +msgstr[2] "Комітів (%{commit_count})" +msgstr[3] "Комітів (%{commit_count})" msgid "Commit Message" msgstr "Коміт-повідомелннÑ" @@ -989,7 +1112,10 @@ msgid "Commit message" msgstr "Коміт-повідомленнÑ" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" -msgstr "" +msgstr "СтатиÑтика комітів Ð´Ð»Ñ %{ref} %{start_time} - %{end_time}" + +msgid "Commit to %{branchName} branch" +msgstr "Закомітити в гілку %{branchName}" msgid "CommitBoxTitle|Commit" msgstr "Коміт" @@ -1004,16 +1130,16 @@ msgid "Commits feed" msgstr "Канал комітів" msgid "Commits per day hour (UTC)" -msgstr "" +msgstr "Комітів по годинам Ð´Ð½Ñ (за Грінвічем)" msgid "Commits per day of month" -msgstr "" +msgstr "Комітів по днÑм міÑÑцÑ" msgid "Commits per weekday" -msgstr "" +msgstr "Комітів по днÑм тижнÑ" msgid "Commits|An error occurred while fetching merge requests data." -msgstr "" +msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… запиту на злиттÑ." msgid "Commits|Commit: %{commitText}" msgstr "Коміт: %{commitText}" @@ -1022,7 +1148,7 @@ msgid "Commits|History" msgstr "ІÑторіÑ" msgid "Commits|No related merge requests found" -msgstr "" +msgstr "Ðе знайдено пов'Ñзаних запитів на злиттÑ" msgid "Committed by" msgstr "Коміт від" @@ -1031,13 +1157,13 @@ msgid "Compare" msgstr "ПорівнÑти" msgid "Compare Git revisions" -msgstr "" +msgstr "ПорівнÑти Git-редакції" msgid "Compare Revisions" msgstr "ПорівнÑÐ½Ð½Ñ Ñ€ÐµÐ´Ð°ÐºÑ†Ñ–Ð¹" msgid "CompareBranches|%{source_branch} and %{target_branch} are the same." -msgstr "" +msgstr "%{source_branch} Ñ– %{target_branch} однакові." msgid "CompareBranches|Compare" msgstr "ПорівнÑти" @@ -1046,7 +1172,7 @@ msgid "CompareBranches|Source" msgstr "Джерело" msgid "CompareBranches|Target" -msgstr "" +msgstr "Ціль" msgid "CompareBranches|There isn't anything to compare." msgstr "" @@ -1103,7 +1229,7 @@ msgid "Contribution guide" msgstr "ІнÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ Ð´Ð»Ñ ÑƒÑ‡Ð°Ñників" msgid "Contributors" -msgstr "Контриб’ютори" +msgstr "УчаÑники" msgid "ContributorsPage|%{startDate} – %{endDate}" msgstr "%{startDate} – %{endDate}" @@ -1132,11 +1258,14 @@ msgstr "Скопіювати URL в буфер обміну" msgid "Copy branch name to clipboard" msgstr "Скопіювати назву гілки в буфер обміну" +msgid "Copy command to clipboard" +msgstr "Скопіювати команду в буфер обміну" + msgid "Copy commit SHA to clipboard" msgstr "Скопіювати ідентифікатор в буфер обміну" msgid "Copy reference to clipboard" -msgstr "" +msgstr "Скопіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² буфер обміну" msgid "Create" msgstr "Створити" @@ -1144,9 +1273,18 @@ msgstr "Створити" msgid "Create New Directory" msgstr "Створити новий каталог" +msgid "Create a new branch" +msgstr "Створити нову гілку" + +msgid "Create a new branch and merge request" +msgstr "Створити нову гілку Ñ– запит на злиттÑ" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "Створіть токен доÑтупу Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ аккаунта, щоб відправлÑти та отримувати через %{protocol}." +msgid "Create branch" +msgstr "Створити гілку" + msgid "Create directory" msgstr "Створити каталог" @@ -1160,11 +1298,14 @@ msgid "Create file" msgstr "Створити файл" msgid "Create lists from labels. Issues with that label appear in that list." -msgstr "" +msgstr "Створити ÑпиÑок на оÑтнові міток. Ð’ ньому будуть проблеми з такими мітками." msgid "Create merge request" msgstr "Створити запит на злиттÑ" +msgid "Create merge request and branch" +msgstr "Створити запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‚Ð° гілку" + msgid "Create new branch" msgstr "Створити нову гілку" @@ -1189,6 +1330,12 @@ msgstr "Тег" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "Створити токен Ð´Ð»Ñ Ð¾ÑобиÑтого доÑтупу" +msgid "Creates a new branch from %{branchName}" +msgstr "Створює нову гілку із %{branchName}" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "Створює нову гілку із %{branchName} Ñ– перенаправлÑÑ” Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ запиту на злиттÑ" + msgid "Creating epic" msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑƒ" @@ -1243,6 +1390,9 @@ msgstr "груд." msgid "December" msgstr "грудень" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "Визначте влаÑний шаблон за допомогою ÑинтакÑиÑу cron" @@ -1254,6 +1404,7 @@ msgid_plural "Deploys" msgstr[0] "РозгортаннÑ" msgstr[1] "РозгортаннÑ" msgstr[2] "Розгортань" +msgstr[3] "Розгортань" msgid "Deploy Keys" msgstr "Ключі Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ" @@ -1268,7 +1419,7 @@ msgid "Details" msgstr "Деталі" msgid "Diffs|No file name available" -msgstr "" +msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ не доÑтупне" msgid "Directory name" msgstr "Ім'Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ" @@ -1276,11 +1427,11 @@ msgstr "Ім'Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ" msgid "Disable" msgstr "Вимкнути" -msgid "Discard changes" -msgstr "СкаÑувати зміни" +msgid "Discard draft" +msgstr "Видалити чернетку" msgid "Discover GitLab Geo." -msgstr "" +msgstr "Відкрийте GitLab Geo." msgid "Dismiss Cycle Analytics introduction box" msgstr "Відмінити блок вÑтупу до Ðналитики Циклу" @@ -1310,7 +1461,7 @@ msgid "DownloadArtifacts|Download" msgstr "Завантажити" msgid "DownloadCommit|Email Patches" -msgstr "Email-патчи" +msgstr "Email-патчі" msgid "DownloadCommit|Plain Diff" msgstr "ПроÑте порівнÑÐ½Ð½Ñ (diff)" @@ -1336,6 +1487,9 @@ msgstr "ÐдреÑи електронної пошти" msgid "Enable" msgstr "Увімкнути" +msgid "Enable Auto DevOps" +msgstr "Увімкнути Auto DevOps" + msgid "Environments|An error occurred while fetching the environments." msgstr "Виникла помилка при завантаженні Ñередовищ." @@ -1390,14 +1544,23 @@ msgstr "Епік буде видалено! Ви впевнені?" msgid "Epics" msgstr "Епіки" +msgid "Epics Roadmap" +msgstr "План-графік епіків" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "Епіки дозволÑÑŽÑ‚ÑŒ керувати вашим портфелем проектів ефективніше та з меншими зуÑиллÑми" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "Помилка при Ñтворенні епіку" msgid "Error fetching contributors data." -msgstr "" +msgstr "Помилка Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… учаÑників." msgid "Error fetching labels." msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº." @@ -1415,7 +1578,7 @@ msgid "Error occurred when toggling the notification subscription" msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки на ÑповіщеннÑ" msgid "Error saving label update." -msgstr "" +msgstr "Помилка при збереженні мітки." msgid "Error updating status for all todos." msgstr "Помилка Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑтатуÑу Ð´Ð»Ñ Ð²ÑÑ–Ñ… задач." @@ -1459,12 +1622,36 @@ msgstr "ОглÑд проектів" msgid "Explore public groups" msgstr "ПереглÑнути публічні групи" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "Ðевдалі ЗавданнÑ" + msgid "Failed to change the owner" msgstr "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ влаÑника" +msgid "Failed to remove issue from board, please try again." +msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ проблему з дошки, будь лаÑка, Ñпробуйте ще раз." + msgid "Failed to remove the pipeline schedule" msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ розклад конвеєра" +msgid "Failed to update issues, please try again." +msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ проблеми. Будь лаÑка, Ñпробуйте ще раз." + msgid "Feb" msgstr "лют." @@ -1472,7 +1659,7 @@ msgid "February" msgstr "лютий" msgid "Fields on this page are now uneditable, you can configure" -msgstr "" +msgstr "ÐŸÐ¾Ð»Ñ Ð½Ð° цій Ñторінці зараз недоÑтупні Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ, ви можете налаштувати" msgid "File name" msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" @@ -1480,6 +1667,9 @@ msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" msgid "Files" msgstr "Файли" +msgid "Files (%{human_size})" +msgstr "Файли (%{human_size})" + msgid "Filter by commit message" msgstr "Фільтрувати за коміт-повідомленнÑм" @@ -1500,6 +1690,7 @@ msgid_plural "Forks" msgstr[0] "Форк" msgstr[1] "Форки" msgstr[2] "Форків" +msgstr[3] "Форків" msgid "ForkedFromProjectPath|Forked from" msgstr "Форк від" @@ -1516,11 +1707,14 @@ msgstr "З моменту ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ до Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ msgid "From merge request merge until deploy to production" msgstr "Від Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° production" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "GPG ключі" msgid "Generate a default set of labels" -msgstr "" +msgstr "Створити Ñтандартний набір міткок" msgid "Geo Nodes" msgstr "Гео-Вузли" @@ -1532,13 +1726,13 @@ msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an msgstr "Вузол працює повільно, перевантажений або тільки що відновивÑÑ Ð¿Ñ–ÑÐ»Ñ Ð·Ð±Ð¾ÑŽ." msgid "GeoNodes|Database replication lag:" -msgstr "" +msgstr "Затримка реплікації бази даних:" msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?" -msgstr "" +msgstr "Ð’Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ð° зупинÑÑ” Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації. Ви впевнені?" msgid "GeoNodes|Does not match the primary storage configuration" -msgstr "" +msgstr "Ðе відповідає оÑновній конфігурації Ñховища" msgid "GeoNodes|Failed" msgstr "Ðевдало" @@ -1547,85 +1741,85 @@ msgid "GeoNodes|Full" msgstr "Повний" msgid "GeoNodes|GitLab version does not match the primary node version" -msgstr "" +msgstr "ВерÑÑ–Ñ GitLab не відповідає верÑÑ–Ñ— оÑновного вузла" msgid "GeoNodes|GitLab version:" -msgstr "" +msgstr "ВерÑÑ–Ñ GitLab:" msgid "GeoNodes|Health status:" -msgstr "" +msgstr "Стан працездатноÑÑ‚Ñ–:" msgid "GeoNodes|Last event ID processed by cursor:" -msgstr "" +msgstr "Ідентифікатор оÑтанньої події, обробленої курÑором:" msgid "GeoNodes|Last event ID seen from primary:" -msgstr "" +msgstr "Ідентифікатор оÑтанньої події видимої із оÑновного:" msgid "GeoNodes|Loading nodes" -msgstr "" +msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð²" msgid "GeoNodes|Local Attachments:" -msgstr "" +msgstr "Локальні Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ (attachments):" msgid "GeoNodes|Local LFS objects:" -msgstr "" +msgstr "Локальні LFS-об’єкти:" msgid "GeoNodes|Local job artifacts:" -msgstr "" +msgstr "Ðртефакти локальних завдань:" msgid "GeoNodes|New node" -msgstr "" +msgstr "Ðовий вузол" msgid "GeoNodes|Out of sync" -msgstr "" +msgstr "РозÑинхронізовані" msgid "GeoNodes|Replication slot WAL:" -msgstr "" +msgstr "Слот реплікації WAL:" msgid "GeoNodes|Replication slots:" -msgstr "" +msgstr "Слоти реплікації:" msgid "GeoNodes|Repositories:" -msgstr "" +msgstr "Репозиторії:" msgid "GeoNodes|Selective" -msgstr "" +msgstr "Вибіркові" msgid "GeoNodes|Storage config:" -msgstr "" +msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñховища:" msgid "GeoNodes|Sync settings:" -msgstr "" +msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації:" msgid "GeoNodes|Synced" -msgstr "" +msgstr "Синхронізовано" msgid "GeoNodes|Unused slots" -msgstr "" +msgstr "ÐевикориÑтані Ñлоти" msgid "GeoNodes|Used slots" -msgstr "" +msgstr "ВикориÑтані Ñлоти" msgid "GeoNodes|Wikis:" -msgstr "" +msgstr "Wiki:" msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS." -msgstr "" +msgstr "Ви налаштували Geo-вузли через незахищене HTTP-з’єднаннÑ. Ми рекомендуємо викориÑтовувати HTTPS." msgid "Geo|All projects" -msgstr "" +msgstr "Ð’ÑÑ– проекти" msgid "Geo|File sync capacity" msgstr "ПропуÑкна здатніÑÑ‚ÑŒ Ñинхронізації файлів" msgid "Geo|Groups to synchronize" -msgstr "" +msgstr "Групи Ð´Ð»Ñ Ñинхронізації" msgid "Geo|Projects in certain groups" -msgstr "" +msgstr "Проекти в певних групах" msgid "Geo|Projects in certain storage shards" -msgstr "" +msgstr "Проекти в певних Ñегментах Ñховищ" msgid "Geo|Repository sync capacity" msgstr "ПропуÑкна здатніÑÑ‚ÑŒ Ñинхронізації репозиторіїв" @@ -1634,22 +1828,22 @@ msgid "Geo|Select groups to replicate." msgstr "Виберіть групи Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—." msgid "Geo|Shards to synchronize" -msgstr "" +msgstr "Сегменти Ð´Ð»Ñ Ñинхронізації" msgid "Git revision" -msgstr "" +msgstr "Git-редакціÑ" msgid "Git storage health information has been reset" msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Git була Ñкинута" msgid "Git version" -msgstr "" +msgstr "Git-верÑÑ–Ñ" msgid "GitLab Runner section" msgstr "Розділ GitLab Runner" msgid "Gitaly Servers" -msgstr "" +msgstr "Сервери Gitaly" msgid "Go to your fork" msgstr "Перейти до вашого форку" @@ -1661,7 +1855,25 @@ msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab ad msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Google не %{link_to_documentation}. ПопроÑÑ–Ñ‚ÑŒ Ñвого адмініÑтратора GitLab, Ñкщо ви хочете ÑкориÑтатиÑÑ Ñ†Ð¸Ð¼ ÑервіÑом." msgid "Got it!" -msgstr "" +msgstr "Зрозуміло!" + +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "Епіки дозволють вам керувати портфоліо ваших проектів більш ефективно Ñ– з меншими зуÑиллÑми" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "Від %{dateWord}" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð»Ð°Ð½Ñƒ-графіку" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "Проблема при завантаженні епіків" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду плану-графіку додайте заплановані дати початку та Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ одного з ваших епіків у цій групі або Ñ—Ñ— підгрупах. ВідображаютьÑÑ Ð»Ð¸ÑˆÐµ епіки за попередні та наÑтупні 3 міÑÑці: від %{startDate} до %{endDate}." + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "До %{dateWord}" msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "Заборонити Ñпільний доÑтуп до проекту в рамках %{group} з іншими групами" @@ -1700,7 +1912,7 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc msgstr "Ви можете керувати правами доÑтупу членів групи мати доÑтуп до кожного проекту в ній." msgid "GroupsTree|Are you sure you want to leave the \"${group.fullName}\" group?" -msgstr "" +msgstr "Ви впевнені, що хочете залишити групу \"${group.fullName}\"?" msgid "GroupsTree|Create a project in this group." msgstr "Створити проект у групі." @@ -1752,9 +1964,10 @@ msgstr "Ðездоровий" msgid "Hide value" msgid_plural "Hide values" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Сховати значеннÑ" +msgstr[1] "Сховати значеннÑ" +msgstr[2] "Сховати значень" +msgstr[3] "Сховати значень" msgid "History" msgstr "ІÑторіÑ" @@ -1762,6 +1975,9 @@ msgstr "ІÑторіÑ" msgid "Housekeeping successfully started" msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑƒÑпішно розпочато" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "Якщо у Ð²Ð°Ñ ÑƒÐ¶Ðµ Ñ” файли, ви можете відправити Ñ—Ñ… за допомогою %{link_to_cli} нижче." + msgid "Import repository" msgstr "Імпорт репозиторію" @@ -1774,6 +1990,9 @@ msgstr "Покращити ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°Ð¼Ð¸ з можл msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "Покращити пошук за допомогою розширеного глобального пошук в верÑÑ–Ñ— GitLab Enterprise Edition." +msgid "Install Runner on Kubernetes" +msgstr "Ð’Ñтановити Runner на Kubernetes" + msgid "Install a Runner compatible with GitLab CI" msgstr "Ð’Ñтановіть Runner, ÑуміÑний з GitLab CI" @@ -1782,12 +2001,13 @@ msgid_plural "Instances" msgstr[0] "ІнÑтанÑ" msgstr[1] "IнÑтанÑи" msgstr[2] "ІнÑтанÑів" +msgstr[3] "ІнÑтанÑів" msgid "Instance does not support multiple Kubernetes clusters" -msgstr "" +msgstr "Цей інÑÑ‚Ð°Ð½Ñ Ð½Ðµ підтримує декілька Kubernetes-клаÑтерів" msgid "Interested parties can even contribute by pushing commits if they want to." -msgstr "" +msgstr "Зацікавлені Ñторони за бажаннÑм можуть навіть робити внеÑки шлÑхом Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²." msgid "Internal - The group and any internal projects can be viewed by any logged in user." msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ â€” будь-Ñкий автентифікований кориÑтувач має доÑтуп до цієї групи та уÑÑ–Ñ… Ñ—Ñ— внутрішніх проектів." @@ -1817,7 +2037,7 @@ msgid "Issues" msgstr "Проблеми" msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable." -msgstr "" +msgstr "Проблеми можуть бути помилками, завданнÑми чи ідеÑми Ð´Ð»Ñ Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ. Крім того, проблеми доÑтупні Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ та фільтруваннÑ." msgid "Jan" msgstr "Ñіч." @@ -1825,6 +2045,9 @@ msgstr "Ñіч." msgid "January" msgstr "Ñічень" +msgid "Jobs" +msgstr "ЗавданнÑ" + msgid "Jul" msgstr "лип." @@ -1844,16 +2067,19 @@ msgid "Kubernetes Cluster" msgstr "КлаÑтер Kubernetes" msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}" -msgstr "" +msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ чаÑу при Ñтворенні Kubernetes-клаÑтера; %{timeout}" msgid "Kubernetes cluster integration was not removed." -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· Kubernetes-клаÑтером не була видалена." msgid "Kubernetes cluster integration was successfully removed." -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· Kubernetes-клаÑтером була уÑпішно видалена." msgid "Kubernetes cluster was successfully updated." -msgstr "" +msgstr "Kubernetes-клаÑтер уÑпішно оновлено." + +msgid "Kubernetes configured" +msgstr "Kubernetes налаштовано" msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1875,6 +2101,7 @@ msgid_plural "Last %d days" msgstr[0] "ОÑтанній %d день" msgstr[1] "ОÑтанніх %d дні" msgstr[2] "ОÑтанніх %d днів" +msgstr[3] "ОÑтанніх %d днів" msgid "Last Pipeline" msgstr "ОÑтанній Конвеєр" @@ -1903,6 +2130,12 @@ msgstr "в" msgid "Learn more" msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ" +msgid "Learn more about Kubernetes" +msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Kubernetes" + +msgid "Learn more about protected branches" +msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про захищені гілки" + msgid "Learn more in the" msgstr "ДізнайтеÑÑŒ більше" @@ -1921,6 +2154,9 @@ msgstr "Залишити проект" msgid "License" msgstr "ЛіцензіÑ" +msgid "List" +msgstr "СпиÑок" + msgid "Loading the GitLab IDE..." msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ IDE GitLab..." @@ -1930,8 +2166,11 @@ msgstr "БлокуваннÑ" msgid "Lock %{issuableDisplayName}" msgstr "Заблокувати %{issuableDisplayName}" +msgid "Lock not found" +msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ знайдено" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." -msgstr "" +msgstr "Заблокувати цю %{issuableDisplayName}? Лише <strong>члени проекту</strong> зможуть коментувати." msgid "Locked" msgstr "Заблоковано" @@ -1939,11 +2178,14 @@ msgstr "Заблоковано" msgid "Locked Files" msgstr "Заблоковані файли" +msgid "Locks give the ability to lock specific file or folder." +msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути заÑтоÑоване до конкретного файлу або директорії." + msgid "Login" msgstr "Вхід" msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos." -msgstr "" +msgstr "Зробіть кожного учаÑника команди більш продуктивним незалежно від його міÑцезнаходженнÑ. GitLab Geo Ñтворює копії \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" вашого GitLab Ñервера, щоб Ñкоротити Ñ‡Ð°Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ з великих репозиторіїв." msgid "Manage labels" msgstr "Керувати мітками" @@ -1955,7 +2197,7 @@ msgid "March" msgstr "березень" msgid "Mark done" -msgstr "" +msgstr "Позначити виконаним" msgid "Maximum git storage failures" msgstr "МакÑимальна кількіÑÑ‚ÑŒ невдач в Ñховищі даних git" @@ -1969,9 +2211,6 @@ msgstr "Медіана" msgid "Members" msgstr "КориÑтувачі" -msgid "Merge Request" -msgstr "Запит на злиттÑ" - msgid "Merge Requests" msgstr "Запити на злиттÑ" @@ -1984,8 +2223,11 @@ msgstr "Запит на злиттÑ" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "Затверджено" + msgid "Merged" -msgstr "" +msgstr "Злиті" msgid "Messages" msgstr "ПовідомленнÑ" @@ -2008,9 +2250,18 @@ msgstr "Етап %{milestoneTitle} не знайдено" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "не додаÑте SSH ключ" +msgid "Modal|Cancel" +msgstr "СкаÑувати" + +msgid "Modal|Close" +msgstr "Закрити" + msgid "Monitoring" msgstr "Моніторинг" +msgid "More information" +msgstr "Детальніше" + msgid "More information is available|here" msgstr "тут" @@ -2024,19 +2275,20 @@ msgid "Multiple issue boards" msgstr "Кілька дошок обговореннÑ" msgid "Name new label" -msgstr "" +msgstr "Ðазвіть нову мітку" msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Ðова проблема" msgstr[1] "Ðові проблеми" msgstr[2] "Ðових проблем" +msgstr[3] "Ðових проблем" msgid "New Kubernetes Cluster" -msgstr "" +msgstr "Ðовий Kubernetes-клаÑтер" msgid "New Kubernetes cluster" -msgstr "" +msgstr "Ðовий Kubernetes-клаÑтер" msgid "New Pipeline Schedule" msgstr "Ðовий розклад Конвеєра" @@ -2093,10 +2345,10 @@ msgid "No connection could be made to a Gitaly Server, please check your logs!" msgstr "" msgid "No due date" -msgstr "Ðемає запланованої дати завершеннÑ" +msgstr "Ðемає" msgid "No estimate or time spent" -msgstr "" +msgstr "Ðемає запланованого або витраченого чаÑу" msgid "No file chosen" msgstr "Файл не вибрано" @@ -2107,14 +2359,11 @@ msgstr "Ðемає репозиторію" msgid "No schedules" msgstr "немає Розкладів" -msgid "No time spent" -msgstr "Ðемає витраченого чаÑу" - msgid "None" -msgstr "Жоден" +msgstr "Ðемає" msgid "Not allowed to merge" -msgstr "" +msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ допуÑкаєтьÑÑ" msgid "Not available" msgstr "ÐедоÑтупний" @@ -2125,6 +2374,9 @@ msgstr "Ðе конфіденційно" msgid "Not enough data" msgstr "ÐедоÑтатньо даних" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "Майте на увазі, що гілка master захищена автоматично. %{link_to_protected_branches}" + msgid "Notification events" msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ події" @@ -2227,6 +2479,9 @@ msgstr "ВідкриваєтьÑÑ Ñƒ новому вікні" msgid "Options" msgstr "Параметри" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "Ð’ іншому разі рекомендуєтьÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ з одного з наведених нижче варіантів." + msgid "Overview" msgstr "ОглÑд" @@ -2330,7 +2585,25 @@ msgid "Pipelines|Build with confidence" msgstr "" msgid "Pipelines|Get started with Pipelines" -msgstr "" +msgstr "Початок роботи з Конвеєрами" + +msgid "Pipeline|Retry pipeline" +msgstr "ПерезапуÑтити конвеєр" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "ПерезапуÑтити конвеєр #%{pipelineId}?" + +msgid "Pipeline|Stop pipeline" +msgstr "Зупинити конвеєр" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "Зупинити конвеєр #%{pipelineId}?" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "Зараз ви перезапуÑтите конвеєр %{pipelineId}." + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "Зараз ви зупинете конвеєр %{pipelineId}." msgid "Pipeline|all" msgstr "вÑÑ–" @@ -2357,7 +2630,7 @@ msgid "Preferences" msgstr "ÐалаштуваннÑ" msgid "Primary" -msgstr "" +msgstr "Головний" msgid "Private - Project access must be granted explicitly to each user." msgstr "Приватний — доÑтуп до проекту повинен надаватиÑÑ ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñƒ кориÑтувачеві." @@ -2365,6 +2638,9 @@ msgstr "Приватний — доÑтуп до проекту повинен Ð msgid "Private - The group and its projects can only be viewed by members." msgstr "Приватна — цю групу та Ñ—Ñ— проекти можуть бачити тільки Ñ—Ñ— кориÑтувачі." +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "Профіль" @@ -2405,7 +2681,7 @@ msgid "Profiles|your account" msgstr "ваш обліковий запиÑ" msgid "Programming languages used in this repository" -msgstr "" +msgstr "Мови програмуваннÑ, що викориÑтовуєтьÑÑ Ð² цьому репозиторії" msgid "Project '%{project_name}' is in the process of being deleted." msgstr "Проект '%{project_name}' перебуває в процеÑÑ– видаленнÑ." @@ -2426,7 +2702,7 @@ msgid "Project avatar" msgstr "Ðватар проекту" msgid "Project avatar in repository: %{link}" -msgstr "" +msgstr "Ðватар проекту в репозиторії: %{link}" msgid "Project cache successfully reset." msgstr "Кеш проекту уÑпішно Ñкинуто." @@ -2450,13 +2726,13 @@ msgid "ProjectActivityRSS|Subscribe" msgstr "ПідпиÑатиÑÑ" msgid "ProjectCreationLevel|Allowed to create projects" -msgstr "" +msgstr "Дозволено Ñтворювати проекти" msgid "ProjectCreationLevel|Default project creation protection" msgstr "" msgid "ProjectCreationLevel|Developers + Masters" -msgstr "" +msgstr "Розробники + Керівники" msgid "ProjectCreationLevel|Masters" msgstr "Керівники" @@ -2527,12 +2803,30 @@ msgstr "Ðа жаль, по вашоу запиту проектів не зна msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” підтримки localStorage вашим браузером" +msgid "PrometheusService|Active" +msgstr "Ðктивний" + +msgid "PrometheusService|Auto configuration" +msgstr "Ðвтоматична конфігураціÑ" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "Ðвтоматично розгортайте та налаштовуйте Prometheus на ваші клаÑтери Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ Ñередовищ проекту" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "За замовчуваннÑм, Prometheus запуÑкаєтьÑÑ Ð·Ð° адреÑою ‘http://localhost:9090’. Ðе рекомендуєтьÑÑ Ð·Ð¼Ñ–Ð½ÑŽÐ²Ð°Ñ‚Ð¸ цю адреÑу Ñ– порт, бо це може призвеÑти до конфлікту з іншими ÑервіÑами запущеними на GitLab Ñервері." msgid "PrometheusService|Finding and configuring metrics..." msgstr "Пошук та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº..." +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "Ð’Ñтановити Prometheus на клаÑтери" + +msgid "PrometheusService|Manage clusters" +msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐºÐ»Ð°Ñтерами" + +msgid "PrometheusService|Manual configuration" +msgstr "Ручні налаштуваннÑ" + msgid "PrometheusService|Metrics" msgstr "Метрики" @@ -2554,8 +2848,17 @@ msgstr "Жодні метрики не відÑлідковуютьÑÑ. Ð”Ð»Ñ msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "Базова адреÑа Prometheus API, наприклад http://prometheus.example.com/" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "Prometheus автоматично налаштований на ваших клаÑтерах" + msgid "PrometheusService|Time-series monitoring service" -msgstr "" +msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ чаÑових Ñ€Ñдів" + +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "Ð”Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– ручного налаштуваннÑ, видаліть Prometheus із ваших клаÑтерів" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "Ð”Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Prometheus на ваші клаÑтери, деактивуйте ручні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ" msgid "PrometheusService|View environments" msgstr "ПереглÑд Ñередовищ" @@ -2575,11 +2878,17 @@ msgstr "Правила відправленнÑ" msgid "Push events" msgstr "Події Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ (push)" +msgid "Push project from command line" +msgstr "Виконати push проекту за допомогою командного Ñ€Ñдка" + +msgid "Push to create a project" +msgstr "ÐатиÑніть, щоб Ñтворити проект" + msgid "PushRule|Committer restriction" msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ‚ÐµÑ€Ð°" msgid "Quick actions can be used in the issues description and comment boxes." -msgstr "" +msgstr "Швидкі дії можна викориÑтовувати в опиÑах проблем Ñ– коментарÑÑ…." msgid "Read more" msgstr "Докладніше" @@ -2594,7 +2903,7 @@ msgid "RefSwitcher|Tags" msgstr "Теги" msgid "Reference:" -msgstr "" +msgstr "ПоÑиланнÑ:" msgid "Register / Sign In" msgstr "ЗареєÑтруватиÑÑ / Увійти" @@ -2633,11 +2942,14 @@ msgid "Remove project" msgstr "Видалити проект" msgid "Repair authentication" -msgstr "" +msgstr "Відновити аутентифікацію" msgid "Repository" msgstr "Репозиторій" +msgid "Repository has no locks." +msgstr "Репозиторій не має блокувань." + msgid "Request Access" msgstr "Запит доÑтупу" @@ -2650,11 +2962,15 @@ msgstr "Оновити токен доÑтупу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ прРmsgid "Reset runners registration token" msgstr "Скинути реєÑтраційний токен runner-ів" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Показати значеннÑ" +msgstr[1] "Показати значеннÑ" +msgstr[2] "Показати значень" +msgstr[3] "Показати значень" msgid "Revert this commit" msgstr "Ðнулювати цей коміт" @@ -2662,6 +2978,9 @@ msgstr "Ðнулювати цей коміт" msgid "Revert this merge request" msgstr "Ðнулювати цей запит на злиттÑ" +msgid "Roadmap" +msgstr "План-графік" + msgid "SSH Keys" msgstr "Ключі SSH" @@ -2672,7 +2991,7 @@ msgid "Save pipeline schedule" msgstr "Зберегти розклад конвеєра" msgid "Save variables" -msgstr "" +msgstr "Зберегти змінні" msgid "Schedule a new pipeline" msgstr "Розклад нового конвеєра" @@ -2693,7 +3012,7 @@ msgid "Search milestones" msgstr "Пошук етапів" msgid "Search project" -msgstr "" +msgstr "Пошук в проекті" msgid "Search users" msgstr "Пошук кориÑтувачів" @@ -2705,7 +3024,10 @@ msgid "Seconds to wait for a storage access attempt" msgstr "КількіÑÑ‚ÑŒ Ñекунд Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ повторною Ñпробою доÑтупу до Ñховища даних" msgid "Secret variables" -msgstr "" +msgstr "Секретні змінні" + +msgid "Security report" +msgstr "Звіт по безпеці" msgid "Select Archive Format" msgstr "Виберіть формат архіву" @@ -2713,6 +3035,9 @@ msgstr "Виберіть формат архіву" msgid "Select a timezone" msgstr "Вибрати чаÑовий поÑÑ" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "Виберіть Ñ–Ñнуючий клаÑтер Kubernetes або Ñтворіть новий" + msgid "Select assignee" msgstr "Виберіть виконавцÑ" @@ -2723,7 +3048,10 @@ msgid "Select target branch" msgstr "Вибір цільової гілки" msgid "Selective synchronization" -msgstr "" +msgstr "Вибіркова ÑинхронізаціÑ" + +msgid "Send email" +msgstr "ÐадіÑлати лиÑта" msgid "Sep" msgstr "вер." @@ -2735,7 +3063,10 @@ msgid "Server version" msgstr "ВерÑÑ–Ñ Ñервера" msgid "Service Templates" -msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñ–Ð²" +msgstr "Шаблони ÑервіÑів" + +msgid "Service URL" +msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ URL" msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Ð’Ñтановіть пароль Ð´Ð»Ñ Ñвого облікового запиÑу, щоб мати можливіÑÑ‚ÑŒ відправлÑти та отримувати через %{protocol}." @@ -2746,24 +3077,27 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD" msgid "Set up Koding" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Koding" -msgid "Set up auto deploy" -msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ розгортаннÑ" - msgid "SetPasswordToCloneLink|set a password" msgstr "вÑтановити пароль" msgid "Settings" msgstr "ÐалаштуваннÑ" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" msgid "SharedRunnersMinutesSettings|Reset pipeline minutes" -msgstr "" +msgstr "Скинути хвилини в конвеєрі" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "Показати команду" + msgid "Show parent pages" msgstr "Показати батьківÑькі Ñторінки" @@ -2775,6 +3109,7 @@ msgid_plural "Showing %d events" msgstr[0] "Показано %d подію" msgstr[1] "Показано %d події" msgstr[2] "Показано %d подій" +msgstr[3] "Показано %d подій" msgid "Sidebar|Change weight" msgstr "Змінити вагу" @@ -2792,29 +3127,41 @@ msgid "Snippets" msgstr "Сніпети" msgid "Something went wrong on our end" -msgstr "" +msgstr "ЩоÑÑŒ пішло не так з нашого боку" msgid "Something went wrong on our end." msgstr "ЩоÑÑŒ пішло не так з нашого боку" msgid "Something went wrong trying to change the confidentiality of this issue" -msgstr "" +msgstr "Помилка при зміні конфіденційноÑÑ‚Ñ– цієї проблеми" msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName}" msgstr "ЩоÑÑŒ пішло не так, при Ñпробі зміни Ñтану Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ${this.issuableDisplayName}" msgid "Something went wrong when toggling the button" +msgstr "Помилка при перемиканні кнопки" + +msgid "Something went wrong while closing the %{issuable}. Please try again later" msgstr "" +msgid "Something went wrong while fetching SAST." +msgstr "Помилка при отриманні SAST." + msgid "Something went wrong while fetching the projects." msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ–Ð²" msgid "Something went wrong while fetching the registry list." msgstr "ЩоÑÑŒ пішло не так при отриманні ÑпиÑку із реєÑтру." -msgid "Something went wrong. Please try again." +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." msgstr "" +msgid "Something went wrong. Please try again." +msgstr "ЩоÑÑŒ пішло не так. Будь лаÑка Ñпробуйте ще раз." + msgid "Sort by" msgstr "Сортувати за" @@ -2917,6 +3264,9 @@ msgstr "Вага" msgid "Source" msgstr "Джерело" +msgid "Source (branch or tag)" +msgstr "Джерело (гілка або тег)" + msgid "Source code" msgstr "Код" @@ -2945,7 +3295,7 @@ msgid "Stopped" msgstr "Зупинено" msgid "Storage" -msgstr "" +msgstr "Сховище" msgid "Subgroups" msgstr "Підгрупи" @@ -2956,11 +3306,12 @@ msgstr "Перейти в гілку/тег" msgid "System Hooks" msgstr "СиÑтемні гуки" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Тег" -msgstr[1] "Теги" -msgstr[2] "Тегів" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "Тег (%{tag_count})" +msgstr[1] "Тега (%{tag_count})" +msgstr[2] "Тегів (%{tag_count})" +msgstr[3] "Тегів (%{tag_count})" msgid "Tags" msgstr "Теги" @@ -3065,7 +3416,7 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ \"Проблема\" показує, Ñкільки чаÑу потрібно від ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ до Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ—Ñ— до ÑкогоÑÑŒ етапу, або Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ на дошку. Почніть Ñтворювати проблеми, щоб переглÑдати дані Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñтадії." msgid "The maximum file size allowed is 200KB." -msgstr "" +msgstr "МакÑимальний розмір файлу — 200 Кб." msgid "The number of attempts GitLab will make to access a storage." msgstr "КількіÑÑ‚ÑŒ Ñпроб, Ñкі зробить GitLab Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу до Ñховища даних." @@ -3091,9 +3442,15 @@ msgstr "ДоÑтуп до проекту можливий без будь-Ñко msgid "The repository for this project does not exist." msgstr "Репозиторій Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту не Ñ–Ñнує." +msgid "The repository for this project is empty" +msgstr "Репозиторій цього проекту порожній" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ \"ЗатвердженнÑ\" показує Ñ‡Ð°Ñ Ð²Ñ–Ð´ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ про об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ його виконаннÑ. Дані будуть автоматично додані піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ запиту на злиттÑ." +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "План-графік показує Ñтан ваших епіків у чаÑÑ–" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ \"Staging\" показує Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‚Ð° розгортаннÑм коду у production. Дані автоматично додаютьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ production вперше." @@ -3116,31 +3473,31 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet msgstr "Середнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² Ñ€Ñдку. Приклад: між 3, 5, 9, Ñередніми 5, між 3, 5, 7, 8, Ñередніми (5 + 7) / 2 = 6." msgid "There are no issues to show" -msgstr "" +msgstr "Ðемає проблем Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ" msgid "There are no merge requests to show" -msgstr "" +msgstr "Ðемає запитів на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ" msgid "There are problems accessing Git storage: " msgstr "Є проблеми з доÑтупом до Ñховища git: " msgid "There was an error loading users activity calendar." -msgstr "" +msgstr "Помилка при завантаженні ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– кориÑтувачів." msgid "There was an error saving your notification settings." -msgstr "" +msgstr "Помилка при збереженні ваших налаштувань Ñповіщень." msgid "There was an error subscribing to this label." -msgstr "" +msgstr "Помилка при підпиÑці на цю мітку." msgid "There was an error when reseting email token." -msgstr "" +msgstr "Помилка при Ñкиданні токена електронної пошти." msgid "There was an error when subscribing to this label." -msgstr "" +msgstr "Помилка при підпиÑці на цю мітку." msgid "There was an error when unsubscribing from this label." -msgstr "" +msgstr "Помилка при відпиÑці від цієї мітки." msgid "This board\\'s scope is reduced" msgstr "ВидиміÑÑ‚ÑŒ цієї дошки обмежена" @@ -3167,19 +3524,19 @@ msgid "This job depends on a user to trigger its process. Often they are used to msgstr "" msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered" -msgstr "" +msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ від попередніх, Ñкі повинні завершитиÑÑ ÑƒÑпішно Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ запуÑку" msgid "This job has not been triggered yet" -msgstr "" +msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ‰Ðµ не було запущене" msgid "This job has not started yet" -msgstr "" +msgstr "Ð¦Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ‰Ðµ не розпочалаÑÑ" msgid "This job is in pending state and is waiting to be picked by a runner" msgstr "" msgid "This job requires a manual action" -msgstr "" +msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” ручних дій" msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Це означає, що ви не можете відправлÑти код, поки не Ñтворите порожній репозиторій або не імпортуєте Ñ–Ñнуючий." @@ -3187,6 +3544,9 @@ msgstr "Це означає, що ви не можете відправлÑти msgid "This merge request is locked." msgstr "Цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾." +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "Ð¦Ñ Ñторінка недоÑтупна, тому що ви не можете переглÑдати інформацію по кількох проектах." + msgid "This project" msgstr "Цей проект" @@ -3212,13 +3572,13 @@ msgid "Time until first merge request" msgstr "Ð§Ð°Ñ Ð´Ð¾ першого запиту на злиттÑ" msgid "TimeTrackingEstimated|Est" -msgstr "" +msgstr "Запланований чаÑ" msgid "TimeTracking|Estimated:" -msgstr "" +msgstr "Запланований чаÑ:" msgid "TimeTracking|Spent" -msgstr "" +msgstr "Витрачено" msgid "Timeago|%s days ago" msgstr "%s днів тому" @@ -3348,19 +3708,27 @@ msgid_plural "Time|hrs" msgstr[0] "година" msgstr[1] "години" msgstr[2] "годин" +msgstr[3] "годин" msgid "Time|min" msgid_plural "Time|mins" msgstr[0] "хвилина" msgstr[1] "хвилини" msgstr[2] "хвилин" +msgstr[3] "хвилин" msgid "Time|s" msgstr "Ñекунд(а)" +msgid "Tip:" +msgstr "Порада:" + msgid "Title" msgstr "Ðазва" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду плану-графіку додайте заплановані дати початку та Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ одного з ваших епіків у цій групі або Ñ—Ñ— підгрупах. ВідображаютьÑÑ Ð»Ð¸ÑˆÐµ епіки за попередні та наÑтупні 3 міÑÑці." + msgid "Todo" msgstr "Задача" @@ -3376,35 +3744,29 @@ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð°: УВІМКÐЕÐО" msgid "Total Time" msgstr "Загальний чаÑ" -msgid "Total issue time spent" -msgstr "Загальний витрачений Ñ‡Ð°Ñ Ð½Ð° проблему" - msgid "Total test time for all commits/merges" msgstr "Загальний чаÑ, щоб перевірити вÑÑ– коміти/злиттÑ" +msgid "Total: %{total}" +msgstr "Ð’Ñього: %{total}" + msgid "Track activity with Contribution Analytics." msgstr "ВідÑтежувати активніÑÑ‚ÑŒ за допомогою Ðналітики учаÑників." msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "ВідÑтежуйте групи проблем зі Ñпільною темою з різних проектів та етапів" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" msgstr "" msgid "Trigger this manual action" -msgstr "" +msgstr "ЗапуÑтити цю ручну дію" msgid "Turn on Service Desk" msgstr "Ввімкнути Service Desk" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." -msgstr "" +msgstr "Ðеможливо Ñкинуте кеш проекту." msgid "Unknown" msgstr "Ðевідомо" @@ -3413,16 +3775,19 @@ msgid "Unlock" msgstr "Розблокувати" msgid "Unlock this %{issuableDisplayName}? <strong>Everyone</strong> will be able to comment." -msgstr "" +msgstr "Розблокувати %{issuableDisplayName}? <strong>Будь-хто</strong> зможе залишати коментарі." msgid "Unlocked" msgstr "Розблоковано" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "Видалити із обраних" msgid "Up to date" -msgstr "" +msgstr "Ðктуальний" msgid "Upgrade your plan to activate Advanced Global Search." msgstr "Перейдіть на вищий тарифний план щоб активувати Покращений Глобальний Пошук." @@ -3446,7 +3811,7 @@ msgid "Upload file" msgstr "Завантажити файл" msgid "Upload new avatar" -msgstr "" +msgstr "Завантажити новий аватар" msgid "UploadLink|click to upload" msgstr "ÐатиÑніть, щоб завантажити" @@ -3461,13 +3826,16 @@ msgid "Use your global notification setting" msgstr "ВикориÑтовуютьÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." -msgstr "" +msgstr "Змінні заÑтоÑовуютьÑÑ Ð´Ð¾ Ñередовищ через runner. Вони можуть бути захищені, в такому випадку вони доÑтупні тільки Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… гілок та тегів. Ви можете викориÑтовувати змінні Ð´Ð»Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð², Ñекретний ключів тощо." + +msgid "View epics list" +msgstr "ПереглÑнути ÑпиÑок епіків" msgid "View file @ " msgstr "ПереглÑд файла @ " msgid "View labels" -msgstr "" +msgstr "ПереглÑнути мітки" msgid "View open merge request" msgstr "ПереглÑд відкритих запитів на злиттÑ" @@ -3499,6 +3867,9 @@ msgstr "Ми не маємо доÑтатньо даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð° msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "Ми хочемо бути впевнені, що це ви, будь лаÑка, підтвердіть, що ви не робот." +msgid "Web IDE" +msgstr "Веб-IDE" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "Веб-гук дозволÑÑ” вам викликати URL Ñкщо, наприклад, був відправлений новий код або Ñтворено нову проблему. Ви можете налаштувати його так, щоб він реагував на певні події (відправки коду, проблеми або запити на злиттÑ). Групові веб-гуки заÑтоÑовуютьÑÑ Ð´Ð¾ вÑÑ–Ñ… проектів в групі Ñ– дозволÑÑŽÑ‚ÑŒ вам Ñтандартизувати Ñ—Ñ… Ð´Ð»Ñ Ð²Ñієї вашої групи." @@ -3524,7 +3895,7 @@ msgid "WikiClone|Start Gollum and edit locally" msgstr "ЗапуÑÑ‚Ñ–Ñ‚ÑŒ Gollum Ñ– редагуйте локально" msgid "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title." -msgstr "" +msgstr "Порада: Ви можете переміÑтити цю Ñторінку, додавши шлÑÑ… до початку заголовка." msgid "WikiEdit|There is already a page with the same title in that path." msgstr "" @@ -3619,6 +3990,9 @@ msgstr "З аналітикою учаÑників ви може вивчати msgid "Withdraw Access Request" msgstr "СкаÑувати запит доÑтупу" +msgid "Write a commit message..." +msgstr "Ðапишіть коміт-повідомленнÑ..." + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "Ви хочете видалити %{group_name}. Видалені групи ÐЕ МОЖÐРбуду відновити! Ви ÐБСОЛЮТÐО впевнені?" @@ -3631,20 +4005,23 @@ msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ зв'Ñзок з форка Ð msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Ви збираєтеÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ проект %{project_name_with_namespace} іншому влаÑнику. Ви ÐБСОЛЮТÐО впевнені?" +msgid "You can also create a project from the command line." +msgstr "Ви також можете Ñтворити проект із командного Ñ€Ñдка." + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." -msgstr "" +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" +msgstr "Ви можете легко вÑтановити Runner на клаÑтері Kubernetes. %{link_to_help_page}" msgid "You can move around the graph by using the arrow keys." -msgstr "" +msgstr "Ви можете переÑуватиÑÑ Ð¿Ð¾ графіку за допомогою клавіш зі Ñтрілками." msgid "You can only add files when you are on a branch" msgstr "Ви можете додавати файли тільки коли перебуваєте в гілці" msgid "You can only edit files when you are on a branch" -msgstr "" +msgstr "Ви можете редагувати файли, лише перебуваючи у ÑкійÑÑŒ гілці" msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." msgstr "Ви не можете запиÑувати на вторинні інÑтанÑи \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" GitLab Geo. Будь лаÑка викориÑтовуйте %{link_to_primary_node}." @@ -3652,12 +4029,24 @@ msgstr "Ви не можете запиÑувати на вторинні Ñ–Ð½Ñ msgid "You cannot write to this read-only GitLab instance." msgstr "Ви не можете запиÑувати на цей \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" інÑÑ‚Ð°Ð½Ñ GitLab." +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” необхідних прав доÑтупу, щоб перевизначити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації LDAP-груп." + +msgid "You have no permissions" +msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав доÑтупу" + msgid "You have reached your project limit" msgstr "Ви доÑÑгли Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² вашому проекті" +msgid "You must have master access to force delete a lock" +msgstr "У Ð²Ð°Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ бути доÑтуп на рівні керівника, Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÑƒÑового Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ" + msgid "You must sign in to star a project" msgstr "Ðеобхідно увійти, щоб оцінити проект" +msgid "You need a different license to enable FileLocks feature" +msgstr "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— функції Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¤Ð°Ð¹Ð»Ñ–Ð² вам потрібна інша ліцензіÑ" + msgid "You need permission." msgstr "Вам потрібен дозвіл" @@ -3686,9 +4075,12 @@ msgid "You won't be able to pull or push project code via SSH until you add an S msgstr "Ви не зможете відправлÑти та отримувати код проекту через SSH, поки не додаÑте в Ñвій профіль SSH ключ" msgid "You'll need to use different branch names to get a valid comparison." -msgstr "" +msgstr "Вам необхідно викориÑтовувати різні імена гілок Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ порівнÑннÑ." msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" +msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ ваш Kubernetes-клаÑтер вÑе ще доÑтупна Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° цій Ñторінці, але ми радимо вимкнути Ñ– повторно налаштувати" + +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" msgstr "" msgid "Your comment will not be visible to the public." @@ -3716,13 +4108,13 @@ msgid "ciReport|Code quality" msgstr "ЯкіÑÑ‚ÑŒ коду" msgid "ciReport|DAST detected no alerts by analyzing the review app" -msgstr "" +msgstr "DAST не виÑвив попереджень при аналізі цього review app" -msgid "ciReport|Failed to load ${type} report" -msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ ${type} пройшло невдало" +msgid "ciReport|Failed to load %{reportName} report" +msgstr "Помилка при завантаженні звіту %{reportName}" msgid "ciReport|Fixed:" -msgstr "" +msgstr "Виправлено:" msgid "ciReport|Instances" msgstr "ІнÑтанÑи" @@ -3730,11 +4122,11 @@ msgstr "ІнÑтанÑи" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" -msgstr "" +msgid "ciReport|Loading %{reportName} report" +msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ %{reportName}" msgid "ciReport|No changes to code quality" -msgstr "" +msgstr "Ðемає змін у ÑкоÑÑ‚Ñ– коду" msgid "ciReport|No changes to performance metrics" msgstr "" @@ -3745,41 +4137,88 @@ msgstr "" msgid "ciReport|SAST" msgstr "SAST" +msgid "ciReport|SAST degraded on" +msgstr "SAST погіршивÑÑ Ð½Ð°" + +msgid "ciReport|SAST detected" +msgstr "SAST виÑвив" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "SAST не виÑвив нових вразливоÑтей" + msgid "ciReport|SAST detected no security vulnerabilities" -msgstr "" +msgstr "SAST не виÑвив жодних вразливоÑтей" msgid "ciReport|SAST:container no vulnerabilities were found" msgstr "" msgid "ciReport|Show complete code vulnerabilities report" -msgstr "" +msgstr "Показати повний звіт про вразливоÑÑ‚Ñ– в коді" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" -msgstr "" +msgstr "Ðезатверджені вразливоÑÑ‚Ñ– (червоні) можуть бути відмічені Ñк затверджені. %{helpLink}" + +msgid "ciReport|no security vulnerabilities" +msgstr "вразливоÑтей немає" + +msgid "command line instructions" +msgstr "інÑтрукції Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð³Ð¾ Ñ€Ñдка" msgid "commit" msgstr "коміт" msgid "confidentiality|You are going to turn off the confidentiality. This means <strong>everyone</strong> will be able to see and leave a comment on this issue." -msgstr "" +msgstr "ви вимикаєте конфіденційніÑÑ‚ÑŒ. Це означає, що <strong>будь-хто</strong> зможе бачити Ñ– залишати коментарі Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— проблеми." msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with <strong>at least Reporter access</strong> are able to see and leave comments on the issue." -msgstr "" +msgstr "Ви вмикаєте конфіденційніÑÑ‚ÑŒ. Це означає що лише члени команди <strong>Ñ€Ñ–Ð²Ð½Ñ Ñ€ÐµÐ¿Ð¾Ñ€Ñ‚ÐµÑ€ або вище</strong> матимуть змогу бачити та залишати коментарі Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— проблеми." msgid "day" msgid_plural "days" msgstr[0] "день" msgstr[1] "дні" msgstr[2] "днів" +msgstr[3] "днів" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "неправильний через наÑвніÑÑ‚ÑŒ блокувань на нижчих рівнÑÑ…" + +msgid "is invalid because there is upstream lock" +msgstr "неправильний через наÑвніÑÑ‚ÑŒ блокувань на вищих рівнÑÑ…" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "заблоковано %{path_lock_user_name} %{created_at}" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "запит на злиттÑ" msgstr[1] "запити на злиттÑ" msgstr[2] "запитів на злиттÑ" +msgstr[3] "запитів на злиттÑ" + +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "Будь лаÑка відновіть Ñ—Ñ— або викориÑтовуйте іншу %{missingBranchName} гілку" + +msgid "mrWidget|Add approval" +msgstr "Додати затвердженнÑ" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°." + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "Затвердити" + +msgid "mrWidget|Approved by" +msgstr "" msgid "mrWidget|Cancel automatic merge" msgstr "СкаÑувати автоматичне злиттÑ" @@ -3788,34 +4227,37 @@ msgid "mrWidget|Check out branch" msgstr "" msgid "mrWidget|Checking ability to merge automatically" -msgstr "" +msgstr "перевірка можливоÑÑ‚Ñ– автоматичного злиттÑ" msgid "mrWidget|Cherry-pick" -msgstr "" +msgstr "вибір (коміта)" msgid "mrWidget|Cherry-pick this merge request in a new merge request" msgstr "" msgid "mrWidget|Closed" -msgstr "" +msgstr "Закриті" msgid "mrWidget|Closed by" -msgstr "" +msgstr "Закритий" msgid "mrWidget|Closes" msgstr "" msgid "mrWidget|Did not close" -msgstr "" +msgstr "Ðе закрив" msgid "mrWidget|Email patches" -msgstr "" +msgstr "Email-патчі" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" -msgstr "" +msgstr "Якщо гілка %{branch} Ñ–Ñнує у вашому локальному репозиторії, то ви можете заÑтоÑувати цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ за допомогою" + +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "Якщо гілка %{missingBranchName} Ñ–Ñнує у вашому локальному репозиторії, то ви можете заÑтоÑувати цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ за допомогою командного Ñ€Ñдка" msgid "mrWidget|Mentions" -msgstr "" +msgstr "Згадки" msgid "mrWidget|Merge" msgstr "ЗлиттÑ" @@ -3824,13 +4266,13 @@ msgid "mrWidget|Merge failed." msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ невдало." msgid "mrWidget|Merge locally" -msgstr "" +msgstr "Злити локально" msgid "mrWidget|Merged by" -msgstr "" +msgstr "Злито" msgid "mrWidget|Plain diff" -msgstr "" +msgstr "ПроÑте порівнÑÐ½Ð½Ñ (diff)" msgid "mrWidget|Refresh" msgstr "Оновити" @@ -3839,76 +4281,82 @@ msgid "mrWidget|Refresh now" msgstr "Оновити зараз" msgid "mrWidget|Refreshing now" -msgstr "" +msgstr "ВідбуваєтьÑÑ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" msgid "mrWidget|Remove Source Branch" -msgstr "" +msgstr "Видалити гілку-джерело" msgid "mrWidget|Remove source branch" -msgstr "" +msgstr "Видалити гілку-джерело" + +msgid "mrWidget|Remove your approval" +msgstr "Видалити ваше затвердженнÑ" msgid "mrWidget|Request to merge" -msgstr "" +msgstr "Запит на злиттÑ" msgid "mrWidget|Resolve conflicts" -msgstr "" +msgstr "Вирішити конфлікти" msgid "mrWidget|Revert" -msgstr "" +msgstr "Ðнулювати" msgid "mrWidget|Revert this merge request in a new merge request" -msgstr "" +msgstr "Ðнулювати цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð° допомогою нового запиту на злиттÑ" msgid "mrWidget|Set by" -msgstr "" +msgstr "Ð’Ñтановлено" msgid "mrWidget|The changes were merged into" -msgstr "" +msgstr "Зміни були злиті в" msgid "mrWidget|The changes were not merged into" -msgstr "" +msgstr "Зміни не були злиті в" msgid "mrWidget|The changes will be merged into" -msgstr "" +msgstr "Зміни будуть злиті в" msgid "mrWidget|The source branch has been removed" -msgstr "" +msgstr "Гілку-джерело видалено" msgid "mrWidget|The source branch is being removed" -msgstr "" +msgstr "Гілка-джерело в процеÑÑ– видаленнÑ" msgid "mrWidget|The source branch will be removed" -msgstr "" +msgstr "Гілку-джерело буде видалено" msgid "mrWidget|The source branch will not be removed" -msgstr "" +msgstr "Гілку-джерело не буде видалено" msgid "mrWidget|There are merge conflicts" -msgstr "" +msgstr "Ñ–Ñнують конфлікти при злитті" msgid "mrWidget|This merge request failed to be merged automatically" msgstr "ВідбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при автоматичному злитті цього запиту" msgid "mrWidget|This merge request is in the process of being merged" -msgstr "" +msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² процеÑÑ– виконаннÑ" msgid "mrWidget|This project is archived, write access has been disabled" -msgstr "" +msgstr "Цей проект заархівований, доÑтуп до запиÑу було відключено" msgid "mrWidget|You can merge this merge request manually using the" -msgstr "" +msgstr "Ви можете прийнÑти цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ за допомогою" msgid "mrWidget|You can remove source branch now" -msgstr "" +msgstr "Тепер ви можете видалити гілку-джерело" + +msgid "mrWidget|branch does not exist." +msgstr "гілка не Ñ–Ñнує." msgid "mrWidget|command line" -msgstr "" +msgstr "командний Ñ€Ñдок" msgid "mrWidget|into" -msgstr "" +msgstr "в" msgid "mrWidget|to be merged automatically when the pipeline succeeds" -msgstr "" +msgstr "буде злито автоматично, коли конвеєр завершитьÑÑ ÑƒÑпішно" msgid "new merge request" msgstr "Ðовий запит на злиттÑ" @@ -3924,6 +4372,7 @@ msgid_plural "parents" msgstr[0] "батьківÑький об’єкт" msgstr[1] "батьківÑькі об’єкти" msgstr[2] "батьківÑький об’єктів" +msgstr[3] "батьківÑький об’єктів" msgid "password" msgstr "пароль" @@ -3947,5 +4396,8 @@ msgid "username" msgstr "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" msgid "uses Kubernetes clusters to deploy your code!" +msgstr "викориÑтовує клаÑтери Kubernetes Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ!" + +msgid "with %{additions} additions, %{deletions} deletions." msgstr "" diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po index 441f080596c..6a43a434cb8 100644 --- a/locale/zh_CN/gitlab.po +++ b/locale/zh_CN/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:58-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:21-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -43,6 +43,9 @@ msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "为æ高页é¢åŠ 载速度åŠæ€§èƒ½ï¼Œå·²çœç•¥äº† %s 次æ交。" +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -50,6 +53,9 @@ msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "%{count} ä½å‚与者" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} 个è½åŽ %{default_branch} 分支的æ交, %{number_commits_ahead} 早超å‰çš„æ交" @@ -59,6 +65,9 @@ msgstr "已失败 %{number_of_failures} 次/最多å…许失败失败 %{maximum_f msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "已失败 %{number_of_failures} 次/最多å…许失败 %{maximum_failures} 次,GitLab ä¸ä¼šç»§ç»è‡ªåŠ¨é‡è¯•ã€‚请在问题解决åŽé‡ç½®å˜å‚¨å¥åº·ä¿¡æ¯ã€‚" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}:已 %{failed_attempts} 次å°è¯•è®¿é—®å˜å‚¨å¤±è´¥ï¼š" @@ -121,9 +130,15 @@ msgstr "æ·»åŠ è´¡çŒ®æŒ‡å—" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "æ·»åŠ ç»„Webhookså’ŒGitLabä¼ä¸šç‰ˆã€‚" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "æ·»åŠ è®¸å¯è¯" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "æ·»åŠ ç›®å½•" @@ -142,12 +157,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "å¥åº·é¡µé¢" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -172,6 +220,12 @@ msgstr "切æ¢é€šçŸ¥è®¢é˜…æ—¶å‘生错误" msgid "An error occurred when updating the issue weight" msgstr "更新议题æƒé‡æ—¶å‘生错误" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -181,12 +235,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "获å–侧边æ æ•°æ®æ—¶å‘生错误" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -199,6 +277,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -223,15 +307,15 @@ msgstr "项目已归档ï¼å˜å‚¨åº“为åªè¯»çŠ¶æ€" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "确定è¦åˆ 除æ¤æµæ°´çº¿è®¡åˆ’å—?" -msgid "Are you sure you want to discard your changes?" -msgstr "确定è¦æ”¾å¼ƒä¿®æ”¹å—?" - msgid "Are you sure you want to reset registration token?" msgstr "确定è¦é‡ç½®æ³¨å†Œä»¤ç‰Œå—?" msgid "Are you sure you want to reset the health check token?" msgstr "确定è¦é‡ç½®å¥åº·æ£€æŸ¥ä»¤ç‰Œå—?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "确定å—?" @@ -271,6 +355,9 @@ msgstr "作者" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -295,8 +382,14 @@ msgstr "å°†æ ¹æ®é¢„定义的 CI/CD é…置自动构建ã€æµ‹è¯•å’Œéƒ¨ç½²åº”ç”¨ç¨ msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "想了解更多请访问 %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "您å¯ä»¥ä¸ºæ¤é¡¹ç›®æ¿€æ´» %{link_to_settings}。" +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" msgid "Available" msgstr "å¯ç”¨çš„" @@ -307,6 +400,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "è´¦å•" @@ -361,12 +457,9 @@ msgstr "æ¯å¹´æ”¯ä»˜ %{price_per_year}" msgid "BillingPlans|per user" msgstr "æ¯ç”¨æˆ·" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "分支" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "已创建分支 <strong>%{branch_name}</strong> 。如需设置自动部署, 请选择åˆé€‚çš„ GitLab CI Yaml 模æ¿å¹¶æ交更改。%{link_to_autodeploy_doc}" @@ -659,6 +752,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "æ–路器 API" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -713,6 +809,9 @@ msgstr "å¤åˆ¶API地å€" msgid "ClusterIntegration|Copy CA Certificate" msgstr "å¤åˆ¶CAè¯ä¹¦" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -761,6 +860,9 @@ msgstr "Helm Tiller" msgid "ClusterIntegration|Ingress" msgstr "å…¥å£" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "安装" @@ -812,9 +914,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "了解详细%{link_to_documentation}" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -950,6 +1049,12 @@ msgstr "æ£ç¡®é…ç½®" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "评论" @@ -957,6 +1062,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "æ交" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" + msgid "Commit Message" msgstr "æ交消æ¯" @@ -969,6 +1078,9 @@ msgstr "æ交信æ¯" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "æ交" @@ -1110,6 +1222,9 @@ msgstr "å¤åˆ¶ URL 到剪贴æ¿" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "å¤åˆ¶æ交 SHA 的值到剪贴æ¿" @@ -1122,9 +1237,18 @@ msgstr "" msgid "Create New Directory" msgstr "创建新目录" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "在å¸æˆ·ä¸Šåˆ›å»ºä¸ªäººè®¿é—®ä»¤ç‰Œï¼Œä»¥é€šè¿‡ %{protocol} æ¥æ‹‰å–或推é€ã€‚" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "创建目录" @@ -1143,6 +1267,9 @@ msgstr "" msgid "Create merge request" msgstr "创建åˆå¹¶è¯·æ±‚" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "创建新分支" @@ -1167,6 +1294,12 @@ msgstr "æ ‡ç¾" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "创建个人访问令牌" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "创建EPICä¸" @@ -1221,6 +1354,9 @@ msgstr "å二" msgid "December" msgstr "å二月" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "使用 Cron è¯æ³•å®šä¹‰è‡ªå®šä¹‰æ¨¡å¼" @@ -1252,8 +1388,8 @@ msgstr "目录å称" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "放弃更改" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1312,6 +1448,9 @@ msgstr "电å邮件" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "获å–环境时å‘生错误。" @@ -1366,9 +1505,18 @@ msgstr "EPICå°†è¢«åˆ é™¤!是å¦ç¡®å®šï¼Ÿ" msgid "Epics" msgstr "EPIC" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "EPICè®©ä½ æ›´æœ‰æ•ˆçŽ‡åœ°ç®¡ç†ä½ 的项目组åˆï¼Œè€Œä¸”ä¸è´¹å¹ç°ä¹‹åŠ›" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "创建EPIC时出错" @@ -1435,12 +1583,36 @@ msgstr "查看项目" msgid "Explore public groups" msgstr "æœç´¢å…¬å…±ç¾¤ç»„" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "æ— æ³•å˜æ›´æ‰€æœ‰è€…" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "æ— æ³•åˆ é™¤æµæ°´çº¿è®¡åˆ’" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "二" @@ -1456,6 +1628,9 @@ msgstr "文件å" msgid "Files" msgstr "文件" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "按æ交消æ¯è¿‡æ»¤" @@ -1490,6 +1665,9 @@ msgstr "从创建议题到部署至生产环境" msgid "From merge request merge until deploy to production" msgstr "从åˆå¹¶è¯·æ±‚被åˆå¹¶åŽåˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒ" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "GPG 密钥" @@ -1637,6 +1815,24 @@ msgstr "Google 身份验è¯ä¸æ˜¯%{link_to_documentation}。如果您想使用æ msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "ç¦æ¢ä¸Žå…¶ä»–群组共享 %{group} ä¸çš„项目" @@ -1734,6 +1930,9 @@ msgstr "历å²" msgid "Housekeeping successfully started" msgstr "已开始维护" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "导入å˜å‚¨åº“" @@ -1746,12 +1945,15 @@ msgstr "å助改善GitLab ä¼ä¸šç‰ˆçš„议题管ç†ä¸Žæƒé‡ã€‚" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "å助改进GitLab ä¼ä¸šç‰ˆçš„æœç´¢å’Œé«˜çº§å…¨å±€æœç´¢ 。" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "安装一个与 GitLab CI 兼容的 Runner" msgid "Instance" msgid_plural "Instances" -msgstr[0] "例å" +msgstr[0] "实例" msgid "Instance does not support multiple Kubernetes clusters" msgstr "" @@ -1795,6 +1997,9 @@ msgstr "一" msgid "January" msgstr "一月" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "七" @@ -1825,6 +2030,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1871,6 +2079,12 @@ msgstr "于" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "了解更多" @@ -1889,6 +2103,9 @@ msgstr "退出项目" msgid "License" msgstr "许å¯åè®®" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1898,6 +2115,9 @@ msgstr "é”定" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1907,6 +2127,9 @@ msgstr "å·²é”定" msgid "Locked Files" msgstr "å·²é”定文件" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "登录" @@ -1937,9 +2160,6 @@ msgstr "ä¸ä½æ•°" msgid "Members" msgstr "æˆå‘˜" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "åˆå¹¶è¯·æ±‚" @@ -1952,6 +2172,9 @@ msgstr "åˆå¹¶è¯·æ±‚" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1976,9 +2199,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "新建 SSH 公钥" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "监控" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "帮助文档" @@ -2073,9 +2305,6 @@ msgstr "没有å˜å‚¨åº“" msgid "No schedules" msgstr "没有计划" -msgid "No time spent" -msgstr "没有花费时间" - msgid "None" msgstr "æ— " @@ -2091,6 +2320,9 @@ msgstr "" msgid "Not enough data" msgstr "æ•°æ®ä¸è¶³" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "通知事件" @@ -2193,6 +2425,9 @@ msgstr "打开一个新窗å£" msgid "Options" msgstr "æ“作" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "概览" @@ -2298,6 +2533,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "所有" @@ -2331,6 +2584,9 @@ msgstr "ç§äºº - å¿…é¡»å‘æ¯ä¸ªç”¨æˆ·æ˜Žç¡®æŽˆäºˆé¡¹ç›®è®¿é—®æƒé™ã€‚" msgid "Private - The group and its projects can only be viewed by members." msgstr "ç§äºº - 群组åŠå…¶é¡¹ç›®åªèƒ½ç”±æˆå‘˜æŸ¥çœ‹ã€‚" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "用户信æ¯" @@ -2493,12 +2749,30 @@ msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ç¬¦åˆæ¡ä»¶çš„项目" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "æ¤åŠŸèƒ½éœ€è¦æµè§ˆå™¨æ”¯æŒ localStorage" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "默认情况下,Prometheus ä¾¦å¬ â€˜http://localhost:9090’。ä¸å»ºè®®æ›´æ”¹é»˜è®¤åœ°å€å’Œç«¯å£ï¼Œå› 为这å¯èƒ½ä¼šå½±å“或冲çªåœ¨ GitLab æœåŠ¡å™¨ä¸Šè¿è¡Œçš„其他æœåŠ¡ã€‚" msgid "PrometheusService|Finding and configuring metrics..." msgstr "查找和é…ç½®æŒ‡æ ‡..." +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "æŒ‡æ ‡" @@ -2520,9 +2794,18 @@ msgstr "æ²¡æœ‰ç›‘æµ‹æŒ‡æ ‡ã€‚è¦å¼€å§‹ç›‘测,请部署到环境ä¸ã€‚" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "Prometheus API 地å€ï¼Œä¾‹å¦‚ http://prometheus.example.com/" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "查看环境" @@ -2541,6 +2824,12 @@ msgstr "推é€è§„则" msgid "Push events" msgstr "推é€äº‹ä»¶" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "æ交é™åˆ¶" @@ -2604,6 +2893,9 @@ msgstr "" msgid "Repository" msgstr "å˜å‚¨åº“" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "申请æƒé™" @@ -2616,6 +2908,9 @@ msgstr "é‡ç½®å¥åº·æ£€æŸ¥è®¿é—®ä»¤ç‰Œ" msgid "Reset runners registration token" msgstr "é‡ç½® Runner 注册令牌" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2626,6 +2921,9 @@ msgstr "还原æ¤æ交" msgid "Revert this merge request" msgstr "还原æ¤åˆå¹¶è¯·æ±‚" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "SSH 密钥" @@ -2671,12 +2969,18 @@ msgstr "ç‰å¾…å˜å‚¨è®¿é—®å°è¯•æ—¶é—´(秒)" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "é€‰æ‹©ä¸‹è½½æ ¼å¼" msgid "Select a timezone" msgstr "选择时区" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2689,6 +2993,9 @@ msgstr "é€‰æ‹©ç›®æ ‡åˆ†æ”¯" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "ä¹" @@ -2701,6 +3008,9 @@ msgstr "" msgid "Service Templates" msgstr "æœåŠ¡æ¨¡æ¿" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "为账å·åˆ›å»ºä¸€ä¸ªç”¨äºŽæŽ¨é€æˆ–拉å–çš„ %{protocol} 密ç 。" @@ -2710,15 +3020,15 @@ msgstr "" msgid "Set up Koding" msgstr "设置 Koding" -msgid "Set up auto deploy" -msgstr "设置自动部署" - msgid "SetPasswordToCloneLink|set a password" msgstr "设置密ç " msgid "Settings" msgstr "设置" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2728,6 +3038,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "查看上级页é¢" @@ -2748,7 +3061,7 @@ msgid "Sidebar|None" msgstr "æ— " msgid "Sidebar|Weight" -msgstr "宽度" +msgstr "æƒé‡" msgid "Snippets" msgstr "代ç 片段" @@ -2768,12 +3081,24 @@ msgstr "è¯•å›¾æ”¹å˜ ${this.issuableDisplayName} çš„é”定状æ€æ—¶å‡ºé”™äº†" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "拉å–项目时å‘生错误。" msgid "Something went wrong while fetching the registry list." msgstr "拉å–注册表列表时å‘生错误。" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2879,6 +3204,9 @@ msgstr "æƒé‡" msgid "Source" msgstr "æº" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "æºä»£ç " @@ -2918,9 +3246,9 @@ msgstr "切æ¢åˆ†æ”¯/æ ‡ç¾" msgid "System Hooks" msgstr "系统钩å" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "æ ‡ç¾" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" msgid "Tags" msgstr "æ ‡ç¾" @@ -3051,9 +3379,15 @@ msgstr "该项目å…许任何人访问。" msgid "The repository for this project does not exist." msgstr "æ¤é¡¹ç›®çš„å˜å‚¨åº“ä¸å˜åœ¨ã€‚" +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "评审阶段概述了从创建åˆå¹¶è¯·æ±‚到被åˆå¹¶çš„时间。当创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ 到æ¤å¤„。" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "预å‘布阶段概述了从åˆå¹¶è¯·æ±‚被åˆå¹¶åˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒçš„总时间。首次部署到生产环境åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ 到æ¤å¤„。" @@ -3147,6 +3481,9 @@ msgstr "在创建一个空的å˜å‚¨åº“或导入现有å˜å‚¨åº“之å‰ï¼Œå°†æ— 法 msgid "This merge request is locked." msgstr "æ¤åˆå¹¶è¯·æ±‚å·²é”定。" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3314,9 +3651,15 @@ msgstr[0] "分钟" msgid "Time|s" msgstr "秒" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "æ ‡é¢˜" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3332,21 +3675,18 @@ msgstr "" msgid "Total Time" msgstr "总时间" -msgid "Total issue time spent" -msgstr "议题花费时间总计" - msgid "Total test time for all commits/merges" msgstr "所有æ交和åˆå¹¶çš„总测试时间" +msgid "Total: %{total}" +msgstr "" + msgid "Track activity with Contribution Analytics." msgstr "跟踪活动与贡献的分æžã€‚" msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "在项目和里程碑之间跟踪共享主题的议题组" -msgid "Total: %{total}" -msgstr "" - msgid "Track time with quick actions" msgstr "" @@ -3356,9 +3696,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "打开æœåŠ¡å°" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3374,6 +3711,9 @@ msgstr "" msgid "Unlocked" msgstr "已解é”" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "å–æ¶ˆæ˜Ÿæ ‡" @@ -3419,6 +3759,9 @@ msgstr "使用全局通知设置" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "æµè§ˆæ–‡ä»¶ @ " @@ -3455,6 +3798,9 @@ msgstr "该阶段的数æ®ä¸è¶³ï¼Œæ— 法显示。" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "我们è¦ç¡®å®šä½ 是ä¸æ˜¯æœºå™¨äººã€‚" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "如果有新的推é€æˆ–新的议题,Webhook将自动触å‘您设置URL。 您å¯ä»¥é…ç½® Webhook æ¥ç›‘å¬ç‰¹å®šäº‹ä»¶ï¼Œå¦‚推é€ã€è®®é¢˜æˆ–åˆå¹¶è¯·æ±‚。 群组 Webhook 将适用于团队ä¸çš„所有项目,并å…许您设置整个团队ä¸çš„ Webhook 。" @@ -3575,6 +3921,9 @@ msgstr "通过贡献分æžï¼Œæ‚¨å¯ä»¥åˆ†æžæ‚¨çš„组织åŠå…¶æˆå‘˜çš„议题〠msgid "Withdraw Access Request" msgstr "å–消æƒé™ç”³è¯·" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "å³å°†åˆ 除 %{group_name}ã€‚å·²åˆ é™¤çš„ç¾¤ç»„æ— æ³•æ¢å¤ï¼ç¡®å®šç»§ç»å—?" @@ -3587,10 +3936,13 @@ msgstr "å³å°†åˆ 除与æºé¡¹ç›® %{forked_from_project} 的派生关系。确定 msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "å³å°† %{project_name_with_namespace} 转移给å¦ä¸€ä¸ªæ‰€æœ‰è€…。确定继ç»å—?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3608,12 +3960,24 @@ msgstr "您ä¸èƒ½å†™å…¥åªè¯»çš„辅助 GitLab Geo 实例。请改用%{link_to_pr msgid "You cannot write to this read-only GitLab instance." msgstr "您ä¸èƒ½å†™å…¥è¿™ä¸ªåªè¯»çš„ GitLab 实例。" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "您已达到项目数é‡é™åˆ¶" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "必须登录æ‰èƒ½å¯¹é¡¹ç›®åŠ æ˜Ÿæ ‡" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "需è¦ç›¸å…³çš„æƒé™ã€‚" @@ -3647,6 +4011,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "您的评论将ä¸ä¼šå…¬å¼€æ˜¾ç¤ºã€‚" @@ -3674,7 +4041,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3686,7 +4053,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3701,6 +4068,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3713,6 +4089,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "æ交" @@ -3729,10 +4111,40 @@ msgstr[0] "天" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3766,6 +4178,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3799,6 +4214,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3853,6 +4271,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3899,3 +4320,6 @@ msgstr "用户å" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index c79a46c93f7..0174e945bab 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:58-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:22-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Chinese Traditional, Hong Kong\n" "Language: zh_HK\n" @@ -43,6 +43,9 @@ msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "為æ高é é¢åŠ 載速度åŠæ€§èƒ½ï¼Œå·²çœç•¥äº† %s 次æ交。" +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -50,6 +53,9 @@ msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -59,6 +65,9 @@ msgstr "已失敗 %{number_of_failures} 次,最大失敗 %{maximum_failures} æ msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "已失敗 %{number_of_failures} 次,最大失敗 %{maximum_failures} 次,GitLabä¸æœƒé‡è©¦ã€‚當å•é¡Œè§£æ±ºæ™‚é‡ç½®å˜å„²ä¿¡æ¯ã€‚" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}:已訪å•æ¤ä¸»æ©Ÿå¤±æ•— %{failed_attempts} 次" @@ -121,9 +130,15 @@ msgstr "æ·»åŠ è²¢ç»æŒ‡å—" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "æ·»åŠ è¨±å¯è‰" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "æ·»åŠ æ–°ç›®éŒ„" @@ -142,12 +157,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -172,6 +220,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -181,12 +235,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -199,6 +277,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -223,15 +307,15 @@ msgstr "æ¸æª”é …ç›®ï¼å˜å„²åº«ç‚ºåªè®€" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "確定è¦åˆªé™¤æ¤æµæ°´ç·šè¨ˆåŠƒå—Žï¼Ÿ" -msgid "Are you sure you want to discard your changes?" -msgstr "確定è¦æ”¾æ£„修改嗎?" - msgid "Are you sure you want to reset registration token?" msgstr "確定è¦é‡ç½®è¨»å†Šä»¤ç‰Œå—Žï¼Ÿ" msgid "Are you sure you want to reset the health check token?" msgstr "確定è¦é‡ç½®å¥åº·æª¢æŸ¥ä»¤ç‰Œå—Žï¼Ÿ" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "確定嗎?" @@ -271,6 +355,9 @@ msgstr "" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -295,7 +382,13 @@ msgstr "" msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" msgstr "" msgid "Available" @@ -307,6 +400,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -361,12 +457,9 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "分支" +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "分支 <strong>%{branch_name}</strong> 已創建。如需è¨ç½®è‡ªå‹•éƒ¨ç½²ï¼Œ è«‹é¸æ“‡åˆé©çš„ GitLab CI Yaml 模æ¿ä½µæ交更改。%{link_to_autodeploy_doc}" @@ -659,6 +752,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -713,6 +809,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -761,6 +860,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -812,9 +914,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -950,6 +1049,12 @@ msgstr "" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "è©•è«–" @@ -957,6 +1062,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "æ交" +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" + msgid "Commit Message" msgstr "" @@ -969,6 +1078,9 @@ msgstr "æ交信æ¯" msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "æ交" @@ -1110,6 +1222,9 @@ msgstr "複製URL到剪貼æ¿" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "複製æ交 SHA 到剪貼æ¿" @@ -1122,9 +1237,18 @@ msgstr "" msgid "Create New Directory" msgstr "創建新目錄" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "在帳戶上創建個人訪å•ä»¤ç‰Œï¼Œä»¥é€šéŽ %{protocol} 來拉å–或推é€ã€‚" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "創建目錄" @@ -1143,6 +1267,9 @@ msgstr "" msgid "Create merge request" msgstr "創建åˆä½µè«‹æ±‚" +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "" @@ -1167,6 +1294,12 @@ msgstr "標籤" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "創建個人訪å•ä»¤ç‰Œ" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1221,6 +1354,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "使用 Cron 語法定義自定義模å¼" @@ -1252,8 +1388,8 @@ msgstr "目錄å稱" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "放棄更改" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1312,6 +1448,9 @@ msgstr "" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1366,9 +1505,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1435,12 +1583,36 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "無法變更所有者" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "無法刪除æµæ°´ç·šè¨ˆåŠƒ" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1456,6 +1628,9 @@ msgstr "" msgid "Files" msgstr "文件" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "按æ交消æ¯éŽæ¿¾" @@ -1490,6 +1665,9 @@ msgstr "從創建è°é¡Œåˆ°éƒ¨ç½²åˆ°ç”Ÿç”¢ç’°å¢ƒ" msgid "From merge request merge until deploy to production" msgstr "從åˆä½µè«‹æ±‚çš„åˆä½µåˆ°éƒ¨ç½²è‡³ç”Ÿç”¢ç’°å¢ƒ" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "" @@ -1637,6 +1815,24 @@ msgstr "" msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" @@ -1734,6 +1930,9 @@ msgstr "" msgid "Housekeeping successfully started" msgstr "已開始ç¶è·" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "å°Žå…¥å˜å„²åº«" @@ -1746,6 +1945,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "安è£å£¹å€‹èˆ‡ GitLab CI 兼容的 Runner" @@ -1795,6 +1997,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1825,6 +2030,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1871,6 +2079,12 @@ msgstr "在" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "了解更多" @@ -1889,6 +2103,9 @@ msgstr "é€€å‡ºé …ç›®" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1898,6 +2115,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1907,6 +2127,9 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "" @@ -1937,9 +2160,6 @@ msgstr "ä¸ä½æ•¸" msgid "Members" msgstr "" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "" @@ -1952,6 +2172,9 @@ msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1976,9 +2199,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "æ·»åŠ å£¹å€‹ SSH 公鑰" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "幫助文檔" @@ -2073,9 +2305,6 @@ msgstr "沒有å˜å„²åº«" msgid "No schedules" msgstr "沒有計劃" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "" @@ -2091,6 +2320,9 @@ msgstr "" msgid "Not enough data" msgstr "數據ä¸è¶³" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "通知事件" @@ -2193,6 +2425,9 @@ msgstr "" msgid "Options" msgstr "æ“作" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "" @@ -2298,6 +2533,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "所有" @@ -2331,6 +2584,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "" @@ -2493,12 +2749,30 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2520,9 +2794,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2541,6 +2824,12 @@ msgstr "" msgid "Push events" msgstr "推é€äº‹ä»¶ (push event) " +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2604,6 +2893,9 @@ msgstr "" msgid "Repository" msgstr "å˜å„²åº«" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "申請權é™" @@ -2616,6 +2908,9 @@ msgstr "é‡ç½®å¥åº·æª¢æŸ¥è¨ªå•ä»¤ç‰Œ" msgid "Reset runners registration token" msgstr "é‡ç½® Runner 註冊令牌" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2626,6 +2921,9 @@ msgstr "還原æ¤æ交" msgid "Revert this merge request" msgstr "還原æ¤åˆä½µè«‹æ±‚" +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "" @@ -2671,12 +2969,18 @@ msgstr "" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "é¸æ“‡ä¸‹è¼‰æ ¼å¼" msgid "Select a timezone" msgstr "é¸æ“‡æ™‚å€" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2689,6 +2993,9 @@ msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯" msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2701,6 +3008,9 @@ msgstr "" msgid "Service Templates" msgstr "" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "ç‚ºè³¬è™Ÿæ·»åŠ å£¹å€‹ç”¨æ–¼æŽ¨é€æˆ–拉å–çš„ %{protocol} 密碼。" @@ -2710,15 +3020,15 @@ msgstr "" msgid "Set up Koding" msgstr "è¨ç½® Koding" -msgid "Set up auto deploy" -msgstr "è¨ç½®è‡ªå‹•éƒ¨ç½²" - msgid "SetPasswordToCloneLink|set a password" msgstr "è¨ç½®å¯†ç¢¼" msgid "Settings" msgstr "" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2728,6 +3038,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "" @@ -2768,12 +3081,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2879,6 +3204,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "æºä»£ç¢¼" @@ -2918,9 +3246,9 @@ msgstr "切æ›åˆ†æ”¯/標籤" msgid "System Hooks" msgstr "" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "標籤" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" msgid "Tags" msgstr "標籤" @@ -3051,9 +3379,15 @@ msgstr "è©²é …ç›®å…許任何人訪å•ã€‚" msgid "The repository for this project does not exist." msgstr "æ¤é …目的å˜å„²åº«ä¸å˜åœ¨ã€‚" +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "評審階段概述了從創建åˆä½µè«‹æ±‚到åˆä½µçš„時間。當創建第壹個åˆä½µè«‹æ±‚å¾Œï¼Œæ•¸æ“šå°‡è‡ªå‹•æ·»åŠ åˆ°æ¤è™•ã€‚" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "é 發布階段概述了åˆä½µè«‹æ±‚çš„åˆä½µåˆ°éƒ¨ç½²ä»£ç¢¼åˆ°ç”Ÿç”¢ç’°å¢ƒçš„ç¸½æ™‚é–“ã€‚ç•¶é¦–æ¬¡éƒ¨ç½²åˆ°ç”Ÿç”¢ç’°å¢ƒå¾Œï¼Œæ•¸æ“šå°‡è‡ªå‹•æ·»åŠ åˆ°æ¤è™•ã€‚" @@ -3147,6 +3481,9 @@ msgstr "在創建壹個空的å˜å„²åº«æˆ–å°Žå…¥ç¾æœ‰å˜å„²åº«ä¹‹å‰ï¼Œæ‚¨å°‡ç„¡ msgid "This merge request is locked." msgstr "" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3314,9 +3651,15 @@ msgstr[0] "分é˜" msgid "Time|s" msgstr "秒" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3332,19 +3675,16 @@ msgstr "" msgid "Total Time" msgstr "總時間" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "所有æ交和åˆä½µçš„總測試時間" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3356,9 +3696,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3374,6 +3711,9 @@ msgstr "" msgid "Unlocked" msgstr "" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "å–消星標" @@ -3419,6 +3759,9 @@ msgstr "使用全局通知è¨ç½®" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -3455,6 +3798,9 @@ msgstr "該階段的數據ä¸è¶³ï¼Œç„¡æ³•é¡¯ç¤ºã€‚" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3575,6 +3921,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "å–消權é™ç”³è¯·" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "å³å°‡åˆªé™¤ %{group_name}。已刪除的群組無法æ¢å¾©ï¼ç¢ºå®šç¹¼çºŒå—Žï¼Ÿ" @@ -3587,10 +3936,13 @@ msgstr "å³å°‡åˆªé™¤èˆ‡æºé …ç›® %{forked_from_project} 的派生關系。確定 msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "å³å°‡ %{project_name_with_namespace} 轉義給å¦å£¹å€‹æ‰€æœ‰è€…。確定繼續嗎?" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3608,12 +3960,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "您已é”åˆ°é …ç›®æ•¸é‡é™åˆ¶" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "å¿…é ˆç™»éŒ„æ‰èƒ½å°é …ç›®åŠ æ˜Ÿæ¨™" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "需è¦ç›¸é—œçš„權é™ã€‚" @@ -3647,6 +4011,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "" @@ -3674,7 +4041,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3686,7 +4053,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3701,6 +4068,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3713,6 +4089,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3729,10 +4111,40 @@ msgstr[0] "天" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3766,6 +4178,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3799,6 +4214,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3853,6 +4271,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3899,3 +4320,6 @@ msgstr "" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po index 635f5c6c449..025af6fa2d9 100644 --- a/locale/zh_TW/gitlab.po +++ b/locale/zh_TW/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 11:38-0600\n" -"PO-Revision-Date: 2018-02-12 03:58-0500\n" +"POT-Creation-Date: 2018-03-02 13:39+0100\n" +"PO-Revision-Date: 2018-03-05 03:23-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Chinese Traditional\n" "Language: zh_TW\n" @@ -43,6 +43,9 @@ msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "å› æ•ˆèƒ½è€ƒé‡ï¼Œå·²éš±è— %s 個更動 (commit)。" +msgid "%{actionText} & %{openOrClose} %{noteable}" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" @@ -50,6 +53,9 @@ msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "%{count} åƒèˆ‡è€…" +msgid "%{lock_path} is locked by GitLab User %{lock_user_id}" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -59,6 +65,9 @@ msgstr "ç›®å‰å·²å¤±æ•— %{number_of_failures} 次。GitLab å…許在 %{maximum_f msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." msgstr "已失敗 %{number_of_failures} / %{maximum_failures} 次,GitLab å°‡ä¸å†è‡ªå‹•é‡è©¦ã€‚請在確èªå•é¡Œè§£æ±ºå¾Œæ‰‹å‹•é‡ç½®å„²å˜ç©ºé–“資訊。" +msgid "%{openOrClose} %{noteable}" +msgstr "" + msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" msgstr[0] "%{storage_name}:已å˜å–æ¤ä¸»æ©Ÿå¤±æ•— %{failed_attempts} 次" @@ -121,9 +130,15 @@ msgstr "新增å”作指å—" msgid "Add Group Webhooks and GitLab Enterprise Edition." msgstr "" +msgid "Add Kubernetes cluster" +msgstr "" + msgid "Add License" msgstr "新增授權æ¢æ¬¾" +msgid "Add Readme" +msgstr "" + msgid "Add new directory" msgstr "新增目錄" @@ -142,12 +157,45 @@ msgstr "" msgid "AdminArea|Stopping jobs failed" msgstr "" -msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running." +msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs that are running." msgstr "" msgid "AdminHealthPageLink|health page" msgstr "系統狀態" +msgid "AdminProjects|Delete" +msgstr "" + +msgid "AdminProjects|Delete Project %{projectName}?" +msgstr "" + +msgid "AdminProjects|Delete project" +msgstr "" + +msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." +msgstr "" + +msgid "AdminUsers|Block user" +msgstr "" + +msgid "AdminUsers|Delete User %{username} and contributions?" +msgstr "" + +msgid "AdminUsers|Delete User %{username}?" +msgstr "" + +msgid "AdminUsers|Delete user" +msgstr "" + +msgid "AdminUsers|Delete user and contributions" +msgstr "" + +msgid "AdminUsers|To confirm, type %{projectName}" +msgstr "" + +msgid "AdminUsers|To confirm, type %{username}" +msgstr "" + msgid "Advanced" msgstr "" @@ -172,6 +220,12 @@ msgstr "" msgid "An error occurred when updating the issue weight" msgstr "" +msgid "An error occurred while adding approver" +msgstr "" + +msgid "An error occurred while detecting host keys" +msgstr "" + msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" @@ -181,12 +235,36 @@ msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the pipeline." +msgstr "" + msgid "An error occurred while getting projects" msgstr "" +msgid "An error occurred while importing project" +msgstr "" + +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading commits" +msgstr "" + +msgid "An error occurred while loading diff" +msgstr "" + msgid "An error occurred while loading filenames" msgstr "" +msgid "An error occurred while loading the file" +msgstr "" + +msgid "An error occurred while making the request." +msgstr "" + +msgid "An error occurred while removing approver" +msgstr "" + msgid "An error occurred while rendering KaTeX" msgstr "" @@ -199,6 +277,12 @@ msgstr "" msgid "An error occurred while retrieving diff" msgstr "" +msgid "An error occurred while saving LDAP override status. Please try again." +msgstr "" + +msgid "An error occurred while saving assignees" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -223,15 +307,15 @@ msgstr "æ¤å°ˆæ¡ˆå·²å°å˜ï¼æª”案庫 (repository) 為唯讀狀態" msgid "Are you sure you want to delete this pipeline schedule?" msgstr "確定è¦åˆªé™¤æ¤æµæ°´ç·š (pipeline) 排程嗎?" -msgid "Are you sure you want to discard your changes?" -msgstr "確定è¦æ”¾æ£„修改嗎?" - msgid "Are you sure you want to reset registration token?" msgstr "確定è¦é‡ç½®è¨»å†Šæ†‘è‰ (registration token) 嗎?" msgid "Are you sure you want to reset the health check token?" msgstr "確定è¦é‡ç½®å¥åº·æª¢æŸ¥å˜å–æ†‘è‰ (access token) 嗎?" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure?" msgstr "確定嗎?" @@ -271,6 +355,9 @@ msgstr "作者" msgid "Authors: %{authors}" msgstr "" +msgid "Auto DevOps enabled" +msgstr "" + msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly." msgstr "" @@ -295,8 +382,14 @@ msgstr "å°‡æ ¹æ“šè¨å®šçš„çš„ CI / CD æµç¨‹è‡ªå‹•å»ºæ§‹ã€æ¸¬è©¦å’Œéƒ¨ç½²æ‡‰ç”¨ msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "了解更多於 %{link_to_documentation}" -msgid "AutoDevOps|You can activate %{link_to_settings} for this project." -msgstr "ä½ å¯ä»¥ç‚ºæ¤å°ˆæ¡ˆå•Ÿå‹• %{link_to_settings}" +msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}." +msgstr "" + +msgid "AutoDevOps|add a Kubernetes cluster" +msgstr "" + +msgid "AutoDevOps|enable Auto DevOps (Beta)" +msgstr "" msgid "Available" msgstr "" @@ -307,6 +400,9 @@ msgstr "" msgid "Average per day: %{average}" msgstr "" +msgid "Begin with the selected commit" +msgstr "" + msgid "Billing" msgstr "" @@ -361,12 +457,9 @@ msgstr "" msgid "BillingPlans|per user" msgstr "" -msgid "Begin with the selected commit" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "分支 (branch) " +msgid "Branch (%{branch_count})" +msgid_plural "Branches (%{branch_count})" +msgstr[0] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "已建立分支 (branch) <strong>%{branch_name}</strong> 。如需è¨å®šè‡ªå‹•éƒ¨ç½²ï¼Œ 在é¸æ“‡åˆé©çš„ GitLab CI Yaml 模æ¿å¾Œï¼Œè«‹é€äº¤ (commit) 您的編輯內容。%{link_to_autodeploy_doc}" @@ -659,6 +752,9 @@ msgstr "" msgid "CircuitBreakerApiLink|circuitbreaker api" msgstr "斷路器 (circuitbreaker) API" +msgid "Click the button below to begin the install process by navigating to the Kubernetes page" +msgstr "" + msgid "Click to expand text" msgstr "" @@ -713,6 +809,9 @@ msgstr "" msgid "ClusterIntegration|Copy CA Certificate" msgstr "" +msgid "ClusterIntegration|Copy Ingress IP Address to clipboard" +msgstr "" + msgid "ClusterIntegration|Copy Kubernetes cluster name" msgstr "" @@ -761,6 +860,9 @@ msgstr "" msgid "ClusterIntegration|Ingress" msgstr "" +msgid "ClusterIntegration|Ingress IP Address" +msgstr "" + msgid "ClusterIntegration|Install" msgstr "" @@ -812,9 +914,6 @@ msgstr "" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "å¸ç¿’更多有關於%{link_to_documentation}" -msgid "ClusterIntegration|Learn more about Kubernetes" -msgstr "" - msgid "ClusterIntegration|Learn more about environments" msgstr "" @@ -950,6 +1049,12 @@ msgstr "è¨å®šæ£ç¢º" msgid "Collapse" msgstr "" +msgid "Comment and resolve discussion" +msgstr "" + +msgid "Comment and unresolve discussion" +msgstr "" + msgid "Comments" msgstr "留言" @@ -957,6 +1062,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "更動記錄 (commit) " +msgid "Commit (%{commit_count})" +msgid_plural "Commits (%{commit_count})" +msgstr[0] "" + msgid "Commit Message" msgstr "更動訊æ¯" @@ -969,6 +1078,9 @@ msgstr "更動說明 (commit) " msgid "Commit statistics for %{ref} %{start_time} - %{end_time}" msgstr "" +msgid "Commit to %{branchName} branch" +msgstr "" + msgid "CommitBoxTitle|Commit" msgstr "é€äº¤" @@ -1110,6 +1222,9 @@ msgstr "複製網å€åˆ°å‰ªè²¼ç°¿" msgid "Copy branch name to clipboard" msgstr "" +msgid "Copy command to clipboard" +msgstr "" + msgid "Copy commit SHA to clipboard" msgstr "複製更動記錄 (commit) çš„ SHA 值到剪貼簿" @@ -1122,9 +1237,18 @@ msgstr "" msgid "Create New Directory" msgstr "建立新目錄" +msgid "Create a new branch" +msgstr "" + +msgid "Create a new branch and merge request" +msgstr "" + msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "建立個人å˜å–æ†‘è‰ (access token) 以使用 %{protocol} 來上傳 (push) 或下載 (pull) 。" +msgid "Create branch" +msgstr "" + msgid "Create directory" msgstr "建立目錄" @@ -1143,6 +1267,9 @@ msgstr "" msgid "Create merge request" msgstr "發出åˆä½µè«‹æ±‚ (merge request) " +msgid "Create merge request and branch" +msgstr "" + msgid "Create new branch" msgstr "新增分支(branch)" @@ -1167,6 +1294,12 @@ msgstr "建立標籤" msgid "CreateTokenToCloneLink|create a personal access token" msgstr "建立個人å˜å–æ†‘è‰ (access token)" +msgid "Creates a new branch from %{branchName}" +msgstr "" + +msgid "Creates a new branch from %{branchName} and re-directs to create a new merge request" +msgstr "" + msgid "Creating epic" msgstr "" @@ -1221,6 +1354,9 @@ msgstr "" msgid "December" msgstr "" +msgid "Default classification label" +msgstr "" + msgid "Define a custom pattern with cron syntax" msgstr "使用 Cron 語法自訂排程" @@ -1252,8 +1388,8 @@ msgstr "目錄å稱" msgid "Disable" msgstr "" -msgid "Discard changes" -msgstr "放棄修改" +msgid "Discard draft" +msgstr "" msgid "Discover GitLab Geo." msgstr "" @@ -1312,6 +1448,9 @@ msgstr "é›»å郵件" msgid "Enable" msgstr "" +msgid "Enable Auto DevOps" +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -1366,9 +1505,18 @@ msgstr "" msgid "Epics" msgstr "" +msgid "Epics Roadmap" +msgstr "" + msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" msgstr "" +msgid "Error checking branch data. Please try again." +msgstr "" + +msgid "Error committing changes. Please try again." +msgstr "" + msgid "Error creating epic" msgstr "" @@ -1435,12 +1583,36 @@ msgstr "ç€è¦½å°ˆæ¡ˆ" msgid "Explore public groups" msgstr "æœå°‹å…¬é–‹çš„群組" +msgid "External Classification Policy Authorization" +msgstr "" + +msgid "External authorization denied access to this project" +msgstr "" + +msgid "ExternalAuthorizationService|Classification Label" +msgstr "" + +msgid "ExternalAuthorizationService|Classification label" +msgstr "" + +msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used." +msgstr "" + +msgid "Failed Jobs" +msgstr "" + msgid "Failed to change the owner" msgstr "無法變更所有權" +msgid "Failed to remove issue from board, please try again." +msgstr "" + msgid "Failed to remove the pipeline schedule" msgstr "無法刪除æµæ°´ç·š (pipeline) 排程" +msgid "Failed to update issues, please try again." +msgstr "" + msgid "Feb" msgstr "" @@ -1456,6 +1628,9 @@ msgstr "檔案å稱" msgid "Files" msgstr "檔案" +msgid "Files (%{human_size})" +msgstr "" + msgid "Filter by commit message" msgstr "以更動說明篩é¸" @@ -1490,6 +1665,9 @@ msgstr "從è°é¡Œ (issue) 建立直到部署至營é‹ç’°å¢ƒ" msgid "From merge request merge until deploy to production" msgstr "從請求被åˆä½µå¾Œ (merge request merged) 直到部署至營é‹ç’°å¢ƒ" +msgid "From the Kubernetes cluster details view, install Runner from the applications list" +msgstr "" + msgid "GPG Keys" msgstr "GPG 金鑰" @@ -1637,6 +1815,24 @@ msgstr "Google 身份驗è‰ä¸æ˜¯ %{link_to_documentation}。如果您想使用æ msgid "Got it!" msgstr "" +msgid "GroupRoadmap|Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Loading roadmap" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown – from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "ç¦æ¢èˆ‡å…¶ä»–群組共享 %{group} ä¸çš„專案" @@ -1734,6 +1930,9 @@ msgstr "æ·å²" msgid "Housekeeping successfully started" msgstr "已開始ç¶è·" +msgid "If you already have files you can push them using the %{link_to_cli} below." +msgstr "" + msgid "Import repository" msgstr "匯入檔案庫 (repository)" @@ -1746,6 +1945,9 @@ msgstr "" msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "" +msgid "Install Runner on Kubernetes" +msgstr "" + msgid "Install a Runner compatible with GitLab CI" msgstr "安è£èˆ‡ GitLab CI 相容的 Runner" @@ -1795,6 +1997,9 @@ msgstr "" msgid "January" msgstr "" +msgid "Jobs" +msgstr "" + msgid "Jul" msgstr "" @@ -1825,6 +2030,9 @@ msgstr "" msgid "Kubernetes cluster was successfully updated." msgstr "" +msgid "Kubernetes configured" +msgstr "" + msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page" msgstr "" @@ -1871,6 +2079,12 @@ msgstr "æ–¼" msgid "Learn more" msgstr "" +msgid "Learn more about Kubernetes" +msgstr "" + +msgid "Learn more about protected branches" +msgstr "" + msgid "Learn more in the" msgstr "了解更多" @@ -1889,6 +2103,9 @@ msgstr "退出專案" msgid "License" msgstr "" +msgid "List" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1898,6 +2115,9 @@ msgstr "鎖定" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock not found" +msgstr "" + msgid "Lock this %{issuableDisplayName}? Only <strong>project members</strong> will be able to comment." msgstr "" @@ -1907,6 +2127,9 @@ msgstr "鎖定" msgid "Locked Files" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Login" msgstr "登入" @@ -1937,9 +2160,6 @@ msgstr "ä¸ä½æ•¸" msgid "Members" msgstr "æˆå“¡" -msgid "Merge Request" -msgstr "" - msgid "Merge Requests" msgstr "åˆä½µè«‹æ±‚ (merge request)" @@ -1952,6 +2172,9 @@ msgstr "åˆä½µè«‹æ±‚" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "MergeRequest|Approved" +msgstr "" + msgid "Merged" msgstr "" @@ -1976,9 +2199,18 @@ msgstr "" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "新增 SSH 金鑰" +msgid "Modal|Cancel" +msgstr "" + +msgid "Modal|Close" +msgstr "" + msgid "Monitoring" msgstr "監控" +msgid "More information" +msgstr "" + msgid "More information is available|here" msgstr "å¥åº·æª¢æŸ¥" @@ -2073,9 +2305,6 @@ msgstr "找ä¸åˆ°æª”案庫 (repository)" msgid "No schedules" msgstr "沒有排程" -msgid "No time spent" -msgstr "" - msgid "None" msgstr "ç„¡" @@ -2091,6 +2320,9 @@ msgstr "" msgid "Not enough data" msgstr "資料ä¸è¶³" +msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" +msgstr "" + msgid "Notification events" msgstr "事件通知" @@ -2193,6 +2425,9 @@ msgstr "於新視窗開啟" msgid "Options" msgstr "é¸é …" +msgid "Otherwise it is recommended you start with one of the options below." +msgstr "" + msgid "Overview" msgstr "總覽" @@ -2298,6 +2533,24 @@ msgstr "" msgid "Pipelines|Get started with Pipelines" msgstr "" +msgid "Pipeline|Retry pipeline" +msgstr "" + +msgid "Pipeline|Retry pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|Stop pipeline" +msgstr "" + +msgid "Pipeline|Stop pipeline #%{pipelineId}?" +msgstr "" + +msgid "Pipeline|You’re about to retry pipeline %{pipelineId}." +msgstr "" + +msgid "Pipeline|You’re about to stop pipeline %{pipelineId}." +msgstr "" + msgid "Pipeline|all" msgstr "所有" @@ -2331,6 +2584,9 @@ msgstr "ç§æœ‰ - 專案權é™å¿…é ˆä¸€ä¸€æŒ‡æ´¾çµ¦æ¯å€‹ä½¿ç”¨è€…" msgid "Private - The group and its projects can only be viewed by members." msgstr "ç§æœ‰ - 群組åŠæ——下專案åªèƒ½è¢«è©²ç¾¤çµ„æˆå“¡æŸ¥çœ‹" +msgid "Private projects can be created in your personal namespace with:" +msgstr "" + msgid "Profile" msgstr "個人資料" @@ -2493,12 +2749,30 @@ msgstr "抱æ‰ï¼Œæ²’有符åˆæœå°‹æ¢ä»¶çš„專案" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "æ¤åŠŸèƒ½éœ€è¦ç€è¦½å™¨æ”¯æ´ localStorage" +msgid "PrometheusService|Active" +msgstr "" + +msgid "PrometheusService|Auto configuration" +msgstr "" + +msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments" +msgstr "" + msgid "PrometheusService|By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server." msgstr "" msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Install Prometheus on clusters" +msgstr "" + +msgid "PrometheusService|Manage clusters" +msgstr "" + +msgid "PrometheusService|Manual configuration" +msgstr "" + msgid "PrometheusService|Metrics" msgstr "" @@ -2520,9 +2794,18 @@ msgstr "" msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/" msgstr "" +msgid "PrometheusService|Prometheus is being automatically managed on your clusters" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" +msgid "PrometheusService|To enable manual configuration, uninstall Prometheus from your clusters" +msgstr "" + +msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration below" +msgstr "" + msgid "PrometheusService|View environments" msgstr "" @@ -2541,6 +2824,12 @@ msgstr "" msgid "Push events" msgstr "æŽ¨é€ (push) 事件" +msgid "Push project from command line" +msgstr "" + +msgid "Push to create a project" +msgstr "" + msgid "PushRule|Committer restriction" msgstr "" @@ -2604,6 +2893,9 @@ msgstr "" msgid "Repository" msgstr "檔案庫 (repository)" +msgid "Repository has no locks." +msgstr "" + msgid "Request Access" msgstr "申請權é™" @@ -2616,6 +2908,9 @@ msgstr "é‡ç½®å¥åº·æª¢æŸ¥å˜å–æ†‘è‰ (access token)" msgid "Reset runners registration token" msgstr "é‡ç½® Runner è¨»å†Šæ†‘è‰ (registration token)" +msgid "Resolve discussion" +msgstr "" + msgid "Reveal value" msgid_plural "Reveal values" msgstr[0] "" @@ -2626,6 +2921,9 @@ msgstr "還原æ¤æ›´å‹•è¨˜éŒ„ (commit)" msgid "Revert this merge request" msgstr "還原æ¤åˆä½µè«‹æ±‚ (merge request) " +msgid "Roadmap" +msgstr "" + msgid "SSH Keys" msgstr "SSH 金鑰" @@ -2671,12 +2969,18 @@ msgstr "ç‰å¾…å˜å–儲å˜ç©ºé–“的嘗試時間(秒)" msgid "Secret variables" msgstr "" +msgid "Security report" +msgstr "" + msgid "Select Archive Format" msgstr "é¸æ“‡ä¸‹è¼‰æ ¼å¼" msgid "Select a timezone" msgstr "é¸æ“‡æ™‚å€" +msgid "Select an existing Kubernetes cluster or create a new one" +msgstr "" + msgid "Select assignee" msgstr "" @@ -2689,6 +2993,9 @@ msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯ (branch) " msgid "Selective synchronization" msgstr "" +msgid "Send email" +msgstr "" + msgid "Sep" msgstr "" @@ -2701,6 +3008,9 @@ msgstr "" msgid "Service Templates" msgstr "æœå‹™ç¯„本" +msgid "Service URL" +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "è«‹å…ˆè¨å®šå¯†ç¢¼ï¼Œæ‰èƒ½ä½¿ç”¨ %{protocol} 來上傳 (push) 或下載 (pull) 。" @@ -2710,15 +3020,15 @@ msgstr "" msgid "Set up Koding" msgstr "è¨å®š Koding" -msgid "Set up auto deploy" -msgstr "è¨å®šè‡ªå‹•éƒ¨ç½²" - msgid "SetPasswordToCloneLink|set a password" msgstr "è¨å®šå¯†ç¢¼" msgid "Settings" msgstr "è¨å®š" +msgid "Setup a specific Runner automatically" +msgstr "" + msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero." msgstr "" @@ -2728,6 +3038,9 @@ msgstr "" msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes" msgstr "" +msgid "Show command" +msgstr "" + msgid "Show parent pages" msgstr "顯示上層é é¢" @@ -2768,12 +3081,24 @@ msgstr "" msgid "Something went wrong when toggling the button" msgstr "" +msgid "Something went wrong while closing the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while fetching SAST." +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "讀å–專案時發生錯誤。" msgid "Something went wrong while fetching the registry list." msgstr "讀å–註冊列表時發生錯誤。" +msgid "Something went wrong while reopening the %{issuable}. Please try again later" +msgstr "" + +msgid "Something went wrong while resolving this discussion. Please try again." +msgstr "" + msgid "Something went wrong. Please try again." msgstr "" @@ -2879,6 +3204,9 @@ msgstr "" msgid "Source" msgstr "" +msgid "Source (branch or tag)" +msgstr "" + msgid "Source code" msgstr "原始碼" @@ -2918,9 +3246,9 @@ msgstr "切æ›åˆ†æ”¯ (branch) 或標籤" msgid "System Hooks" msgstr "系統鉤å" -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "標籤" +msgid "Tag (%{tag_count})" +msgid_plural "Tags (%{tag_count})" +msgstr[0] "" msgid "Tags" msgstr "標籤" @@ -3051,9 +3379,15 @@ msgstr "本專案å¯è®“任何人å˜å–" msgid "The repository for this project does not exist." msgstr "本專案沒有檔案庫 (repository) " +msgid "The repository for this project is empty" +msgstr "" + msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request." msgstr "複閱階段顯示從åˆä½µè«‹æ±‚ (merge request) 建立後至被åˆä½µçš„時間。當建立第一個åˆä½µè«‹æ±‚ (merge request) 後,資料將自動填入。" +msgid "The roadmap shows the progress of your epics along a timeline" +msgstr "" + msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time." msgstr "試營é‹æ®µé¡¯ç¤ºå¾žåˆä½µè«‹æ±‚ (merge request) 被åˆä½µå¾Œè‡³éƒ¨ç½²ç‡Ÿé‹çš„時間。當第一次部署營é‹å¾Œï¼Œè³‡æ–™å°‡è‡ªå‹•å¡«å…¥" @@ -3147,6 +3481,9 @@ msgstr "這代表在您建立一個空的檔案庫 (repository) 或是匯入一å msgid "This merge request is locked." msgstr "這個åˆä½µè«‹æ±‚已被鎖定。" +msgid "This page is unavailable because you are not allowed to read information across multiple projects." +msgstr "" + msgid "This project" msgstr "" @@ -3314,9 +3651,15 @@ msgstr[0] "分é˜" msgid "Time|s" msgstr "秒" +msgid "Tip:" +msgstr "" + msgid "Title" msgstr "" +msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown." +msgstr "" + msgid "Todo" msgstr "" @@ -3332,19 +3675,16 @@ msgstr "" msgid "Total Time" msgstr "總時間" -msgid "Total issue time spent" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "åˆä½µ (merge) 與更動記錄 (commit) 的總測試時間" -msgid "Track activity with Contribution Analytics." +msgid "Total: %{total}" msgstr "" -msgid "Track groups of issues that share a theme, across projects and milestones" +msgid "Track activity with Contribution Analytics." msgstr "" -msgid "Total: %{total}" +msgid "Track groups of issues that share a theme, across projects and milestones" msgstr "" msgid "Track time with quick actions" @@ -3356,9 +3696,6 @@ msgstr "" msgid "Turn on Service Desk" msgstr "" -msgid "Type %{value} to confirm:" -msgstr "" - msgid "Unable to reset project cache." msgstr "" @@ -3374,6 +3711,9 @@ msgstr "" msgid "Unlocked" msgstr "已解鎖" +msgid "Unresolve discussion" +msgstr "" + msgid "Unstar" msgstr "å–消收è—" @@ -3419,6 +3759,9 @@ msgstr "使用全域通知è¨å®š" msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want." msgstr "" +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "ç€è¦½æª”案 @ " @@ -3455,6 +3798,9 @@ msgstr "å› è©²éšŽæ®µçš„è³‡æ–™ä¸è¶³è€Œç„¡æ³•é¡¯ç¤ºç›¸é—œè³‡è¨Š" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" +msgid "Web IDE" +msgstr "" + msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgstr "" @@ -3575,6 +3921,9 @@ msgstr "" msgid "Withdraw Access Request" msgstr "å–消權é™ç”³è«‹" +msgid "Write a commit message..." +msgstr "" + msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" msgstr "å°‡è¦åˆªé™¤ %{group_name}。被刪除的群組無法復原ï¼çœŸçš„「確定ã€è¦é€™éº¼åšå—Žï¼Ÿ" @@ -3587,10 +3936,13 @@ msgstr "å°‡è¦åˆªé™¤æœ¬åˆ†æ”¯å°ˆæ¡ˆèˆ‡ä¸»å¹¹ %{forked_from_project} 的所有關 msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "å°‡è¦æŠŠ %{project_name_with_namespace} 的所有權轉移給å¦ä¸€å€‹äººã€‚真的「確定ã€è¦é€™éº¼åšå—Žï¼Ÿ" +msgid "You can also create a project from the command line." +msgstr "" + msgid "You can also star a label to make it a priority label." msgstr "" -msgid "You can move around the graph by using the arrow keys." +msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" msgid "You can move around the graph by using the arrow keys." @@ -3608,12 +3960,24 @@ msgstr "" msgid "You cannot write to this read-only GitLab instance." msgstr "您ä¸èƒ½ä¿®æ”¹é€™å€‹å”¯è®€çš„ GitLab 主機。" +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + +msgid "You have no permissions" +msgstr "" + msgid "You have reached your project limit" msgstr "您已é”到專案數é‡é™åˆ¶" +msgid "You must have master access to force delete a lock" +msgstr "" + msgid "You must sign in to star a project" msgstr "å¿…é ˆç™»å…¥æ‰èƒ½æ”¶è—專案" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + msgid "You need permission." msgstr "需è¦æ¬Šé™æ‰èƒ½é€™éº¼åšã€‚" @@ -3647,6 +4011,9 @@ msgstr "" msgid "Your Kubernetes cluster information on this page is still editable, but you are advised to disable and reconfigure" msgstr "" +msgid "Your changes have been committed. Commit %{commitId} %{commitStats}" +msgstr "" + msgid "Your comment will not be visible to the public." msgstr "ä½ çš„ç•™è¨€å°‡ä¸æœƒè¢«å…¬é–‹ã€‚" @@ -3674,7 +4041,7 @@ msgstr "" msgid "ciReport|DAST detected no alerts by analyzing the review app" msgstr "" -msgid "ciReport|Failed to load ${type} report" +msgid "ciReport|Failed to load %{reportName} report" msgstr "" msgid "ciReport|Fixed:" @@ -3686,7 +4053,7 @@ msgstr "" msgid "ciReport|Learn more about whitelisting" msgstr "" -msgid "ciReport|Loading ${type} report" +msgid "ciReport|Loading %{reportName} report" msgstr "" msgid "ciReport|No changes to code quality" @@ -3701,6 +4068,15 @@ msgstr "" msgid "ciReport|SAST" msgstr "" +msgid "ciReport|SAST degraded on" +msgstr "" + +msgid "ciReport|SAST detected" +msgstr "" + +msgid "ciReport|SAST detected no new security vulnerabilities" +msgstr "" + msgid "ciReport|SAST detected no security vulnerabilities" msgstr "" @@ -3713,6 +4089,12 @@ msgstr "" msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved. %{helpLink}" msgstr "" +msgid "ciReport|no security vulnerabilities" +msgstr "" + +msgid "command line instructions" +msgstr "" + msgid "commit" msgstr "" @@ -3729,10 +4111,40 @@ msgstr[0] "天" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" +msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch" +msgstr "" + +msgid "mrWidget|Add approval" +msgstr "" + +msgid "mrWidget|An error occured while removing your approval." +msgstr "" + +msgid "mrWidget|An error occured while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occured while submitting your approval." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -3766,6 +4178,9 @@ msgstr "" msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the" msgstr "" +msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line" +msgstr "" + msgid "mrWidget|Mentions" msgstr "" @@ -3799,6 +4214,9 @@ msgstr "" msgid "mrWidget|Remove source branch" msgstr "" +msgid "mrWidget|Remove your approval" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -3853,6 +4271,9 @@ msgstr "" msgid "mrWidget|You can remove source branch now" msgstr "" +msgid "mrWidget|branch does not exist." +msgstr "" + msgid "mrWidget|command line" msgstr "" @@ -3899,3 +4320,6 @@ msgstr "使用者å稱" msgid "uses Kubernetes clusters to deploy your code!" msgstr "" +msgid "with %{additions} additions, %{deletions} deletions." +msgstr "" + diff --git a/scripts/trigger-build-docs b/scripts/trigger-build-docs index a270823b857..ae8cac0cf02 100755 --- a/scripts/trigger-build-docs +++ b/scripts/trigger-build-docs @@ -7,7 +7,7 @@ require 'gitlab' # Gitlab.configure do |config| config.endpoint = 'https://gitlab.com/api/v4' - config.private_token = ENV["DOCS_API_TOKEN"] # GitLab Docs bot access token which has only Developer access to gitlab-docs + config.private_token = ENV["DOCS_API_TOKEN"] # GitLab Docs bot access token with Developer access to gitlab-docs end # @@ -31,13 +31,24 @@ def docs_branch end # -# Create a remote branch in gitlab-docs +# Create a remote branch in gitlab-docs and immediately cancel the pipeline +# to avoid race conditions, since a triggered pipeline will also run right +# after the branch creation. This only happens the very first time a branch +# is created and will be skipped in subsequent runs. Read more in +# https://gitlab.com/gitlab-com/gitlab-docs/issues/154. # def create_remote_branch Gitlab.create_branch(GITLAB_DOCS_REPO, docs_branch, 'master') - puts "Remote branch '#{docs_branch}' created" + puts "=> Remote branch '#{docs_branch}' created" + + # Get the latest pipeline ID which is also the first + pipeline_id = Gitlab.pipelines(GITLAB_DOCS_REPO, { ref: docs_branch }).last.id + + # Cancel the pipeline + Gitlab.cancel_pipeline(GITLAB_DOCS_REPO, pipeline_id) + puts "=> Canceled uneeded pipeline #{pipeline_id} for '#{docs_branch}'" rescue Gitlab::Error::BadRequest - puts "Remote branch '#{docs_branch}' already exists" + puts "=> Remote branch '#{docs_branch}' already exists" end # @@ -45,7 +56,7 @@ end # def remove_remote_branch Gitlab.delete_branch(GITLAB_DOCS_REPO, docs_branch) - puts "Remote branch '#{docs_branch}' deleted" + puts "=> Remote branch '#{docs_branch}' deleted" end # @@ -78,18 +89,22 @@ def trigger_pipeline # The review app URL app_url = "http://#{docs_branch}.#{ENV["DOCS_REVIEW_APPS_DOMAIN"]}/#{slug}" - # Create the pipeline - puts "=> Triggering a pipeline..." + # Create the cross project pipeline using CI_JOB_TOKEN pipeline = Gitlab.run_trigger(GITLAB_DOCS_REPO, ENV["CI_JOB_TOKEN"], docs_branch, { param_name => ENV["CI_COMMIT_REF_NAME"] }) - puts "=> Pipeline created:" + puts "=> Follow the status of the triggered pipeline:" puts "" puts "https://gitlab.com/gitlab-com/gitlab-docs/pipelines/#{pipeline.id}" puts "" - puts "=> Preview your changes live at:" + puts "=> In a few minutes, you will be able to preview your changes under the following URL:" puts "" puts app_url puts "" + puts "=> For more information, read the documentation" + puts "=> https://docs.gitlab.com/ee/development/writing_documentation.html#previewing-the-changes-live" + puts "" + puts "=> If something doesn't work, drop a line in the #docs chat channel." + puts "" end # diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb index b7257fac608..fb6d82d7de3 100644 --- a/spec/controllers/autocomplete_controller_spec.rb +++ b/spec/controllers/autocomplete_controller_spec.rb @@ -246,7 +246,7 @@ describe AutocompleteController do expect(json_response.size).to eq(1) expect(json_response.first['id']).to eq authorized_project.id - expect(json_response.first['name_with_namespace']).to eq authorized_project.name_with_namespace + expect(json_response.first['name_with_namespace']).to eq authorized_project.full_name end end end @@ -267,7 +267,7 @@ describe AutocompleteController do expect(json_response.size).to eq(1) expect(json_response.first['id']).to eq authorized_search_project.id - expect(json_response.first['name_with_namespace']).to eq authorized_search_project.name_with_namespace + expect(json_response.first['name_with_namespace']).to eq authorized_search_project.full_name end end end diff --git a/spec/controllers/groups/boards_controller_spec.rb b/spec/controllers/groups/boards_controller_spec.rb new file mode 100644 index 00000000000..0f5bde62006 --- /dev/null +++ b/spec/controllers/groups/boards_controller_spec.rb @@ -0,0 +1,136 @@ +require 'spec_helper' + +describe Groups::BoardsController do + let(:group) { create(:group) } + let(:user) { create(:user) } + + before do + group.add_master(user) + sign_in(user) + end + + describe 'GET index' do + it 'creates a new board when group does not have one' do + expect { list_boards }.to change(group.boards, :count).by(1) + end + + context 'when format is HTML' do + it 'renders template' do + list_boards + + expect(response).to render_template :index + expect(response.content_type).to eq 'text/html' + end + + context 'with unauthorized user' do + before do + allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true) + allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false) + end + + it 'returns a not found 404 response' do + list_boards + + expect(response).to have_gitlab_http_status(404) + expect(response.content_type).to eq 'text/html' + end + end + end + + context 'when format is JSON' do + it 'return an array with one group board' do + create(:board, group: group) + + list_boards format: :json + + parsed_response = JSON.parse(response.body) + + expect(response).to match_response_schema('boards') + expect(parsed_response.length).to eq 1 + end + + context 'with unauthorized user' do + before do + allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true) + allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false) + end + + it 'returns a not found 404 response' do + list_boards format: :json + + expect(response).to have_gitlab_http_status(404) + expect(response.content_type).to eq 'application/json' + end + end + end + + def list_boards(format: :html) + get :index, group_id: group, format: format + end + end + + describe 'GET show' do + let!(:board) { create(:board, group: group) } + + context 'when format is HTML' do + it 'renders template' do + read_board board: board + + expect(response).to render_template :show + expect(response.content_type).to eq 'text/html' + end + + context 'with unauthorized user' do + before do + allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true) + allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false) + end + + it 'returns a not found 404 response' do + read_board board: board + + expect(response).to have_gitlab_http_status(404) + expect(response.content_type).to eq 'text/html' + end + end + end + + context 'when format is JSON' do + it 'returns project board' do + read_board board: board, format: :json + + expect(response).to match_response_schema('board') + end + + context 'with unauthorized user' do + before do + allow(Ability).to receive(:allowed?).with(user, :read_cross_project, :global).and_return(true) + allow(Ability).to receive(:allowed?).with(user, :read_group, group).and_return(false) + end + + it 'returns a not found 404 response' do + read_board board: board, format: :json + + expect(response).to have_gitlab_http_status(404) + expect(response.content_type).to eq 'application/json' + end + end + end + + context 'when board does not belong to group' do + it 'returns a not found 404 response' do + another_board = create(:board) + + read_board board: another_board + + expect(response).to have_gitlab_http_status(404) + end + end + + def read_board(board:, format: :html) + get :show, group_id: group, + id: board.to_param, + format: format + end + end +end diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb index 734396ddf7b..3b9e06cb5ad 100644 --- a/spec/controllers/projects/branches_controller_spec.rb +++ b/spec/controllers/projects/branches_controller_spec.rb @@ -407,10 +407,43 @@ describe Projects::BranchesController do get :index, namespace_id: project.namespace, project_id: project, + state: 'all', format: :html expect(response).to have_gitlab_http_status(200) end end + + context 'when depreated sort/search/page parameters are specified' do + it 'returns with a status 301 when sort specified' do + get :index, + namespace_id: project.namespace, + project_id: project, + sort: 'updated_asc', + format: :html + + expect(response).to redirect_to project_branches_filtered_path(project, state: 'all') + end + + it 'returns with a status 301 when search specified' do + get :index, + namespace_id: project.namespace, + project_id: project, + search: 'feature', + format: :html + + expect(response).to redirect_to project_branches_filtered_path(project, state: 'all') + end + + it 'returns with a status 301 when page specified' do + get :index, + namespace_id: project.namespace, + project_id: project, + page: 2, + format: :html + + expect(response).to redirect_to project_branches_filtered_path(project, state: 'all') + end + end end end diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb index 73e7921fab7..6c67dfde63a 100644 --- a/spec/controllers/projects/deployments_controller_spec.rb +++ b/spec/controllers/projects/deployments_controller_spec.rb @@ -129,10 +129,10 @@ describe Projects::DeploymentsController do end context 'when metrics are enabled' do - let(:prometheus_service) { double('prometheus_service') } + let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) } before do - allow(deployment.project).to receive(:prometheus_service).and_return(prometheus_service) + allow(deployment).to receive(:prometheus_adapter).and_return(prometheus_adapter) end context 'when environment has no metrics' do diff --git a/spec/controllers/projects/prometheus/metrics_controller_spec.rb b/spec/controllers/projects/prometheus/metrics_controller_spec.rb index f17f819feee..b2b245dba90 100644 --- a/spec/controllers/projects/prometheus/metrics_controller_spec.rb +++ b/spec/controllers/projects/prometheus/metrics_controller_spec.rb @@ -4,21 +4,22 @@ describe Projects::Prometheus::MetricsController do let(:user) { create(:user) } let(:project) { create(:project) } - let(:prometheus_service) { double('prometheus_service') } + let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) } before do - allow(controller).to receive(:project).and_return(project) - allow(project).to receive(:find_or_initialize_service).with('prometheus').and_return(prometheus_service) - project.add_master(user) sign_in(user) end describe 'GET #active_common' do + before do + allow(controller).to receive(:prometheus_adapter).and_return(prometheus_adapter) + end + context 'when prometheus metrics are enabled' do context 'when data is not present' do before do - allow(prometheus_service).to receive(:matched_metrics).and_return({}) + allow(prometheus_adapter).to receive(:query).with(:matched_metrics).and_return({}) end it 'returns no content response' do @@ -32,7 +33,7 @@ describe Projects::Prometheus::MetricsController do let(:sample_response) { { some_data: 1 } } before do - allow(prometheus_service).to receive(:matched_metrics).and_return(sample_response) + allow(prometheus_adapter).to receive(:query).with(:matched_metrics).and_return(sample_response) end it 'returns no content response' do @@ -53,6 +54,18 @@ describe Projects::Prometheus::MetricsController do end end + describe '#prometheus_adapter' do + before do + allow(controller).to receive(:project).and_return(project) + end + + it 'calls prometheus adapter service' do + expect_any_instance_of(::Prometheus::AdapterService).to receive(:prometheus_adapter) + + subject.__send__(:prometheus_adapter) + end + end + def project_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project) end diff --git a/spec/factories/badge.rb b/spec/factories/badge.rb new file mode 100644 index 00000000000..b87ece946cb --- /dev/null +++ b/spec/factories/badge.rb @@ -0,0 +1,14 @@ +FactoryBot.define do + trait :base_badge do + link_url { generate(:url) } + image_url { generate(:url) } + end + + factory :project_badge, traits: [:base_badge], class: ProjectBadge do + project + end + + factory :group_badge, aliases: [:badge], traits: [:base_badge], class: GroupBadge do + group + end +end diff --git a/spec/factories/boards.rb b/spec/factories/boards.rb index 1e125237ae8..6524bb4830c 100644 --- a/spec/factories/boards.rb +++ b/spec/factories/boards.rb @@ -1,6 +1,29 @@ FactoryBot.define do factory :board do - project + transient do + project nil + group nil + project_id nil + group_id nil + parent nil + end + + after(:build, :stub) do |board, evaluator| + if evaluator.group + board.group = evaluator.group + elsif evaluator.group_id + board.group_id = evaluator.group_id + elsif evaluator.project + board.project = evaluator.project + elsif evaluator.project_id + board.project_id = evaluator.project_id + elsif evaluator.parent + id = evaluator.parent.id + evaluator.parent.is_a?(Group) ? board.group_id = id : evaluator.project_id = id + else + board.project = create(:project, :empty_repo) + end + end after(:create) do |board| board.lists.create(list_type: :closed) diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb index a5f22848031..d5e603baeae 100644 --- a/spec/features/admin/admin_groups_spec.rb +++ b/spec/features/admin/admin_groups_spec.rb @@ -173,7 +173,7 @@ feature 'Admin Groups' do visit admin_group_path(group) - expect(page).to have_content(empty_project.name_with_namespace) + expect(page).to have_content(empty_project.full_name) expect(page).to have_content('Projects shared with') end end diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb index f266f2ecc54..25ed3bdc88e 100644 --- a/spec/features/admin/admin_hooks_spec.rb +++ b/spec/features/admin/admin_hooks_spec.rb @@ -24,6 +24,16 @@ describe 'Admin::Hooks' do visit admin_hooks_path expect(page).to have_content(system_hook.url) end + + it 'renders plugins list as well' do + allow(Gitlab::Plugin).to receive(:files).and_return(['foo.rb', 'bar.clj']) + + visit admin_hooks_path + + expect(page).to have_content('Plugins') + expect(page).to have_content('foo.rb') + expect(page).to have_content('bar.clj') + end end describe 'New Hook' do diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb index d02ac6c2e2a..6d8350e99f1 100644 --- a/spec/features/admin/admin_projects_spec.rb +++ b/spec/features/admin/admin_projects_spec.rb @@ -58,7 +58,7 @@ describe "Admin::Projects" do expect(current_path).to eq admin_project_path(project) expect(page).to have_content(project.path) expect(page).to have_content(project.name) - expect(page).to have_content(project.name_with_namespace) + expect(page).to have_content(project.full_name) expect(page).to have_content(project.creator.name) end end diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 7eeed7da998..8de2e3d199b 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -76,8 +76,8 @@ describe "Admin Runners" do describe 'projects' do it 'contains project names' do - expect(page).to have_content(@project1.name_with_namespace) - expect(page).to have_content(@project2.name_with_namespace) + expect(page).to have_content(@project1.full_name) + expect(page).to have_content(@project2.full_name) end end @@ -89,8 +89,8 @@ describe "Admin Runners" do end it 'contains name of correct project' do - expect(page).to have_content(@project1.name_with_namespace) - expect(page).not_to have_content(@project2.name_with_namespace) + expect(page).to have_content(@project1.full_name) + expect(page).not_to have_content(@project2.full_name) end end diff --git a/spec/features/dashboard/issues_spec.rb b/spec/features/dashboard/issues_spec.rb index 54652e2d849..8d1d5a51750 100644 --- a/spec/features/dashboard/issues_spec.rb +++ b/spec/features/dashboard/issues_spec.rb @@ -74,8 +74,8 @@ RSpec.describe 'Dashboard Issues' do find('.new-project-item-select-button').click page.within('.select2-results') do - expect(page).to have_content(project.name_with_namespace) - expect(page).not_to have_content(project_with_issues_disabled.name_with_namespace) + expect(page).to have_content(project.full_name) + expect(page).not_to have_content(project_with_issues_disabled.full_name) end end @@ -84,8 +84,8 @@ RSpec.describe 'Dashboard Issues' do wait_for_requests - project_path = "/#{project.path_with_namespace}" - project_json = { name: project.name_with_namespace, url: project_path }.to_json + project_path = "/#{project.full_path}" + project_json = { name: project.full_name, url: project_path }.to_json # simulate selection, and prevent overlap by dropdown menu first('.project-item-select', visible: false) diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb index 744041ac425..c8f3a8449f5 100644 --- a/spec/features/dashboard/merge_requests_spec.rb +++ b/spec/features/dashboard/merge_requests_spec.rb @@ -28,8 +28,8 @@ feature 'Dashboard Merge Requests' do find('.new-project-item-select-button').click page.within('.select2-results') do - expect(page).to have_content(project.name_with_namespace) - expect(page).not_to have_content(project_with_disabled_merge_requests.name_with_namespace) + expect(page).to have_content(project.full_name) + expect(page).not_to have_content(project_with_disabled_merge_requests.full_name) end end end diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb index 586c7b48d0b..986f864f0b5 100644 --- a/spec/features/dashboard/projects_spec.rb +++ b/spec/features/dashboard/projects_spec.rb @@ -37,6 +37,14 @@ feature 'Dashboard Projects' do expect(page).to have_xpath("//time[@datetime='#{project.last_repository_updated_at.getutc.iso8601}']") end + + it 'shows the last_activity_at attribute as the update date' do + project.update_attributes!(last_repository_updated_at: 1.hour.ago, last_activity_at: Time.now) + + visit dashboard_projects_path + + expect(page).to have_xpath("//time[@datetime='#{project.last_activity_at.getutc.iso8601}']") + end end context 'when last_repository_updated_at and last_activity_at are missing' do diff --git a/spec/features/dashboard/todos/todos_filtering_spec.rb b/spec/features/dashboard/todos/todos_filtering_spec.rb index 2fc34301d51..7b359b0c651 100644 --- a/spec/features/dashboard/todos/todos_filtering_spec.rb +++ b/spec/features/dashboard/todos/todos_filtering_spec.rb @@ -24,14 +24,14 @@ feature 'Dashboard > User filters todos', :js do it 'filters by project' do click_button 'Project' within '.dropdown-menu-project' do - fill_in 'Search projects', with: project_1.name_with_namespace - click_link project_1.name_with_namespace + fill_in 'Search projects', with: project_1.full_name + click_link project_1.full_name end wait_for_requests - expect(page).to have_content project_1.name_with_namespace - expect(page).not_to have_content project_2.name_with_namespace + expect(page).to have_content project_1.full_name + expect(page).not_to have_content project_2.full_name end context 'Author filter' do diff --git a/spec/features/issues/move_spec.rb b/spec/features/issues/move_spec.rb index 076a02150a4..3c01ff345fc 100644 --- a/spec/features/issues/move_spec.rb +++ b/spec/features/issues/move_spec.rb @@ -73,7 +73,7 @@ feature 'issue move to another project' do wait_for_requests page.within '.js-sidebar-move-issue-block' do - expect(page).to have_content new_project.name_with_namespace + expect(page).to have_content new_project.full_name end end end diff --git a/spec/features/projects/branches/download_buttons_spec.rb b/spec/features/projects/branches/download_buttons_spec.rb index 39bcea013e7..605298ba8ab 100644 --- a/spec/features/projects/branches/download_buttons_spec.rb +++ b/spec/features/projects/branches/download_buttons_spec.rb @@ -29,7 +29,7 @@ feature 'Download buttons in branches page' do describe 'when checking branches' do context 'with artifacts' do before do - visit project_branches_path(project, search: 'binary-encoding') + visit project_branches_filtered_path(project, state: 'all', search: 'binary-encoding') end scenario 'shows download artifacts button' do diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb index 2fddd274078..2a9d9e6416c 100644 --- a/spec/features/projects/branches_spec.rb +++ b/spec/features/projects/branches_spec.rb @@ -11,15 +11,109 @@ describe 'Branches' do project.add_developer(user) end - describe 'Initial branches page' do - it 'shows all the branches sorted by last updated by default' do + context 'on the projects with 6 active branches and 4 stale branches' do + let(:project) { create(:project, :public, :empty_repo) } + let(:repository) { project.repository } + let(:threshold) { Gitlab::Git::Branch::STALE_BRANCH_THRESHOLD } + + before do + # Add 4 stale branches + (1..4).reverse_each do |i| + Timecop.freeze((threshold + i).ago) { create_file(message: "a commit in stale-#{i}", branch_name: "stale-#{i}") } + end + # Add 6 active branches + (1..6).each do |i| + Timecop.freeze((threshold - i).ago) { create_file(message: "a commit in active-#{i}", branch_name: "active-#{i}") } + end + end + + describe 'Overview page of the branches' do + it 'shows the first 5 active branches and the first 4 stale branches sorted by last updated' do + visit project_branches_path(project) + + expect(page).to have_content(sorted_branches(repository, count: 5, sort_by: :updated_desc, state: 'active')) + expect(page).to have_content(sorted_branches(repository, count: 4, sort_by: :updated_desc, state: 'stale')) + + expect(page).to have_link('Show more active branches', href: project_branches_filtered_path(project, state: 'active')) + expect(page).not_to have_content('Show more stale branches') + end + end + + describe 'Active branches page' do + it 'shows 6 active branches sorted by last updated' do + visit project_branches_filtered_path(project, state: 'active') + + expect(page).to have_content(sorted_branches(repository, count: 6, sort_by: :updated_desc, state: 'active')) + end + end + + describe 'Stale branches page' do + it 'shows 4 active branches sorted by last updated' do + visit project_branches_filtered_path(project, state: 'stale') + + expect(page).to have_content(sorted_branches(repository, count: 4, sort_by: :updated_desc, state: 'stale')) + end + end + + describe 'All branches page' do + it 'shows 10 branches sorted by last updated' do + visit project_branches_filtered_path(project, state: 'all') + + expect(page).to have_content(sorted_branches(repository, count: 10, sort_by: :updated_desc)) + end + end + + context 'with branches over more than one page' do + before do + allow(Kaminari.config).to receive(:default_per_page).and_return(5) + end + + it 'shows only default_per_page active branches sorted by last updated' do + visit project_branches_filtered_path(project, state: 'active') + + expect(page).to have_content(sorted_branches(repository, count: Kaminari.config.default_per_page, sort_by: :updated_desc, state: 'active')) + end + + it 'shows only default_per_page branches sorted by last updated on All branches' do + visit project_branches_filtered_path(project, state: 'all') + + expect(page).to have_content(sorted_branches(repository, count: Kaminari.config.default_per_page, sort_by: :updated_desc)) + end + end + end + + describe 'Find branches' do + it 'shows filtered branches', :js do visit project_branches_path(project) + fill_in 'branch-search', with: 'fix' + find('#branch-search').native.send_keys(:enter) + + expect(page).to have_content('fix') + expect(find('.all-branches')).to have_selector('li', count: 1) + end + end + + describe 'Delete unprotected branch on Overview' do + it 'removes branch after confirmation', :js do + visit project_branches_filtered_path(project, state: 'all') + + expect(all('.all-branches').last).to have_selector('li', count: 20) + accept_confirm { find('.js-branch-add-pdf-text-binary .btn-remove').click } + + expect(all('.all-branches').last).to have_selector('li', count: 19) + end + end + + describe 'All branches page' do + it 'shows all the branches sorted by last updated by default' do + visit project_branches_filtered_path(project, state: 'all') + expect(page).to have_content(sorted_branches(repository, count: 20, sort_by: :updated_desc)) end it 'sorts the branches by name' do - visit project_branches_path(project) + visit project_branches_filtered_path(project, state: 'all') click_button "Last updated" # Open sorting dropdown click_link "Name" @@ -28,7 +122,7 @@ describe 'Branches' do end it 'sorts the branches by oldest updated' do - visit project_branches_path(project) + visit project_branches_filtered_path(project, state: 'all') click_button "Last updated" # Open sorting dropdown click_link "Oldest updated" @@ -41,13 +135,13 @@ describe 'Branches' do %w(one two three four five).each { |ref| repository.add_branch(user, ref, 'master') } - expect { visit project_branches_path(project) }.not_to exceed_query_limit(control_count) + expect { visit project_branches_filtered_path(project, state: 'all') }.not_to exceed_query_limit(control_count) end end - describe 'Find branches' do + describe 'Find branches on All branches' do it 'shows filtered branches', :js do - visit project_branches_path(project) + visit project_branches_filtered_path(project, state: 'all') fill_in 'branch-search', with: 'fix' find('#branch-search').native.send_keys(:enter) @@ -57,9 +151,9 @@ describe 'Branches' do end end - describe 'Delete unprotected branch' do + describe 'Delete unprotected branch on All branches' do it 'removes branch after confirmation', :js do - visit project_branches_path(project) + visit project_branches_filtered_path(project, state: 'all') fill_in 'branch-search', with: 'fix' @@ -73,6 +167,19 @@ describe 'Branches' do expect(find('.all-branches')).to have_selector('li', count: 0) end end + + context 'on project with 0 branch' do + let(:project) { create(:project, :public, :empty_repo) } + let(:repository) { project.repository } + + describe '0 branches on Overview' do + it 'shows warning' do + visit project_branches_path(project) + + expect(page).not_to have_selector('.all-branches') + end + end + end end context 'logged in as master' do @@ -83,7 +190,7 @@ describe 'Branches' do describe 'Initial branches page' do it 'shows description for admin' do - visit project_branches_path(project) + visit project_branches_filtered_path(project, state: 'all') expect(page).to have_content("Protected branches can be managed in project settings") end @@ -102,12 +209,18 @@ describe 'Branches' do end end - def sorted_branches(repository, count:, sort_by:) + def sorted_branches(repository, count:, sort_by:, state: nil) + branches = repository.branches_sorted_by(sort_by) + branches = branches.select { |b| state == 'active' ? b.active? : b.stale? } if state sorted_branches = - repository.branches_sorted_by(sort_by).first(count).map do |branch| + branches.first(count).map do |branch| Regexp.escape(branch.name) end Regexp.new(sorted_branches.join('.*')) end + + def create_file(message: 'message', branch_name:) + repository.create_file(user, generate(:branch), 'content', message: message, branch_name: branch_name) + end end diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index 64e600144e0..b233af83eec 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -234,7 +234,7 @@ feature 'Environment' do end scenario 'user deletes the branch with running environment' do - visit project_branches_path(project, search: 'feature') + visit project_branches_filtered_path(project, state: 'all', search: 'feature') remove_branch_with_hooks(project, user, 'feature') do page.within('.js-branch-feature') { find('a.btn-remove').click } diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz Binary files differindex 0cc68aff494..12bfcc177c7 100644 --- a/spec/features/projects/import_export/test_project_export.tar.gz +++ b/spec/features/projects/import_export/test_project_export.tar.gz diff --git a/spec/features/projects/members/master_manages_access_requests_spec.rb b/spec/features/projects/members/master_manages_access_requests_spec.rb index d575596937d..1f4eec0a317 100644 --- a/spec/features/projects/members/master_manages_access_requests_spec.rb +++ b/spec/features/projects/members/master_manages_access_requests_spec.rb @@ -25,7 +25,7 @@ feature 'Projects > Members > Master manages access requests' do perform_enqueued_jobs { click_on 'Grant access' } expect(ActionMailer::Base.deliveries.last.to).to eq [user.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{project.name_with_namespace} project was granted" + expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{project.full_name} project was granted" end scenario 'master can deny access' do @@ -36,7 +36,7 @@ feature 'Projects > Members > Master manages access requests' do perform_enqueued_jobs { click_on 'Deny access' } expect(ActionMailer::Base.deliveries.last.to).to eq [user.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{project.name_with_namespace} project was denied" + expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{project.full_name} project was denied" end def expect_visible_access_request(project, user) diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb index 4eb36156812..672d5daa3d8 100644 --- a/spec/features/projects/members/user_requests_access_spec.rb +++ b/spec/features/projects/members/user_requests_access_spec.rb @@ -21,7 +21,7 @@ feature 'Projects > Members > User requests access', :js do perform_enqueued_jobs { click_link 'Request Access' } expect(ActionMailer::Base.deliveries.last.to).to eq [master.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to eq "Request to join the #{project.name_with_namespace} project" + expect(ActionMailer::Base.deliveries.last.subject).to eq "Request to join the #{project.full_name} project" expect(project.requesters.exists?(user_id: user)).to be_truthy expect(page).to have_content 'Your request for access has been queued for review.' diff --git a/spec/features/projects/merge_request_button_spec.rb b/spec/features/projects/merge_request_button_spec.rb index 85d518c0cc3..40689964b91 100644 --- a/spec/features/projects/merge_request_button_spec.rb +++ b/spec/features/projects/merge_request_button_spec.rb @@ -81,8 +81,8 @@ feature 'Merge Request button' do context 'on branches page' do it_behaves_like 'Merge request button only shown when allowed' do let(:label) { 'Merge request' } - let(:url) { project_branches_path(project, search: 'feature') } - let(:fork_url) { project_branches_path(forked_project, search: 'feature') } + let(:url) { project_branches_filtered_path(project, state: 'all', search: 'feature') } + let(:fork_url) { project_branches_filtered_path(forked_project, state: 'all', search: 'feature') } end end diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index b5104747d00..fd561288091 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -142,7 +142,7 @@ feature 'New project' do context 'from git repository url, "Repo by URL"' do before do - first('.import_git').click + first('.js-import-git-toggle-button').click end it 'does not autocomplete sensitive git repo URL' do diff --git a/spec/features/projects/pages_spec.rb b/spec/features/projects/pages_spec.rb index 2a0d235ef04..233d2e67b9d 100644 --- a/spec/features/projects/pages_spec.rb +++ b/spec/features/projects/pages_spec.rb @@ -258,7 +258,7 @@ feature 'Pages' do end let(:ci_build) do - build( + create( :ci_build, project: project, pipeline: pipeline, diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 3a8e7c05cc4..849d85061df 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -86,7 +86,22 @@ describe 'Pipelines', :js do it 'updates content when tab is clicked' do page.find('.js-pipelines-tab-pending').click wait_for_requests - expect(page).to have_content('No pipelines to show.') + expect(page).to have_content('There are currently no pending pipelines.') + end + end + + context 'navigation links' do + before do + visit project_pipelines_path(project) + wait_for_requests + end + + it 'renders run pipeline link' do + expect(page).to have_link('Run Pipeline') + end + + it 'renders ci lint link' do + expect(page).to have_link('CI Lint') end end @@ -542,7 +557,7 @@ describe 'Pipelines', :js do end it 'has a clear caches button' do - expect(page).to have_link 'Clear runner caches' + expect(page).to have_link 'Clear Runner Caches' end describe 'user clicks the button' do @@ -552,19 +567,31 @@ describe 'Pipelines', :js do end it 'increments jobs_cache_index' do - click_link 'Clear runner caches' + click_link 'Clear Runner Caches' expect(page.find('.flash-notice')).to have_content 'Project cache successfully reset.' end end context 'when project does not have jobs_cache_index' do it 'sets jobs_cache_index to 1' do - click_link 'Clear runner caches' + click_link 'Clear Runner Caches' expect(page.find('.flash-notice')).to have_content 'Project cache successfully reset.' end end end end + + describe 'Empty State' do + let(:project) { create(:project, :repository) } + + before do + visit project_pipelines_path(project) + end + + it 'renders empty state' do + expect(page).to have_content 'Build with confidence' + end + end end context 'when user is not logged in' do @@ -575,7 +602,9 @@ describe 'Pipelines', :js do context 'when project is public' do let(:project) { create(:project, :public, :repository) } - it { expect(page).to have_content 'Build with confidence' } + context 'without pipelines' do + it { expect(page).to have_content 'This project is not currently set up to run pipelines.' } + end end context 'when project is private' do diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/settings/user_manages_project_members_spec.rb index 2709047b8de..0a4f57bcd21 100644 --- a/spec/features/projects/settings/user_manages_project_members_spec.rb +++ b/spec/features/projects/settings/user_manages_project_members_spec.rb @@ -39,7 +39,7 @@ describe 'User manages project members' do click_link('Import') end - select(project2.name_with_namespace, from: 'source_project_id') + select(project2.full_name, from: 'source_project_id') click_button('Import') project_member = project.project_members.find_by(user_id: user_mike.id) diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb index 77212fb105b..9e089c5a6cb 100644 --- a/spec/features/search/user_searches_for_code_spec.rb +++ b/spec/features/search/user_searches_for_code_spec.rb @@ -35,7 +35,7 @@ describe 'User searches for code' do find('.js-search-project-dropdown').click page.within('.project-filter') do - click_link(project.name_with_namespace) + click_link(project.full_name) end fill_in('dashboard_search', with: 'rspec') diff --git a/spec/features/search/user_searches_for_issues_spec.rb b/spec/features/search/user_searches_for_issues_spec.rb index ef9553f2a91..d6120ff8517 100644 --- a/spec/features/search/user_searches_for_issues_spec.rb +++ b/spec/features/search/user_searches_for_issues_spec.rb @@ -34,7 +34,7 @@ describe 'User searches for issues', :js do find('.js-search-project-dropdown').click page.within('.project-filter') do - click_link(project.name_with_namespace) + click_link(project.full_name) end fill_in('dashboard_search', with: issue1.title) diff --git a/spec/features/search/user_searches_for_merge_requests_spec.rb b/spec/features/search/user_searches_for_merge_requests_spec.rb index 3b6739aecbd..68e2f7a857d 100644 --- a/spec/features/search/user_searches_for_merge_requests_spec.rb +++ b/spec/features/search/user_searches_for_merge_requests_spec.rb @@ -33,7 +33,7 @@ describe 'User searches for merge requests', :js do find('.js-search-project-dropdown').click page.within('.project-filter') do - click_link(project.name_with_namespace) + click_link(project.full_name) end fill_in('dashboard_search', with: merge_request1.title) diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb index 6e197aee498..fc6cd81eb68 100644 --- a/spec/features/search/user_searches_for_milestones_spec.rb +++ b/spec/features/search/user_searches_for_milestones_spec.rb @@ -33,7 +33,7 @@ describe 'User searches for milestones', :js do find('.js-search-project-dropdown').click page.within('.project-filter') do - click_link(project.name_with_namespace) + click_link(project.full_name) end fill_in('dashboard_search', with: milestone1.title) diff --git a/spec/features/search/user_searches_for_wiki_pages_spec.rb b/spec/features/search/user_searches_for_wiki_pages_spec.rb index 00af625dc86..7934779058f 100644 --- a/spec/features/search/user_searches_for_wiki_pages_spec.rb +++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb @@ -18,7 +18,7 @@ describe 'User searches for wiki pages', :js do find('.js-search-project-dropdown').click page.within('.project-filter') do - click_link(project.name_with_namespace) + click_link(project.full_name) end fill_in('dashboard_search', with: 'content') diff --git a/spec/features/search/user_uses_search_filters_spec.rb b/spec/features/search/user_uses_search_filters_spec.rb index aa883c964d2..66afe163447 100644 --- a/spec/features/search/user_uses_search_filters_spec.rb +++ b/spec/features/search/user_uses_search_filters_spec.rb @@ -31,7 +31,7 @@ describe 'User uses search filters', :js do wait_for_requests - expect(page).to have_link(group_project.name_with_namespace) + expect(page).to have_link(group_project.full_name) end end end @@ -43,10 +43,10 @@ describe 'User uses search filters', :js do wait_for_requests - click_link(project.name_with_namespace) + click_link(project.full_name) end - expect(find('.js-search-project-dropdown')).to have_content(project.name_with_namespace) + expect(find('.js-search-project-dropdown')).to have_content(project.full_name) end end end diff --git a/spec/finders/todos_finder_spec.rb b/spec/finders/todos_finder_spec.rb index 90eb0fe21e4..9747b9402a7 100644 --- a/spec/finders/todos_finder_spec.rb +++ b/spec/finders/todos_finder_spec.rb @@ -2,12 +2,13 @@ require 'spec_helper' describe TodosFinder do describe '#execute' do - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:finder) { described_class } + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, namespace: group) } + let(:finder) { described_class } before do - project.add_developer(user) + group.add_developer(user) end describe '#sort' do @@ -34,17 +35,20 @@ describe TodosFinder do end it "sorts by priority" do + project_2 = create(:project) + label_1 = create(:label, title: 'label_1', project: project, priority: 1) label_2 = create(:label, title: 'label_2', project: project, priority: 2) label_3 = create(:label, title: 'label_3', project: project, priority: 3) + label_1_2 = create(:label, title: 'label_1', project: project_2, priority: 1) issue_1 = create(:issue, title: 'issue_1', project: project) issue_2 = create(:issue, title: 'issue_2', project: project) issue_3 = create(:issue, title: 'issue_3', project: project) issue_4 = create(:issue, title: 'issue_4', project: project) - merge_request_1 = create(:merge_request, source_project: project) + merge_request_1 = create(:merge_request, source_project: project_2) - merge_request_1.labels << label_1 + merge_request_1.labels << label_1_2 # Covers the case where Todo has more than one label issue_3.labels << label_1 @@ -57,15 +61,14 @@ describe TodosFinder do todo_2 = create(:todo, user: user, project: project, target: issue_2) todo_3 = create(:todo, user: user, project: project, target: issue_3, created_at: 2.hours.ago) todo_4 = create(:todo, user: user, project: project, target: issue_1) - todo_5 = create(:todo, user: user, project: project, target: merge_request_1, created_at: 1.hour.ago) + todo_5 = create(:todo, user: user, project: project_2, target: merge_request_1, created_at: 1.hour.ago) + + project_2.add_developer(user) todos = finder.new(user, { sort: 'priority' }).execute - expect(todos.first).to eq(todo_3) - expect(todos.second).to eq(todo_5) - expect(todos.third).to eq(todo_4) - expect(todos.fourth).to eq(todo_2) - expect(todos.fifth).to eq(todo_1) + puts todos.to_sql + expect(todos).to eq([todo_3, todo_5, todo_4, todo_2, todo_1]) end end end diff --git a/spec/fixtures/api/schemas/public_api/v4/project/export_status.json b/spec/fixtures/api/schemas/public_api/v4/project/export_status.json new file mode 100644 index 00000000000..d24a6f93f4b --- /dev/null +++ b/spec/fixtures/api/schemas/public_api/v4/project/export_status.json @@ -0,0 +1,17 @@ +{ + "type": "object", + "allOf": [ + { "$ref": "identity.json" }, + { + "required": [ + "export_status" + ], + "properties": { + "export_status": { + "type": "string", + "enum": ["none", "started", "finished"] + } + } + } + ] +} diff --git a/spec/fixtures/api/schemas/public_api/v4/project/identity.json b/spec/fixtures/api/schemas/public_api/v4/project/identity.json new file mode 100644 index 00000000000..e35ab023d44 --- /dev/null +++ b/spec/fixtures/api/schemas/public_api/v4/project/identity.json @@ -0,0 +1,21 @@ +{ + "type": "object", + "required": [ + "id", + "description", + "name", + "name_with_namespace", + "path", + "path_with_namespace", + "created_at" + ], + "properties": { + "id": { "type": "integer" }, + "description": { "type": ["string", "null"] }, + "name": { "type": "string" }, + "name_with_namespace": { "type": "string" }, + "path": { "type": "string" }, + "path_with_namespace": { "type": "string" }, + "created_at": { "type": "date" } + } +} diff --git a/spec/helpers/boards_helper_spec.rb b/spec/helpers/boards_helper_spec.rb index a3c5ab99c87..b22947911b9 100644 --- a/spec/helpers/boards_helper_spec.rb +++ b/spec/helpers/boards_helper_spec.rb @@ -1,6 +1,34 @@ require 'spec_helper' describe BoardsHelper do + describe '#build_issue_link_base' do + context 'project board' do + it 'returns correct path for project board' do + @project = create(:project) + @board = create(:board, project: @project) + + expect(build_issue_link_base).to eq("/#{@project.namespace.path}/#{@project.path}/issues") + end + end + + context 'group board' do + let(:base_group) { create(:group, path: 'base') } + + it 'returns correct path for base group' do + @board = create(:board, group: base_group) + + expect(build_issue_link_base).to eq('/base/:project_path/issues') + end + + it 'returns correct path for subgroup' do + subgroup = create(:group, parent: base_group, path: 'sub') + @board = create(:board, group: subgroup) + + expect(build_issue_link_base).to eq('/base/sub/:project_path/issues') + end + end + end + describe '#board_data' do let(:user) { create(:user) } let(:project) { create(:project) } diff --git a/spec/helpers/members_helper_spec.rb b/spec/helpers/members_helper_spec.rb index 45ffbeb27a4..4590904c93d 100644 --- a/spec/helpers/members_helper_spec.rb +++ b/spec/helpers/members_helper_spec.rb @@ -12,10 +12,10 @@ describe MembersHelper do let(:group_member_invite) { build(:group_member, group: group).tap { |m| m.generate_invite_token! } } let(:group_member_request) { group.request_access(requester) } - it { expect(remove_member_message(project_member)).to eq "Are you sure you want to remove #{project_member.user.name} from the #{project.name_with_namespace} project?" } - it { expect(remove_member_message(project_member_invite)).to eq "Are you sure you want to revoke the invitation for #{project_member_invite.invite_email} to join the #{project.name_with_namespace} project?" } - it { expect(remove_member_message(project_member_request)).to eq "Are you sure you want to deny #{requester.name}'s request to join the #{project.name_with_namespace} project?" } - it { expect(remove_member_message(project_member_request, user: requester)).to eq "Are you sure you want to withdraw your access request for the #{project.name_with_namespace} project?" } + it { expect(remove_member_message(project_member)).to eq "Are you sure you want to remove #{project_member.user.name} from the #{project.full_name} project?" } + it { expect(remove_member_message(project_member_invite)).to eq "Are you sure you want to revoke the invitation for #{project_member_invite.invite_email} to join the #{project.full_name} project?" } + it { expect(remove_member_message(project_member_request)).to eq "Are you sure you want to deny #{requester.name}'s request to join the #{project.full_name} project?" } + it { expect(remove_member_message(project_member_request, user: requester)).to eq "Are you sure you want to withdraw your access request for the #{project.full_name} project?" } it { expect(remove_member_message(group_member)).to eq "Are you sure you want to remove #{group_member.user.name} from the #{group.name} group?" } it { expect(remove_member_message(group_member_invite)).to eq "Are you sure you want to revoke the invitation for #{group_member_invite.invite_email} to join the #{group.name} group?" } it { expect(remove_member_message(group_member_request)).to eq "Are you sure you want to deny #{requester.name}'s request to join the #{group.name} group?" } @@ -42,7 +42,7 @@ describe MembersHelper do let(:group) { build_stubbed(:group) } let(:user) { build_stubbed(:user) } - it { expect(leave_confirmation_message(project)).to eq "Are you sure you want to leave the \"#{project.name_with_namespace}\" project?" } + it { expect(leave_confirmation_message(project)).to eq "Are you sure you want to leave the \"#{project.full_name}\" project?" } it { expect(leave_confirmation_message(group)).to eq "Are you sure you want to leave the \"#{group.name}\" group?" } end end diff --git a/spec/helpers/todos_helper_spec.rb b/spec/helpers/todos_helper_spec.rb index f55163c26e9..63806ef91f3 100644 --- a/spec/helpers/todos_helper_spec.rb +++ b/spec/helpers/todos_helper_spec.rb @@ -26,8 +26,8 @@ describe TodosHelper do expected_results = [ { 'id' => '', 'text' => 'Any Project' }, - { 'id' => projects.second.id, 'text' => projects.second.name_with_namespace }, - { 'id' => projects.first.id, 'text' => projects.first.name_with_namespace } + { 'id' => projects.second.id, 'text' => projects.second.full_name }, + { 'id' => projects.first.id, 'text' => projects.first.full_name } ] expect(JSON.parse(helper.todo_projects_options)).to match_array(expected_results) diff --git a/spec/javascripts/api_spec.js b/spec/javascripts/api_spec.js index cf3a76d0d2e..5477581c1b9 100644 --- a/spec/javascripts/api_spec.js +++ b/spec/javascripts/api_spec.js @@ -137,6 +137,27 @@ describe('Api', () => { done(); }); }); + + it('creates a group label', (done) => { + const namespace = 'group/subgroup'; + const labelData = { some: 'data' }; + const expectedUrl = `${dummyUrlRoot}/groups/${namespace}/-/labels`; + const expectedData = { + label: labelData, + }; + mock.onPost(expectedUrl).reply((config) => { + expect(config.data).toBe(JSON.stringify(expectedData)); + + return [200, { + name: 'test', + }]; + }); + + Api.newLabel(namespace, undefined, labelData, (response) => { + expect(response.name).toBe('test'); + done(); + }); + }); }); describe('groupProjects', () => { diff --git a/spec/javascripts/environments/environments_app_spec.js b/spec/javascripts/environments/environments_app_spec.js index 5bb37304372..e4c3bf2bef1 100644 --- a/spec/javascripts/environments/environments_app_spec.js +++ b/spec/javascripts/environments/environments_app_spec.js @@ -61,6 +61,7 @@ describe('Environment', () => { }); describe('with paginated environments', () => { + let backupInterceptors; const environmentsResponseInterceptor = (request, next) => { next((response) => { response.headers.set('X-nExt-pAge', '2'); @@ -84,16 +85,16 @@ describe('Environment', () => { }; beforeEach(() => { - Vue.http.interceptors.push(environmentsResponseInterceptor); - Vue.http.interceptors.push(headersInterceptor); + backupInterceptors = Vue.http.interceptors; + Vue.http.interceptors = [ + environmentsResponseInterceptor, + headersInterceptor, + ]; component = mountComponent(EnvironmentsComponent, mockData); }); afterEach(() => { - Vue.http.interceptors = _.without( - Vue.http.interceptors, environmentsResponseInterceptor, - ); - Vue.http.interceptors = _.without(Vue.http.interceptors, headersInterceptor); + Vue.http.interceptors = backupInterceptors; }); it('should render a table with environments', (done) => { diff --git a/spec/javascripts/fixtures/environments.rb b/spec/javascripts/fixtures/environments.rb deleted file mode 100644 index d2457d75419..00000000000 --- a/spec/javascripts/fixtures/environments.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'spec_helper' - -describe Projects::EnvironmentsController, '(JavaScript fixtures)', type: :controller do - include JavaScriptFixturesHelpers - - let(:admin) { create(:admin) } - let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} - let(:project) { create(:project_empty_repo, namespace: namespace, path: 'environments-project') } - let(:environment) { create(:environment, name: 'production', project: project) } - - render_views - - before(:all) do - clean_frontend_fixtures('environments/metrics') - end - - before do - sign_in(admin) - end - - it 'environments/metrics/metrics.html.raw' do |example| - get :metrics, - namespace_id: project.namespace, - project_id: project, - id: environment.id - - expect(response).to be_success - store_frontend_fixture(response, example.description) - end -end diff --git a/spec/javascripts/groups/components/app_spec.js b/spec/javascripts/groups/components/app_spec.js index 3adc29262f3..46c7b9f54f2 100644 --- a/spec/javascripts/groups/components/app_spec.js +++ b/spec/javascripts/groups/components/app_spec.js @@ -129,7 +129,7 @@ describe('AppComponent', () => { vm.fetchGroups({}); setTimeout(() => { - expect(vm.isLoading).toBeFalsy(); + expect(vm.isLoading).toBe(false); expect($.scrollTo).toHaveBeenCalledWith(0); expect(window.Flash).toHaveBeenCalledWith('An error occurred. Please try again.'); done(); @@ -144,10 +144,10 @@ describe('AppComponent', () => { spyOn(vm, 'updateGroups').and.callThrough(); vm.fetchAllGroups(); - expect(vm.isLoading).toBeTruthy(); + expect(vm.isLoading).toBe(true); expect(vm.fetchGroups).toHaveBeenCalled(); setTimeout(() => { - expect(vm.isLoading).toBeFalsy(); + expect(vm.isLoading).toBe(false); expect(vm.updateGroups).toHaveBeenCalled(); done(); }, 0); @@ -181,7 +181,7 @@ describe('AppComponent', () => { spyOn($, 'scrollTo'); vm.fetchPage(2, null, null, true); - expect(vm.isLoading).toBeTruthy(); + expect(vm.isLoading).toBe(true); expect(vm.fetchGroups).toHaveBeenCalledWith({ page: 2, filterGroupsBy: null, @@ -190,7 +190,7 @@ describe('AppComponent', () => { archived: true, }); setTimeout(() => { - expect(vm.isLoading).toBeFalsy(); + expect(vm.isLoading).toBe(false); expect($.scrollTo).toHaveBeenCalledWith(0); expect(utils.mergeUrlParams).toHaveBeenCalledWith({ page: 2 }, jasmine.any(String)); expect(window.history.replaceState).toHaveBeenCalledWith({ @@ -216,7 +216,7 @@ describe('AppComponent', () => { spyOn(vm.store, 'setGroupChildren'); vm.toggleChildren(groupItem); - expect(groupItem.isChildrenLoading).toBeTruthy(); + expect(groupItem.isChildrenLoading).toBe(true); expect(vm.fetchGroups).toHaveBeenCalledWith({ parentId: groupItem.id, }); @@ -232,7 +232,7 @@ describe('AppComponent', () => { vm.toggleChildren(groupItem); expect(vm.fetchGroups).not.toHaveBeenCalled(); - expect(groupItem.isOpen).toBeTruthy(); + expect(groupItem.isOpen).toBe(true); }); it('should collapse group if it is already expanded', () => { @@ -241,16 +241,16 @@ describe('AppComponent', () => { vm.toggleChildren(groupItem); expect(vm.fetchGroups).not.toHaveBeenCalled(); - expect(groupItem.isOpen).toBeFalsy(); + expect(groupItem.isOpen).toBe(false); }); it('should set `isChildrenLoading` back to `false` if load request fails', (done) => { spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise({}, true)); vm.toggleChildren(groupItem); - expect(groupItem.isChildrenLoading).toBeTruthy(); + expect(groupItem.isChildrenLoading).toBe(true); setTimeout(() => { - expect(groupItem.isChildrenLoading).toBeFalsy(); + expect(groupItem.isChildrenLoading).toBe(false); done(); }, 0); }); @@ -268,10 +268,10 @@ describe('AppComponent', () => { it('updates props which show modal confirmation dialog', () => { const group = Object.assign({}, mockParentGroupItem); - expect(vm.updateModal).toBeFalsy(); + expect(vm.showModal).toBe(false); expect(vm.groupLeaveConfirmationMessage).toBe(''); vm.showLeaveGroupModal(group, mockParentGroupItem); - expect(vm.updateModal).toBeTruthy(); + expect(vm.showModal).toBe(true); expect(vm.groupLeaveConfirmationMessage).toBe(`Are you sure you want to leave the "${group.fullName}" group?`); }); }); @@ -280,9 +280,9 @@ describe('AppComponent', () => { it('hides modal confirmation which is shown before leaving the group', () => { const group = Object.assign({}, mockParentGroupItem); vm.showLeaveGroupModal(group, mockParentGroupItem); - expect(vm.updateModal).toBeTruthy(); + expect(vm.showModal).toBe(true); vm.hideLeaveGroupModal(); - expect(vm.updateModal).toBeFalsy(); + expect(vm.showModal).toBe(false); }); }); @@ -307,8 +307,8 @@ describe('AppComponent', () => { spyOn($, 'scrollTo'); vm.leaveGroup(); - expect(vm.updateModal).toBeFalsy(); - expect(vm.targetGroup.isBeingRemoved).toBeTruthy(); + expect(vm.showModal).toBe(false); + expect(vm.targetGroup.isBeingRemoved).toBe(true); expect(vm.service.leaveGroup).toHaveBeenCalledWith(vm.targetGroup.leavePath); setTimeout(() => { expect($.scrollTo).toHaveBeenCalledWith(0); @@ -325,12 +325,12 @@ describe('AppComponent', () => { spyOn(window, 'Flash'); vm.leaveGroup(); - expect(vm.targetGroup.isBeingRemoved).toBeTruthy(); + expect(vm.targetGroup.isBeingRemoved).toBe(true); expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath); setTimeout(() => { expect(vm.store.removeGroup).not.toHaveBeenCalled(); expect(window.Flash).toHaveBeenCalledWith(message); - expect(vm.targetGroup.isBeingRemoved).toBeFalsy(); + expect(vm.targetGroup.isBeingRemoved).toBe(false); done(); }, 0); }); @@ -342,12 +342,12 @@ describe('AppComponent', () => { spyOn(window, 'Flash'); vm.leaveGroup(childGroupItem, groupItem); - expect(vm.targetGroup.isBeingRemoved).toBeTruthy(); + expect(vm.targetGroup.isBeingRemoved).toBe(true); expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath); setTimeout(() => { expect(vm.store.removeGroup).not.toHaveBeenCalled(); expect(window.Flash).toHaveBeenCalledWith(message); - expect(vm.targetGroup.isBeingRemoved).toBeFalsy(); + expect(vm.targetGroup.isBeingRemoved).toBe(false); done(); }, 0); }); @@ -379,10 +379,10 @@ describe('AppComponent', () => { it('should set `isSearchEmpty` prop based on groups count', () => { vm.updateGroups(mockGroups); - expect(vm.isSearchEmpty).toBeFalsy(); + expect(vm.isSearchEmpty).toBe(false); vm.updateGroups([]); - expect(vm.isSearchEmpty).toBeTruthy(); + expect(vm.isSearchEmpty).toBe(true); }); }); }); @@ -473,13 +473,16 @@ describe('AppComponent', () => { }); }); - it('renders modal confirmation dialog', () => { + it('renders modal confirmation dialog', (done) => { vm.groupLeaveConfirmationMessage = 'Are you sure you want to leave the "foo" group?'; - vm.updateModal = true; - const modalDialogEl = vm.$el.querySelector('.modal'); - expect(modalDialogEl).not.toBe(null); - expect(modalDialogEl.querySelector('.modal-title').innerText.trim()).toBe('Are you sure?'); - expect(modalDialogEl.querySelector('.btn.btn-warning').innerText.trim()).toBe('Leave'); + vm.showModal = true; + Vue.nextTick(() => { + const modalDialogEl = vm.$el.querySelector('.modal'); + expect(modalDialogEl).not.toBe(null); + expect(modalDialogEl.querySelector('.modal-title').innerText.trim()).toBe('Are you sure?'); + expect(modalDialogEl.querySelector('.btn.btn-warning').innerText.trim()).toBe('Leave'); + done(); + }); }); }); }); diff --git a/spec/javascripts/monitoring/dashboard_spec.js b/spec/javascripts/monitoring/dashboard_spec.js index eb8f6bbe50d..29b355307ef 100644 --- a/spec/javascripts/monitoring/dashboard_spec.js +++ b/spec/javascripts/monitoring/dashboard_spec.js @@ -5,24 +5,35 @@ import axios from '~/lib/utils/axios_utils'; import { metricsGroupsAPIResponse, mockApiEndpoint } from './mock_data'; describe('Dashboard', () => { - const fixtureName = 'environments/metrics/metrics.html.raw'; let DashboardComponent; - let component; - preloadFixtures(fixtureName); + + const propsData = { + hasMetrics: false, + documentationPath: '/path/to/docs', + settingsPath: '/path/to/settings', + clustersPath: '/path/to/clusters', + tagsPath: '/path/to/tags', + projectPath: '/path/to/project', + metricsEndpoint: mockApiEndpoint, + deploymentEndpoint: null, + emptyGettingStartedSvgPath: '/path/to/getting-started.svg', + emptyLoadingSvgPath: '/path/to/loading.svg', + emptyUnableToConnectSvgPath: '/path/to/unable-to-connect.svg', + }; beforeEach(() => { - loadFixtures(fixtureName); + setFixtures('<div class="prometheus-graphs"></div>'); DashboardComponent = Vue.extend(Dashboard); }); describe('no metrics are available yet', () => { it('shows a getting started empty state when no metrics are present', () => { - component = new DashboardComponent({ - el: document.querySelector('#prometheus-graphs'), + const component = new DashboardComponent({ + el: document.querySelector('.prometheus-graphs'), + propsData, }); - component.$mount(); - expect(component.$el.querySelector('#prometheus-graphs')).toBe(null); + expect(component.$el.querySelector('.prometheus-graphs')).toBe(null); expect(component.state).toEqual('gettingStarted'); }); }); @@ -30,11 +41,8 @@ describe('Dashboard', () => { describe('requests information to the server', () => { let mock; beforeEach(() => { - document.querySelector('#prometheus-graphs').setAttribute('data-has-metrics', 'true'); mock = new MockAdapter(axios); - mock.onGet(mockApiEndpoint).reply(200, { - metricsGroupsAPIResponse, - }); + mock.onGet(mockApiEndpoint).reply(200, metricsGroupsAPIResponse); }); afterEach(() => { @@ -42,14 +50,43 @@ describe('Dashboard', () => { }); it('shows up a loading state', (done) => { - component = new DashboardComponent({ - el: document.querySelector('#prometheus-graphs'), + const component = new DashboardComponent({ + el: document.querySelector('.prometheus-graphs'), + propsData: { ...propsData, hasMetrics: true }, }); - component.$mount(); + Vue.nextTick(() => { expect(component.state).toEqual('loading'); done(); }); }); + + it('hides the legend when showLegend is false', (done) => { + const component = new DashboardComponent({ + el: document.querySelector('.prometheus-graphs'), + propsData: { ...propsData, hasMetrics: true, showLegend: false }, + }); + + setTimeout(() => { + expect(component.showEmptyState).toEqual(false); + expect(component.$el.querySelector('.legend-group')).toEqual(null); + expect(component.$el.querySelector('.prometheus-graph-group')).toBeTruthy(); + done(); + }); + }); + + it('hides the group panels when showPanels is false', (done) => { + const component = new DashboardComponent({ + el: document.querySelector('.prometheus-graphs'), + propsData: { ...propsData, hasMetrics: true, showPanels: false }, + }); + + setTimeout(() => { + expect(component.showEmptyState).toEqual(false); + expect(component.$el.querySelector('.prometheus-panel')).toEqual(null); + expect(component.$el.querySelector('.prometheus-graph-group')).toBeTruthy(); + done(); + }); + }); }); }); diff --git a/spec/javascripts/pipelines/blank_state_spec.js b/spec/javascripts/pipelines/blank_state_spec.js new file mode 100644 index 00000000000..b7a9b60d85c --- /dev/null +++ b/spec/javascripts/pipelines/blank_state_spec.js @@ -0,0 +1,29 @@ +import Vue from 'vue'; +import component from '~/pipelines/components/blank_state.vue'; +import mountComponent from '../helpers/vue_mount_component_helper'; + +describe('Pipelines Blank State', () => { + let vm; + let Component; + + beforeEach(() => { + Component = Vue.extend(component); + + vm = mountComponent(Component, + { + svgPath: 'foo', + message: 'Blank State', + }, + ); + }); + + it('should render svg', () => { + expect(vm.$el.querySelector('.svg-content img').getAttribute('src')).toEqual('foo'); + }); + + it('should render message', () => { + expect( + vm.$el.querySelector('h4').textContent.trim(), + ).toEqual('Blank State'); + }); +}); diff --git a/spec/javascripts/pipelines/empty_state_spec.js b/spec/javascripts/pipelines/empty_state_spec.js index 97f04844b3a..71f77e5f42e 100644 --- a/spec/javascripts/pipelines/empty_state_spec.js +++ b/spec/javascripts/pipelines/empty_state_spec.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import emptyStateComp from '~/pipelines/components/empty_state.vue'; +import mountComponent from '../helpers/vue_mount_component_helper'; describe('Pipelines Empty State', () => { let component; @@ -8,12 +9,15 @@ describe('Pipelines Empty State', () => { beforeEach(() => { EmptyStateComponent = Vue.extend(emptyStateComp); - component = new EmptyStateComponent({ - propsData: { - helpPagePath: 'foo', - emptyStateSvgPath: 'foo', - }, - }).$mount(); + component = mountComponent(EmptyStateComponent, { + helpPagePath: 'foo', + emptyStateSvgPath: 'foo', + canSetCi: true, + }); + }); + + afterEach(() => { + component.$destroy(); }); it('should render empty state SVG', () => { @@ -24,16 +28,16 @@ describe('Pipelines Empty State', () => { expect(component.$el.querySelector('h4').textContent).toContain('Build with confidence'); expect( - component.$el.querySelector('p').textContent.trim().replace(/[\r\n]+/g, ' '), - ).toContain('Continous Integration can help catch bugs by running your tests automatically'); + component.$el.querySelector('p').innerHTML.trim().replace(/\n+\s+/m, ' ').replace(/\s\s+/g, ' '), + ).toContain('Continous Integration can help catch bugs by running your tests automatically,'); expect( - component.$el.querySelector('p').textContent.trim().replace(/[\r\n]+/g, ' '), - ).toContain('Continuous Deployment can help you deliver code to your product environment'); + component.$el.querySelector('p').innerHTML.trim().replace(/\n+\s+/m, ' ').replace(/\s\s+/g, ' '), + ).toContain('while Continuous Deployment can help you deliver code to your product environment'); }); it('should render a link with provided help path', () => { - expect(component.$el.querySelector('.btn-info').getAttribute('href')).toEqual('foo'); - expect(component.$el.querySelector('.btn-info').textContent).toContain('Get started with Pipelines'); + expect(component.$el.querySelector('.js-get-started-pipelines').getAttribute('href')).toEqual('foo'); + expect(component.$el.querySelector('.js-get-started-pipelines').textContent).toContain('Get started with Pipelines'); }); }); diff --git a/spec/javascripts/pipelines/error_state_spec.js b/spec/javascripts/pipelines/error_state_spec.js deleted file mode 100644 index a402857a4d1..00000000000 --- a/spec/javascripts/pipelines/error_state_spec.js +++ /dev/null @@ -1,27 +0,0 @@ -import Vue from 'vue'; -import errorStateComp from '~/pipelines/components/error_state.vue'; - -describe('Pipelines Error State', () => { - let component; - let ErrorStateComponent; - - beforeEach(() => { - ErrorStateComponent = Vue.extend(errorStateComp); - - component = new ErrorStateComponent({ - propsData: { - errorStateSvgPath: 'foo', - }, - }).$mount(); - }); - - it('should render error state SVG', () => { - expect(component.$el.querySelector('.svg-content svg')).toBeDefined(); - }); - - it('should render emtpy state information', () => { - expect( - component.$el.querySelector('h4').textContent, - ).toContain('The API failed to fetch the pipelines'); - }); -}); diff --git a/spec/javascripts/pipelines/nav_controls_spec.js b/spec/javascripts/pipelines/nav_controls_spec.js index 09a0c14d96c..77c5258f74c 100644 --- a/spec/javascripts/pipelines/nav_controls_spec.js +++ b/spec/javascripts/pipelines/nav_controls_spec.js @@ -1,116 +1,68 @@ import Vue from 'vue'; import navControlsComp from '~/pipelines/components/nav_controls.vue'; +import mountComponent from '../helpers/vue_mount_component_helper'; describe('Pipelines Nav Controls', () => { let NavControlsComponent; + let component; beforeEach(() => { NavControlsComponent = Vue.extend(navControlsComp); }); + afterEach(() => { + component.$destroy(); + }); + it('should render link to create a new pipeline', () => { const mockData = { newPipelinePath: 'foo', - hasCiEnabled: true, - helpPagePath: 'foo', ciLintPath: 'foo', resetCachePath: 'foo', - canCreatePipeline: true, }; - const component = new NavControlsComponent({ - propsData: mockData, - }).$mount(); + component = mountComponent(NavControlsComponent, mockData); - expect(component.$el.querySelector('.btn-create').textContent).toContain('Run Pipeline'); - expect(component.$el.querySelector('.btn-create').getAttribute('href')).toEqual(mockData.newPipelinePath); + expect(component.$el.querySelector('.js-run-pipeline').textContent).toContain('Run Pipeline'); + expect(component.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(mockData.newPipelinePath); }); - it('should not render link to create pipeline if no permission is provided', () => { + it('should not render link to create pipeline if no path is provided', () => { const mockData = { - newPipelinePath: 'foo', - hasCiEnabled: true, helpPagePath: 'foo', ciLintPath: 'foo', resetCachePath: 'foo', - canCreatePipeline: false, }; - const component = new NavControlsComponent({ - propsData: mockData, - }).$mount(); + component = mountComponent(NavControlsComponent, mockData); - expect(component.$el.querySelector('.btn-create')).toEqual(null); + expect(component.$el.querySelector('.js-run-pipeline')).toEqual(null); }); it('should render link for resetting runner caches', () => { const mockData = { newPipelinePath: 'foo', - hasCiEnabled: true, - helpPagePath: 'foo', ciLintPath: 'foo', resetCachePath: 'foo', - canCreatePipeline: false, }; - const component = new NavControlsComponent({ - propsData: mockData, - }).$mount(); + component = mountComponent(NavControlsComponent, mockData); - expect(component.$el.querySelectorAll('.btn-default')[0].textContent).toContain('Clear runner caches'); - expect(component.$el.querySelectorAll('.btn-default')[0].getAttribute('href')).toEqual(mockData.resetCachePath); + expect(component.$el.querySelector('.js-clear-cache').textContent.trim()).toContain('Clear Runner Caches'); + expect(component.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(mockData.resetCachePath); }); it('should render link for CI lint', () => { const mockData = { newPipelinePath: 'foo', - hasCiEnabled: true, - helpPagePath: 'foo', - ciLintPath: 'foo', - resetCachePath: 'foo', - canCreatePipeline: true, - }; - - const component = new NavControlsComponent({ - propsData: mockData, - }).$mount(); - - expect(component.$el.querySelectorAll('.btn-default')[1].textContent).toContain('CI Lint'); - expect(component.$el.querySelectorAll('.btn-default')[1].getAttribute('href')).toEqual(mockData.ciLintPath); - }); - - it('should render link to help page when CI is not enabled', () => { - const mockData = { - newPipelinePath: 'foo', - hasCiEnabled: false, - helpPagePath: 'foo', - ciLintPath: 'foo', - resetCachePath: 'foo', - canCreatePipeline: true, - }; - - const component = new NavControlsComponent({ - propsData: mockData, - }).$mount(); - - expect(component.$el.querySelector('.btn-info').textContent).toContain('Get started with Pipelines'); - expect(component.$el.querySelector('.btn-info').getAttribute('href')).toEqual(mockData.helpPagePath); - }); - - it('should not render link to help page when CI is enabled', () => { - const mockData = { - newPipelinePath: 'foo', - hasCiEnabled: true, helpPagePath: 'foo', ciLintPath: 'foo', resetCachePath: 'foo', - canCreatePipeline: true, }; - const component = new NavControlsComponent({ - propsData: mockData, - }).$mount(); + component = mountComponent(NavControlsComponent, mockData); - expect(component.$el.querySelector('.btn-info')).toEqual(null); + expect(component.$el.querySelector('.js-ci-lint').textContent.trim()).toContain('CI Lint'); + expect(component.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(mockData.ciLintPath); }); }); diff --git a/spec/javascripts/pipelines/pipelines_spec.js b/spec/javascripts/pipelines/pipelines_spec.js index 54d5bfd51e6..84fd0329f08 100644 --- a/spec/javascripts/pipelines/pipelines_spec.js +++ b/spec/javascripts/pipelines/pipelines_spec.js @@ -7,36 +7,380 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper'; describe('Pipelines', () => { const jsonFixtureName = 'pipelines/pipelines.json'; - preloadFixtures('static/pipelines.html.raw'); preloadFixtures(jsonFixtureName); let PipelinesComponent; let pipelines; - let component; + let vm; + const paths = { + endpoint: 'twitter/flight/pipelines.json', + autoDevopsPath: '/help/topics/autodevops/index.md', + helpPagePath: '/help/ci/quick_start/README', + emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg', + errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg', + noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg', + ciLintPath: '/ci/lint', + resetCachePath: '/twitter/flight/settings/ci_cd/reset_cache', + newPipelinePath: '/twitter/flight/pipelines/new', + }; + + const noPermissions = { + endpoint: 'twitter/flight/pipelines.json', + autoDevopsPath: '/help/topics/autodevops/index.md', + helpPagePath: '/help/ci/quick_start/README', + emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg', + errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg', + noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg', + }; beforeEach(() => { - loadFixtures('static/pipelines.html.raw'); pipelines = getJSONFixture(jsonFixtureName); PipelinesComponent = Vue.extend(pipelinesComp); }); afterEach(() => { - component.$destroy(); + vm.$destroy(); + }); + + const pipelinesInterceptor = (request, next) => { + next(request.respondWith(JSON.stringify(pipelines), { + status: 200, + })); + }; + + const emptyStateInterceptor = (request, next) => { + next(request.respondWith(JSON.stringify({ + pipelines: [], + count: { + all: 0, + pending: 0, + running: 0, + finished: 0, + }, + }), { + status: 200, + })); + }; + + const errorInterceptor = (request, next) => { + next(request.respondWith(JSON.stringify({}), { + status: 500, + })); + }; + + describe('With permission', () => { + describe('With pipelines in main tab', () => { + beforeEach((done) => { + Vue.http.interceptors.push(pipelinesInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, pipelinesInterceptor, + ); + }); + + it('renders tabs', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); + }); + + it('renders Run Pipeline button', () => { + expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath); + }); + + it('renders CI Lint button', () => { + expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath); + }); + + it('renders Clear Runner Cache button', () => { + expect(vm.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(paths.resetCachePath); + }); + + it('renders pipelines table', () => { + expect( + vm.$el.querySelectorAll('.gl-responsive-table-row').length, + ).toEqual(pipelines.pipelines.length + 1); + }); + }); + + describe('Without pipelines on main tab with CI', () => { + beforeEach((done) => { + Vue.http.interceptors.push(emptyStateInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, emptyStateInterceptor, + ); + }); + + it('renders tabs', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); + }); + + it('renders Run Pipeline button', () => { + expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath); + }); + + it('renders CI Lint button', () => { + expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath); + }); + + it('renders Clear Runner Cache button', () => { + expect(vm.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(paths.resetCachePath); + }); + + it('renders tab empty state', () => { + expect(vm.$el.querySelector('.empty-state h4').textContent.trim()).toEqual('There are currently no pipelines.'); + }); + }); + + describe('Without pipelines nor CI', () => { + beforeEach((done) => { + Vue.http.interceptors.push(emptyStateInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: false, + canCreatePipeline: true, + ...paths, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, emptyStateInterceptor, + ); + }); + + it('renders empty state', () => { + expect(vm.$el.querySelector('.js-empty-state h4').textContent.trim()).toEqual('Build with confidence'); + expect(vm.$el.querySelector('.js-get-started-pipelines').getAttribute('href')).toEqual(paths.helpPagePath); + }); + + it('does not render tabs nor buttons', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all')).toBeNull(); + expect(vm.$el.querySelector('.js-run-pipeline')).toBeNull(); + expect(vm.$el.querySelector('.js-ci-lint')).toBeNull(); + expect(vm.$el.querySelector('.js-clear-cache')).toBeNull(); + }); + }); + + describe('When API returns error', () => { + beforeEach((done) => { + Vue.http.interceptors.push(errorInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: false, + canCreatePipeline: true, + ...paths, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, errorInterceptor, + ); + }); + + it('renders tabs', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); + }); + + it('renders buttons', () => { + expect(vm.$el.querySelector('.js-run-pipeline').getAttribute('href')).toEqual(paths.newPipelinePath); + expect(vm.$el.querySelector('.js-ci-lint').getAttribute('href')).toEqual(paths.ciLintPath); + expect(vm.$el.querySelector('.js-clear-cache').getAttribute('href')).toEqual(paths.resetCachePath); + }); + + it('renders error state', () => { + expect(vm.$el.querySelector('.empty-state').textContent.trim()).toContain('There was an error fetching the pipelines.'); + }); + }); + }); + + describe('Without permission', () => { + describe('With pipelines in main tab', () => { + beforeEach((done) => { + Vue.http.interceptors.push(pipelinesInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: false, + canCreatePipeline: false, + ...noPermissions, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, pipelinesInterceptor, + ); + }); + + it('renders tabs', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); + }); + + it('does not render buttons', () => { + expect(vm.$el.querySelector('.js-run-pipeline')).toBeNull(); + expect(vm.$el.querySelector('.js-ci-lint')).toBeNull(); + expect(vm.$el.querySelector('.js-clear-cache')).toBeNull(); + }); + + it('renders pipelines table', () => { + expect( + vm.$el.querySelectorAll('.gl-responsive-table-row').length, + ).toEqual(pipelines.pipelines.length + 1); + }); + }); + + describe('Without pipelines on main tab with CI', () => { + beforeEach((done) => { + Vue.http.interceptors.push(emptyStateInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: false, + ...noPermissions, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, emptyStateInterceptor, + ); + }); + it('renders tabs', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); + }); + + it('does not render buttons', () => { + expect(vm.$el.querySelector('.js-run-pipeline')).toBeNull(); + expect(vm.$el.querySelector('.js-ci-lint')).toBeNull(); + expect(vm.$el.querySelector('.js-clear-cache')).toBeNull(); + }); + + it('renders tab empty state', () => { + expect(vm.$el.querySelector('.empty-state h4').textContent.trim()).toEqual('There are currently no pipelines.'); + }); + }); + + describe('Without pipelines nor CI', () => { + beforeEach((done) => { + Vue.http.interceptors.push(emptyStateInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: false, + canCreatePipeline: false, + ...noPermissions, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, emptyStateInterceptor, + ); + }); + + it('renders empty state without button to set CI', () => { + expect(vm.$el.querySelector('.js-empty-state').textContent.trim()).toEqual('This project is not currently set up to run pipelines.'); + expect(vm.$el.querySelector('.js-get-started-pipelines')).toBeNull(); + }); + + it('does not render tabs or buttons', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all')).toBeNull(); + expect(vm.$el.querySelector('.js-run-pipeline')).toBeNull(); + expect(vm.$el.querySelector('.js-ci-lint')).toBeNull(); + expect(vm.$el.querySelector('.js-clear-cache')).toBeNull(); + }); + }); + + describe('When API returns error', () => { + beforeEach((done) => { + Vue.http.interceptors.push(errorInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: false, + canCreatePipeline: true, + ...noPermissions, + }); + + setTimeout(() => { + done(); + }); + }); + + afterEach(() => { + Vue.http.interceptors = _.without( + Vue.http.interceptors, errorInterceptor, + ); + }); + + it('renders tabs', () => { + expect(vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim()).toContain('All'); + }); + + it('does not renders buttons', () => { + expect(vm.$el.querySelector('.js-run-pipeline')).toBeNull(); + expect(vm.$el.querySelector('.js-ci-lint')).toBeNull(); + expect(vm.$el.querySelector('.js-clear-cache')).toBeNull(); + }); + + it('renders error state', () => { + expect(vm.$el.querySelector('.empty-state').textContent.trim()).toContain('There was an error fetching the pipelines.'); + }); + }); }); describe('successfull request', () => { describe('with pipelines', () => { - const pipelinesInterceptor = (request, next) => { - next(request.respondWith(JSON.stringify(pipelines), { - status: 200, - })); - }; - beforeEach(() => { Vue.http.interceptors.push(pipelinesInterceptor); - component = mountComponent(PipelinesComponent, { + vm = mountComponent(PipelinesComponent, { store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, }); }); @@ -48,9 +392,9 @@ describe('Pipelines', () => { it('should render table', (done) => { setTimeout(() => { - expect(component.$el.querySelector('.table-holder')).toBeDefined(); + expect(vm.$el.querySelector('.table-holder')).toBeDefined(); expect( - component.$el.querySelectorAll('.gl-responsive-table-row').length, + vm.$el.querySelectorAll('.gl-responsive-table-row').length, ).toEqual(pipelines.pipelines.length + 1); done(); }); @@ -59,22 +403,22 @@ describe('Pipelines', () => { it('should render navigation tabs', (done) => { setTimeout(() => { expect( - component.$el.querySelector('.js-pipelines-tab-pending').textContent.trim(), + vm.$el.querySelector('.js-pipelines-tab-pending').textContent.trim(), ).toContain('Pending'); expect( - component.$el.querySelector('.js-pipelines-tab-all').textContent.trim(), + vm.$el.querySelector('.js-pipelines-tab-all').textContent.trim(), ).toContain('All'); expect( - component.$el.querySelector('.js-pipelines-tab-running').textContent.trim(), + vm.$el.querySelector('.js-pipelines-tab-running').textContent.trim(), ).toContain('Running'); expect( - component.$el.querySelector('.js-pipelines-tab-finished').textContent.trim(), + vm.$el.querySelector('.js-pipelines-tab-finished').textContent.trim(), ).toContain('Finished'); expect( - component.$el.querySelector('.js-pipelines-tab-branches').textContent.trim(), + vm.$el.querySelector('.js-pipelines-tab-branches').textContent.trim(), ).toContain('Branches'); expect( - component.$el.querySelector('.js-pipelines-tab-tags').textContent.trim(), + vm.$el.querySelector('.js-pipelines-tab-tags').textContent.trim(), ).toContain('Tags'); done(); }); @@ -82,10 +426,10 @@ describe('Pipelines', () => { it('should make an API request when using tabs', (done) => { setTimeout(() => { - spyOn(component, 'updateContent'); - component.$el.querySelector('.js-pipelines-tab-finished').click(); + spyOn(vm, 'updateContent'); + vm.$el.querySelector('.js-pipelines-tab-finished').click(); - expect(component.updateContent).toHaveBeenCalledWith({ scope: 'finished', page: '1' }); + expect(vm.updateContent).toHaveBeenCalledWith({ scope: 'finished', page: '1' }); done(); }); }); @@ -93,9 +437,9 @@ describe('Pipelines', () => { describe('with pagination', () => { it('should make an API request when using pagination', (done) => { setTimeout(() => { - spyOn(component, 'updateContent'); + spyOn(vm, 'updateContent'); // Mock pagination - component.store.state.pageInfo = { + vm.store.state.pageInfo = { page: 1, total: 10, perPage: 2, @@ -103,9 +447,9 @@ describe('Pipelines', () => { totalPages: 5, }; - Vue.nextTick(() => { - component.$el.querySelector('.js-next-button a').click(); - expect(component.updateContent).toHaveBeenCalledWith({ scope: 'all', page: '2' }); + vm.$nextTick(() => { + vm.$el.querySelector('.js-next-button a').click(); + expect(vm.updateContent).toHaveBeenCalledWith({ scope: 'all', page: '2' }); done(); }); @@ -113,112 +457,249 @@ describe('Pipelines', () => { }); }); }); + }); - describe('without pipelines', () => { - const emptyInterceptor = (request, next) => { - next(request.respondWith(JSON.stringify([]), { - status: 200, - })); - }; + describe('methods', () => { + beforeEach(() => { + spyOn(history, 'pushState').and.stub(); + }); - beforeEach(() => { - Vue.http.interceptors.push(emptyInterceptor); - }); + describe('updateContent', () => { + it('should set given parameters', () => { + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, + }); + vm.updateContent({ scope: 'finished', page: '4' }); - afterEach(() => { - Vue.http.interceptors = _.without( - Vue.http.interceptors, emptyInterceptor, - ); + expect(vm.page).toEqual('4'); + expect(vm.scope).toEqual('finished'); + expect(vm.requestData.scope).toEqual('finished'); + expect(vm.requestData.page).toEqual('4'); }); + }); + + describe('onChangeTab', () => { + it('should set page to 1', () => { + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, + }); + spyOn(vm, 'updateContent'); - it('should render empty state', (done) => { - component = new PipelinesComponent({ - propsData: { - store: new Store(), - }, - }).$mount(); + vm.onChangeTab('running'); - setTimeout(() => { - expect(component.$el.querySelector('.empty-state')).not.toBe(null); - done(); + expect(vm.updateContent).toHaveBeenCalledWith({ scope: 'running', page: '1' }); + }); + }); + + describe('onChangePage', () => { + it('should update page and keep scope', () => { + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, }); + spyOn(vm, 'updateContent'); + + vm.onChangePage(4); + + expect(vm.updateContent).toHaveBeenCalledWith({ scope: vm.scope, page: '4' }); }); }); }); - describe('unsuccessfull request', () => { - const errorInterceptor = (request, next) => { - next(request.respondWith(JSON.stringify([]), { - status: 500, - })); - }; - + describe('computed properties', () => { beforeEach(() => { - Vue.http.interceptors.push(errorInterceptor); + vm = mountComponent(PipelinesComponent, { + store: new Store(), + hasGitlabCi: true, + canCreatePipeline: true, + ...paths, + }); }); - afterEach(() => { - Vue.http.interceptors = _.without( - Vue.http.interceptors, errorInterceptor, - ); + describe('tabs', () => { + it('returns default tabs', () => { + expect(vm.tabs).toEqual([ + { name: 'All', scope: 'all', count: undefined, isActive: true }, + { name: 'Pending', scope: 'pending', count: undefined, isActive: false }, + { name: 'Running', scope: 'running', count: undefined, isActive: false }, + { name: 'Finished', scope: 'finished', count: undefined, isActive: false }, + { name: 'Branches', scope: 'branches', isActive: false }, + { name: 'Tags', scope: 'tags', isActive: false }, + ]); + }); }); - it('should render error state', (done) => { - component = new PipelinesComponent({ - propsData: { - store: new Store(), - }, - }).$mount(); + describe('emptyTabMessage', () => { + it('returns message with scope', (done) => { + vm.scope = 'pending'; - setTimeout(() => { - expect(component.$el.querySelector('.js-pipelines-error-state')).toBeDefined(); - done(); + vm.$nextTick(() => { + expect(vm.emptyTabMessage).toEqual('There are currently no pending pipelines.'); + done(); + }); }); - }); - }); - describe('methods', () => { - beforeEach(() => { - spyOn(history, 'pushState').and.stub(); + it('returns message without scope when scope is `all`', () => { + expect(vm.emptyTabMessage).toEqual('There are currently no pipelines.'); + }); }); - describe('updateContent', () => { - it('should set given parameters', () => { - component = mountComponent(PipelinesComponent, { - store: new Store(), + describe('stateToRender', () => { + it('returns loading state when the app is loading', () => { + expect(vm.stateToRender).toEqual('loading'); + }); + + it('returns error state when app has error', (done) => { + vm.hasError = true; + vm.isLoading = false; + + vm.$nextTick(() => { + expect(vm.stateToRender).toEqual('error'); + done(); + }); + }); + + it('returns table list when app has pipelines', (done) => { + vm.isLoading = false; + vm.hasError = false; + vm.state.pipelines = pipelines.pipelines; + + vm.$nextTick(() => { + expect(vm.stateToRender).toEqual('tableList'); + + done(); + }); + }); + + it('returns empty tab when app does not have pipelines but project has pipelines', (done) => { + vm.state.count.all = 10; + vm.isLoading = false; + + vm.$nextTick(() => { + expect(vm.stateToRender).toEqual('emptyTab'); + + done(); }); - component.updateContent({ scope: 'finished', page: '4' }); + }); + + it('returns empty tab when project has CI', (done) => { + vm.isLoading = false; + vm.$nextTick(() => { + expect(vm.stateToRender).toEqual('emptyTab'); - expect(component.page).toEqual('4'); - expect(component.scope).toEqual('finished'); - expect(component.requestData.scope).toEqual('finished'); - expect(component.requestData.page).toEqual('4'); + done(); + }); + }); + + it('returns empty state when project does not have pipelines nor CI', (done) => { + vm.isLoading = false; + vm.hasGitlabCi = false; + vm.$nextTick(() => { + expect(vm.stateToRender).toEqual('emptyState'); + + done(); + }); }); }); - describe('onChangeTab', () => { - it('should set page to 1', () => { - component = mountComponent(PipelinesComponent, { - store: new Store(), + describe('shouldRenderTabs', () => { + it('returns true when state is loading & has already made the first request', (done) => { + vm.isLoading = true; + vm.hasMadeRequest = true; + + vm.$nextTick(() => { + expect(vm.shouldRenderTabs).toEqual(true); + + done(); }); - spyOn(component, 'updateContent'); + }); - component.onChangeTab('running'); + it('returns true when state is tableList & has already made the first request', (done) => { + vm.isLoading = false; + vm.state.pipelines = pipelines.pipelines; + vm.hasMadeRequest = true; - expect(component.updateContent).toHaveBeenCalledWith({ scope: 'running', page: '1' }); + vm.$nextTick(() => { + expect(vm.shouldRenderTabs).toEqual(true); + + done(); + }); + }); + + it('returns true when state is error & has already made the first request', (done) => { + vm.isLoading = false; + vm.hasError = true; + vm.hasMadeRequest = true; + + vm.$nextTick(() => { + expect(vm.shouldRenderTabs).toEqual(true); + + done(); + }); + }); + + it('returns true when state is empty tab & has already made the first request', (done) => { + vm.isLoading = false; + vm.state.count.all = 10; + vm.hasMadeRequest = true; + + vm.$nextTick(() => { + expect(vm.shouldRenderTabs).toEqual(true); + + done(); + }); + }); + + it('returns false when has not made first request', (done) => { + vm.hasMadeRequest = false; + + vm.$nextTick(() => { + expect(vm.shouldRenderTabs).toEqual(false); + + done(); + }); + }); + + it('returns false when state is emtpy state', (done) => { + vm.isLoading = false; + vm.hasMadeRequest = true; + vm.hasGitlabCi = false; + + vm.$nextTick(() => { + expect(vm.shouldRenderTabs).toEqual(false); + + done(); + }); }); }); - describe('onChangePage', () => { - it('should update page and keep scope', () => { - component = mountComponent(PipelinesComponent, { - store: new Store(), + describe('shouldRenderButtons', () => { + it('returns true when it has paths & has made the first request', (done) => { + vm.hasMadeRequest = true; + + vm.$nextTick(() => { + expect(vm.shouldRenderButtons).toEqual(true); + + done(); }); - spyOn(component, 'updateContent'); + }); + + it('returns false when it has not made the first request', (done) => { + vm.hasMadeRequest = false; - component.onChangePage(4); + vm.$nextTick(() => { + expect(vm.shouldRenderButtons).toEqual(false); - expect(component.updateContent).toHaveBeenCalledWith({ scope: component.scope, page: '4' }); + done(); + }); }); }); }); diff --git a/spec/javascripts/vue_shared/components/clipboard_button_spec.js b/spec/javascripts/vue_shared/components/clipboard_button_spec.js index d0fc10d69ea..f598b1afa74 100644 --- a/spec/javascripts/vue_shared/components/clipboard_button_spec.js +++ b/spec/javascripts/vue_shared/components/clipboard_button_spec.js @@ -10,6 +10,7 @@ describe('clipboard button', () => { vm = mountComponent(Component, { text: 'copy me', title: 'Copy this value into Clipboard!', + cssClass: 'btn-danger', }); }); @@ -28,4 +29,8 @@ describe('clipboard button', () => { expect(vm.$el.getAttribute('data-placement')).toEqual('top'); expect(vm.$el.getAttribute('data-container')).toEqual(null); }); + + it('should render provided classname', () => { + expect(vm.$el.classList).toContain('btn-danger'); + }); }); diff --git a/spec/lib/banzai/filter/label_reference_filter_spec.rb b/spec/lib/banzai/filter/label_reference_filter_spec.rb index 862b1fe3fd3..0c524a1551f 100644 --- a/spec/lib/banzai/filter/label_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/label_reference_filter_spec.rb @@ -381,11 +381,11 @@ describe Banzai::Filter::LabelReferenceFilter do end it 'has valid link text' do - expect(result.css('a').first.text).to eq "#{label.name} in #{project2.name_with_namespace}" + expect(result.css('a').first.text).to eq "#{label.name} in #{project2.full_name}" end it 'has valid text' do - expect(result.text).to eq "See #{label.name} in #{project2.name_with_namespace}" + expect(result.text).to eq "See #{label.name} in #{project2.full_name}" end it 'ignores invalid IDs on the referenced label' do @@ -481,12 +481,12 @@ describe Banzai::Filter::LabelReferenceFilter do it 'has valid link text' do expect(result.css('a').first.text) - .to eq "#{group_label.name} in #{another_project.name_with_namespace}" + .to eq "#{group_label.name} in #{another_project.full_name}" end it 'has valid text' do expect(result.text) - .to eq "See #{group_label.name} in #{another_project.name_with_namespace}" + .to eq "See #{group_label.name} in #{another_project.full_name}" end it 'ignores invalid IDs on the referenced label' do diff --git a/spec/lib/gitlab/ci/charts_spec.rb b/spec/lib/gitlab/ci/charts_spec.rb index f8188675013..1668d3bbaac 100644 --- a/spec/lib/gitlab/ci/charts_spec.rb +++ b/spec/lib/gitlab/ci/charts_spec.rb @@ -1,6 +1,51 @@ require 'spec_helper' describe Gitlab::Ci::Charts do + context "yearchart" do + let(:project) { create(:project) } + let(:chart) { Gitlab::Ci::Charts::YearChart.new(project) } + + subject { chart.to } + + it 'goes until the end of the current month (including the whole last day of the month)' do + is_expected.to eq(Date.today.end_of_month.end_of_day) + end + + it 'starts at the beginning of the current year' do + expect(chart.from).to eq(chart.to.years_ago(1).beginning_of_month.beginning_of_day) + end + end + + context "monthchart" do + let(:project) { create(:project) } + let(:chart) { Gitlab::Ci::Charts::MonthChart.new(project) } + + subject { chart.to } + + it 'includes the whole current day' do + is_expected.to eq(Date.today.end_of_day) + end + + it 'starts one month ago' do + expect(chart.from).to eq(1.month.ago.beginning_of_day) + end + end + + context "weekchart" do + let(:project) { create(:project) } + let(:chart) { Gitlab::Ci::Charts::WeekChart.new(project) } + + subject { chart.to } + + it 'includes the whole current day' do + is_expected.to eq(Date.today.end_of_day) + end + + it 'starts one week ago' do + expect(chart.from).to eq(1.week.ago.beginning_of_day) + end + end + context "pipeline_times" do let(:project) { create(:project) } let(:chart) { Gitlab::Ci::Charts::PipelineTime.new(project) } diff --git a/spec/lib/gitlab/ci/trace_spec.rb b/spec/lib/gitlab/ci/trace_spec.rb index 91c9625ba06..448c6fb57dd 100644 --- a/spec/lib/gitlab/ci/trace_spec.rb +++ b/spec/lib/gitlab/ci/trace_spec.rb @@ -399,4 +399,140 @@ describe Gitlab::Ci::Trace do end end end + + describe '#archive!' do + subject { trace.archive! } + + shared_examples 'archive trace file' do + it do + expect { subject }.to change { Ci::JobArtifact.count }.by(1) + + build.reload + expect(build.trace.exist?).to be_truthy + expect(build.job_artifacts_trace.file.exists?).to be_truthy + expect(build.job_artifacts_trace.file.filename).to eq('job.log') + expect(File.exist?(src_path)).to be_falsy + expect(src_checksum) + .to eq(Digest::SHA256.file(build.job_artifacts_trace.file.path).hexdigest) + expect(build.job_artifacts_trace.file_sha256).to eq(src_checksum) + end + end + + shared_examples 'source trace file stays intact' do |error:| + it do + expect { subject }.to raise_error(error) + + build.reload + expect(build.trace.exist?).to be_truthy + expect(build.job_artifacts_trace).to be_nil + expect(File.exist?(src_path)).to be_truthy + end + end + + shared_examples 'archive trace in database' do + it do + expect { subject }.to change { Ci::JobArtifact.count }.by(1) + + build.reload + expect(build.trace.exist?).to be_truthy + expect(build.job_artifacts_trace.file.exists?).to be_truthy + expect(build.job_artifacts_trace.file.filename).to eq('job.log') + expect(build.old_trace).to be_nil + expect(src_checksum) + .to eq(Digest::SHA256.file(build.job_artifacts_trace.file.path).hexdigest) + expect(build.job_artifacts_trace.file_sha256).to eq(src_checksum) + end + end + + shared_examples 'source trace in database stays intact' do |error:| + it do + expect { subject }.to raise_error(error) + + build.reload + expect(build.trace.exist?).to be_truthy + expect(build.job_artifacts_trace).to be_nil + expect(build.old_trace).to eq(trace_content) + end + end + + context 'when job does not have trace artifact' do + context 'when trace file stored in default path' do + let!(:build) { create(:ci_build, :success, :trace_live) } + let!(:src_path) { trace.read { |s| return s.path } } + let!(:src_checksum) { Digest::SHA256.file(src_path).hexdigest } + + it_behaves_like 'archive trace file' + + context 'when failed to create clone file' do + before do + allow(IO).to receive(:copy_stream).and_return(0) + end + + it_behaves_like 'source trace file stays intact', error: Gitlab::Ci::Trace::ArchiveError + end + + context 'when failed to create job artifact record' do + before do + allow_any_instance_of(Ci::JobArtifact).to receive(:save).and_return(false) + allow_any_instance_of(Ci::JobArtifact).to receive_message_chain(:errors, :full_messages) + .and_return(%w[Error Error]) + end + + it_behaves_like 'source trace file stays intact', error: ActiveRecord::RecordInvalid + end + end + + context 'when trace is stored in database' do + let(:build) { create(:ci_build, :success) } + let(:trace_content) { 'Sample trace' } + let!(:src_checksum) { Digest::SHA256.hexdigest(trace_content) } + + before do + build.update_column(:trace, trace_content) + end + + it_behaves_like 'archive trace in database' + + context 'when failed to create clone file' do + before do + allow(IO).to receive(:copy_stream).and_return(0) + end + + it_behaves_like 'source trace in database stays intact', error: Gitlab::Ci::Trace::ArchiveError + end + + context 'when failed to create job artifact record' do + before do + allow_any_instance_of(Ci::JobArtifact).to receive(:save).and_return(false) + allow_any_instance_of(Ci::JobArtifact).to receive_message_chain(:errors, :full_messages) + .and_return(%w[Error Error]) + end + + it_behaves_like 'source trace in database stays intact', error: ActiveRecord::RecordInvalid + end + end + end + + context 'when job has trace artifact' do + before do + create(:ci_job_artifact, :trace, job: build) + end + + it 'does not archive' do + expect_any_instance_of(described_class).not_to receive(:archive_stream!) + expect { subject }.to raise_error('Already archived') + expect(build.job_artifacts_trace.file.exists?).to be_truthy + end + end + + context 'when job is not finished yet' do + let!(:build) { create(:ci_build, :running, :trace_live) } + + it 'does not archive' do + expect_any_instance_of(described_class).not_to receive(:archive_stream!) + expect { subject }.to raise_error('Job is not finished yet') + expect(build.trace.exist?).to be_truthy + end + end + end end diff --git a/spec/lib/gitlab/contributions_calendar_spec.rb b/spec/lib/gitlab/contributions_calendar_spec.rb index 167876ca158..2c63f3b0455 100644 --- a/spec/lib/gitlab/contributions_calendar_spec.rb +++ b/spec/lib/gitlab/contributions_calendar_spec.rb @@ -77,6 +77,13 @@ describe Gitlab::ContributionsCalendar do expect(calendar(contributor).activity_dates[today]).to eq(1) end + it "counts the discussions on merge requests and issues" do + create_event(public_project, today, 0, Event::COMMENTED, :discussion_note_on_merge_request) + create_event(public_project, today, 2, Event::COMMENTED, :discussion_note_on_issue) + + expect(calendar(contributor).activity_dates[today]).to eq(2) + end + context "when events fall under different dates depending on the time zone" do before do create_event(public_project, today, 1) diff --git a/spec/lib/gitlab/data_builder/build_spec.rb b/spec/lib/gitlab/data_builder/build_spec.rb index 91c43f2bdc0..ee91decafad 100644 --- a/spec/lib/gitlab/data_builder/build_spec.rb +++ b/spec/lib/gitlab/data_builder/build_spec.rb @@ -16,7 +16,7 @@ describe Gitlab::DataBuilder::Build do it { expect(data[:build_status]).to eq(build.status) } it { expect(data[:build_allow_failure]).to eq(false) } it { expect(data[:project_id]).to eq(build.project.id) } - it { expect(data[:project_name]).to eq(build.project.name_with_namespace) } + it { expect(data[:project_name]).to eq(build.project.full_name) } context 'commit author_url' do context 'when no commit present' do diff --git a/spec/lib/gitlab/git/branch_spec.rb b/spec/lib/gitlab/git/branch_spec.rb index 708870060e7..a19155ed5b0 100644 --- a/spec/lib/gitlab/git/branch_spec.rb +++ b/spec/lib/gitlab/git/branch_spec.rb @@ -59,5 +59,69 @@ describe Gitlab::Git::Branch, seed_helper: true do it { expect(branch.dereferenced_target.sha).to eq(SeedRepo::LastCommit::ID) } end + context 'with active, stale and future branches' do + let(:repository) do + Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') + end + + let(:user) { create(:user) } + let(:committer) do + Gitlab::Git.committer_hash(email: user.email, name: user.name) + end + let(:params) do + parents = [repository.rugged.head.target] + tree = parents.first.tree + + { + message: 'commit message', + author: committer, + committer: committer, + tree: tree, + parents: parents + } + end + let(:stale_sha) { Timecop.freeze(Gitlab::Git::Branch::STALE_BRANCH_THRESHOLD.ago - 5.days) { create_commit } } + let(:active_sha) { Timecop.freeze(Gitlab::Git::Branch::STALE_BRANCH_THRESHOLD.ago + 5.days) { create_commit } } + let(:future_sha) { Timecop.freeze(100.days.since) { create_commit } } + + before do + repository.create_branch('stale-1', stale_sha) + repository.create_branch('active-1', active_sha) + repository.create_branch('future-1', future_sha) + end + + after do + ensure_seeds + end + + describe 'examine if the branch is active or stale' do + let(:stale_branch) { repository.find_branch('stale-1') } + let(:active_branch) { repository.find_branch('active-1') } + let(:future_branch) { repository.find_branch('future-1') } + + describe '#active?' do + it { expect(stale_branch.active?).to be_falsey } + it { expect(active_branch.active?).to be_truthy } + it { expect(future_branch.active?).to be_truthy } + end + + describe '#stale?' do + it { expect(stale_branch.stale?).to be_truthy } + it { expect(active_branch.stale?).to be_falsey } + it { expect(future_branch.stale?).to be_falsey } + end + + describe '#state' do + it { expect(stale_branch.state).to eq(:stale) } + it { expect(active_branch.state).to eq(:active) } + it { expect(future_branch.state).to eq(:active) } + end + end + end + it { expect(repository.branches.size).to eq(SeedRepo::Repo::BRANCHES.size) } + + def create_commit + repository.create_commit(params.merge(committer: committer.merge(time: Time.now))) + end end diff --git a/spec/lib/gitlab/git/gitlab_projects_spec.rb b/spec/lib/gitlab/git/gitlab_projects_spec.rb index f4b964e1ee9..45bcd730332 100644 --- a/spec/lib/gitlab/git/gitlab_projects_spec.rb +++ b/spec/lib/gitlab/git/gitlab_projects_spec.rb @@ -61,10 +61,11 @@ describe Gitlab::Git::GitlabProjects do let(:remote_name) { 'remote-name' } let(:branch_name) { 'master' } let(:force) { false } + let(:prune) { true } let(:tags) { true } - let(:args) { { force: force, tags: tags }.merge(extra_args) } + let(:args) { { force: force, tags: tags, prune: prune }.merge(extra_args) } let(:extra_args) { {} } - let(:cmd) { %W(git fetch #{remote_name} --prune --quiet --tags) } + let(:cmd) { %W(git fetch #{remote_name} --quiet --prune --tags) } subject { gl_projects.fetch_remote(remote_name, 600, args) } @@ -97,7 +98,7 @@ describe Gitlab::Git::GitlabProjects do context 'with --force' do let(:force) { true } - let(:cmd) { %W(git fetch #{remote_name} --prune --quiet --force --tags) } + let(:cmd) { %W(git fetch #{remote_name} --quiet --prune --force --tags) } it 'executes the command with forced option' do stub_spawn(cmd, 600, tmp_repo_path, {}, success: true) @@ -108,7 +109,18 @@ describe Gitlab::Git::GitlabProjects do context 'with --no-tags' do let(:tags) { false } - let(:cmd) { %W(git fetch #{remote_name} --prune --quiet --no-tags) } + let(:cmd) { %W(git fetch #{remote_name} --quiet --prune --no-tags) } + + it 'executes the command' do + stub_spawn(cmd, 600, tmp_repo_path, {}, success: true) + + is_expected.to be_truthy + end + end + + context 'with no prune' do + let(:prune) { false } + let(:cmd) { %W(git fetch #{remote_name} --quiet --tags) } it 'executes the command' do stub_spawn(cmd, 600, tmp_repo_path, {}, success: true) diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb index c50e73cecfc..1c41dbcb9ef 100644 --- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb @@ -85,6 +85,20 @@ describe Gitlab::GitalyClient::RepositoryService do end end + describe '#fetch_remote' do + let(:ssh_auth) { double(:ssh_auth, ssh_import?: true, ssh_key_auth?: false, ssh_known_hosts: nil) } + let(:import_url) { 'ssh://example.com' } + + it 'sends a fetch_remote_request message' do + expect_any_instance_of(Gitaly::RepositoryService::Stub) + .to receive(:fetch_remote) + .with(gitaly_request_with_params(no_prune: false), kind_of(Hash)) + .and_return(double(value: true)) + + client.fetch_remote(import_url, ssh_auth: ssh_auth, forced: false, no_tags: false, timeout: 60) + end + end + describe '#rebase_in_progress?' do let(:rebase_id) { 1 } diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index 41a55027f4d..b20cc34dd5c 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -277,6 +277,7 @@ project: - fork_network - custom_attributes - lfs_file_locks +- project_badges award_emoji: - awardable - user @@ -293,3 +294,5 @@ issue_assignees: - assignee lfs_file_locks: - user +project_badges: +- project diff --git a/spec/lib/gitlab/import_export/avatar_restorer_spec.rb b/spec/lib/gitlab/import_export/avatar_restorer_spec.rb index a93a921e459..4897d604bc1 100644 --- a/spec/lib/gitlab/import_export/avatar_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/avatar_restorer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Gitlab::ImportExport::AvatarRestorer do include UploadHelpers - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: 'test') } + let(:shared) { project.import_export_shared } let(:project) { create(:project) } before do diff --git a/spec/lib/gitlab/import_export/avatar_saver_spec.rb b/spec/lib/gitlab/import_export/avatar_saver_spec.rb index 3fb5ddde8b5..f40d4bc2d08 100644 --- a/spec/lib/gitlab/import_export/avatar_saver_spec.rb +++ b/spec/lib/gitlab/import_export/avatar_saver_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Gitlab::ImportExport::AvatarSaver do - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: 'test') } + let(:shared) { project.import_export_shared } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } let(:project_with_avatar) { create(:project, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } let(:project) { create(:project) } diff --git a/spec/lib/gitlab/import_export/file_importer_spec.rb b/spec/lib/gitlab/import_export/file_importer_spec.rb index 5cdc5138fda..58b9fb06cc5 100644 --- a/spec/lib/gitlab/import_export/file_importer_spec.rb +++ b/spec/lib/gitlab/import_export/file_importer_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Gitlab::ImportExport::FileImporter do - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: 'test') } + let(:shared) { Gitlab::ImportExport::Shared.new(nil) } let(:export_path) { "#{Dir.tmpdir}/file_importer_spec" } let(:valid_file) { "#{shared.export_path}/valid.json" } let(:symlink_file) { "#{shared.export_path}/invalid.json" } @@ -12,6 +12,7 @@ describe Gitlab::ImportExport::FileImporter do stub_const('Gitlab::ImportExport::FileImporter::MAX_RETRIES', 0) allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) allow_any_instance_of(Gitlab::ImportExport::CommandLineUtil).to receive(:untar_zxf).and_return(true) + allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:relative_archive_path).and_return('test') allow(SecureRandom).to receive(:hex).and_return('abcd') setup_files end diff --git a/spec/lib/gitlab/import_export/fork_spec.rb b/spec/lib/gitlab/import_export/fork_spec.rb index cfb15ee7e8b..17e06a6a83f 100644 --- a/spec/lib/gitlab/import_export/fork_spec.rb +++ b/spec/lib/gitlab/import_export/fork_spec.rb @@ -7,7 +7,7 @@ describe 'forked project import' do let!(:project_with_repo) { create(:project, :repository, name: 'test-repo-restorer', path: 'test-repo-restorer') } let!(:project) { create(:project, name: 'test-repo-restorer-no-repo', path: 'test-repo-restorer-no-repo') } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } let(:forked_from_project) { create(:project, :repository) } let(:forked_project) { fork_project(project_with_repo, nil, repository: true) } let(:repo_saver) { Gitlab::ImportExport::RepoSaver.new(project: project_with_repo, shared: shared) } diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json index b6c1f0c81cb..62ef93f847a 100644 --- a/spec/lib/gitlab/import_export/project.json +++ b/spec/lib/gitlab/import_export/project.json @@ -14,8 +14,7 @@ "template": false, "description": "", "type": "ProjectLabel", - "priorities": [ - ] + "priorities": [] }, { "id": 3, @@ -160,9 +159,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 352, @@ -184,9 +181,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 353, @@ -208,9 +203,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 354, @@ -232,9 +225,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 355, @@ -256,9 +247,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 356, @@ -280,9 +269,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 357, @@ -304,9 +291,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 358, @@ -328,9 +313,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -395,9 +378,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 360, @@ -419,9 +400,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 361, @@ -443,9 +422,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 362, @@ -467,9 +444,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 363, @@ -491,9 +466,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 364, @@ -515,9 +488,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 365, @@ -539,9 +510,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 366, @@ -563,9 +532,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -628,9 +595,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 368, @@ -652,9 +617,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 369, @@ -676,9 +639,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 370, @@ -700,9 +661,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 371, @@ -724,9 +683,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 372, @@ -748,9 +705,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 373, @@ -772,9 +727,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 374, @@ -796,9 +749,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -840,9 +791,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 376, @@ -864,9 +813,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 377, @@ -888,9 +835,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 378, @@ -912,9 +857,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 379, @@ -936,9 +879,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 380, @@ -960,9 +901,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 381, @@ -984,9 +923,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 382, @@ -1008,9 +945,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -1052,9 +987,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 384, @@ -1076,9 +1009,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 385, @@ -1100,9 +1031,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 386, @@ -1124,9 +1053,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 387, @@ -1148,9 +1075,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 388, @@ -1172,9 +1097,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 389, @@ -1196,9 +1119,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 390, @@ -1220,9 +1141,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -1264,9 +1183,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 392, @@ -1288,9 +1205,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 393, @@ -1312,9 +1227,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 394, @@ -1336,9 +1249,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 395, @@ -1360,9 +1271,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 396, @@ -1384,9 +1293,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 397, @@ -1408,9 +1315,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 398, @@ -1432,9 +1337,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -1476,9 +1379,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 400, @@ -1500,9 +1401,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 401, @@ -1524,9 +1423,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 402, @@ -1548,9 +1445,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 403, @@ -1572,9 +1467,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 404, @@ -1596,9 +1489,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 405, @@ -1620,9 +1511,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 406, @@ -1644,9 +1533,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -1688,9 +1575,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 408, @@ -1712,9 +1597,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 409, @@ -1736,9 +1619,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 410, @@ -1760,9 +1641,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 411, @@ -1784,9 +1663,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 412, @@ -1808,9 +1685,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 413, @@ -1832,9 +1707,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 414, @@ -1856,9 +1729,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -1900,9 +1771,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 416, @@ -1924,9 +1793,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 417, @@ -1948,9 +1815,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 418, @@ -1972,9 +1837,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 419, @@ -1996,9 +1859,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 420, @@ -2020,9 +1881,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 421, @@ -2044,9 +1903,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 422, @@ -2068,9 +1925,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] }, @@ -2112,9 +1967,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 424, @@ -2136,9 +1989,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 425, @@ -2160,9 +2011,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 426, @@ -2184,9 +2033,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 427, @@ -2208,9 +2055,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 428, @@ -2232,9 +2077,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 429, @@ -2256,9 +2099,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 430, @@ -2280,9 +2121,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ] } @@ -2378,12 +2217,8 @@ ] } ], - "snippets": [ - - ], - "releases": [ - - ], + "snippets": [], + "releases": [], "project_members": [ { "id": 36, @@ -2515,9 +2350,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 672, @@ -2539,9 +2372,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 673, @@ -2563,9 +2394,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 674, @@ -2587,9 +2416,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 675, @@ -2611,9 +2438,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 676, @@ -2635,9 +2460,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 677, @@ -2659,9 +2482,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 678, @@ -2683,9 +2504,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -2696,7 +2515,7 @@ "merge_request_diff_id": 27, "relative_order": 0, "sha": "bb5206fee213d983da88c47f9cf4cc6caf9c66dc", - "message": "Feature conflcit added\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Feature conflcit added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-08-06T08:35:52.000+02:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -2708,7 +2527,7 @@ "merge_request_diff_id": 27, "relative_order": 1, "sha": "5937ac0a7beb003549fc5fd26fc247adbce4a52e", - "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T10:01:38.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -2720,7 +2539,7 @@ "merge_request_diff_id": 27, "relative_order": 2, "sha": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:57:31.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -2732,7 +2551,7 @@ "merge_request_diff_id": 27, "relative_order": 3, "sha": "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9", - "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:54:21.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -2744,7 +2563,7 @@ "merge_request_diff_id": 27, "relative_order": 4, "sha": "d14d6c0abdd253381df51a723d58691b2ee1ab08", - "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:49:50.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -2756,7 +2575,7 @@ "merge_request_diff_id": 27, "relative_order": 5, "sha": "c1acaa58bbcbc3eafe538cb8274ba387047b69f8", - "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:48:32.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -2834,7 +2653,7 @@ { "merge_request_diff_id": 27, "relative_order": 5, - "utf8_diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" =\u003e path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" =\u003e path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output \u003c\u003c stdout.read\n @cmd_output \u003c\u003c stderr.read\n", + "utf8_diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n", "new_path": "files/ruby/popen.rb", "old_path": "files/ruby/popen.rb", "a_mode": "100644", @@ -2958,9 +2777,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 680, @@ -2982,9 +2799,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 681, @@ -3006,9 +2821,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 682, @@ -3030,9 +2843,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 683, @@ -3054,9 +2865,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 684, @@ -3078,9 +2887,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 685, @@ -3102,9 +2909,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 686, @@ -3126,9 +2931,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -3139,7 +2942,7 @@ "merge_request_diff_id": 26, "sha": "0b4bc9a49b562e85de7cc9e834518ea6828729b9", "relative_order": 0, - "message": "Feature added\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Feature added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:26:01.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -3237,9 +3040,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 778, @@ -3261,9 +3062,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 779, @@ -3285,9 +3084,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 780, @@ -3309,9 +3106,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 781, @@ -3333,9 +3128,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 782, @@ -3357,9 +3150,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 783, @@ -3381,9 +3172,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 784, @@ -3405,9 +3194,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -3516,9 +3303,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 786, @@ -3540,9 +3325,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 787, @@ -3564,9 +3347,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 788, @@ -3588,9 +3369,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 789, @@ -3612,9 +3391,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 790, @@ -3636,9 +3413,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 791, @@ -3660,9 +3435,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 792, @@ -3684,9 +3457,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -3877,7 +3648,7 @@ "merge_request_diff_id": 14, "relative_order": 15, "sha": "5937ac0a7beb003549fc5fd26fc247adbce4a52e", - "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T10:01:38.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -3889,7 +3660,7 @@ "merge_request_diff_id": 14, "relative_order": 16, "sha": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:57:31.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -3901,7 +3672,7 @@ "merge_request_diff_id": 14, "relative_order": 17, "sha": "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9", - "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:54:21.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -3913,7 +3684,7 @@ "merge_request_diff_id": 14, "relative_order": 18, "sha": "d14d6c0abdd253381df51a723d58691b2ee1ab08", - "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:49:50.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -3925,7 +3696,7 @@ "merge_request_diff_id": 14, "relative_order": 19, "sha": "c1acaa58bbcbc3eafe538cb8274ba387047b69f8", - "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:48:32.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -4016,7 +3787,7 @@ { "merge_request_diff_id": 14, "relative_order": 6, - "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n+\u003csvg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\u003e\n+ \u003c!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch --\u003e\n+ \u003ctitle\u003ewm\u003c/title\u003e\n+ \u003cdesc\u003eCreated with Sketch.\u003c/desc\u003e\n+ \u003cdefs\u003e\n+ \u003cpath id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"\u003e\u003c/path\u003e\n+ \u003c/defs\u003e\n+ \u003cg id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\"\u003e\n+ \u003cpath d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\"\u003e\n+ \u003cg id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\"\u003e\n+ \u003cg id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\n+ \u003cpath d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g16\"\u003e\n+ \u003cg id=\"g18-Clipped\"\u003e\n+ \u003cmask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\"\u003e\n+ \u003cuse xlink:href=\"#path-1\"\u003e\u003c/use\u003e\n+ \u003c/mask\u003e\n+ \u003cg id=\"path22\"\u003e\u003c/g\u003e\n+ \u003cg id=\"g18\" mask=\"url(#mask-2)\"\u003e\n+ \u003cg transform=\"translate(382.736659, 312.879425)\"\u003e\n+ \u003cg id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\"\u003e\n+ \u003cpath d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\"\u003e\n+ \u003cpath d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\"\u003e\n+ \u003cpath d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\"\u003e\n+ \u003cpath d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cpath d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cpath d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\"\u003e\n+ \u003cpath d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\"\u003e\n+ \u003cpath d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path54\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\"\u003e\n+ \u003cpath d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cg id=\"path62\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\"\u003e\n+ \u003cpath d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path70\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\"\u003e\n+ \u003cpath d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cpath d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\"\u003e\n+ \u003cpath d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\"\u003e\n+ \u003cpath d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\n\\ No newline at end of file\n", + "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n", "new_path": "files/images/wm.svg", "old_path": "files/images/wm.svg", "a_mode": "0", @@ -4042,7 +3813,7 @@ { "merge_request_diff_id": 14, "relative_order": 8, - "utf8_diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" =\u003e path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" =\u003e path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output \u003c\u003c stdout.read\n @cmd_output \u003c\u003c stderr.read\n", + "utf8_diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n", "new_path": "files/ruby/popen.rb", "old_path": "files/ruby/popen.rb", "a_mode": "100644", @@ -4207,7 +3978,7 @@ }, "events": [ { - "merge_request_diff_id": 14, + "merge_request_diff_id": 14, "id": 529, "target_type": "Note", "target_id": 793, @@ -4239,9 +4010,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 795, @@ -4263,9 +4032,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 796, @@ -4287,9 +4054,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 797, @@ -4311,9 +4076,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 798, @@ -4335,9 +4098,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 799, @@ -4359,9 +4120,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 800, @@ -4383,9 +4142,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -4603,7 +4360,7 @@ { "merge_request_diff_id": 13, "relative_order": 2, - "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n+\u003csvg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\u003e\n+ \u003c!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch --\u003e\n+ \u003ctitle\u003ewm\u003c/title\u003e\n+ \u003cdesc\u003eCreated with Sketch.\u003c/desc\u003e\n+ \u003cdefs\u003e\n+ \u003cpath id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"\u003e\u003c/path\u003e\n+ \u003c/defs\u003e\n+ \u003cg id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\"\u003e\n+ \u003cpath d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\"\u003e\n+ \u003cg id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\"\u003e\n+ \u003cg id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\n+ \u003cpath d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g16\"\u003e\n+ \u003cg id=\"g18-Clipped\"\u003e\n+ \u003cmask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\"\u003e\n+ \u003cuse xlink:href=\"#path-1\"\u003e\u003c/use\u003e\n+ \u003c/mask\u003e\n+ \u003cg id=\"path22\"\u003e\u003c/g\u003e\n+ \u003cg id=\"g18\" mask=\"url(#mask-2)\"\u003e\n+ \u003cg transform=\"translate(382.736659, 312.879425)\"\u003e\n+ \u003cg id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\"\u003e\n+ \u003cpath d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\"\u003e\n+ \u003cpath d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\"\u003e\n+ \u003cpath d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\"\u003e\n+ \u003cpath d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cpath d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cpath d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\"\u003e\n+ \u003cpath d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\"\u003e\n+ \u003cpath d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path54\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\"\u003e\n+ \u003cpath d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cg id=\"path62\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\"\u003e\n+ \u003cpath d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path70\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\"\u003e\n+ \u003cpath d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cpath d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\"\u003e\n+ \u003cpath d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\"\u003e\n+ \u003cpath d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\n\\ No newline at end of file\n", + "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n", "new_path": "files/images/wm.svg", "old_path": "files/images/wm.svg", "a_mode": "0", @@ -4740,9 +4497,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 802, @@ -4764,9 +4519,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 803, @@ -4788,9 +4541,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 804, @@ -4812,9 +4563,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 805, @@ -4836,9 +4585,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 806, @@ -4860,9 +4607,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 807, @@ -4884,9 +4629,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 808, @@ -4908,9 +4651,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -5104,7 +4845,7 @@ { "merge_request_diff_id": 12, "relative_order": 2, - "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n+\u003csvg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\u003e\n+ \u003c!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch --\u003e\n+ \u003ctitle\u003ewm\u003c/title\u003e\n+ \u003cdesc\u003eCreated with Sketch.\u003c/desc\u003e\n+ \u003cdefs\u003e\n+ \u003cpath id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"\u003e\u003c/path\u003e\n+ \u003c/defs\u003e\n+ \u003cg id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\"\u003e\n+ \u003cpath d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\"\u003e\n+ \u003cg id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\"\u003e\n+ \u003cg id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\n+ \u003cpath d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g16\"\u003e\n+ \u003cg id=\"g18-Clipped\"\u003e\n+ \u003cmask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\"\u003e\n+ \u003cuse xlink:href=\"#path-1\"\u003e\u003c/use\u003e\n+ \u003c/mask\u003e\n+ \u003cg id=\"path22\"\u003e\u003c/g\u003e\n+ \u003cg id=\"g18\" mask=\"url(#mask-2)\"\u003e\n+ \u003cg transform=\"translate(382.736659, 312.879425)\"\u003e\n+ \u003cg id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\"\u003e\n+ \u003cpath d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\"\u003e\n+ \u003cpath d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\"\u003e\n+ \u003cpath d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\"\u003e\n+ \u003cpath d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cpath d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cpath d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\"\u003e\n+ \u003cpath d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\"\u003e\n+ \u003cpath d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path54\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\"\u003e\n+ \u003cpath d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cg id=\"path62\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\"\u003e\n+ \u003cpath d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path70\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\"\u003e\n+ \u003cpath d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cpath d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\"\u003e\n+ \u003cpath d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\"\u003e\n+ \u003cpath d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\n\\ No newline at end of file\n", + "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n", "new_path": "files/images/wm.svg", "old_path": "files/images/wm.svg", "a_mode": "0", @@ -5228,9 +4969,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 810, @@ -5252,9 +4991,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 811, @@ -5276,9 +5013,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 812, @@ -5300,9 +5035,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 813, @@ -5324,9 +5057,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 814, @@ -5348,9 +5079,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 815, @@ -5372,9 +5101,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 816, @@ -5396,18 +5123,14 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { "id": 11, "state": "empty", - "merge_request_diff_commits": [ - ], - "merge_request_diff_files": [ - ], + "merge_request_diff_commits": [], + "merge_request_diff_files": [], "merge_request_id": 11, "created_at": "2016-06-14T15:02:23.772Z", "updated_at": "2016-06-14T15:02:23.833Z", @@ -5482,9 +5205,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 818, @@ -5506,9 +5227,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 819, @@ -5530,9 +5249,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 820, @@ -5554,9 +5271,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 821, @@ -5578,9 +5293,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 822, @@ -5602,9 +5315,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 823, @@ -5626,9 +5337,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 824, @@ -5650,9 +5359,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -5843,7 +5550,7 @@ "merge_request_diff_id": 10, "relative_order": 16, "sha": "5937ac0a7beb003549fc5fd26fc247adbce4a52e", - "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T10:01:38.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -5855,7 +5562,7 @@ "merge_request_diff_id": 10, "relative_order": 17, "sha": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:57:31.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -5867,7 +5574,7 @@ "merge_request_diff_id": 10, "relative_order": 18, "sha": "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9", - "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:54:21.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -5879,7 +5586,7 @@ "merge_request_diff_id": 10, "relative_order": 19, "sha": "d14d6c0abdd253381df51a723d58691b2ee1ab08", - "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:49:50.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -5891,7 +5598,7 @@ "merge_request_diff_id": 10, "relative_order": 20, "sha": "c1acaa58bbcbc3eafe538cb8274ba387047b69f8", - "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n", "authored_date": "2014-02-27T09:48:32.000+01:00", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", @@ -5982,7 +5689,7 @@ { "merge_request_diff_id": 10, "relative_order": 6, - "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n+\u003csvg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\u003e\n+ \u003c!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch --\u003e\n+ \u003ctitle\u003ewm\u003c/title\u003e\n+ \u003cdesc\u003eCreated with Sketch.\u003c/desc\u003e\n+ \u003cdefs\u003e\n+ \u003cpath id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"\u003e\u003c/path\u003e\n+ \u003c/defs\u003e\n+ \u003cg id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\"\u003e\n+ \u003cpath d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\"\u003e\n+ \u003cg id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\"\u003e\n+ \u003cg id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\n+ \u003cpath d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g16\"\u003e\n+ \u003cg id=\"g18-Clipped\"\u003e\n+ \u003cmask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\"\u003e\n+ \u003cuse xlink:href=\"#path-1\"\u003e\u003c/use\u003e\n+ \u003c/mask\u003e\n+ \u003cg id=\"path22\"\u003e\u003c/g\u003e\n+ \u003cg id=\"g18\" mask=\"url(#mask-2)\"\u003e\n+ \u003cg transform=\"translate(382.736659, 312.879425)\"\u003e\n+ \u003cg id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\"\u003e\n+ \u003cpath d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\"\u003e\n+ \u003cpath d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\"\u003e\n+ \u003cpath d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\"\u003e\n+ \u003cpath d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cpath d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cpath d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\"\u003e\n+ \u003cpath d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\"\u003e\n+ \u003cpath d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path54\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\"\u003e\n+ \u003cpath d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cg id=\"path62\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\"\u003e\n+ \u003cpath d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path70\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\"\u003e\n+ \u003cpath d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cpath d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\"\u003e\n+ \u003cpath d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\"\u003e\n+ \u003cpath d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\n\\ No newline at end of file\n", + "utf8_diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n", "new_path": "files/images/wm.svg", "old_path": "files/images/wm.svg", "a_mode": "0", @@ -6008,7 +5715,7 @@ { "merge_request_diff_id": 10, "relative_order": 8, - "utf8_diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" =\u003e path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" =\u003e path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output \u003c\u003c stdout.read\n @cmd_output \u003c\u003c stderr.read\n", + "utf8_diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n", "new_path": "files/ruby/popen.rb", "old_path": "files/ruby/popen.rb", "a_mode": "100644", @@ -6171,9 +5878,7 @@ "author": { "name": "User 4" }, - "events": [ - - ] + "events": [] }, { "id": 826, @@ -6195,9 +5900,7 @@ "author": { "name": "User 3" }, - "events": [ - - ] + "events": [] }, { "id": 827, @@ -6219,9 +5922,7 @@ "author": { "name": "User 0" }, - "events": [ - - ] + "events": [] }, { "id": 828, @@ -6243,9 +5944,7 @@ "author": { "name": "Ottis Schuster II" }, - "events": [ - - ] + "events": [] }, { "id": 829, @@ -6267,9 +5966,7 @@ "author": { "name": "Rhett Emmerich IV" }, - "events": [ - - ] + "events": [] }, { "id": 830, @@ -6291,9 +5988,7 @@ "author": { "name": "Burdette Bernier" }, - "events": [ - - ] + "events": [] }, { "id": 831, @@ -6315,9 +6010,7 @@ "author": { "name": "Ari Wintheiser" }, - "events": [ - - ] + "events": [] }, { "id": 832, @@ -6339,9 +6032,7 @@ "author": { "name": "Administrator" }, - "events": [ - - ] + "events": [] } ], "merge_request_diff": { @@ -6953,9 +6644,7 @@ "updated_at": "2017-01-16T15:25:28.637Z" } ], - "deploy_keys": [ - - ], + "deploy_keys": [], "services": [ { "id": 100, @@ -6964,9 +6653,7 @@ "created_at": "2016-06-14T15:01:51.315Z", "updated_at": "2016-06-14T15:01:51.315Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7008,9 +6695,7 @@ "created_at": "2016-06-14T15:01:51.289Z", "updated_at": "2016-06-14T15:01:51.289Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7030,9 +6715,7 @@ "created_at": "2016-06-14T15:01:51.277Z", "updated_at": "2016-06-14T15:01:51.277Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7052,9 +6735,7 @@ "created_at": "2016-06-14T15:01:51.267Z", "updated_at": "2016-06-14T15:01:51.267Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7097,9 +6778,7 @@ "created_at": "2016-06-14T15:01:51.232Z", "updated_at": "2016-06-14T15:01:51.232Z", "active": true, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7141,9 +6820,7 @@ "created_at": "2016-06-14T15:01:51.202Z", "updated_at": "2016-06-14T15:01:51.202Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7163,9 +6840,7 @@ "created_at": "2016-06-14T15:01:51.182Z", "updated_at": "2016-06-14T15:01:51.182Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7185,9 +6860,7 @@ "created_at": "2016-06-14T15:01:51.166Z", "updated_at": "2016-06-14T15:01:51.166Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7207,9 +6880,7 @@ "created_at": "2016-06-14T15:01:51.153Z", "updated_at": "2016-06-14T15:01:51.153Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7229,9 +6900,7 @@ "created_at": "2016-06-14T15:01:51.139Z", "updated_at": "2016-06-14T15:01:51.139Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7251,9 +6920,7 @@ "created_at": "2016-06-14T15:01:51.125Z", "updated_at": "2016-06-14T15:01:51.125Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7273,9 +6940,7 @@ "created_at": "2016-06-14T15:01:51.113Z", "updated_at": "2016-06-14T15:01:51.113Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7295,9 +6960,7 @@ "created_at": "2016-06-14T15:01:51.080Z", "updated_at": "2016-06-14T15:01:51.080Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7317,9 +6980,7 @@ "created_at": "2016-06-14T15:01:51.067Z", "updated_at": "2016-06-14T15:01:51.067Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7339,9 +7000,7 @@ "created_at": "2016-06-14T15:01:51.047Z", "updated_at": "2016-06-14T15:01:51.047Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7361,9 +7020,7 @@ "created_at": "2016-06-14T15:01:51.031Z", "updated_at": "2016-06-14T15:01:51.031Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7383,9 +7040,7 @@ "created_at": "2016-06-14T15:01:51.031Z", "updated_at": "2016-06-14T15:01:51.031Z", "active": false, - "properties": { - - }, + "properties": {}, "template": false, "push_events": true, "issues_events": true, @@ -7399,9 +7054,7 @@ "type": "JenkinsDeprecatedService" } ], - "hooks": [ - - ], + "hooks": [], "protected_branches": [ { "id": 1, @@ -7475,5 +7128,25 @@ "key": "bar", "value": "bar" } + ], + "project_badges": [ + { + "id": 1, + "created_at": "2017-10-19T15:36:23.466Z", + "updated_at": "2017-10-19T15:36:23.466Z", + "project_id": 5, + "type": "ProjectBadge", + "link_url": "http://www.example.com", + "image_url": "http://www.example.com" + }, + { + "id": 2, + "created_at": "2017-10-19T15:36:23.466Z", + "updated_at": "2017-10-19T15:36:23.466Z", + "project_id": 5, + "type": "ProjectBadge", + "link_url": "http://www.example.com", + "image_url": "http://www.example.com" + } ] } diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index d076007e4bc..f4e466d1296 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -7,9 +7,9 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do @user = create(:user) RSpec::Mocks.with_temporary_scope do - @shared = Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') - allow(@shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/') @project = create(:project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') + @shared = @project.import_export_shared + allow(@shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/') allow_any_instance_of(Repository).to receive(:fetch_ref).and_return(true) allow_any_instance_of(Gitlab::Git::Repository).to receive(:branch_exists?).and_return(false) @@ -129,6 +129,10 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do expect(@project.custom_attributes.count).to eq(2) end + it 'has badges' do + expect(@project.project_badges.count).to eq(2) + end + it 'restores the correct service' do expect(CustomIssueTrackerService.first).not_to be_nil end @@ -259,7 +263,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do context 'Light JSON' do let(:user) { create(:user) } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') } + let(:shared) { project.import_export_shared } let!(:project) { create(:project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') } let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) } let(:restored_project_json) { project_tree_restorer.restore } diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb index 5804c45871e..3049491f0ae 100644 --- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' describe Gitlab::ImportExport::ProjectTreeSaver do describe 'saves the project tree into a json object' do - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } let(:project_tree_saver) { described_class.new(project: project, current_user: user, shared: shared) } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } let(:user) { create(:user) } @@ -180,6 +180,10 @@ describe Gitlab::ImportExport::ProjectTreeSaver do expect(saved_project_json['custom_attributes'].count).to eq(2) end + it 'has badges' do + expect(saved_project_json['project_badges'].count).to eq(2) + end + it 'does not complain about non UTF-8 characters in MR diff files' do ActiveRecord::Base.connection.execute("UPDATE merge_request_diff_files SET diff = '---\n- :diff: !binary |-\n LS0tIC9kZXYvbnVsbAorKysgYi9pbWFnZXMvbnVjb3IucGRmCkBAIC0wLDAg\n KzEsMTY3OSBAQAorJVBERi0xLjUNJeLjz9MNCisxIDAgb2JqDTw8L01ldGFk\n YXR'") @@ -288,6 +292,9 @@ describe Gitlab::ImportExport::ProjectTreeSaver do create(:project_custom_attribute, project: project) create(:project_custom_attribute, project: project) + create(:project_badge, project: project) + create(:project_badge, project: project) + project end diff --git a/spec/lib/gitlab/import_export/reader_spec.rb b/spec/lib/gitlab/import_export/reader_spec.rb index e9f5273725d..1ef024d3078 100644 --- a/spec/lib/gitlab/import_export/reader_spec.rb +++ b/spec/lib/gitlab/import_export/reader_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Gitlab::ImportExport::Reader do - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: '') } + let(:shared) { Gitlab::ImportExport::Shared.new(nil) } let(:test_config) { 'spec/support/import_export/import_export.yml' } let(:project_tree_hash) do { diff --git a/spec/lib/gitlab/import_export/repo_restorer_spec.rb b/spec/lib/gitlab/import_export/repo_restorer_spec.rb index c49af602a01..dc806d036ff 100644 --- a/spec/lib/gitlab/import_export/repo_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/repo_restorer_spec.rb @@ -6,7 +6,7 @@ describe Gitlab::ImportExport::RepoRestorer do let!(:project_with_repo) { create(:project, :repository, name: 'test-repo-restorer', path: 'test-repo-restorer') } let!(:project) { create(:project) } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } let(:bundler) { Gitlab::ImportExport::RepoSaver.new(project: project_with_repo, shared: shared) } let(:bundle_path) { File.join(shared.export_path, Gitlab::ImportExport.project_bundle_filename) } let(:restorer) do diff --git a/spec/lib/gitlab/import_export/repo_saver_spec.rb b/spec/lib/gitlab/import_export/repo_saver_spec.rb index 44f972fe530..187ec8fcfa2 100644 --- a/spec/lib/gitlab/import_export/repo_saver_spec.rb +++ b/spec/lib/gitlab/import_export/repo_saver_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::ImportExport::RepoSaver do let(:user) { create(:user) } let!(:project) { create(:project, :public, name: 'searchable_project') } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } let(:bundler) { described_class.new(project: project, shared: shared) } before do diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index feaab6673cd..ddcbb7a0033 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -536,3 +536,12 @@ LfsFileLock: - user_id - project_id - created_at +Badge: +- id +- link_url +- image_url +- project_id +- group_id +- created_at +- updated_at +- type diff --git a/spec/lib/gitlab/import_export/uploads_restorer_spec.rb b/spec/lib/gitlab/import_export/uploads_restorer_spec.rb index 8a3a244be21..acef97459b8 100644 --- a/spec/lib/gitlab/import_export/uploads_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/uploads_restorer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Gitlab::ImportExport::UploadsRestorer do describe 'bundle a project Git repo' do let(:export_path) { "#{Dir.tmpdir}/uploads_saver_spec" } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } before do allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) diff --git a/spec/lib/gitlab/import_export/uploads_saver_spec.rb b/spec/lib/gitlab/import_export/uploads_saver_spec.rb index 177036c109b..1304d8fabfc 100644 --- a/spec/lib/gitlab/import_export/uploads_saver_spec.rb +++ b/spec/lib/gitlab/import_export/uploads_saver_spec.rb @@ -4,7 +4,7 @@ describe Gitlab::ImportExport::UploadsSaver do describe 'bundle a project Git repo' do let(:export_path) { "#{Dir.tmpdir}/uploads_saver_spec" } let(:file) { fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif') } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } before do allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) diff --git a/spec/lib/gitlab/import_export/version_checker_spec.rb b/spec/lib/gitlab/import_export/version_checker_spec.rb index e7d50f75682..49d857d9483 100644 --- a/spec/lib/gitlab/import_export/version_checker_spec.rb +++ b/spec/lib/gitlab/import_export/version_checker_spec.rb @@ -2,12 +2,13 @@ require 'spec_helper' include ImportExport::CommonUtil describe Gitlab::ImportExport::VersionChecker do - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: '') } + let(:shared) { Gitlab::ImportExport::Shared.new(nil) } describe 'bundle a project Git repo' do let(:version) { Gitlab::ImportExport.version } before do + allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:relative_archive_path).and_return('') allow(File).to receive(:open).and_return(version) end diff --git a/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb b/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb index 1d1e7e7f89a..d2bd8ccdf3f 100644 --- a/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb +++ b/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::ImportExport::WikiRepoSaver do let(:user) { create(:user) } let!(:project) { create(:project, :public, name: 'searchable_project') } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } let(:wiki_bundler) { described_class.new(project: project, shared: shared) } let!(:project_wiki) { ProjectWiki.new(project, user) } diff --git a/spec/lib/gitlab/import_export/wiki_restorer_spec.rb b/spec/lib/gitlab/import_export/wiki_restorer_spec.rb index 81b654e9c5f..5c01ee0ebb8 100644 --- a/spec/lib/gitlab/import_export/wiki_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/wiki_restorer_spec.rb @@ -6,7 +6,7 @@ describe Gitlab::ImportExport::WikiRestorer do let!(:project_without_wiki) { create(:project) } let!(:project) { create(:project) } let(:export_path) { "#{Dir.tmpdir}/project_tree_saver_spec" } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.full_path) } + let(:shared) { project.import_export_shared } let(:bundler) { Gitlab::ImportExport::WikiRepoSaver.new(project: project_with_wiki, shared: shared) } let(:bundle_path) { File.join(shared.export_path, Gitlab::ImportExport.project_bundle_filename) } let(:restorer) do diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb index 0697cb2def6..c7169717fc1 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb @@ -7,7 +7,7 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery do include_examples 'additional metrics query' do let(:deployment) { create(:deployment, environment: environment) } - let(:query_params) { [environment.id, deployment.id] } + let(:query_params) { [deployment.id] } it 'queries using specific time' do expect(client).to receive(:query_range).with(anything, diff --git a/spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb b/spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb index 84dc31d9732..ffe3ad85baa 100644 --- a/spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb @@ -31,7 +31,7 @@ describe Gitlab::Prometheus::Queries::DeploymentQuery do expect(client).to receive(:query).with('avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="environment-slug"}[30m])) * 100', time: stop_time) - expect(subject.query(environment.id, deployment.id)).to eq(memory_values: nil, memory_before: nil, memory_after: nil, - cpu_values: nil, cpu_before: nil, cpu_after: nil) + expect(subject.query(deployment.id)).to eq(memory_values: nil, memory_before: nil, memory_after: nil, + cpu_values: nil, cpu_before: nil, cpu_after: nil) end end diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb index c95719eff1d..420218a695a 100644 --- a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Gitlab::Prometheus::Queries::MatchedMetricsQuery do +describe Gitlab::Prometheus::Queries::MatchedMetricQuery do include Prometheus::MetricBuilders let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } diff --git a/spec/lib/gitlab/shell_spec.rb b/spec/lib/gitlab/shell_spec.rb index 4506cbc3982..56b45d8da3c 100644 --- a/spec/lib/gitlab/shell_spec.rb +++ b/spec/lib/gitlab/shell_spec.rb @@ -508,8 +508,8 @@ describe Gitlab::Shell do end shared_examples 'fetch_remote' do |gitaly_on| - def fetch_remote(ssh_auth = nil) - gitlab_shell.fetch_remote(repository.raw_repository, 'remote-name', ssh_auth: ssh_auth) + def fetch_remote(ssh_auth = nil, prune = true) + gitlab_shell.fetch_remote(repository.raw_repository, 'remote-name', ssh_auth: ssh_auth, prune: prune) end def expect_gitlab_projects(fail = false, options = {}) @@ -555,27 +555,33 @@ describe Gitlab::Shell do end it 'returns true when the command succeeds' do - expect_call(false, force: false, tags: true) + expect_call(false, force: false, tags: true, prune: true) expect(fetch_remote).to be_truthy end + it 'returns true when the command succeeds' do + expect_call(false, force: false, tags: true, prune: false) + + expect(fetch_remote(nil, false)).to be_truthy + end + it 'raises an exception when the command fails' do - expect_call(true, force: false, tags: true) + expect_call(true, force: false, tags: true, prune: true) expect { fetch_remote }.to raise_error(Gitlab::Shell::Error) end it 'allows forced and no_tags to be changed' do - expect_call(false, force: true, tags: false) + expect_call(false, force: true, tags: false, prune: true) - result = gitlab_shell.fetch_remote(repository.raw_repository, 'remote-name', forced: true, no_tags: true) + result = gitlab_shell.fetch_remote(repository.raw_repository, 'remote-name', forced: true, no_tags: true, prune: true) expect(result).to be_truthy end context 'SSH auth' do it 'passes the SSH key if specified' do - expect_call(false, force: false, tags: true, ssh_key: 'foo') + expect_call(false, force: false, tags: true, prune: true, ssh_key: 'foo') ssh_auth = build_ssh_auth(ssh_key_auth?: true, ssh_private_key: 'foo') @@ -583,7 +589,7 @@ describe Gitlab::Shell do end it 'does not pass an empty SSH key' do - expect_call(false, force: false, tags: true) + expect_call(false, force: false, tags: true, prune: true) ssh_auth = build_ssh_auth(ssh_key_auth: true, ssh_private_key: '') @@ -591,7 +597,7 @@ describe Gitlab::Shell do end it 'does not pass the key unless SSH key auth is to be used' do - expect_call(false, force: false, tags: true) + expect_call(false, force: false, tags: true, prune: true) ssh_auth = build_ssh_auth(ssh_key_auth: false, ssh_private_key: 'foo') @@ -599,7 +605,7 @@ describe Gitlab::Shell do end it 'passes the known_hosts data if specified' do - expect_call(false, force: false, tags: true, known_hosts: 'foo') + expect_call(false, force: false, tags: true, prune: true, known_hosts: 'foo') ssh_auth = build_ssh_auth(ssh_known_hosts: 'foo') @@ -607,7 +613,7 @@ describe Gitlab::Shell do end it 'does not pass empty known_hosts data' do - expect_call(false, force: false, tags: true) + expect_call(false, force: false, tags: true, prune: true) ssh_auth = build_ssh_auth(ssh_known_hosts: '') @@ -615,7 +621,7 @@ describe Gitlab::Shell do end it 'does not pass known_hosts data unless SSH is to be used' do - expect_call(false, force: false, tags: true) + expect_call(false, force: false, tags: true, prune: true) ssh_auth = build_ssh_auth(ssh_import?: false, ssh_known_hosts: 'foo') @@ -642,7 +648,7 @@ describe Gitlab::Shell do it 'passes the correct params to the gitaly service' do expect(repository.gitaly_repository_client).to receive(:fetch_remote) - .with(remote_name, ssh_auth: ssh_auth, forced: true, no_tags: true, timeout: timeout) + .with(remote_name, ssh_auth: ssh_auth, forced: true, no_tags: true, prune: true, timeout: timeout) subject end diff --git a/spec/lib/gitlab/string_placeholder_replacer_spec.rb b/spec/lib/gitlab/string_placeholder_replacer_spec.rb new file mode 100644 index 00000000000..7a03ea4154c --- /dev/null +++ b/spec/lib/gitlab/string_placeholder_replacer_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe Gitlab::StringPlaceholderReplacer do + describe '.render_url' do + it 'returns the nil if the string is blank' do + expect(described_class.replace_string_placeholders(nil, /whatever/)).to be_blank + end + + it 'returns the string if the placeholder regex' do + expect(described_class.replace_string_placeholders('whatever')).to eq 'whatever' + end + + it 'returns the string if no block given' do + expect(described_class.replace_string_placeholders('whatever', /whatever/)).to eq 'whatever' + end + + context 'when all params are valid' do + let(:string) { '%{path}/%{id}/%{branch}' } + let(:regex) { /(path|id)/ } + + it 'replaces each placeholders with the block result' do + result = described_class.replace_string_placeholders(string, regex) do |arg| + 'WHATEVER' + end + + expect(result).to eq 'WHATEVER/WHATEVER/%{branch}' + end + + it 'does not replace the placeholder if the block result is nil' do + result = described_class.replace_string_placeholders(string, regex) do |arg| + arg == 'path' ? nil : 'WHATEVER' + end + + expect(result).to eq '%{path}/WHATEVER/%{branch}' + end + end + end +end diff --git a/spec/lib/gitlab/utils_spec.rb b/spec/lib/gitlab/utils_spec.rb index bda239b7871..71a743495a2 100644 --- a/spec/lib/gitlab/utils_spec.rb +++ b/spec/lib/gitlab/utils_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Gitlab::Utils do - delegate :to_boolean, :boolean_to_yes_no, :slugify, :random_string, :which, to: :described_class + delegate :to_boolean, :boolean_to_yes_no, :slugify, :random_string, :which, :ensure_array_from_string, to: :described_class describe '.slugify' do { @@ -83,4 +83,18 @@ describe Gitlab::Utils do expect(which('sh', 'PATH' => '/bin')).to eq('/bin/sh') end end + + describe '.ensure_array_from_string' do + it 'returns the same array if given one' do + arr = ['a', 4, true, { test: 1 }] + + expect(ensure_array_from_string(arr)).to eq(arr) + end + + it 'turns comma-separated strings into arrays' do + str = 'seven, eight, 9, 10' + + expect(ensure_array_from_string(str)).to eq(%w[seven eight 9 10]) + end + end end diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index bcbb9287199..83c33797bbc 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -457,7 +457,7 @@ describe Notify do it 'has the correct subject and body' do is_expected.to have_subject("#{project.name} | Project was moved") - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text(project.ssh_url_to_repo) end end @@ -483,8 +483,8 @@ describe Notify do to_emails = subject.header[:to].addrs.map(&:address) expect(to_emails).to eq([recipient.notification_email]) - is_expected.to have_subject "Request to join the #{project.name_with_namespace} project" - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_subject "Request to join the #{project.full_name} project" + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text project_project_members_url(project) is_expected.to have_body_text project_member.human_access end @@ -503,8 +503,8 @@ describe Notify do it_behaves_like "a user cannot unsubscribe through footer link" it 'contains all the useful information' do - is_expected.to have_subject "Access to the #{project.name_with_namespace} project was denied" - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_subject "Access to the #{project.full_name} project was denied" + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text project.web_url end end @@ -520,8 +520,8 @@ describe Notify do it_behaves_like "a user cannot unsubscribe through footer link" it 'contains all the useful information' do - is_expected.to have_subject "Access to the #{project.name_with_namespace} project was granted" - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_subject "Access to the #{project.full_name} project was granted" + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text project.web_url is_expected.to have_body_text project_member.human_access end @@ -550,8 +550,8 @@ describe Notify do it_behaves_like "a user cannot unsubscribe through footer link" it 'contains all the useful information' do - is_expected.to have_subject "Invitation to join the #{project.name_with_namespace} project" - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_subject "Invitation to join the #{project.full_name} project" + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text project.web_url is_expected.to have_body_text project_member.human_access is_expected.to have_body_text project_member.invite_token @@ -575,7 +575,7 @@ describe Notify do it 'contains all the useful information' do is_expected.to have_subject 'Invitation accepted' - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text project.web_url is_expected.to have_body_text project_member.invite_email is_expected.to have_html_escaped_body_text invited_user.name @@ -598,7 +598,7 @@ describe Notify do it 'contains all the useful information' do is_expected.to have_subject 'Invitation declined' - is_expected.to have_html_escaped_body_text project.name_with_namespace + is_expected.to have_html_escaped_body_text project.full_name is_expected.to have_body_text project.web_url is_expected.to have_body_text project_member.invite_email end diff --git a/spec/migrations/migrate_create_trace_artifact_sidekiq_queue_spec.rb b/spec/migrations/migrate_create_trace_artifact_sidekiq_queue_spec.rb new file mode 100644 index 00000000000..c18ae3b76d3 --- /dev/null +++ b/spec/migrations/migrate_create_trace_artifact_sidekiq_queue_spec.rb @@ -0,0 +1,66 @@ +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20180306074045_migrate_create_trace_artifact_sidekiq_queue.rb') + +describe MigrateCreateTraceArtifactSidekiqQueue, :sidekiq, :redis do + include Gitlab::Database::MigrationHelpers + + context 'when there are jobs in the queues' do + it 'correctly migrates queue when migrating up' do + Sidekiq::Testing.disable! do + stubbed_worker(queue: 'pipeline_default:create_trace_artifact').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_background:archive_trace').perform_async('Something', [1]) + + described_class.new.up + + expect(sidekiq_queue_length('pipeline_default:create_trace_artifact')).to eq 0 + expect(sidekiq_queue_length('pipeline_background:archive_trace')).to eq 2 + end + end + + it 'does not affect other queues under the same namespace' do + Sidekiq::Testing.disable! do + stubbed_worker(queue: 'pipeline_default:build_coverage').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:build_trace_sections').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:pipeline_metrics').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:pipeline_notification').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:update_head_pipeline_for_merge_request').perform_async('Something', [1]) + + described_class.new.up + + expect(sidekiq_queue_length('pipeline_default:build_coverage')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:build_trace_sections')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:pipeline_metrics')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:pipeline_notification')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:update_head_pipeline_for_merge_request')).to eq 1 + end + end + + it 'correctly migrates queue when migrating down' do + Sidekiq::Testing.disable! do + stubbed_worker(queue: 'pipeline_background:archive_trace').perform_async('Something', [1]) + + described_class.new.down + + expect(sidekiq_queue_length('pipeline_default:create_trace_artifact')).to eq 1 + expect(sidekiq_queue_length('pipeline_background:archive_trace')).to eq 0 + end + end + end + + context 'when there are no jobs in the queues' do + it 'does not raise error when migrating up' do + expect { described_class.new.up }.not_to raise_error + end + + it 'does not raise error when migrating down' do + expect { described_class.new.down }.not_to raise_error + end + end + + def stubbed_worker(queue:) + Class.new do + include Sidekiq::Worker + sidekiq_options queue: queue + end + end +end diff --git a/spec/migrations/migrate_update_head_pipeline_for_merge_request_sidekiq_queue_spec.rb b/spec/migrations/migrate_update_head_pipeline_for_merge_request_sidekiq_queue_spec.rb new file mode 100644 index 00000000000..5e3b20ab4a8 --- /dev/null +++ b/spec/migrations/migrate_update_head_pipeline_for_merge_request_sidekiq_queue_spec.rb @@ -0,0 +1,64 @@ +require 'spec_helper' +require Rails.root.join('db', 'post_migrate', '20180307012445_migrate_update_head_pipeline_for_merge_request_sidekiq_queue.rb') + +describe MigrateUpdateHeadPipelineForMergeRequestSidekiqQueue, :sidekiq, :redis do + include Gitlab::Database::MigrationHelpers + + context 'when there are jobs in the queues' do + it 'correctly migrates queue when migrating up' do + Sidekiq::Testing.disable! do + stubbed_worker(queue: 'pipeline_default:update_head_pipeline_for_merge_request').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_processing:update_head_pipeline_for_merge_request').perform_async('Something', [1]) + + described_class.new.up + + expect(sidekiq_queue_length('pipeline_default:update_head_pipeline_for_merge_request')).to eq 0 + expect(sidekiq_queue_length('pipeline_processing:update_head_pipeline_for_merge_request')).to eq 2 + end + end + + it 'does not affect other queues under the same namespace' do + Sidekiq::Testing.disable! do + stubbed_worker(queue: 'pipeline_default:build_coverage').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:build_trace_sections').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:pipeline_metrics').perform_async('Something', [1]) + stubbed_worker(queue: 'pipeline_default:pipeline_notification').perform_async('Something', [1]) + + described_class.new.up + + expect(sidekiq_queue_length('pipeline_default:build_coverage')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:build_trace_sections')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:pipeline_metrics')).to eq 1 + expect(sidekiq_queue_length('pipeline_default:pipeline_notification')).to eq 1 + end + end + + it 'correctly migrates queue when migrating down' do + Sidekiq::Testing.disable! do + stubbed_worker(queue: 'pipeline_processing:update_head_pipeline_for_merge_request').perform_async('Something', [1]) + + described_class.new.down + + expect(sidekiq_queue_length('pipeline_default:update_head_pipeline_for_merge_request')).to eq 1 + expect(sidekiq_queue_length('pipeline_processing:update_head_pipeline_for_merge_request')).to eq 0 + end + end + end + + context 'when there are no jobs in the queues' do + it 'does not raise error when migrating up' do + expect { described_class.new.up }.not_to raise_error + end + + it 'does not raise error when migrating down' do + expect { described_class.new.down }.not_to raise_error + end + end + + def stubbed_worker(queue:) + Class.new do + include Sidekiq::Worker + sidekiq_options queue: queue + end + end +end diff --git a/spec/models/badge_spec.rb b/spec/models/badge_spec.rb new file mode 100644 index 00000000000..33dc19e3432 --- /dev/null +++ b/spec/models/badge_spec.rb @@ -0,0 +1,94 @@ +require 'spec_helper' + +describe Badge do + let(:placeholder_url) { 'http://www.example.com/%{project_path}/%{project_id}/%{default_branch}/%{commit_sha}' } + + describe 'validations' do + # Requires the let variable url_sym + shared_examples 'placeholder url' do + let(:badge) { build(:badge) } + + it 'allows url with http protocol' do + badge[url_sym] = 'http://www.example.com' + + expect(badge).to be_valid + end + + it 'allows url with https protocol' do + badge[url_sym] = 'https://www.example.com' + + expect(badge).to be_valid + end + + it 'cannot be empty' do + badge[url_sym] = '' + + expect(badge).not_to be_valid + end + + it 'cannot be nil' do + badge[url_sym] = nil + + expect(badge).not_to be_valid + end + + it 'accept badges placeholders' do + badge[url_sym] = placeholder_url + + expect(badge).to be_valid + end + + it 'sanitize url' do + badge[url_sym] = 'javascript:alert(1)' + + expect(badge).not_to be_valid + end + end + + context 'link_url format' do + let(:url_sym) { :link_url } + + it_behaves_like 'placeholder url' + end + + context 'image_url format' do + let(:url_sym) { :image_url } + + it_behaves_like 'placeholder url' + end + end + + shared_examples 'rendered_links' do + it 'should use the project information to populate the url placeholders' do + stub_project_commit_info(project) + + expect(badge.public_send("rendered_#{method}", project)).to eq "http://www.example.com/#{project.full_path}/#{project.id}/master/whatever" + end + + it 'returns the url if the project used is nil' do + expect(badge.public_send("rendered_#{method}", nil)).to eq placeholder_url + end + + def stub_project_commit_info(project) + allow(project).to receive(:commit).and_return(double('Commit', sha: 'whatever')) + allow(project).to receive(:default_branch).and_return('master') + end + end + + context 'methods' do + let(:badge) { build(:badge, link_url: placeholder_url, image_url: placeholder_url) } + let!(:project) { create(:project) } + + context '#rendered_link_url' do + let(:method) { :link_url } + + it_behaves_like 'rendered_links' + end + + context '#rendered_image_url' do + let(:method) { :image_url } + + it_behaves_like 'rendered_links' + end + end +end diff --git a/spec/models/badges/group_badge_spec.rb b/spec/models/badges/group_badge_spec.rb new file mode 100644 index 00000000000..ed7f83d0489 --- /dev/null +++ b/spec/models/badges/group_badge_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe GroupBadge do + describe 'associations' do + it { is_expected.to belong_to(:group) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:group) } + end +end diff --git a/spec/models/badges/project_badge_spec.rb b/spec/models/badges/project_badge_spec.rb new file mode 100644 index 00000000000..0e1a8159cb6 --- /dev/null +++ b/spec/models/badges/project_badge_spec.rb @@ -0,0 +1,43 @@ +require 'spec_helper' + +describe ProjectBadge do + let(:placeholder_url) { 'http://www.example.com/%{project_path}/%{project_id}/%{default_branch}/%{commit_sha}' } + + describe 'associations' do + it { is_expected.to belong_to(:project) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:project) } + end + + shared_examples 'rendered_links' do + it 'should use the badge project information to populate the url placeholders' do + stub_project_commit_info(project) + + expect(badge.public_send("rendered_#{method}")).to eq "http://www.example.com/#{project.full_path}/#{project.id}/master/whatever" + end + + def stub_project_commit_info(project) + allow(project).to receive(:commit).and_return(double('Commit', sha: 'whatever')) + allow(project).to receive(:default_branch).and_return('master') + end + end + + context 'methods' do + let(:badge) { build(:project_badge, link_url: placeholder_url, image_url: placeholder_url) } + let!(:project) { badge.project } + + context '#rendered_link_url' do + let(:method) { :link_url } + + it_behaves_like 'rendered_links' + end + + context '#rendered_image_url' do + let(:method) { :image_url } + + it_behaves_like 'rendered_links' + end + end +end diff --git a/spec/models/clusters/applications/prometheus_spec.rb b/spec/models/clusters/applications/prometheus_spec.rb index df8a508e021..2905b58066b 100644 --- a/spec/models/clusters/applications/prometheus_spec.rb +++ b/spec/models/clusters/applications/prometheus_spec.rb @@ -22,11 +22,11 @@ describe Clusters::Applications::Prometheus do end end - describe '#proxy_client' do + describe '#prometheus_client' do context 'cluster is nil' do it 'returns nil' do expect(subject.cluster).to be_nil - expect(subject.proxy_client).to be_nil + expect(subject.prometheus_client).to be_nil end end @@ -35,7 +35,7 @@ describe Clusters::Applications::Prometheus do subject { create(:clusters_applications_prometheus, cluster: cluster) } it 'returns nil' do - expect(subject.proxy_client).to be_nil + expect(subject.prometheus_client).to be_nil end end @@ -63,15 +63,15 @@ describe Clusters::Applications::Prometheus do end it 'creates proxy prometheus rest client' do - expect(subject.proxy_client).to be_instance_of(RestClient::Resource) + expect(subject.prometheus_client).to be_instance_of(RestClient::Resource) end it 'creates proper url' do - expect(subject.proxy_client.url).to eq('http://example.com/api/v1/proxy/namespaces/gitlab-managed-apps/service/prometheus-prometheus-server:80') + expect(subject.prometheus_client.url).to eq('http://example.com/api/v1/proxy/namespaces/gitlab-managed-apps/service/prometheus-prometheus-server:80') end it 'copies options and headers from kube client to proxy client' do - expect(subject.proxy_client.options).to eq(kube_client.rest_client.options.merge(headers: kube_client.headers)) + expect(subject.prometheus_client.options).to eq(kube_client.rest_client.options.merge(headers: kube_client.headers)) end end end diff --git a/spec/models/clusters/applications/runner_spec.rb b/spec/models/clusters/applications/runner_spec.rb index 612a3c8e413..a574779e39d 100644 --- a/spec/models/clusters/applications/runner_spec.rb +++ b/spec/models/clusters/applications/runner_spec.rb @@ -34,6 +34,8 @@ describe Clusters::Applications::Runner do is_expected.to include('checkInterval') is_expected.to include('rbac') is_expected.to include('runners') + is_expected.to include('privileged: true') + is_expected.to include('image: ubuntu:16.04') is_expected.to include('resources') is_expected.to include("runnerToken: #{ci_runner.token}") is_expected.to include("gitlabUrl: #{Gitlab::Routing.url_helpers.root_url}") @@ -65,5 +67,33 @@ describe Clusters::Applications::Runner do expect(gitlab_runner.runner).not_to be_nil end end + + context 'with duplicated values on vendor/runner/values.yaml' do + let(:values) do + { + "concurrent" => 4, + "checkInterval" => 3, + "rbac" => { + "create" => false + }, + "clusterWideAccess" => false, + "runners" => { + "privileged" => false, + "image" => "ubuntu:16.04", + "builds" => {}, + "services" => {}, + "helpers" => {} + } + } + end + + before do + allow(gitlab_runner).to receive(:chart_values).and_return(values) + end + + it 'should overwrite values.yaml' do + is_expected.to include("privileged: #{gitlab_runner.privileged}") + end + end end end diff --git a/spec/models/concerns/prometheus_adapter_spec.rb b/spec/models/concerns/prometheus_adapter_spec.rb new file mode 100644 index 00000000000..f4b9c57e71a --- /dev/null +++ b/spec/models/concerns/prometheus_adapter_spec.rb @@ -0,0 +1,121 @@ +require 'spec_helper' + +describe PrometheusAdapter, :use_clean_rails_memory_store_caching do + include PrometheusHelpers + include ReactiveCachingHelpers + + class TestClass + include PrometheusAdapter + end + + let(:project) { create(:prometheus_project) } + let(:service) { project.prometheus_service } + + let(:described_class) { TestClass } + let(:environment_query) { Gitlab::Prometheus::Queries::EnvironmentQuery } + + describe '#query' do + describe 'environment' do + let(:environment) { build_stubbed(:environment, slug: 'env-slug') } + + around do |example| + Timecop.freeze { example.run } + end + + context 'with valid data' do + subject { service.query(:environment, environment) } + + before do + stub_reactive_cache(service, prometheus_data, environment_query, environment.id) + end + + it 'returns reactive data' do + is_expected.to eq(prometheus_metrics_data) + end + end + end + + describe 'matched_metrics' do + let(:matched_metrics_query) { Gitlab::Prometheus::Queries::MatchedMetricQuery } + let(:prometheus_client_wrapper) { double(:prometheus_client_wrapper, label_values: nil) } + + context 'with valid data' do + subject { service.query(:matched_metrics) } + + before do + allow(service).to receive(:prometheus_client_wrapper).and_return(prometheus_client_wrapper) + synchronous_reactive_cache(service) + end + + it 'returns reactive data' do + expect(subject[:success]).to be_truthy + expect(subject[:data]).to eq([]) + end + end + end + + describe 'deployment' do + let(:deployment) { build_stubbed(:deployment) } + let(:deployment_query) { Gitlab::Prometheus::Queries::DeploymentQuery } + + around do |example| + Timecop.freeze { example.run } + end + + context 'with valid data' do + subject { service.query(:deployment, deployment) } + + before do + stub_reactive_cache(service, prometheus_data, deployment_query, deployment.id) + end + + it 'returns reactive data' do + expect(subject).to eq(prometheus_metrics_data) + end + end + end + end + + describe '#calculate_reactive_cache' do + let(:environment) { create(:environment, slug: 'env-slug') } + before do + service.manual_configuration = true + service.active = true + end + + subject do + service.calculate_reactive_cache(environment_query.name, environment.id) + end + + around do |example| + Timecop.freeze { example.run } + end + + context 'when service is inactive' do + before do + service.active = false + end + + it { is_expected.to be_nil } + end + + context 'when Prometheus responds with valid data' do + before do + stub_all_prometheus_requests(environment.slug) + end + + it { expect(subject.to_json).to eq(prometheus_data.to_json) } + it { expect(subject.to_json).to eq(prometheus_data.to_json) } + end + + [404, 500].each do |status| + context "when Prometheus responds with #{status}" do + before do + stub_all_prometheus_requests(environment.slug, status: status, body: "QUERY FAILED!") + end + + it { is_expected.to eq(success: false, result: %(#{status} - "QUERY FAILED!")) } + end + end + end +end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index ba8aa13d5ad..ac30cd27e0c 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -64,6 +64,7 @@ describe Deployment do describe '#metrics' do let(:deployment) { create(:deployment) } + let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) } subject { deployment.metrics } @@ -76,17 +77,16 @@ describe Deployment do { success: true, metrics: {}, - last_update: 42, - deployment_time: 1494408956 + last_update: 42 } end before do - allow(deployment.project).to receive_message_chain(:monitoring_service, :deployment_metrics) - .with(any_args).and_return(simple_metrics) + allow(deployment).to receive(:prometheus_adapter).and_return(prometheus_adapter) + allow(prometheus_adapter).to receive(:query).with(:deployment, deployment).and_return(simple_metrics) end - it { is_expected.to eq(simple_metrics) } + it { is_expected.to eq(simple_metrics.merge({ deployment_time: deployment.created_at.to_i })) } end end @@ -109,11 +109,11 @@ describe Deployment do } end - let(:prometheus_service) { double('prometheus_service') } + let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) } before do - allow(project).to receive(:prometheus_service).and_return(prometheus_service) - allow(prometheus_service).to receive(:additional_deployment_metrics).and_return(simple_metrics) + allow(deployment).to receive(:prometheus_adapter).and_return(prometheus_adapter) + allow(prometheus_adapter).to receive(:query).with(:additional_metrics_deployment, deployment).and_return(simple_metrics) end it { is_expected.to eq(simple_metrics.merge({ deployment_time: deployment.created_at.to_i })) } diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 6f24a039998..ceb570ac777 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Environment do - set(:project) { create(:project) } + let(:project) { create(:project) } subject(:environment) { create(:environment, project: project) } it { is_expected.to belong_to(:project) } @@ -452,8 +452,8 @@ describe Environment do end it 'returns the metrics from the deployment service' do - expect(project.monitoring_service) - .to receive(:environment_metrics).with(environment) + expect(environment.prometheus_adapter) + .to receive(:query).with(:environment, environment) .and_return(:fake_metrics) is_expected.to eq(:fake_metrics) @@ -508,12 +508,12 @@ describe Environment do context 'when the environment has additional metrics' do before do - allow(environment).to receive(:has_additional_metrics?).and_return(true) + allow(environment).to receive(:has_metrics?).and_return(true) end it 'returns the additional metrics from the deployment service' do - expect(project.prometheus_service).to receive(:additional_environment_metrics) - .with(environment) + expect(environment.prometheus_adapter).to receive(:query) + .with(:additional_metrics_environment, environment) .and_return(:fake_metrics) is_expected.to eq(:fake_metrics) @@ -522,46 +522,13 @@ describe Environment do context 'when the environment does not have metrics' do before do - allow(environment).to receive(:has_additional_metrics?).and_return(false) + allow(environment).to receive(:has_metrics?).and_return(false) end it { is_expected.to be_nil } end end - describe '#has_additional_metrics??' do - subject { environment.has_additional_metrics? } - - context 'when the enviroment is available' do - context 'with a deployment service' do - let(:project) { create(:prometheus_project) } - - context 'and a deployment' do - let!(:deployment) { create(:deployment, environment: environment) } - it { is_expected.to be_truthy } - end - - context 'but no deployments' do - it { is_expected.to be_falsy } - end - end - - context 'without a monitoring service' do - it { is_expected.to be_falsy } - end - end - - context 'when the environment is unavailable' do - let(:project) { create(:prometheus_project) } - - before do - environment.stop - end - - it { is_expected.to be_falsy } - end - end - describe '#slug' do it "is automatically generated" do expect(environment.slug).not_to be_nil @@ -654,4 +621,12 @@ describe Environment do end end end + + describe '#prometheus_adapter' do + it 'calls prometheus adapter service' do + expect_any_instance_of(Prometheus::AdapterService).to receive(:prometheus_adapter) + + subject.prometheus_adapter + end + end end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 67f49348acb..8ea92410022 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -49,6 +49,22 @@ describe Event do end end end + + describe 'after_create :track_user_interacted_projects' do + let(:event) { build(:push_event, project: project, author: project.owner) } + + it 'passes event to UserInteractedProject.track' do + expect(UserInteractedProject).to receive(:available?).and_return(true) + expect(UserInteractedProject).to receive(:track).with(event) + event.save + end + + it 'does not call UserInteractedProject.track if its not yet available' do + expect(UserInteractedProject).to receive(:available?).and_return(false) + expect(UserInteractedProject).not_to receive(:track) + event.save + end + end end describe "Push event" do diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 4f16b73ef38..abfc0896a41 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -18,6 +18,7 @@ describe Group do it { is_expected.to have_many(:uploads).dependent(:destroy) } it { is_expected.to have_one(:chat_team) } it { is_expected.to have_many(:custom_attributes).class_name('GroupCustomAttribute') } + it { is_expected.to have_many(:badges).class_name('GroupBadge') } describe '#members & #requesters' do let(:requester) { create(:user) } diff --git a/spec/models/project_services/asana_service_spec.rb b/spec/models/project_services/asana_service_spec.rb index 04440d890aa..e66109fd98f 100644 --- a/spec/models/project_services/asana_service_spec.rb +++ b/spec/models/project_services/asana_service_spec.rb @@ -47,7 +47,7 @@ describe AsanaService do it 'calls Asana service to create a story' do data = create_data_for_commits('Message from commit. related to #123456') - expected_message = "#{data[:user_name]} pushed to branch #{data[:ref]} of #{project.name_with_namespace} ( #{data[:commits][0][:url]} ): #{data[:commits][0][:message]}" + expected_message = "#{data[:user_name]} pushed to branch #{data[:ref]} of #{project.full_name} ( #{data[:commits][0][:url]} ): #{data[:commits][0][:message]}" d1 = double('Asana::Task') expect(d1).to receive(:add_comment).with(text: expected_message) diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb index 23db29cb541..3e2a166cdd6 100644 --- a/spec/models/project_services/hipchat_service_spec.rb +++ b/spec/models/project_services/hipchat_service_spec.rb @@ -29,7 +29,7 @@ describe HipchatService do let(:user) { create(:user) } let(:project) { create(:project, :repository) } let(:api_url) { 'https://hipchat.example.com/v2/room/123456/notification?auth_token=verySecret' } - let(:project_name) { project.name_with_namespace.gsub(/\s/, '') } + let(:project_name) { project.full_name.gsub(/\s/, '') } let(:token) { 'verySecret' } let(:server_url) { 'https://hipchat.example.com'} let(:push_sample_data) do @@ -303,7 +303,7 @@ describe HipchatService do message = hipchat.__send__(:create_pipeline_message, data) project_url = project.web_url - project_name = project.name_with_namespace.gsub(/\s/, '') + project_name = project.full_name.gsub(/\s/, '') pipeline_attributes = data[:object_attributes] ref = pipeline_attributes[:ref] ref_type = pipeline_attributes[:tag] ? 'tag' : 'branch' diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index 748c366efca..54ef0be67ff 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -166,7 +166,6 @@ describe JiraService do # Creates comment expect(WebMock).to have_requested(:post, @comment_url) - # Creates Remote Link in JIRA issue fields expect(WebMock).to have_requested(:post, @remote_link_url).with( body: hash_including( @@ -174,7 +173,7 @@ describe JiraService do object: { url: "#{Gitlab.config.gitlab.url}/#{project.full_path}/commit/#{merge_request.diff_head_sha}", title: "GitLab: Solved by commit #{merge_request.diff_head_sha}.", - icon: { title: "GitLab", url16x16: "https://gitlab.com/favicon.ico" }, + icon: { title: "GitLab", url16x16: "http://localhost/favicon.ico" }, status: { resolved: true } } ) diff --git a/spec/models/project_services/mattermost_slash_commands_service_spec.rb b/spec/models/project_services/mattermost_slash_commands_service_spec.rb index 522cf15f3ba..a5bdf9a9337 100644 --- a/spec/models/project_services/mattermost_slash_commands_service_spec.rb +++ b/spec/models/project_services/mattermost_slash_commands_service_spec.rb @@ -31,10 +31,10 @@ describe MattermostSlashCommandsService do url: 'http://trigger.url', icon_url: 'http://icon.url/icon.png', auto_complete: true, - auto_complete_desc: "Perform common operations on: #{project.name_with_namespace}", + auto_complete_desc: "Perform common operations on: #{project.full_name}", auto_complete_hint: '[help]', - description: "Perform common operations on: #{project.name_with_namespace}", - display_name: "GitLab / #{project.name_with_namespace}", + description: "Perform common operations on: #{project.full_name}", + display_name: "GitLab / #{project.full_name}", method: 'P', username: 'GitLab' }.to_json) diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb index 6693e5783a5..7afb1b4a8e3 100644 --- a/spec/models/project_services/prometheus_service_spec.rb +++ b/spec/models/project_services/prometheus_service_spec.rb @@ -6,7 +6,6 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do let(:project) { create(:prometheus_project) } let(:service) { project.prometheus_service } - let(:environment_query) { Gitlab::Prometheus::Queries::EnvironmentQuery } describe "Associations" do it { is_expected.to belong_to :project } @@ -55,197 +54,31 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do end end - describe '#environment_metrics' do - let(:environment) { build_stubbed(:environment, slug: 'env-slug') } - - around do |example| - Timecop.freeze { example.run } - end - - context 'with valid data' do - subject { service.environment_metrics(environment) } - - before do - stub_reactive_cache(service, prometheus_data, environment_query, environment.id) - end - - it 'returns reactive data' do - is_expected.to eq(prometheus_metrics_data) - end - end - end - - describe '#matched_metrics' do - let(:matched_metrics_query) { Gitlab::Prometheus::Queries::MatchedMetricsQuery } - let(:client) { double(:client, label_values: nil) } - - context 'with valid data' do - subject { service.matched_metrics } - - before do - allow(service).to receive(:client).and_return(client) - synchronous_reactive_cache(service) - end - - it 'returns reactive data' do - expect(subject[:success]).to be_truthy - expect(subject[:data]).to eq([]) - end - end - end - - describe '#deployment_metrics' do - let(:deployment) { build_stubbed(:deployment) } - let(:deployment_query) { Gitlab::Prometheus::Queries::DeploymentQuery } - - around do |example| - Timecop.freeze { example.run } - end - - context 'with valid data' do - subject { service.deployment_metrics(deployment) } - let(:fake_deployment_time) { 10 } - - before do - stub_reactive_cache(service, prometheus_data, deployment_query, deployment.environment.id, deployment.id) - end - - it 'returns reactive data' do - expect(deployment).to receive(:created_at).and_return(fake_deployment_time) - - expect(subject).to eq(prometheus_metrics_data.merge(deployment_time: fake_deployment_time)) - end - end - end - - describe '#calculate_reactive_cache' do - let(:environment) { create(:environment, slug: 'env-slug') } - before do - service.manual_configuration = true - service.active = true - end - - subject do - service.calculate_reactive_cache(environment_query.name, environment.id) - end - - around do |example| - Timecop.freeze { example.run } - end - - context 'when service is inactive' do - before do - service.active = false - end - - it { is_expected.to be_nil } - end - - context 'when Prometheus responds with valid data' do - before do - stub_all_prometheus_requests(environment.slug) - end - - it { expect(subject.to_json).to eq(prometheus_data.to_json) } - it { expect(subject.to_json).to eq(prometheus_data.to_json) } - end - - [404, 500].each do |status| - context "when Prometheus responds with #{status}" do - before do - stub_all_prometheus_requests(environment.slug, status: status, body: "QUERY FAILED!") - end - - it { is_expected.to eq(success: false, result: %(#{status} - "QUERY FAILED!")) } - end - end - end - - describe '#client' do + describe '#prometheus_client' do context 'manual configuration is enabled' do let(:api_url) { 'http://some_url' } + before do + subject.active = true subject.manual_configuration = true subject.api_url = api_url end - it 'returns simple rest client from api_url' do - expect(subject.client).to be_instance_of(Gitlab::PrometheusClient) - expect(subject.client.rest_client.url).to eq(api_url) + it 'returns rest client from api_url' do + expect(subject.prometheus_client.url).to eq(api_url) end end context 'manual configuration is disabled' do - let!(:cluster_for_all) { create(:cluster, environment_scope: '*', projects: [project]) } - let!(:cluster_for_dev) { create(:cluster, environment_scope: 'dev', projects: [project]) } - - let!(:prometheus_for_dev) { create(:clusters_applications_prometheus, :installed, cluster: cluster_for_dev) } - let(:proxy_client) { double('proxy_client') } + let(:api_url) { 'http://some_url' } before do - service.manual_configuration = false - end - - context 'with cluster for all environments with prometheus installed' do - let!(:prometheus_for_all) { create(:clusters_applications_prometheus, :installed, cluster: cluster_for_all) } - - context 'without environment supplied' do - it 'returns client handling all environments' do - expect(service).to receive(:client_from_cluster).with(cluster_for_all).and_return(proxy_client).twice - - expect(service.client).to be_instance_of(Gitlab::PrometheusClient) - expect(service.client.rest_client).to eq(proxy_client) - end - end - - context 'with dev environment supplied' do - let!(:environment) { create(:environment, project: project, name: 'dev') } - - it 'returns dev cluster client' do - expect(service).to receive(:client_from_cluster).with(cluster_for_dev).and_return(proxy_client).twice - - expect(service.client(environment.id)).to be_instance_of(Gitlab::PrometheusClient) - expect(service.client(environment.id).rest_client).to eq(proxy_client) - end - end - - context 'with prod environment supplied' do - let!(:environment) { create(:environment, project: project, name: 'prod') } - - it 'returns dev cluster client' do - expect(service).to receive(:client_from_cluster).with(cluster_for_all).and_return(proxy_client).twice - - expect(service.client(environment.id)).to be_instance_of(Gitlab::PrometheusClient) - expect(service.client(environment.id).rest_client).to eq(proxy_client) - end - end + subject.manual_configuration = false + subject.api_url = api_url end - context 'with cluster for all environments without prometheus installed' do - context 'without environment supplied' do - it 'raises PrometheusClient::Error because cluster was not found' do - expect { service.client }.to raise_error(Gitlab::PrometheusClient::Error, /couldn't find cluster with Prometheus installed/) - end - end - - context 'with dev environment supplied' do - let!(:environment) { create(:environment, project: project, name: 'dev') } - - it 'returns dev cluster client' do - expect(service).to receive(:client_from_cluster).with(cluster_for_dev).and_return(proxy_client).twice - - expect(service.client(environment.id)).to be_instance_of(Gitlab::PrometheusClient) - expect(service.client(environment.id).rest_client).to eq(proxy_client) - end - end - - context 'with prod environment supplied' do - let!(:environment) { create(:environment, project: project, name: 'prod') } - - it 'raises PrometheusClient::Error because cluster was not found' do - expect { service.client }.to raise_error(Gitlab::PrometheusClient::Error, /couldn't find cluster with Prometheus installed/) - end - end + it 'no client provided' do + expect(subject.prometheus_client).to be_nil end end end @@ -284,7 +117,7 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do end end - describe '#synchronize_service_state! before_save callback' do + describe '#synchronize_service_state before_save callback' do context 'no clusters with prometheus are installed' do context 'when service is inactive' do before do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index f4faec9e52a..b1c9e6754b9 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -80,6 +80,7 @@ describe Project do it { is_expected.to have_many(:members_and_requesters) } it { is_expected.to have_many(:clusters) } it { is_expected.to have_many(:custom_attributes).class_name('ProjectCustomAttribute') } + it { is_expected.to have_many(:project_badges).class_name('ProjectBadge') } it { is_expected.to have_many(:lfs_file_locks) } context 'after initialized' do @@ -517,6 +518,20 @@ describe Project do it 'returns the project\'s last update date if it has no events' do expect(project.last_activity_date).to eq(project.updated_at) end + + it 'returns the most recent timestamp' do + project.update_attributes(updated_at: nil, + last_activity_at: timestamp, + last_repository_updated_at: timestamp - 1.hour) + + expect(project.last_activity_date).to eq(timestamp) + + project.update_attributes(updated_at: timestamp, + last_activity_at: timestamp - 1.hour, + last_repository_updated_at: nil) + + expect(project.last_activity_date).to eq(timestamp) + end end end @@ -3331,4 +3346,36 @@ describe Project do end.not_to raise_error # Sidekiq::Worker::EnqueueFromTransactionError end end + + describe '#badges' do + let(:project_group) { create(:group) } + let(:project) { create(:project, path: 'avatar', namespace: project_group) } + + before do + create_list(:project_badge, 2, project: project) + create(:group_badge, group: project_group) + end + + it 'returns the project and the project group badges' do + create(:group_badge, group: create(:group)) + + expect(Badge.count).to eq 4 + expect(project.badges.count).to eq 3 + end + + if Group.supports_nested_groups? + context 'with nested_groups' do + let(:parent_group) { create(:group) } + + before do + create_list(:group_badge, 2, group: project_group) + project_group.update(parent: parent_group) + end + + it 'returns the project and the project nested groups badges' do + expect(project.badges.count).to eq 5 + end + end + end + end end diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb index 1e7671476f1..8b4b5873704 100644 --- a/spec/models/project_wiki_spec.rb +++ b/spec/models/project_wiki_spec.rb @@ -14,13 +14,13 @@ describe ProjectWiki do it { is_expected.to delegate_method(:repository_storage_path).to :project } it { is_expected.to delegate_method(:hashed_storage?).to :project } - describe "#path_with_namespace" do + describe "#full_path" do it "returns the project path with namespace with the .wiki extension" do - expect(subject.path_with_namespace).to eq(project.full_path + '.wiki') + expect(subject.full_path).to eq(project.full_path + '.wiki') end it 'returns the same value as #full_path' do - expect(subject.path_with_namespace).to eq(subject.full_path) + expect(subject.full_path).to eq(subject.full_path) end end diff --git a/spec/models/user_interacted_project_spec.rb b/spec/models/user_interacted_project_spec.rb new file mode 100644 index 00000000000..cb4bb3372d4 --- /dev/null +++ b/spec/models/user_interacted_project_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe UserInteractedProject do + describe '.track' do + subject { described_class.track(event) } + let(:event) { build(:event) } + + Event::ACTIONS.each do |action| + context "for all actions (event types)" do + let(:event) { build(:event, action: action) } + it 'creates a record' do + expect { subject }.to change { described_class.count }.from(0).to(1) + end + end + end + + it 'sets project accordingly' do + subject + expect(described_class.first.project).to eq(event.project) + end + + it 'sets user accordingly' do + subject + expect(described_class.first.user).to eq(event.author) + end + + it 'only creates a record once per user/project' do + expect do + subject + described_class.track(event) + end.to change { described_class.count }.from(0).to(1) + end + + describe 'with an event without a project' do + let(:event) { build(:event, project: nil) } + + it 'ignores the event' do + expect { subject }.not_to change { described_class.count } + end + end + end + + describe '.available?' do + before do + described_class.instance_variable_set('@available_flag', nil) + end + + it 'checks schema version and properly caches positive result' do + expect(ActiveRecord::Migrator).to receive(:current_version).and_return(described_class::REQUIRED_SCHEMA_VERSION - 1 - rand(1000)) + expect(described_class.available?).to be_falsey + expect(ActiveRecord::Migrator).to receive(:current_version).and_return(described_class::REQUIRED_SCHEMA_VERSION + rand(1000)) + expect(described_class.available?).to be_truthy + expect(ActiveRecord::Migrator).not_to receive(:current_version) + expect(described_class.available?).to be_truthy # cached response + end + end + + it { is_expected.to validate_presence_of(:project_id) } + it { is_expected.to validate_presence_of(:user_id) } +end diff --git a/spec/requests/api/badges_spec.rb b/spec/requests/api/badges_spec.rb new file mode 100644 index 00000000000..ae64a9ca162 --- /dev/null +++ b/spec/requests/api/badges_spec.rb @@ -0,0 +1,367 @@ +require 'spec_helper' + +describe API::Badges do + let(:master) { create(:user, username: 'master_user') } + let(:developer) { create(:user) } + let(:access_requester) { create(:user) } + let(:stranger) { create(:user) } + let(:project_group) { create(:group) } + let(:project) { setup_project } + let!(:group) { setup_group } + + shared_context 'source helpers' do + def get_source(source_type) + source_type == 'project' ? project : group + end + end + + shared_examples 'GET /:sources/:id/badges' do |source_type| + include_context 'source helpers' + + let(:source) { get_source(source_type) } + + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) { get api("/#{source_type.pluralize}/#{source.id}/badges", stranger) } + end + + %i[master developer access_requester stranger].each do |type| + context "when authenticated as a #{type}" do + it 'returns 200' do + user = public_send(type) + badges_count = source_type == 'project' ? 3 : 2 + + get api("/#{source_type.pluralize}/#{source.id}/badges", user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response.size).to eq(badges_count) + end + end + end + + it 'avoids N+1 queries' do + # Establish baseline + get api("/#{source_type.pluralize}/#{source.id}/badges", master) + + control = ActiveRecord::QueryRecorder.new do + get api("/#{source_type.pluralize}/#{source.id}/badges", master) + end + + project.add_developer(create(:user)) + + expect do + get api("/#{source_type.pluralize}/#{source.id}/badges", master) + end.not_to exceed_query_limit(control) + end + end + end + + shared_examples 'GET /:sources/:id/badges/:badge_id' do |source_type| + include_context 'source helpers' + + let(:source) { get_source(source_type) } + + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) { get api("/#{source_type.pluralize}/#{source.id}/badges/#{developer.id}", stranger) } + end + + context 'when authenticated as a non-member' do + %i[master developer access_requester stranger].each do |type| + let(:badge) { source.badges.first } + + context "as a #{type}" do + it 'returns 200' do + user = public_send(type) + + get api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", user) + + expect(response).to have_gitlab_http_status(200) + expect(json_response['id']).to eq(badge.id) + expect(json_response['link_url']).to eq(badge.link_url) + expect(json_response['rendered_link_url']).to eq(badge.rendered_link_url) + expect(json_response['image_url']).to eq(badge.image_url) + expect(json_response['rendered_image_url']).to eq(badge.rendered_image_url) + expect(json_response['kind']).to eq source_type + end + end + end + end + end + end + + shared_examples 'POST /:sources/:id/badges' do |source_type| + include_context 'source helpers' + + let(:source) { get_source(source_type) } + let(:example_url) { 'http://www.example.com' } + let(:example_url2) { 'http://www.example1.com' } + + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) do + post api("/#{source_type.pluralize}/#{source.id}/badges", stranger), + link_url: example_url, image_url: example_url2 + end + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester stranger developer].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + + post api("/#{source_type.pluralize}/#{source.id}/badges", user), + link_url: example_url, image_url: example_url2 + + expect(response).to have_gitlab_http_status(403) + end + end + end + end + + context 'when authenticated as a master/owner' do + it 'creates a new badge' do + expect do + post api("/#{source_type.pluralize}/#{source.id}/badges", master), + link_url: example_url, image_url: example_url2 + + expect(response).to have_gitlab_http_status(201) + end.to change { source.badges.count }.by(1) + + expect(json_response['link_url']).to eq(example_url) + expect(json_response['image_url']).to eq(example_url2) + expect(json_response['kind']).to eq source_type + end + end + + it 'returns 400 when link_url is not given' do + post api("/#{source_type.pluralize}/#{source.id}/badges", master), + link_url: example_url + + expect(response).to have_gitlab_http_status(400) + end + + it 'returns 400 when image_url is not given' do + post api("/#{source_type.pluralize}/#{source.id}/badges", master), + image_url: example_url2 + + expect(response).to have_gitlab_http_status(400) + end + + it 'returns 400 when link_url or image_url is not valid' do + post api("/#{source_type.pluralize}/#{source.id}/badges", master), + link_url: 'whatever', image_url: 'whatever' + + expect(response).to have_gitlab_http_status(400) + end + end + end + + shared_examples 'PUT /:sources/:id/badges/:badge_id' do |source_type| + include_context 'source helpers' + + let(:source) { get_source(source_type) } + + context "with :sources == #{source_type.pluralize}" do + let(:badge) { source.badges.first } + let(:example_url) { 'http://www.example.com' } + let(:example_url2) { 'http://www.example1.com' } + + it_behaves_like 'a 404 response when source is private' do + let(:route) do + put api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", stranger), + link_url: example_url + end + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester stranger developer].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + + put api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", user), + link_url: example_url + + expect(response).to have_gitlab_http_status(403) + end + end + end + end + + context 'when authenticated as a master/owner' do + it 'updates the member' do + put api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", master), + link_url: example_url, image_url: example_url2 + + expect(response).to have_gitlab_http_status(200) + expect(json_response['link_url']).to eq(example_url) + expect(json_response['image_url']).to eq(example_url2) + expect(json_response['kind']).to eq source_type + end + end + + it 'returns 400 when link_url or image_url is not valid' do + put api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", master), + link_url: 'whatever', image_url: 'whatever' + + expect(response).to have_gitlab_http_status(400) + end + end + end + + shared_examples 'DELETE /:sources/:id/badges/:badge_id' do |source_type| + include_context 'source helpers' + + let(:source) { get_source(source_type) } + + context "with :sources == #{source_type.pluralize}" do + let(:badge) { source.badges.first } + + it_behaves_like 'a 404 response when source is private' do + let(:route) { delete api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", stranger) } + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester developer stranger].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + + delete api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", user) + + expect(response).to have_gitlab_http_status(403) + end + end + end + end + + context 'when authenticated as a master/owner' do + it 'deletes the badge' do + expect do + delete api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", master) + + expect(response).to have_gitlab_http_status(204) + end.to change { source.badges.count }.by(-1) + end + + it_behaves_like '412 response' do + let(:request) { api("/#{source_type.pluralize}/#{source.id}/badges/#{badge.id}", master) } + end + end + + it 'returns 404 if badge does not exist' do + delete api("/#{source_type.pluralize}/#{source.id}/badges/123", master) + + expect(response).to have_gitlab_http_status(404) + end + end + end + + shared_examples 'GET /:sources/:id/badges/render' do |source_type| + include_context 'source helpers' + + let(:source) { get_source(source_type) } + let(:example_url) { 'http://www.example.com' } + let(:example_url2) { 'http://www.example1.com' } + + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) do + get api("/#{source_type.pluralize}/#{source.id}/badges/render?link_url=#{example_url}&image_url=#{example_url2}", stranger) + end + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester stranger developer].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + + get api("/#{source_type.pluralize}/#{source.id}/badges/render?link_url=#{example_url}&image_url=#{example_url2}", user) + + expect(response).to have_gitlab_http_status(403) + end + end + end + end + + context 'when authenticated as a master/owner' do + it 'gets the rendered badge values' do + get api("/#{source_type.pluralize}/#{source.id}/badges/render?link_url=#{example_url}&image_url=#{example_url2}", master) + + expect(response).to have_gitlab_http_status(200) + + expect(json_response.keys).to contain_exactly('link_url', 'rendered_link_url', 'image_url', 'rendered_image_url') + expect(json_response['link_url']).to eq(example_url) + expect(json_response['image_url']).to eq(example_url2) + expect(json_response['rendered_link_url']).to eq(example_url) + expect(json_response['rendered_image_url']).to eq(example_url2) + end + end + + it 'returns 400 when link_url is not given' do + get api("/#{source_type.pluralize}/#{source.id}/badges/render?link_url=#{example_url}", master) + + expect(response).to have_gitlab_http_status(400) + end + + it 'returns 400 when image_url is not given' do + get api("/#{source_type.pluralize}/#{source.id}/badges/render?image_url=#{example_url}", master) + + expect(response).to have_gitlab_http_status(400) + end + + it 'returns 400 when link_url or image_url is not valid' do + get api("/#{source_type.pluralize}/#{source.id}/badges/render?link_url=whatever&image_url=whatever", master) + + expect(response).to have_gitlab_http_status(400) + end + end + end + + context 'when deleting a badge' do + context 'and the source is a project' do + it 'cannot delete badges owned by the project group' do + delete api("/projects/#{project.id}/badges/#{project_group.badges.first.id}", master) + + expect(response).to have_gitlab_http_status(403) + end + end + end + + describe 'Endpoints' do + %w(project group).each do |source_type| + it_behaves_like 'GET /:sources/:id/badges', source_type + it_behaves_like 'GET /:sources/:id/badges/:badge_id', source_type + it_behaves_like 'GET /:sources/:id/badges/render', source_type + it_behaves_like 'POST /:sources/:id/badges', source_type + it_behaves_like 'PUT /:sources/:id/badges/:badge_id', source_type + it_behaves_like 'DELETE /:sources/:id/badges/:badge_id', source_type + end + end + + def setup_project + create(:project, :public, :access_requestable, creator_id: master.id, namespace: project_group) do |project| + project.add_developer(developer) + project.add_master(master) + project.request_access(access_requester) + project.project_badges << build(:project_badge, project: project) + project.project_badges << build(:project_badge, project: project) + project_group.badges << build(:group_badge, group: group) + end + end + + def setup_group + create(:group, :public, :access_requestable) do |group| + group.add_developer(developer) + group.add_owner(master) + group.request_access(access_requester) + group.badges << build(:group_badge, group: group) + group.badges << build(:group_badge, group: group) + end + end +end diff --git a/spec/requests/api/group_boards_spec.rb b/spec/requests/api/group_boards_spec.rb new file mode 100644 index 00000000000..894c94688ba --- /dev/null +++ b/spec/requests/api/group_boards_spec.rb @@ -0,0 +1,54 @@ +require 'spec_helper' + +describe API::GroupBoards do + set(:user) { create(:user) } + set(:non_member) { create(:user) } + set(:guest) { create(:user) } + set(:admin) { create(:user, :admin) } + set(:board_parent) { create(:group, :public) } + + before do + board_parent.add_owner(user) + end + + set(:project) { create(:project, :public, namespace: board_parent ) } + + set(:dev_label) do + create(:group_label, title: 'Development', color: '#FFAABB', group: board_parent) + end + + set(:test_label) do + create(:group_label, title: 'Testing', color: '#FFAACC', group: board_parent) + end + + set(:ux_label) do + create(:group_label, title: 'UX', color: '#FF0000', group: board_parent) + end + + set(:dev_list) do + create(:list, label: dev_label, position: 1) + end + + set(:test_list) do + create(:list, label: test_label, position: 2) + end + + set(:milestone) { create(:milestone, group: board_parent) } + set(:board_label) { create(:group_label, group: board_parent) } + + set(:board) { create(:board, group: board_parent, lists: [dev_list, test_list]) } + + it_behaves_like 'group and project boards', "/groups/:id/boards", false + + describe 'POST /groups/:id/boards/lists' do + let(:url) { "/groups/#{board_parent.id}/boards/#{board.id}/lists" } + + it 'does not create lists for child project labels' do + project_label = create(:label, project: project) + + post api(url, user), label_id: project_label.id + + expect(response).to have_gitlab_http_status(400) + end + end +end diff --git a/spec/requests/api/pages_domains_spec.rb b/spec/requests/api/pages_domains_spec.rb index 025165622b7..dc3a116c060 100644 --- a/spec/requests/api/pages_domains_spec.rb +++ b/spec/requests/api/pages_domains_spec.rb @@ -16,7 +16,7 @@ describe API::PagesDomains do let(:route) { "/projects/#{project.id}/pages/domains" } let(:route_domain) { "/projects/#{project.id}/pages/domains/#{pages_domain.domain}" } - let(:route_domain_path) { "/projects/#{project.path_with_namespace.gsub('/', '%2F')}/pages/domains/#{pages_domain.domain}" } + let(:route_domain_path) { "/projects/#{project.full_path.gsub('/', '%2F')}/pages/domains/#{pages_domain.domain}" } let(:route_secure_domain) { "/projects/#{project.id}/pages/domains/#{pages_domain_secure.domain}" } let(:route_expired_domain) { "/projects/#{project.id}/pages/domains/#{pages_domain_expired.domain}" } let(:route_vacant_domain) { "/projects/#{project.id}/pages/domains/www.vacant-domain.test" } diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb new file mode 100644 index 00000000000..fbed527963f --- /dev/null +++ b/spec/requests/api/project_export_spec.rb @@ -0,0 +1,290 @@ +require 'spec_helper' + +describe API::ProjectExport do + set(:project) { create(:project) } + set(:project_none) { create(:project) } + set(:project_started) { create(:project) } + set(:project_finished) { create(:project) } + set(:user) { create(:user) } + set(:admin) { create(:admin) } + + let(:path) { "/projects/#{project.id}/export" } + let(:path_none) { "/projects/#{project_none.id}/export" } + let(:path_started) { "/projects/#{project_started.id}/export" } + let(:path_finished) { "/projects/#{project_finished.id}/export" } + + let(:download_path) { "/projects/#{project.id}/export/download" } + let(:download_path_none) { "/projects/#{project_none.id}/export/download" } + let(:download_path_started) { "/projects/#{project_started.id}/export/download" } + let(:download_path_finished) { "/projects/#{project_finished.id}/export/download" } + + let(:export_path) { "#{Dir.tmpdir}/project_export_spec" } + + before do + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + + # simulate exporting work directory + FileUtils.mkdir_p File.join(project_started.export_path, 'securerandom-hex') + + # simulate exported + FileUtils.mkdir_p project_finished.export_path + FileUtils.touch File.join(project_finished.export_path, '_export.tar.gz') + end + + after do + FileUtils.rm_rf(export_path, secure: true) + end + + shared_examples_for 'when project export is disabled' do + before do + stub_application_setting(project_export_enabled?: false) + end + + it_behaves_like '404 response' + end + + describe 'GET /projects/:project_id/export' do + shared_examples_for 'get project export status not found' do + it_behaves_like '404 response' do + let(:request) { get api(path, user) } + end + end + + shared_examples_for 'get project export status denied' do + it_behaves_like '403 response' do + let(:request) { get api(path, user) } + end + end + + shared_examples_for 'get project export status ok' do + it 'is none' do + get api(path_none, user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to match_response_schema('public_api/v4/project/export_status') + expect(json_response['export_status']).to eq('none') + end + + it 'is started' do + get api(path_started, user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to match_response_schema('public_api/v4/project/export_status') + expect(json_response['export_status']).to eq('started') + end + + it 'is finished' do + get api(path_finished, user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to match_response_schema('public_api/v4/project/export_status') + expect(json_response['export_status']).to eq('finished') + end + end + + it_behaves_like 'when project export is disabled' do + let(:request) { get api(path, admin) } + end + + context 'when project export is enabled' do + context 'when user is an admin' do + let(:user) { admin } + + it_behaves_like 'get project export status ok' + end + + context 'when user is a master' do + before do + project.add_master(user) + project_none.add_master(user) + project_started.add_master(user) + project_finished.add_master(user) + end + + it_behaves_like 'get project export status ok' + end + + context 'when user is a developer' do + before do + project.add_developer(user) + end + + it_behaves_like 'get project export status denied' + end + + context 'when user is a reporter' do + before do + project.add_reporter(user) + end + + it_behaves_like 'get project export status denied' + end + + context 'when user is a guest' do + before do + project.add_guest(user) + end + + it_behaves_like 'get project export status denied' + end + + context 'when user is not a member' do + it_behaves_like 'get project export status not found' + end + end + end + + describe 'GET /projects/:project_id/export/download' do + shared_examples_for 'get project export download not found' do + it_behaves_like '404 response' do + let(:request) { get api(download_path, user) } + end + end + + shared_examples_for 'get project export download denied' do + it_behaves_like '403 response' do + let(:request) { get api(download_path, user) } + end + end + + shared_examples_for 'get project export download' do + it_behaves_like '404 response' do + let(:request) { get api(download_path_none, user) } + end + + it_behaves_like '404 response' do + let(:request) { get api(download_path_started, user) } + end + + it 'downloads' do + get api(download_path_finished, user) + + expect(response).to have_gitlab_http_status(200) + end + end + + it_behaves_like 'when project export is disabled' do + let(:request) { get api(download_path, admin) } + end + + context 'when project export is enabled' do + context 'when user is an admin' do + let(:user) { admin } + + it_behaves_like 'get project export download' + end + + context 'when user is a master' do + before do + project.add_master(user) + project_none.add_master(user) + project_started.add_master(user) + project_finished.add_master(user) + end + + it_behaves_like 'get project export download' + end + + context 'when user is a developer' do + before do + project.add_developer(user) + end + + it_behaves_like 'get project export download denied' + end + + context 'when user is a reporter' do + before do + project.add_reporter(user) + end + + it_behaves_like 'get project export download denied' + end + + context 'when user is a guest' do + before do + project.add_guest(user) + end + + it_behaves_like 'get project export download denied' + end + + context 'when user is not a member' do + it_behaves_like 'get project export download not found' + end + end + end + + describe 'POST /projects/:project_id/export' do + shared_examples_for 'post project export start not found' do + it_behaves_like '404 response' do + let(:request) { post api(path, user) } + end + end + + shared_examples_for 'post project export start denied' do + it_behaves_like '403 response' do + let(:request) { post api(path, user) } + end + end + + shared_examples_for 'post project export start' do + it 'starts' do + post api(path, user) + + expect(response).to have_gitlab_http_status(202) + end + end + + it_behaves_like 'when project export is disabled' do + let(:request) { post api(path, admin) } + end + + context 'when project export is enabled' do + context 'when user is an admin' do + let(:user) { admin } + + it_behaves_like 'post project export start' + end + + context 'when user is a master' do + before do + project.add_master(user) + project_none.add_master(user) + project_started.add_master(user) + project_finished.add_master(user) + end + + it_behaves_like 'post project export start' + end + + context 'when user is a developer' do + before do + project.add_developer(user) + end + + it_behaves_like 'post project export start denied' + end + + context 'when user is a reporter' do + before do + project.add_reporter(user) + end + + it_behaves_like 'post project export start denied' + end + + context 'when user is a guest' do + before do + project.add_guest(user) + end + + it_behaves_like 'post project export start denied' + end + + context 'when user is not a member' do + it_behaves_like 'post project export start not found' + end + end + end +end diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb index 72cafac3f90..95c23726a79 100644 --- a/spec/requests/api/runner_spec.rb +++ b/spec/requests/api/runner_spec.rb @@ -698,10 +698,10 @@ describe API::Runner do end end - context 'when tace is given' do + context 'when trace is given' do it 'creates a trace artifact' do allow(BuildFinishedWorker).to receive(:perform_async).with(job.id) do - CreateTraceArtifactWorker.new.perform(job.id) + ArchiveTraceWorker.new.perform(job.id) end update_job(state: 'success', trace: 'BUILD TRACE UPDATED') @@ -1100,11 +1100,13 @@ describe API::Runner do context 'posts artifacts file and metadata file' do let!(:artifacts) { file_upload } + let!(:artifacts_sha256) { Digest::SHA256.file(artifacts.path).hexdigest } let!(:metadata) { file_upload2 } let(:stored_artifacts_file) { job.reload.artifacts_file.file } let(:stored_metadata_file) { job.reload.artifacts_metadata.file } let(:stored_artifacts_size) { job.reload.artifacts_size } + let(:stored_artifacts_sha256) { job.reload.job_artifacts_archive.file_sha256 } before do post(api("/jobs/#{job.id}/artifacts"), post_data, headers_with_token) @@ -1114,6 +1116,7 @@ describe API::Runner do let(:post_data) do { 'file.path' => artifacts.path, 'file.name' => artifacts.original_filename, + 'file.sha256' => artifacts_sha256, 'metadata.path' => metadata.path, 'metadata.name' => metadata.original_filename } end @@ -1123,6 +1126,7 @@ describe API::Runner do expect(stored_artifacts_file.original_filename).to eq(artifacts.original_filename) expect(stored_metadata_file.original_filename).to eq(metadata.original_filename) expect(stored_artifacts_size).to eq(72821) + expect(stored_artifacts_sha256).to eq(artifacts_sha256) end end diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb index 0467e0251b3..6dbbb1ad7bb 100644 --- a/spec/requests/git_http_spec.rb +++ b/spec/requests/git_http_spec.rb @@ -795,9 +795,9 @@ describe 'Git HTTP requests' do let(:path) { 'doesnt/exist.git' } before do - allow(Gitlab::Auth::LDAP::Config).to receive(:enabled?).and_return(true) - allow(Gitlab::Auth::LDAP::Authentication).to receive(:login).and_return(nil) - allow(Gitlab::Auth::LDAP::Authentication).to receive(:login).with(user.username, user.password).and_return(user) + allow(Gitlab::Auth::OAuth::Provider).to receive(:enabled?).and_return(true) + allow_any_instance_of(Gitlab::Auth::LDAP::Authentication).to receive(:login).and_return(nil) + allow_any_instance_of(Gitlab::Auth::LDAP::Authentication).to receive(:login).with(user.username, user.password).and_return(user) end it_behaves_like 'pulls require Basic HTTP Authentication' diff --git a/spec/services/auth/container_registry_authentication_service_spec.rb b/spec/services/auth/container_registry_authentication_service_spec.rb index 9128280eb5a..290eeae828e 100644 --- a/spec/services/auth/container_registry_authentication_service_spec.rb +++ b/spec/services/auth/container_registry_authentication_service_spec.rb @@ -172,7 +172,7 @@ describe Auth::ContainerRegistryAuthenticationService do end let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:*" } + { scope: "repository:#{project.full_path}:*" } end it_behaves_like 'an inaccessible' @@ -200,7 +200,7 @@ describe Auth::ContainerRegistryAuthenticationService do end let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:*" } + { scope: "repository:#{project.full_path}:*" } end it_behaves_like 'an inaccessible' @@ -239,7 +239,7 @@ describe Auth::ContainerRegistryAuthenticationService do end let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:*" } + { scope: "repository:#{project.full_path}:*" } end it_behaves_like 'an inaccessible' @@ -270,7 +270,7 @@ describe Auth::ContainerRegistryAuthenticationService do context 'disallow anyone to delete images' do let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:*" } + { scope: "repository:#{project.full_path}:*" } end it_behaves_like 'an inaccessible' @@ -311,7 +311,7 @@ describe Auth::ContainerRegistryAuthenticationService do context 'disallow anyone to delete images' do let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:*" } + { scope: "repository:#{project.full_path}:*" } end it_behaves_like 'an inaccessible' @@ -323,7 +323,7 @@ describe Auth::ContainerRegistryAuthenticationService do context 'disallow anyone to pull or push images' do let(:current_user) { create(:user, external: true) } let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:pull,push" } + { scope: "repository:#{project.full_path}:pull,push" } end it_behaves_like 'an inaccessible' @@ -333,7 +333,7 @@ describe Auth::ContainerRegistryAuthenticationService do context 'disallow anyone to delete images' do let(:current_user) { create(:user, external: true) } let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:*" } + { scope: "repository:#{project.full_path}:*" } end it_behaves_like 'an inaccessible' @@ -359,7 +359,7 @@ describe Auth::ContainerRegistryAuthenticationService do context 'allow to delete images' do let(:current_params) do - { scope: "repository:#{current_project.path_with_namespace}:*" } + { scope: "repository:#{current_project.full_path}:*" } end it_behaves_like 'a deletable' do @@ -398,7 +398,7 @@ describe Auth::ContainerRegistryAuthenticationService do context 'disallow to delete images' do let(:current_params) do - { scope: "repository:#{current_project.path_with_namespace}:*" } + { scope: "repository:#{current_project.full_path}:*" } end it_behaves_like 'an inaccessible' do diff --git a/spec/services/boards/create_service_spec.rb b/spec/services/boards/create_service_spec.rb index db51a524e79..a715261cd6c 100644 --- a/spec/services/boards/create_service_spec.rb +++ b/spec/services/boards/create_service_spec.rb @@ -2,34 +2,20 @@ require 'spec_helper' describe Boards::CreateService do describe '#execute' do - let(:project) { create(:project) } + context 'when board parent is a project' do + let(:parent) { create(:project) } - subject(:service) { described_class.new(project, double) } + subject(:service) { described_class.new(parent, double) } - context 'when project does not have a board' do - it 'creates a new board' do - expect { service.execute }.to change(Board, :count).by(1) - end - - it 'creates the default lists' do - board = service.execute - - expect(board.lists.size).to eq 2 - expect(board.lists.first).to be_backlog - expect(board.lists.last).to be_closed - end + it_behaves_like 'boards create service' end - context 'when project has a board' do - before do - create(:board, project: project) - end + context 'when board parent is a group' do + let(:parent) { create(:group) } - it 'does not create a new board' do - expect(service).to receive(:can_create_board?) { false } + subject(:service) { described_class.new(parent, double) } - expect { service.execute }.not_to change(project.boards, :count) - end + it_behaves_like 'boards create service' end end end diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb index ff5733b7064..b4efa3e44b6 100644 --- a/spec/services/boards/issues/list_service_spec.rb +++ b/spec/services/boards/issues/list_service_spec.rb @@ -2,98 +2,103 @@ require 'spec_helper' describe Boards::Issues::ListService do describe '#execute' do - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:board) { create(:board, project: project) } - - let(:bug) { create(:label, project: project, name: 'Bug') } - let(:development) { create(:label, project: project, name: 'Development') } - let(:testing) { create(:label, project: project, name: 'Testing') } - let(:p1) { create(:label, title: 'P1', project: project, priority: 1) } - let(:p2) { create(:label, title: 'P2', project: project, priority: 2) } - let(:p3) { create(:label, title: 'P3', project: project, priority: 3) } - - let!(:backlog) { create(:backlog_list, board: board) } - let!(:list1) { create(:list, board: board, label: development, position: 0) } - let!(:list2) { create(:list, board: board, label: testing, position: 1) } - let!(:closed) { create(:closed_list, board: board) } - - let!(:opened_issue1) { create(:labeled_issue, project: project, labels: [bug]) } - let!(:opened_issue2) { create(:labeled_issue, project: project, labels: [p2]) } - let!(:reopened_issue1) { create(:issue, :opened, project: project) } - - let!(:list1_issue1) { create(:labeled_issue, project: project, labels: [p2, development]) } - let!(:list1_issue2) { create(:labeled_issue, project: project, labels: [development]) } - let!(:list1_issue3) { create(:labeled_issue, project: project, labels: [development, p1]) } - let!(:list2_issue1) { create(:labeled_issue, project: project, labels: [testing]) } - - let!(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug]) } - let!(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3]) } - let!(:closed_issue3) { create(:issue, :closed, project: project) } - let!(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1]) } - let!(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development]) } - - before do - project.add_developer(user) - end - - it 'delegates search to IssuesFinder' do - params = { board_id: board.id, id: list1.id } - - expect_any_instance_of(IssuesFinder).to receive(:execute).once.and_call_original + context 'when parent is a project' do + let(:user) { create(:user) } + let(:project) { create(:project) } + let(:board) { create(:board, project: project) } + + let(:m1) { create(:milestone, project: project) } + let(:m2) { create(:milestone, project: project) } + + let(:bug) { create(:label, project: project, name: 'Bug') } + let(:development) { create(:label, project: project, name: 'Development') } + let(:testing) { create(:label, project: project, name: 'Testing') } + let(:p1) { create(:label, title: 'P1', project: project, priority: 1) } + let(:p2) { create(:label, title: 'P2', project: project, priority: 2) } + let(:p3) { create(:label, title: 'P3', project: project, priority: 3) } + + let!(:backlog) { create(:backlog_list, board: board) } + let!(:list1) { create(:list, board: board, label: development, position: 0) } + let!(:list2) { create(:list, board: board, label: testing, position: 1) } + let!(:closed) { create(:closed_list, board: board) } + + let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) } + let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) } + let!(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Issue 3' ) } + + let!(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, development]) } + let!(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) } + let!(:list1_issue3) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1]) } + let!(:list2_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [testing]) } + + let!(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug]) } + let!(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3]) } + let!(:closed_issue3) { create(:issue, :closed, project: project) } + let!(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1]) } + let!(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development]) } + + let(:parent) { project } + + before do + project.add_developer(user) + end - described_class.new(project, user, params).execute + it_behaves_like 'issues list service' end - context 'issues are ordered by priority' do - it 'returns opened issues when list_id is missing' do - params = { board_id: board.id } - - issues = described_class.new(project, user, params).execute - - expect(issues).to eq [opened_issue2, reopened_issue1, opened_issue1] - end + context 'when parent is a group' do + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, :empty_repo, namespace: group) } + let(:project1) { create(:project, :empty_repo, namespace: group) } + let(:board) { create(:board, group: group) } - it 'returns opened issues when listing issues from Backlog' do - params = { board_id: board.id, id: backlog.id } + let(:m1) { create(:milestone, group: group) } + let(:m2) { create(:milestone, group: group) } - issues = described_class.new(project, user, params).execute + let(:bug) { create(:group_label, group: group, name: 'Bug') } + let(:development) { create(:group_label, group: group, name: 'Development') } + let(:testing) { create(:group_label, group: group, name: 'Testing') } - expect(issues).to eq [opened_issue2, reopened_issue1, opened_issue1] - end + let(:p1) { create(:group_label, title: 'P1', group: group) } + let(:p2) { create(:group_label, title: 'P2', group: group) } + let(:p3) { create(:group_label, title: 'P3', group: group) } - it 'returns closed issues when listing issues from Closed' do - params = { board_id: board.id, id: closed.id } + let(:p1_project) { create(:label, title: 'P1_project', project: project, priority: 1) } + let(:p2_project) { create(:label, title: 'P2_project', project: project, priority: 2) } + let(:p3_project) { create(:label, title: 'P3_project', project: project, priority: 3) } - issues = described_class.new(project, user, params).execute + let(:p1_project1) { create(:label, title: 'P1_project1', project: project1, priority: 1) } + let(:p2_project1) { create(:label, title: 'P2_project1', project: project1, priority: 2) } + let(:p3_project1) { create(:label, title: 'P3_project1', project: project1, priority: 3) } - expect(issues).to eq [closed_issue4, closed_issue2, closed_issue5, closed_issue3, closed_issue1] - end + let!(:backlog) { create(:backlog_list, board: board) } + let!(:list1) { create(:list, board: board, label: development, position: 0) } + let!(:list2) { create(:list, board: board, label: testing, position: 1) } + let!(:closed) { create(:closed_list, board: board) } - it 'returns opened issues that have label list applied when listing issues from a label list' do - params = { board_id: board.id, id: list1.id } + let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) } + let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2, p2_project]) } + let!(:reopened_issue1) { create(:issue, state: 'opened', project: project, title: 'Issue 3', closed_at: Time.now ) } - issues = described_class.new(project, user, params).execute + let!(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, p2_project, development]) } + let!(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) } + let!(:list1_issue3) { create(:labeled_issue, project: project1, milestone: m1, labels: [development, p1, p1_project1]) } + let!(:list2_issue1) { create(:labeled_issue, project: project1, milestone: m1, labels: [testing]) } - expect(issues).to eq [list1_issue3, list1_issue1, list1_issue2] - end - end + let!(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug]) } + let!(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3, p3_project]) } + let!(:closed_issue3) { create(:issue, :closed, project: project1) } + let!(:closed_issue4) { create(:labeled_issue, :closed, project: project1, labels: [p1, p1_project1]) } + let!(:closed_issue5) { create(:labeled_issue, :closed, project: project1, labels: [development]) } - context 'with list that does not belong to the board' do - it 'raises an error' do - list = create(:list) - service = described_class.new(project, user, board_id: board.id, id: list.id) + let(:parent) { group } - expect { service.execute }.to raise_error(ActiveRecord::RecordNotFound) + before do + group.add_developer(user) end - end - - context 'with invalid list id' do - it 'raises an error' do - service = described_class.new(project, user, board_id: board.id, id: nil) - expect { service.execute }.to raise_error(ActiveRecord::RecordNotFound) - end + it_behaves_like 'issues list service' end end end diff --git a/spec/services/boards/issues/move_service_spec.rb b/spec/services/boards/issues/move_service_spec.rb index 280e411683e..0a6b6d880d3 100644 --- a/spec/services/boards/issues/move_service_spec.rb +++ b/spec/services/boards/issues/move_service_spec.rb @@ -2,108 +2,53 @@ require 'spec_helper' describe Boards::Issues::MoveService do describe '#execute' do - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:board1) { create(:board, project: project) } - - let(:bug) { create(:label, project: project, name: 'Bug') } - let(:development) { create(:label, project: project, name: 'Development') } - let(:testing) { create(:label, project: project, name: 'Testing') } - - let!(:list1) { create(:list, board: board1, label: development, position: 0) } - let!(:list2) { create(:list, board: board1, label: testing, position: 1) } - let!(:closed) { create(:closed_list, board: board1) } - - before do - project.add_developer(user) - end - - context 'when moving an issue between lists' do - let(:issue) { create(:labeled_issue, project: project, labels: [bug, development]) } - let(:params) { { board_id: board1.id, from_list_id: list1.id, to_list_id: list2.id } } - - it 'delegates the label changes to Issues::UpdateService' do - expect_any_instance_of(Issues::UpdateService).to receive(:execute).with(issue).once - - described_class.new(project, user, params).execute(issue) - end - - it 'removes the label from the list it came from and adds the label of the list it goes to' do - described_class.new(project, user, params).execute(issue) - - expect(issue.reload.labels).to contain_exactly(bug, testing) - end - end - - context 'when moving to closed' do + context 'when parent is a project' do + let(:user) { create(:user) } + let(:project) { create(:project) } + let(:board1) { create(:board, project: project) } let(:board2) { create(:board, project: project) } + + let(:bug) { create(:label, project: project, name: 'Bug') } + let(:development) { create(:label, project: project, name: 'Development') } + let(:testing) { create(:label, project: project, name: 'Testing') } let(:regression) { create(:label, project: project, name: 'Regression') } - let!(:list3) { create(:list, board: board2, label: regression, position: 1) } - let(:issue) { create(:labeled_issue, project: project, labels: [bug, development, testing, regression]) } - let(:params) { { board_id: board1.id, from_list_id: list2.id, to_list_id: closed.id } } + let!(:list1) { create(:list, board: board1, label: development, position: 0) } + let!(:list2) { create(:list, board: board1, label: testing, position: 1) } + let!(:closed) { create(:closed_list, board: board1) } - it 'delegates the close proceedings to Issues::CloseService' do - expect_any_instance_of(Issues::CloseService).to receive(:execute).with(issue).once + let(:parent) { project } - described_class.new(project, user, params).execute(issue) + before do + parent.add_developer(user) end - it 'removes all list-labels from project boards and close the issue' do - described_class.new(project, user, params).execute(issue) - issue.reload - - expect(issue.labels).to contain_exactly(bug) - expect(issue).to be_closed - end + it_behaves_like 'issues move service' end - context 'when moving from closed' do - let(:issue) { create(:labeled_issue, :closed, project: project, labels: [bug]) } - let(:params) { { board_id: board1.id, from_list_id: closed.id, to_list_id: list2.id } } - - it 'delegates the re-open proceedings to Issues::ReopenService' do - expect_any_instance_of(Issues::ReopenService).to receive(:execute).with(issue).once - - described_class.new(project, user, params).execute(issue) - end - - it 'adds the label of the list it goes to and reopen the issue' do - described_class.new(project, user, params).execute(issue) - issue.reload - - expect(issue.labels).to contain_exactly(bug, testing) - expect(issue).to be_opened - end - end + context 'when parent is a group' do + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, namespace: group) } + let(:board1) { create(:board, group: group) } + let(:board2) { create(:board, group: group) } - context 'when moving to same list' do - let(:issue) { create(:labeled_issue, project: project, labels: [bug, development]) } - let(:issue1) { create(:labeled_issue, project: project, labels: [bug, development]) } - let(:issue2) { create(:labeled_issue, project: project, labels: [bug, development]) } - let(:params) { { board_id: board1.id, from_list_id: list1.id, to_list_id: list1.id } } + let(:bug) { create(:group_label, group: group, name: 'Bug') } + let(:development) { create(:group_label, group: group, name: 'Development') } + let(:testing) { create(:group_label, group: group, name: 'Testing') } + let(:regression) { create(:group_label, group: group, name: 'Regression') } - it 'returns false' do - expect(described_class.new(project, user, params).execute(issue)).to eq false - end + let!(:list1) { create(:list, board: board1, label: development, position: 0) } + let!(:list2) { create(:list, board: board1, label: testing, position: 1) } + let!(:closed) { create(:closed_list, board: board1) } - it 'keeps issues labels' do - described_class.new(project, user, params).execute(issue) + let(:parent) { group } - expect(issue.reload.labels).to contain_exactly(bug, development) + before do + parent.add_developer(user) end - it 'sorts issues' do - [issue, issue1, issue2].each do |issue| - issue.move_to_end && issue.save! - end - - params.merge!(move_after_id: issue1.id, move_before_id: issue2.id) - - described_class.new(project, user, params).execute(issue) - - expect(issue.relative_position).to be_between(issue1.relative_position, issue2.relative_position) - end + it_behaves_like 'issues move service' end end end diff --git a/spec/services/boards/list_service_spec.rb b/spec/services/boards/list_service_spec.rb index 1d0be99fb35..7518e9e9b75 100644 --- a/spec/services/boards/list_service_spec.rb +++ b/spec/services/boards/list_service_spec.rb @@ -2,36 +2,20 @@ require 'spec_helper' describe Boards::ListService do describe '#execute' do - let(:project) { create(:project) } + context 'when board parent is a project' do + let(:parent) { create(:project) } - subject(:service) { described_class.new(project, double) } + subject(:service) { described_class.new(parent, double) } - context 'when project does not have a board' do - it 'creates a new project board' do - expect { service.execute }.to change(project.boards, :count).by(1) - end - - it 'delegates the project board creation to Boards::CreateService' do - expect_any_instance_of(Boards::CreateService).to receive(:execute).once - - service.execute - end + it_behaves_like 'boards list service' end - context 'when project has a board' do - before do - create(:board, project: project) - end - - it 'does not create a new board' do - expect { service.execute }.not_to change(project.boards, :count) - end - end + context 'when board parent is a group' do + let(:parent) { create(:group) } - it 'returns project boards' do - board = create(:board, project: project) + subject(:service) { described_class.new(parent, double) } - expect(service.execute).to match_array [board] + it_behaves_like 'boards list service' end end end diff --git a/spec/services/boards/lists/create_service_spec.rb b/spec/services/boards/lists/create_service_spec.rb index d5322e1bb21..7d3f5f86deb 100644 --- a/spec/services/boards/lists/create_service_spec.rb +++ b/spec/services/boards/lists/create_service_spec.rb @@ -2,62 +2,77 @@ require 'spec_helper' describe Boards::Lists::CreateService do describe '#execute' do - let(:project) { create(:project) } - let(:board) { create(:board, project: project) } - let(:user) { create(:user) } - let(:label) { create(:label, project: project, name: 'in-progress') } + shared_examples 'creating board lists' do + let(:user) { create(:user) } - subject(:service) { described_class.new(project, user, label_id: label.id) } + subject(:service) { described_class.new(parent, user, label_id: label.id) } - before do - project.add_developer(user) - end + before do + parent.add_developer(user) + end - context 'when board lists is empty' do - it 'creates a new list at beginning of the list' do - list = service.execute(board) + context 'when board lists is empty' do + it 'creates a new list at beginning of the list' do + list = service.execute(board) - expect(list.position).to eq 0 + expect(list.position).to eq 0 + end end - end - context 'when board lists has the done list' do - it 'creates a new list at beginning of the list' do - list = service.execute(board) + context 'when board lists has the done list' do + it 'creates a new list at beginning of the list' do + list = service.execute(board) - expect(list.position).to eq 0 + expect(list.position).to eq 0 + end end - end - context 'when board lists has labels lists' do - it 'creates a new list at end of the lists' do - create(:list, board: board, position: 0) - create(:list, board: board, position: 1) + context 'when board lists has labels lists' do + it 'creates a new list at end of the lists' do + create(:list, board: board, position: 0) + create(:list, board: board, position: 1) - list = service.execute(board) + list = service.execute(board) - expect(list.position).to eq 2 + expect(list.position).to eq 2 + end end - end - context 'when board lists has label and done lists' do - it 'creates a new list at end of the label lists' do - list1 = create(:list, board: board, position: 0) + context 'when board lists has label and done lists' do + it 'creates a new list at end of the label lists' do + list1 = create(:list, board: board, position: 0) - list2 = service.execute(board) + list2 = service.execute(board) - expect(list1.reload.position).to eq 0 - expect(list2.reload.position).to eq 1 + expect(list1.reload.position).to eq 0 + expect(list2.reload.position).to eq 1 + end end - end - context 'when provided label does not belongs to the project' do - it 'raises an error' do - label = create(:label, name: 'in-development') - service = described_class.new(project, user, label_id: label.id) + context 'when provided label does not belongs to the parent' do + it 'raises an error' do + label = create(:label, name: 'in-development') + service = described_class.new(parent, user, label_id: label.id) - expect { service.execute(board) }.to raise_error(ActiveRecord::RecordNotFound) + expect { service.execute(board) }.to raise_error(ActiveRecord::RecordNotFound) + end end end + + context 'when board parent is a project' do + let(:parent) { create(:project) } + let(:board) { create(:board, project: parent) } + let(:label) { create(:label, project: parent, name: 'in-progress') } + + it_behaves_like 'creating board lists' + end + + context 'when board parent is a group' do + let(:parent) { create(:group) } + let(:board) { create(:board, group: parent) } + let(:label) { create(:group_label, group: parent, name: 'in-progress') } + + it_behaves_like 'creating board lists' + end end end diff --git a/spec/services/boards/lists/destroy_service_spec.rb b/spec/services/boards/lists/destroy_service_spec.rb index bd98625b44f..3c4eb6b3fc5 100644 --- a/spec/services/boards/lists/destroy_service_spec.rb +++ b/spec/services/boards/lists/destroy_service_spec.rb @@ -2,37 +2,24 @@ require 'spec_helper' describe Boards::Lists::DestroyService do describe '#execute' do - let(:project) { create(:project) } - let(:board) { create(:board, project: project) } - let(:user) { create(:user) } + context 'when board parent is a project' do + let(:project) { create(:project) } + let(:board) { create(:board, project: project) } + let(:user) { create(:user) } - context 'when list type is label' do - it 'removes list from board' do - list = create(:list, board: board) - service = described_class.new(project, user) + let(:parent) { project } - expect { service.execute(list) }.to change(board.lists, :count).by(-1) - end - - it 'decrements position of higher lists' do - development = create(:list, board: board, position: 0) - review = create(:list, board: board, position: 1) - staging = create(:list, board: board, position: 2) - closed = board.closed_list - - described_class.new(project, user).execute(development) - - expect(review.reload.position).to eq 0 - expect(staging.reload.position).to eq 1 - expect(closed.reload.position).to be_nil - end + it_behaves_like 'lists destroy service' end - it 'does not remove list from board when list type is closed' do - list = board.closed_list - service = described_class.new(project, user) + context 'when board parent is a group' do + let(:group) { create(:group) } + let(:board) { create(:board, group: group) } + let(:user) { create(:user) } + + let(:parent) { group } - expect { service.execute(list) }.not_to change(board.lists, :count) + it_behaves_like 'lists destroy service' end end end diff --git a/spec/services/boards/lists/list_service_spec.rb b/spec/services/boards/lists/list_service_spec.rb index b189857e4f4..24e04eed642 100644 --- a/spec/services/boards/lists/list_service_spec.rb +++ b/spec/services/boards/lists/list_service_spec.rb @@ -1,33 +1,25 @@ require 'spec_helper' describe Boards::Lists::ListService do - let(:project) { create(:project) } - let(:board) { create(:board, project: project) } - let(:label) { create(:label, project: project) } - let!(:list) { create(:list, board: board, label: label) } - let(:service) { described_class.new(project, double) } - describe '#execute' do - context 'when the board has a backlog list' do - let!(:backlog_list) { create(:backlog_list, board: board) } - - it 'does not create a backlog list' do - expect { service.execute(board) }.not_to change(board.lists, :count) - end + context 'when board parent is a project' do + let(:project) { create(:project) } + let(:board) { create(:board, project: project) } + let(:label) { create(:label, project: project) } + let!(:list) { create(:list, board: board, label: label) } + let(:service) { described_class.new(project, double) } - it "returns board's lists" do - expect(service.execute(board)).to eq [backlog_list, list, board.closed_list] - end + it_behaves_like 'lists list service' end - context 'when the board does not have a backlog list' do - it 'creates a backlog list' do - expect { service.execute(board) }.to change(board.lists, :count).by(1) - end + context 'when board parent is a group' do + let(:group) { create(:group) } + let(:board) { create(:board, group: group) } + let(:label) { create(:group_label, group: group) } + let!(:list) { create(:list, board: board, label: label) } + let(:service) { described_class.new(group, double) } - it "returns board's lists" do - expect(service.execute(board)).to eq [board.backlog_list, list, board.closed_list] - end + it_behaves_like 'lists list service' end end end diff --git a/spec/services/boards/lists/move_service_spec.rb b/spec/services/boards/lists/move_service_spec.rb index a9d218bad49..16dfb2ae6af 100644 --- a/spec/services/boards/lists/move_service_spec.rb +++ b/spec/services/boards/lists/move_service_spec.rb @@ -2,100 +2,24 @@ require 'spec_helper' describe Boards::Lists::MoveService do describe '#execute' do - let(:project) { create(:project) } - let(:board) { create(:board, project: project) } - let(:user) { create(:user) } + context 'when board parent is a project' do + let(:project) { create(:project) } + let(:board) { create(:board, project: project) } + let(:user) { create(:user) } - let!(:planning) { create(:list, board: board, position: 0) } - let!(:development) { create(:list, board: board, position: 1) } - let!(:review) { create(:list, board: board, position: 2) } - let!(:staging) { create(:list, board: board, position: 3) } - let!(:closed) { create(:closed_list, board: board) } + let(:parent) { project } - context 'when list type is set to label' do - it 'keeps position of lists when new position is nil' do - service = described_class.new(project, user, position: nil) - - service.execute(planning) - - expect(current_list_positions).to eq [0, 1, 2, 3] - end - - it 'keeps position of lists when new positon is equal to old position' do - service = described_class.new(project, user, position: planning.position) - - service.execute(planning) - - expect(current_list_positions).to eq [0, 1, 2, 3] - end - - it 'keeps position of lists when new positon is negative' do - service = described_class.new(project, user, position: -1) - - service.execute(planning) - - expect(current_list_positions).to eq [0, 1, 2, 3] - end - - it 'keeps position of lists when new positon is equal to number of labels lists' do - service = described_class.new(project, user, position: board.lists.label.size) - - service.execute(planning) - - expect(current_list_positions).to eq [0, 1, 2, 3] - end - - it 'keeps position of lists when new positon is greater than number of labels lists' do - service = described_class.new(project, user, position: board.lists.label.size + 1) - - service.execute(planning) - - expect(current_list_positions).to eq [0, 1, 2, 3] - end - - it 'increments position of intermediate lists when new positon is equal to first position' do - service = described_class.new(project, user, position: 0) - - service.execute(staging) - - expect(current_list_positions).to eq [1, 2, 3, 0] - end - - it 'decrements position of intermediate lists when new positon is equal to last position' do - service = described_class.new(project, user, position: board.lists.label.last.position) - - service.execute(planning) - - expect(current_list_positions).to eq [3, 0, 1, 2] - end - - it 'decrements position of intermediate lists when new position is greater than old position' do - service = described_class.new(project, user, position: 2) - - service.execute(planning) - - expect(current_list_positions).to eq [2, 0, 1, 3] - end - - it 'increments position of intermediate lists when new position is lower than old position' do - service = described_class.new(project, user, position: 1) - - service.execute(staging) - - expect(current_list_positions).to eq [0, 2, 3, 1] - end + it_behaves_like 'lists move service' end - it 'keeps position of lists when list type is closed' do - service = described_class.new(project, user, position: 2) + context 'when board parent is a group' do + let(:group) { create(:group) } + let(:board) { create(:board, group: group) } + let(:user) { create(:user) } - service.execute(closed) + let(:parent) { group } - expect(current_list_positions).to eq [0, 1, 2, 3] + it_behaves_like 'lists move service' end end - - def current_list_positions - [planning, development, review, staging].map { |list| list.reload.position } - end end diff --git a/spec/services/ci/create_trace_artifact_service_spec.rb b/spec/services/ci/create_trace_artifact_service_spec.rb deleted file mode 100644 index 8c5e8e438c7..00000000000 --- a/spec/services/ci/create_trace_artifact_service_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'spec_helper' - -describe Ci::CreateTraceArtifactService do - describe '#execute' do - subject { described_class.new(nil, nil).execute(job) } - - context 'when the job does not have trace artifact' do - context 'when the job has a trace file' do - let!(:job) { create(:ci_build, :trace_live) } - let!(:legacy_path) { job.trace.read { |stream| return stream.path } } - let!(:legacy_checksum) { Digest::SHA256.file(legacy_path).hexdigest } - let(:new_path) { job.job_artifacts_trace.file.path } - let(:new_checksum) { Digest::SHA256.file(new_path).hexdigest } - - it { expect(File.exist?(legacy_path)).to be_truthy } - - it 'creates trace artifact' do - expect { subject }.to change { Ci::JobArtifact.count }.by(1) - - expect(File.exist?(legacy_path)).to be_falsy - expect(File.exist?(new_path)).to be_truthy - expect(new_checksum).to eq(legacy_checksum) - expect(job.job_artifacts_trace.file.exists?).to be_truthy - expect(job.job_artifacts_trace.file.filename).to eq('job.log') - end - - context 'when failed to create trace artifact record' do - before do - # When ActiveRecord error happens - allow_any_instance_of(Ci::JobArtifact).to receive(:save).and_return(false) - allow_any_instance_of(Ci::JobArtifact).to receive_message_chain(:errors, :full_messages) - .and_return("Error") - - subject rescue nil - - job.reload - end - - it 'keeps legacy trace and removes trace artifact' do - expect(File.exist?(legacy_path)).to be_truthy - expect(job.job_artifacts_trace).to be_nil - end - end - end - - context 'when the job does not have a trace file' do - let!(:job) { create(:ci_build) } - - it 'does not create trace artifact' do - expect { subject }.not_to change { Ci::JobArtifact.count } - end - end - end - - context 'when the job has already had trace artifact' do - let!(:job) { create(:ci_build, :trace_artifact) } - - it 'does not create trace artifact' do - expect { subject }.not_to change { Ci::JobArtifact.count } - end - end - end -end diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index bfb86284d86..934106627a9 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -34,6 +34,7 @@ describe Projects::UpdatePagesService do context 'with expiry date' do before do build.artifacts_expire_in = "2 days" + build.save! end it "doesn't delete artifacts" do @@ -105,6 +106,7 @@ describe Projects::UpdatePagesService do context 'with expiry date' do before do build.artifacts_expire_in = "2 days" + build.save! end it "doesn't delete artifacts" do @@ -159,6 +161,20 @@ describe Projects::UpdatePagesService do expect(execute).not_to eq(:success) end + + context 'when timeout happens by DNS error' do + before do + allow_any_instance_of(described_class) + .to receive(:extract_zip_archive!).and_raise(SocketError) + end + + it 'raises an error' do + expect { execute }.to raise_error(SocketError) + + build.reload + expect(build.artifacts?).to eq(true) + end + end end end diff --git a/spec/services/prometheus/adapter_service_spec.rb b/spec/services/prometheus/adapter_service_spec.rb new file mode 100644 index 00000000000..335fc5844aa --- /dev/null +++ b/spec/services/prometheus/adapter_service_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe Prometheus::AdapterService do + let(:project) { create(:project) } + subject { described_class.new(project) } + + describe '#prometheus_adapter' do + let(:cluster) { create(:cluster, :provided_by_user, environment_scope: '*', projects: [project]) } + + context 'prometheus service can execute queries' do + let(:prometheus_service) { double(:prometheus_service, can_query?: true) } + + before do + allow(project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service + end + + it 'return prometheus service as prometheus adapter' do + expect(subject.prometheus_adapter).to eq(prometheus_service) + end + end + + context "prometheus service can't execute queries" do + let(:prometheus_service) { double(:prometheus_service, can_query?: false) } + + context 'with cluster with prometheus installed' do + let!(:prometheus) { create(:clusters_applications_prometheus, :installed, cluster: cluster) } + + it 'returns application handling all environments' do + expect(subject.prometheus_adapter).to eq(prometheus) + end + end + + context 'with cluster without prometheus installed' do + it 'returns nil' do + expect(subject.prometheus_adapter).to be_nil + end + end + end + end +end diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb index c40cd5b7548..51396d34f8f 100644 --- a/spec/services/system_hooks_service_spec.rb +++ b/spec/services/system_hooks_service_spec.rb @@ -30,6 +30,7 @@ describe SystemHooksService do :old_path_with_namespace ) end + it do project.old_path_with_namespace = 'transfered_from_path' expect(event_data(project, :transfer)).to include( @@ -45,18 +46,21 @@ describe SystemHooksService do :owner_name, :owner_email ) end + it do expect(event_data(group, :destroy)).to include( :event_name, :name, :created_at, :updated_at, :path, :group_id, :owner_name, :owner_email ) end + it do expect(event_data(group_member, :create)).to include( :event_name, :created_at, :updated_at, :group_name, :group_path, :group_id, :user_id, :user_username, :user_name, :user_email, :group_access ) end + it do expect(event_data(group_member, :destroy)).to include( :event_name, :created_at, :updated_at, :group_name, :group_path, @@ -70,6 +74,14 @@ describe SystemHooksService do expect(data[:project_visibility]).to eq('private') end + it 'handles nil datetime columns' do + user.update_attributes(created_at: nil, updated_at: nil) + data = event_data(user, :destroy) + + expect(data[:created_at]).to be(nil) + expect(data[:updated_at]).to be(nil) + end + context 'group_rename' do it 'contains old and new path' do allow(group).to receive(:path_was).and_return('old-path') diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb index 5b5edc1aa0d..a3893188c6e 100644 --- a/spec/services/system_note_service_spec.rb +++ b/spec/services/system_note_service_spec.rb @@ -789,7 +789,7 @@ describe SystemNoteService do object: { url: project_commit_url(project, commit), title: "GitLab: Mentioned on commit - #{commit.title}", - icon: { title: "GitLab", url16x16: "https://gitlab.com/favicon.ico" }, + icon: { title: "GitLab", url16x16: "http://localhost/favicon.ico" }, status: { resolved: false } } ) @@ -815,7 +815,7 @@ describe SystemNoteService do object: { url: project_issue_url(project, issue), title: "GitLab: Mentioned on issue - #{issue.title}", - icon: { title: "GitLab", url16x16: "https://gitlab.com/favicon.ico" }, + icon: { title: "GitLab", url16x16: "http://localhost/favicon.ico" }, status: { resolved: false } } ) @@ -841,7 +841,7 @@ describe SystemNoteService do object: { url: project_snippet_url(project, snippet), title: "GitLab: Mentioned on snippet - #{snippet.title}", - icon: { title: "GitLab", url16x16: "https://gitlab.com/favicon.ico" }, + icon: { title: "GitLab", url16x16: "http://localhost/favicon.ico" }, status: { resolved: false } } ) diff --git a/spec/support/shared_examples/services/boards/boards_create_service.rb b/spec/support/shared_examples/services/boards/boards_create_service.rb new file mode 100644 index 00000000000..5bdc04f660f --- /dev/null +++ b/spec/support/shared_examples/services/boards/boards_create_service.rb @@ -0,0 +1,27 @@ +shared_examples 'boards create service' do + context 'when parent does not have a board' do + it 'creates a new board' do + expect { service.execute }.to change(Board, :count).by(1) + end + + it 'creates the default lists' do + board = service.execute + + expect(board.lists.size).to eq 2 + expect(board.lists.first).to be_backlog + expect(board.lists.last).to be_closed + end + end + + context 'when parent has a board' do + before do + create(:board, parent: parent) + end + + it 'does not create a new board' do + expect(service).to receive(:can_create_board?) { false } + + expect { service.execute }.not_to change(parent.boards, :count) + end + end +end diff --git a/spec/support/shared_examples/services/boards/boards_list_service.rb b/spec/support/shared_examples/services/boards/boards_list_service.rb new file mode 100644 index 00000000000..e0d5a7c61f2 --- /dev/null +++ b/spec/support/shared_examples/services/boards/boards_list_service.rb @@ -0,0 +1,29 @@ +shared_examples 'boards list service' do + context 'when parent does not have a board' do + it 'creates a new parent board' do + expect { service.execute }.to change(parent.boards, :count).by(1) + end + + it 'delegates the parent board creation to Boards::CreateService' do + expect_any_instance_of(Boards::CreateService).to receive(:execute).once + + service.execute + end + end + + context 'when parent has a board' do + before do + create(:board, parent: parent) + end + + it 'does not create a new board' do + expect { service.execute }.not_to change(parent.boards, :count) + end + end + + it 'returns parent boards' do + board = create(:board, parent: parent) + + expect(service.execute).to eq [board] + end +end diff --git a/spec/support/shared_examples/services/boards/issues_list_service.rb b/spec/support/shared_examples/services/boards/issues_list_service.rb new file mode 100644 index 00000000000..3e744323cea --- /dev/null +++ b/spec/support/shared_examples/services/boards/issues_list_service.rb @@ -0,0 +1,60 @@ +shared_examples 'issues list service' do + it 'delegates search to IssuesFinder' do + params = { board_id: board.id, id: list1.id } + + expect_any_instance_of(IssuesFinder).to receive(:execute).once.and_call_original + + described_class.new(parent, user, params).execute + end + + context 'issues are ordered by priority' do + it 'returns opened issues when list_id is missing' do + params = { board_id: board.id } + + issues = described_class.new(parent, user, params).execute + + expect(issues).to eq [opened_issue2, reopened_issue1, opened_issue1] + end + + it 'returns opened issues when listing issues from Backlog' do + params = { board_id: board.id, id: backlog.id } + + issues = described_class.new(parent, user, params).execute + + expect(issues).to eq [opened_issue2, reopened_issue1, opened_issue1] + end + + it 'returns closed issues when listing issues from Closed' do + params = { board_id: board.id, id: closed.id } + + issues = described_class.new(parent, user, params).execute + + expect(issues).to eq [closed_issue4, closed_issue2, closed_issue5, closed_issue3, closed_issue1] + end + + it 'returns opened issues that have label list applied when listing issues from a label list' do + params = { board_id: board.id, id: list1.id } + + issues = described_class.new(parent, user, params).execute + + expect(issues).to eq [list1_issue3, list1_issue1, list1_issue2] + end + end + + context 'with list that does not belong to the board' do + it 'raises an error' do + list = create(:list) + service = described_class.new(parent, user, board_id: board.id, id: list.id) + + expect { service.execute }.to raise_error(ActiveRecord::RecordNotFound) + end + end + + context 'with invalid list id' do + it 'raises an error' do + service = described_class.new(parent, user, board_id: board.id, id: nil) + + expect { service.execute }.to raise_error(ActiveRecord::RecordNotFound) + end + end +end diff --git a/spec/support/shared_examples/services/boards/issues_move_service.rb b/spec/support/shared_examples/services/boards/issues_move_service.rb new file mode 100644 index 00000000000..4a4fbaa3a0e --- /dev/null +++ b/spec/support/shared_examples/services/boards/issues_move_service.rb @@ -0,0 +1,87 @@ +shared_examples 'issues move service' do + context 'when moving an issue between lists' do + let(:issue) { create(:labeled_issue, project: project, labels: [bug, development]) } + let(:params) { { board_id: board1.id, from_list_id: list1.id, to_list_id: list2.id } } + + it 'delegates the label changes to Issues::UpdateService' do + expect_any_instance_of(Issues::UpdateService).to receive(:execute).with(issue).once + + described_class.new(parent, user, params).execute(issue) + end + + it 'removes the label from the list it came from and adds the label of the list it goes to' do + described_class.new(parent, user, params).execute(issue) + + expect(issue.reload.labels).to contain_exactly(bug, testing) + end + end + + context 'when moving to closed' do + let!(:list3) { create(:list, board: board2, label: regression, position: 1) } + + let(:issue) { create(:labeled_issue, project: project, labels: [bug, development, testing, regression]) } + let(:params) { { board_id: board1.id, from_list_id: list2.id, to_list_id: closed.id } } + + it 'delegates the close proceedings to Issues::CloseService' do + expect_any_instance_of(Issues::CloseService).to receive(:execute).with(issue).once + + described_class.new(parent, user, params).execute(issue) + end + + it 'removes all list-labels from boards and close the issue' do + described_class.new(parent, user, params).execute(issue) + issue.reload + + expect(issue.labels).to contain_exactly(bug) + expect(issue).to be_closed + end + end + + context 'when moving from closed' do + let(:issue) { create(:labeled_issue, :closed, project: project, labels: [bug]) } + let(:params) { { board_id: board1.id, from_list_id: closed.id, to_list_id: list2.id } } + + it 'delegates the re-open proceedings to Issues::ReopenService' do + expect_any_instance_of(Issues::ReopenService).to receive(:execute).with(issue).once + + described_class.new(parent, user, params).execute(issue) + end + + it 'adds the label of the list it goes to and reopen the issue' do + described_class.new(parent, user, params).execute(issue) + issue.reload + + expect(issue.labels).to contain_exactly(bug, testing) + expect(issue).to be_opened + end + end + + context 'when moving to same list' do + let(:issue) { create(:labeled_issue, project: project, labels: [bug, development]) } + let(:issue1) { create(:labeled_issue, project: project, labels: [bug, development]) } + let(:issue2) { create(:labeled_issue, project: project, labels: [bug, development]) } + let(:params) { { board_id: board1.id, from_list_id: list1.id, to_list_id: list1.id } } + + it 'returns false' do + expect(described_class.new(parent, user, params).execute(issue)).to eq false + end + + it 'keeps issues labels' do + described_class.new(parent, user, params).execute(issue) + + expect(issue.reload.labels).to contain_exactly(bug, development) + end + + it 'sorts issues' do + [issue, issue1, issue2].each do |issue| + issue.move_to_end && issue.save! + end + + params.merge!(move_after_id: issue1.id, move_before_id: issue2.id) + + described_class.new(parent, user, params).execute(issue) + + expect(issue.relative_position).to be_between(issue1.relative_position, issue2.relative_position) + end + end +end diff --git a/spec/support/shared_examples/services/boards/lists_destroy_service.rb b/spec/support/shared_examples/services/boards/lists_destroy_service.rb new file mode 100644 index 00000000000..62b6ffe1836 --- /dev/null +++ b/spec/support/shared_examples/services/boards/lists_destroy_service.rb @@ -0,0 +1,30 @@ +shared_examples 'lists destroy service' do + context 'when list type is label' do + it 'removes list from board' do + list = create(:list, board: board) + service = described_class.new(parent, user) + + expect { service.execute(list) }.to change(board.lists, :count).by(-1) + end + + it 'decrements position of higher lists' do + development = create(:list, board: board, position: 0) + review = create(:list, board: board, position: 1) + staging = create(:list, board: board, position: 2) + closed = board.closed_list + + described_class.new(parent, user).execute(development) + + expect(review.reload.position).to eq 0 + expect(staging.reload.position).to eq 1 + expect(closed.reload.position).to be_nil + end + end + + it 'does not remove list from board when list type is closed' do + list = board.closed_list + service = described_class.new(parent, user) + + expect { service.execute(list) }.not_to change(board.lists, :count) + end +end diff --git a/spec/support/shared_examples/services/boards/lists_list_service.rb b/spec/support/shared_examples/services/boards/lists_list_service.rb new file mode 100644 index 00000000000..0a8220111ab --- /dev/null +++ b/spec/support/shared_examples/services/boards/lists_list_service.rb @@ -0,0 +1,23 @@ +shared_examples 'lists list service' do + context 'when the board has a backlog list' do + let!(:backlog_list) { create(:backlog_list, board: board) } + + it 'does not create a backlog list' do + expect { service.execute(board) }.not_to change(board.lists, :count) + end + + it "returns board's lists" do + expect(service.execute(board)).to eq [backlog_list, list, board.closed_list] + end + end + + context 'when the board does not have a backlog list' do + it 'creates a backlog list' do + expect { service.execute(board) }.to change(board.lists, :count).by(1) + end + + it "returns board's lists" do + expect(service.execute(board)).to eq [board.backlog_list, list, board.closed_list] + end + end +end diff --git a/spec/support/shared_examples/services/boards/lists_move_service.rb b/spec/support/shared_examples/services/boards/lists_move_service.rb new file mode 100644 index 00000000000..07c98cb29b7 --- /dev/null +++ b/spec/support/shared_examples/services/boards/lists_move_service.rb @@ -0,0 +1,93 @@ +shared_examples 'lists move service' do + let!(:planning) { create(:list, board: board, position: 0) } + let!(:development) { create(:list, board: board, position: 1) } + let!(:review) { create(:list, board: board, position: 2) } + let!(:staging) { create(:list, board: board, position: 3) } + let!(:closed) { create(:closed_list, board: board) } + + context 'when list type is set to label' do + it 'keeps position of lists when new position is nil' do + service = described_class.new(parent, user, position: nil) + + service.execute(planning) + + expect(current_list_positions).to eq [0, 1, 2, 3] + end + + it 'keeps position of lists when new positon is equal to old position' do + service = described_class.new(parent, user, position: planning.position) + + service.execute(planning) + + expect(current_list_positions).to eq [0, 1, 2, 3] + end + + it 'keeps position of lists when new positon is negative' do + service = described_class.new(parent, user, position: -1) + + service.execute(planning) + + expect(current_list_positions).to eq [0, 1, 2, 3] + end + + it 'keeps position of lists when new positon is equal to number of labels lists' do + service = described_class.new(parent, user, position: board.lists.label.size) + + service.execute(planning) + + expect(current_list_positions).to eq [0, 1, 2, 3] + end + + it 'keeps position of lists when new positon is greater than number of labels lists' do + service = described_class.new(parent, user, position: board.lists.label.size + 1) + + service.execute(planning) + + expect(current_list_positions).to eq [0, 1, 2, 3] + end + + it 'increments position of intermediate lists when new positon is equal to first position' do + service = described_class.new(parent, user, position: 0) + + service.execute(staging) + + expect(current_list_positions).to eq [1, 2, 3, 0] + end + + it 'decrements position of intermediate lists when new positon is equal to last position' do + service = described_class.new(parent, user, position: board.lists.label.last.position) + + service.execute(planning) + + expect(current_list_positions).to eq [3, 0, 1, 2] + end + + it 'decrements position of intermediate lists when new position is greater than old position' do + service = described_class.new(parent, user, position: 2) + + service.execute(planning) + + expect(current_list_positions).to eq [2, 0, 1, 3] + end + + it 'increments position of intermediate lists when new position is lower than old position' do + service = described_class.new(parent, user, position: 1) + + service.execute(staging) + + expect(current_list_positions).to eq [0, 2, 3, 1] + end + end + + it 'keeps position of lists when list type is closed' do + service = described_class.new(parent, user, position: 2) + + service.execute(closed) + + expect(current_list_positions).to eq [0, 1, 2, 3] + end + + def current_list_positions + [planning, development, review, staging].map { |list| list.reload.position } + end +end diff --git a/spec/tasks/gitlab/traces_rake_spec.rb b/spec/tasks/gitlab/traces_rake_spec.rb new file mode 100644 index 00000000000..bd18e8ffc1e --- /dev/null +++ b/spec/tasks/gitlab/traces_rake_spec.rb @@ -0,0 +1,55 @@ +require 'rake_helper' + +describe 'gitlab:traces rake tasks' do + before do + Rake.application.rake_require 'tasks/gitlab/traces' + end + + shared_examples 'passes the job id to worker' do + it do + expect(ArchiveTraceWorker).to receive(:bulk_perform_async).with([[job.id]]) + + run_rake_task('gitlab:traces:archive') + end + end + + shared_examples 'does not pass the job id to worker' do + it do + expect(ArchiveTraceWorker).not_to receive(:bulk_perform_async) + + run_rake_task('gitlab:traces:archive') + end + end + + context 'when trace file stored in default path' do + let!(:job) { create(:ci_build, :success, :trace_live) } + + it_behaves_like 'passes the job id to worker' + end + + context 'when trace is stored in database' do + let!(:job) { create(:ci_build, :success) } + + before do + job.update_column(:trace, 'trace in db') + end + + it_behaves_like 'passes the job id to worker' + end + + context 'when job has trace artifact' do + let!(:job) { create(:ci_build, :success) } + + before do + create(:ci_job_artifact, :trace, job: job) + end + + it_behaves_like 'does not pass the job id to worker' + end + + context 'when job is not finished yet' do + let!(:build) { create(:ci_build, :running, :trace_live) } + + it_behaves_like 'does not pass the job id to worker' + end +end diff --git a/spec/validators/url_placeholder_validator_spec.rb b/spec/validators/url_placeholder_validator_spec.rb new file mode 100644 index 00000000000..b76d8acdf88 --- /dev/null +++ b/spec/validators/url_placeholder_validator_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe UrlPlaceholderValidator do + let(:validator) { described_class.new(attributes: [:link_url], **options) } + let!(:badge) { build(:badge) } + let(:placeholder_url) { 'http://www.example.com/%{project_path}/%{project_id}/%{default_branch}/%{commit_sha}' } + + subject { validator.validate_each(badge, :link_url, badge.link_url) } + + describe '#validates_each' do + context 'with no options' do + let(:options) { {} } + + it 'allows http and https protocols by default' do + expect(validator.send(:default_options)[:protocols]).to eq %w(http https) + end + + it 'checks that the url structure is valid' do + badge.link_url = placeholder_url + + subject + + expect(badge.errors.empty?).to be false + end + end + + context 'with placeholder regex' do + let(:options) { { placeholder_regex: /(project_path|project_id|commit_sha|default_branch)/ } } + + it 'checks that the url is valid and obviate placeholders that match regex' do + badge.link_url = placeholder_url + + subject + + expect(badge.errors.empty?).to be true + end + end + end +end diff --git a/spec/validators/url_validator_spec.rb b/spec/validators/url_validator_spec.rb new file mode 100644 index 00000000000..763dff181d2 --- /dev/null +++ b/spec/validators/url_validator_spec.rb @@ -0,0 +1,46 @@ +require 'spec_helper' + +describe UrlValidator do + let(:validator) { described_class.new(attributes: [:link_url], **options) } + let!(:badge) { build(:badge) } + + subject { validator.validate_each(badge, :link_url, badge.link_url) } + + describe '#validates_each' do + context 'with no options' do + let(:options) { {} } + + it 'allows http and https protocols by default' do + expect(validator.send(:default_options)[:protocols]).to eq %w(http https) + end + + it 'checks that the url structure is valid' do + badge.link_url = 'http://www.google.es/%{whatever}' + + subject + + expect(badge.errors.empty?).to be false + end + end + + context 'with protocols' do + let(:options) { { protocols: %w(http) } } + + it 'allows urls with the defined protocols' do + badge.link_url = 'http://www.example.com' + + subject + + expect(badge.errors.empty?).to be true + end + + it 'add error if the url protocol does not match the selected ones' do + badge.link_url = 'https://www.example.com' + + subject + + expect(badge.errors.empty?).to be false + end + end + end +end diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb index c5f455b8948..f28bf430f02 100644 --- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb +++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb @@ -12,7 +12,7 @@ describe 'layouts/nav/sidebar/_project' do end describe 'issue boards' do - it 'has boards tab when multiple issue boards available' do + it 'has board tab' do render expect(rendered).to have_css('a[title="Board"]') diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb index 62af946dcab..15fce65979b 100644 --- a/spec/views/projects/_home_panel.html.haml_spec.rb +++ b/spec/views/projects/_home_panel.html.haml_spec.rb @@ -1,7 +1,8 @@ require 'spec_helper' describe 'projects/_home_panel' do - let(:project) { create(:project, :public) } + let(:group) { create(:group) } + let(:project) { create(:project, :public, namespace: group) } let(:notification_settings) do user&.notification_settings_for(project) @@ -35,4 +36,55 @@ describe 'projects/_home_panel' do expect(rendered).not_to have_selector('.notification_dropdown') end end + + context 'when project' do + let!(:user) { create(:user) } + let(:badges) { project.badges } + + context 'has no badges' do + it 'should not render any badge' do + render + + expect(rendered).to have_selector('.project-badges') + expect(rendered).not_to have_selector('.project-badges > a') + end + end + + shared_examples 'show badges' do + it 'should render the all badges' do + render + + expect(rendered).to have_selector('.project-badges a') + + badges.each do |badge| + expect(rendered).to have_link(href: badge.rendered_link_url) + end + end + end + + context 'only has group badges' do + before do + create(:group_badge, group: project.group) + end + + it_behaves_like 'show badges' + end + + context 'only has project badges' do + before do + create(:project_badge, project: project) + end + + it_behaves_like 'show badges' + end + + context 'has both group and project badges' do + before do + create(:project_badge, project: project) + create(:group_badge, group: project.group) + end + + it_behaves_like 'show badges' + end + end end diff --git a/spec/workers/create_trace_artifact_worker_spec.rb b/spec/workers/archive_trace_worker_spec.rb index 854abd9cca7..b768588c6e1 100644 --- a/spec/workers/create_trace_artifact_worker_spec.rb +++ b/spec/workers/archive_trace_worker_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe CreateTraceArtifactWorker do +describe ArchiveTraceWorker do describe '#perform' do subject { described_class.new.perform(job&.id) } @@ -8,8 +8,7 @@ describe CreateTraceArtifactWorker do let(:job) { create(:ci_build) } it 'executes service' do - expect_any_instance_of(Ci::CreateTraceArtifactService) - .to receive(:execute).with(job) + expect_any_instance_of(Gitlab::Ci::Trace).to receive(:archive!) subject end @@ -19,8 +18,7 @@ describe CreateTraceArtifactWorker do let(:job) { nil } it 'does not execute service' do - expect_any_instance_of(Ci::CreateTraceArtifactService) - .not_to receive(:execute) + expect_any_instance_of(Gitlab::Ci::Trace).not_to receive(:archive!) subject end diff --git a/spec/workers/build_finished_worker_spec.rb b/spec/workers/build_finished_worker_spec.rb index c7ff8cf3b92..acd8da11d8d 100644 --- a/spec/workers/build_finished_worker_spec.rb +++ b/spec/workers/build_finished_worker_spec.rb @@ -14,7 +14,7 @@ describe BuildFinishedWorker do expect_any_instance_of(BuildTraceSectionsWorker).to receive(:perform) expect_any_instance_of(BuildCoverageWorker).to receive(:perform) expect(BuildHooksWorker).to receive(:perform_async) - expect(CreateTraceArtifactWorker).to receive(:perform_async) + expect(ArchiveTraceWorker).to receive(:perform_async) described_class.new.perform(build.id) end diff --git a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb index 68cfe9d5545..615462380e0 100644 --- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb +++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb @@ -25,7 +25,7 @@ describe Gitlab::GithubImport::ObjectImporter do importer_class = double(:importer_class) importer_instance = double(:importer_instance) representation = double(:representation) - project = double(:project, path_with_namespace: 'foo/bar') + project = double(:project, full_path: 'foo/bar') client = double(:client) expect(worker) diff --git a/spec/workers/concerns/pipeline_background_queue_spec.rb b/spec/workers/concerns/pipeline_background_queue_spec.rb new file mode 100644 index 00000000000..24c0a3c6a20 --- /dev/null +++ b/spec/workers/concerns/pipeline_background_queue_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe PipelineBackgroundQueue do + let(:worker) do + Class.new do + def self.name + 'DummyWorker' + end + + include ApplicationWorker + include PipelineBackgroundQueue + end + end + + it 'sets a default object storage queue automatically' do + expect(worker.sidekiq_options['queue']) + .to eq 'pipeline_background:dummy' + end +end diff --git a/spec/workers/git_garbage_collect_worker_spec.rb b/spec/workers/git_garbage_collect_worker_spec.rb index 47297de738b..74539a7e493 100644 --- a/spec/workers/git_garbage_collect_worker_spec.rb +++ b/spec/workers/git_garbage_collect_worker_spec.rb @@ -195,6 +195,12 @@ describe GitGarbageCollectWorker do expect(File.exist?(bitmap_path(after_packs.first))).to eq(bitmaps_enabled) end + + it 'cleans up repository after finishing' do + expect_any_instance_of(Project).to receive(:cleanup).and_call_original + + subject.perform(project.id, 'gc', lease_key, lease_uuid) + end end context 'with bitmaps enabled' do diff --git a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb index 7c8c665a9b3..48e7eaf32fc 100644 --- a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb +++ b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::GithubImport::ImportDiffNoteWorker do describe '#import' do it 'imports a diff note' do - project = double(:project, path_with_namespace: 'foo/bar') + project = double(:project, full_path: 'foo/bar') client = double(:client) importer = double(:importer) hash = { diff --git a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb index 4116380ff4d..8cf6ac15919 100644 --- a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb +++ b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::GithubImport::ImportIssueWorker do describe '#import' do it 'imports an issue' do - project = double(:project, path_with_namespace: 'foo/bar') + project = double(:project, full_path: 'foo/bar') client = double(:client) importer = double(:importer) hash = { diff --git a/spec/workers/gitlab/github_import/import_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_note_worker_spec.rb index 0ca825a722b..677697c02df 100644 --- a/spec/workers/gitlab/github_import/import_note_worker_spec.rb +++ b/spec/workers/gitlab/github_import/import_note_worker_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::GithubImport::ImportNoteWorker do describe '#import' do it 'imports a note' do - project = double(:project, path_with_namespace: 'foo/bar') + project = double(:project, full_path: 'foo/bar') client = double(:client) importer = double(:importer) hash = { diff --git a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb index d49f560af42..e287ddbe0d7 100644 --- a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb +++ b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::GithubImport::ImportPullRequestWorker do describe '#import' do it 'imports a pull request' do - project = double(:project, path_with_namespace: 'foo/bar') + project = double(:project, full_path: 'foo/bar') client = double(:client) importer = double(:importer) hash = { diff --git a/vendor/project_templates/express.tar.gz b/vendor/project_templates/express.tar.gz Binary files differindex dcf5e4a0416..06093deb459 100644 --- a/vendor/project_templates/express.tar.gz +++ b/vendor/project_templates/express.tar.gz diff --git a/vendor/project_templates/rails.tar.gz b/vendor/project_templates/rails.tar.gz Binary files differindex d4856090ed9..85cc1b6bb78 100644 --- a/vendor/project_templates/rails.tar.gz +++ b/vendor/project_templates/rails.tar.gz diff --git a/vendor/project_templates/spring.tar.gz b/vendor/project_templates/spring.tar.gz Binary files differindex 6ee7e76f676..e98d3ce7b8f 100644 --- a/vendor/project_templates/spring.tar.gz +++ b/vendor/project_templates/spring.tar.gz diff --git a/vendor/runner/values.yaml b/vendor/runner/values.yaml index b7e2e24acaf..e5f95152ac7 100644 --- a/vendor/runner/values.yaml +++ b/vendor/runner/values.yaml @@ -15,10 +15,8 @@ rbac: clusterWideAccess: false ## Configuration for the Pods that that the runner launches for each new job -## runners: image: ubuntu:16.04 - privileged: false builds: {} services: {} helpers: {} |